UNPKG

@pipedream/canva

Version:

Pipedream Canva Components

146 lines (142 loc) 4.75 kB
import canva from "../../canva.app.mjs"; import constants from "../../common/constants.mjs"; export default { key: "canva-export-design", name: "Export Design", description: "Starts a new job to export a file from Canva. [See the documentation](https://www.canva.dev/docs/connect/api-reference/exports/create-design-export-job/)", version: "0.0.5", type: "action", props: { canva, designId: { propDefinition: [ canva, "designId", ], }, type: { type: "string", label: "Format Type", description: "The desired export format", reloadProps: true, options: constants.EXPORT_TYPES, }, pages: { type: "integer[]", label: "Pages", description: "To specify which pages to export in a multi-page design, provide the page numbers as an array. The first page in a design is page `1`. If pages isn't specified, all the pages are exported.", optional: true, }, waitForCompletion: { propDefinition: [ canva, "waitForCompletion", ], }, }, async additionalProps() { const props = {}; if (!this.type) { return props; } if (this.type === "jpg") { props.quality = { type: "integer", label: "Quality", description: "Determines how compressed the exported file should be. A low `quality` value (minimum `1`) will create a file with a smaller file size, but the resulting file will have pixelated artifacts when compared to a file created with a high `quality` value (maximum `100`).", }; } if (this.type === "mp4") { props.quality = { type: "string", label: "Quality", description: "The orientation and resolution of the exported video", options: constants.MP4_QUALITY, }; } if (this.type === "pdf") { props.size = { type: "string", label: "Paper Size", description: "The paper size of the export PDF file", options: constants.PAPER_SIZE, optional: true, }; } if (this.type === "png") { props.lossless = { type: "boolean", label: "Lossless", description: "When `true`, the PNG is compressed with a lossless compression algorithm (`false` by default)", optional: true, }; props.asSingleImage = { type: "boolean", label: "As Single Image", description: "When `true`, multi-page designs are merged into a single image. When `false` (default), each page is exported as a separate image", optional: true, }; } if (this.type === "pdf" || this.type === "jpg" || this.type === "png" || this.type === "gif" || this.type === "mp4") { props.exportQuality = { type: "string", label: "Export Quality", description: "Specifies the export quality of the design. A `pro` export might fail if the design contains premium elements and the calling user either hasn't purchased the elements or isn't on a Canva plan (such as Canva Pro) that has premium features.", options: constants.EXPORT_QUALITY, optional: true, }; if (this.type === "jpg" || this.type === "png" || this.type === "gif") { props.height = { type: "integer", label: "Height", description: "The height in pixels of the exported image", optional: true, }; props.width = { type: "integer", label: "Width", description: "The width in pixels of the exported image", optional: true, }; } } return props; }, async run({ $ }) { let response = await this.canva.exportDesign({ $, data: { design_id: this.designId, format: { type: this.type, pages: this.pages, quality: this.quality, export_quality: this.exportQuality, size: this.size, height: this.height, width: this.width, lossless: this.lossless, as_single_image: this.asSingleImage, }, }, }); if (this.waitForCompletion) { const timer = (ms) => new Promise((res) => setTimeout(res, ms)); const exportId = response.job.id; while (response.job.status === "in_progress") { response = await this.canva.getDesignExportJob({ $, exportId, }); if (response.job.error) { throw new Error(response.job.error.message); } await timer(3000); } } $.export("$summary", `Successfully ${this.waitForCompletion ? "exported" : "started export job for"} design with ID "${this.designId}"`); return response; }, };