Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kentcdodds/canva

src/operations.ts

234 lines · 6.1 KB · TypeScript
export type CanvaOperationDefinition = {
	method: 'GET' | 'POST' | 'PATCH' | 'DELETE'
	path: string
	tag: string
	contentType?: 'application/json' | 'application/octet-stream'
	deprecated?: boolean
	preview?: boolean
}

export const canvaOperations = {
	createassetuploadjob: {
		method: 'POST',
		path: '/v1/asset-uploads',
		tag: 'asset',
		contentType: 'application/octet-stream',
	},
	createcomment: {
		method: 'POST',
		path: '/v1/comments',
		tag: 'comment',
		contentType: 'application/json',
		deprecated: true,
	},
	createdesign: {
		method: 'POST',
		path: '/v1/designs',
		tag: 'design',
		contentType: 'application/json',
	},
	createdesignautofilljob: {
		method: 'POST',
		path: '/v1/autofills',
		tag: 'autofill',
		contentType: 'application/json',
	},
	createdesignexportjob: {
		method: 'POST',
		path: '/v1/exports',
		tag: 'export',
		contentType: 'application/json',
	},
	createdesignimportjob: {
		method: 'POST',
		path: '/v1/imports',
		tag: 'design-import',
		contentType: 'application/octet-stream',
	},
	createdesignmergejob: {
		method: 'POST',
		path: '/v1/merges',
		tag: 'merge',
		contentType: 'application/json',
		preview: true,
	},
	createdesignresizejob: {
		method: 'POST',
		path: '/v1/resizes',
		tag: 'resize',
		contentType: 'application/json',
	},
	createfolder: {
		method: 'POST',
		path: '/v1/folders',
		tag: 'folder',
		contentType: 'application/json',
	},
	createprintpartnerdesign: {
		method: 'POST',
		path: '/v1/print-partner/designs',
		tag: 'design',
		contentType: 'application/json',
		preview: true,
	},
	createprintpartnerdesignexportjob: {
		method: 'POST',
		path: '/v1/print-partner/exports',
		tag: 'export',
		contentType: 'application/json',
		preview: true,
	},
	createreply: {
		method: 'POST',
		path: '/v1/designs/{designId}/comments/{threadId}/replies',
		tag: 'comment',
		contentType: 'application/json',
		preview: true,
	},
	createthread: {
		method: 'POST',
		path: '/v1/designs/{designId}/comments',
		tag: 'comment',
		contentType: 'application/json',
		preview: true,
	},
	createurlassetuploadjob: {
		method: 'POST',
		path: '/v1/url-asset-uploads',
		tag: 'asset',
		contentType: 'application/json',
		preview: true,
	},
	createurlimportjob: {
		method: 'POST',
		path: '/v1/url-imports',
		tag: 'design-import',
		contentType: 'application/json',
	},
	deleteasset: { method: 'DELETE', path: '/v1/assets/{assetId}', tag: 'asset' },
	deletefolder: { method: 'DELETE', path: '/v1/folders/{folderId}', tag: 'folder' },
	getasset: { method: 'GET', path: '/v1/assets/{assetId}', tag: 'asset' },
	getassetuploadjob: { method: 'GET', path: '/v1/asset-uploads/{jobId}', tag: 'asset' },
	getbrandtemplate: {
		method: 'GET',
		path: '/v1/brand-templates/{brandTemplateId}',
		tag: 'brand-template',
	},
	getbrandtemplatedataset: {
		method: 'GET',
		path: '/v1/brand-templates/{brandTemplateId}/dataset',
		tag: 'brand-template',
	},
	getdesign: { method: 'GET', path: '/v1/designs/{designId}', tag: 'design' },
	getdesignautofilljob: { method: 'GET', path: '/v1/autofills/{jobId}', tag: 'autofill' },
	getdesigndataset: {
		method: 'GET',
		path: '/v1/designs/{designId}/dataset',
		tag: 'design',
		preview: true,
	},
	getdesignexportformats: {
		method: 'GET',
		path: '/v1/designs/{designId}/export-formats',
		tag: 'design',
	},
	getdesignexportjob: { method: 'GET', path: '/v1/exports/{exportId}', tag: 'export' },
	getdesignimportjob: { method: 'GET', path: '/v1/imports/{jobId}', tag: 'design-import' },
	getdesignmergejob: {
		method: 'GET',
		path: '/v1/merges/{jobId}',
		tag: 'merge',
		preview: true,
	},
	getdesignpages: {
		method: 'GET',
		path: '/v1/designs/{designId}/pages',
		tag: 'design',
		preview: true,
	},
	getdesignresizejob: { method: 'GET', path: '/v1/resizes/{jobId}', tag: 'resize' },
	getfolder: { method: 'GET', path: '/v1/folders/{folderId}', tag: 'folder' },
	getoidcjwks: { method: 'GET', path: '/v1/oidc/jwks', tag: 'oidc' },
	getreply: {
		method: 'GET',
		path: '/v1/designs/{designId}/comments/{threadId}/replies/{replyId}',
		tag: 'comment',
		preview: true,
	},
	getthread: {
		method: 'GET',
		path: '/v1/designs/{designId}/comments/{threadId}',
		tag: 'comment',
		preview: true,
	},
	geturlassetuploadjob: {
		method: 'GET',
		path: '/v1/url-asset-uploads/{jobId}',
		tag: 'asset',
		preview: true,
	},
	geturlimportjob: { method: 'GET', path: '/v1/url-imports/{jobId}', tag: 'design-import' },
	getusercapabilities: { method: 'GET', path: '/v1/users/me/capabilities', tag: 'user' },
	getuserprofile: { method: 'GET', path: '/v1/users/me/profile', tag: 'user' },
	listbrandtemplates: { method: 'GET', path: '/v1/brand-templates', tag: 'brand-template' },
	listdesigns: { method: 'GET', path: '/v1/designs', tag: 'design' },
	listfolderitems: {
		method: 'GET',
		path: '/v1/folders/{folderId}/items',
		tag: 'folder',
	},
	listreplies: {
		method: 'GET',
		path: '/v1/designs/{designId}/comments/{threadId}/replies',
		tag: 'comment',
		preview: true,
	},
	movefolderitem: {
		method: 'POST',
		path: '/v1/folders/move',
		tag: 'folder',
		contentType: 'application/json',
	},
	publishbrandtemplate: {
		method: 'POST',
		path: '/v1/brand-templates',
		tag: 'brand-template',
		contentType: 'application/json',
		preview: true,
	},
	updateasset: {
		method: 'PATCH',
		path: '/v1/assets/{assetId}',
		tag: 'asset',
		contentType: 'application/json',
	},
	updatefolder: {
		method: 'PATCH',
		path: '/v1/folders/{folderId}',
		tag: 'folder',
		contentType: 'application/json',
	},
	userinfo: { method: 'GET', path: '/v1/oidc/userinfo', tag: 'oidc' },
	usersme: { method: 'GET', path: '/v1/users/me', tag: 'user' },
} as const satisfies Record<string, CanvaOperationDefinition>

export type CanvaOperation = keyof typeof canvaOperations

export const canvaOperationNames = Object.freeze(
	Object.keys(canvaOperations) as Array<CanvaOperation>,
)

export function isCanvaOperation(value: unknown): value is CanvaOperation {
	return typeof value === 'string' && Object.hasOwn(canvaOperations, value)
}

export function isMutation(operation: CanvaOperation): boolean {
	return canvaOperations[operation].method !== 'GET'
}

export default async function operationsCatalog() {
	return {
		count: canvaOperationNames.length,
		operations: canvaOperations,
	}
}