UNPKG

@strapi/provider-upload-cloudinary

Version:

Cloudinary provider for strapi upload

1 lines 7.82 kB
{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import type { ReadStream } from 'node:fs';\nimport { v2 as cloudinary, ConfigOptions, UploadApiOptions } from 'cloudinary';\nimport intoStream from 'into-stream';\nimport * as utils from '@strapi/utils';\n\ninterface File {\n name: string;\n alternativeText?: string;\n caption?: string;\n width?: number;\n height?: number;\n formats?: Record<string, unknown>;\n hash: string;\n ext?: string;\n mime: string;\n size: number;\n sizeInBytes: number;\n url: string;\n previewUrl?: string;\n path?: string;\n provider?: string;\n provider_metadata?: Record<string, unknown>;\n stream?: ReadStream;\n buffer?: Buffer;\n}\n\nexport default {\n init(options: ConfigOptions) {\n cloudinary.config(options);\n\n const upload = (file: File, customConfig = {}): Promise<void> => {\n return new Promise((resolve, reject) => {\n const config: Partial<UploadApiOptions> = {\n resource_type: 'auto',\n public_id: file.hash,\n };\n\n if (file.ext) {\n config.filename = `${file.hash}${file.ext}`;\n }\n\n if (file.path) {\n config.folder = file.path;\n }\n\n // For files smaller than 99 MB use regular upload as it tends to be faster\n // and fallback to chunked upload for larger files as that's required by Cloudinary.\n // https://support.cloudinary.com/hc/en-us/community/posts/360009586100-Upload-movie-video-with-large-size?page=1#community_comment_360002140099\n // The Cloudinary's max limit for regular upload is actually 100 MB but add some headroom\n // for size counting shenanigans. (Strapi provides the size in kilobytes rounded to two decimal places here).\n const uploadMethod =\n file.size && file.size < 1000 * 99\n ? cloudinary.uploader.upload_stream\n : cloudinary.uploader.upload_chunked_stream;\n\n const uploadStream = uploadMethod({ ...config, ...customConfig }, (err, image) => {\n if (err) {\n if (err.message.includes('File size too large')) {\n reject(new utils.errors.PayloadTooLargeError());\n } else {\n reject(new Error(`Error uploading to cloudinary: ${err.message}`));\n }\n return;\n }\n\n if (!image) {\n return;\n }\n\n if (image.resource_type === 'video') {\n file.previewUrl = cloudinary.url(`${image.public_id}.gif`, {\n video_sampling: 6,\n delay: 200,\n width: 250,\n crop: 'scale',\n resource_type: 'video',\n });\n }\n\n file.url = image.secure_url;\n file.provider_metadata = {\n public_id: image.public_id,\n resource_type: image.resource_type,\n };\n\n resolve();\n });\n\n if (file.stream) {\n file.stream.pipe(uploadStream);\n } else if (file.buffer) {\n intoStream(file.buffer).pipe(uploadStream);\n } else {\n throw new Error('Missing file stream or buffer');\n }\n });\n };\n\n return {\n uploadStream(file: File, customConfig = {}) {\n return upload(file, customConfig);\n },\n upload(file: File, customConfig = {}) {\n return upload(file, customConfig);\n },\n async delete(file: File, customConfig = {}) {\n try {\n const { resource_type: resourceType, public_id: publicId } = file.provider_metadata ?? {};\n const deleteConfig = {\n resource_type: (resourceType || 'image') as string,\n invalidate: true,\n ...customConfig,\n };\n\n const response = await cloudinary.uploader.destroy(`${publicId}`, deleteConfig);\n\n if (response.result !== 'ok' && response.result !== 'not found') {\n throw new Error(response.result);\n }\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Error deleting on cloudinary: ${error.message}`);\n }\n\n throw error;\n }\n },\n };\n },\n};\n"],"names":["init","options","cloudinary","config","upload","file","customConfig","Promise","resolve","reject","resource_type","public_id","hash","ext","filename","path","folder","uploadMethod","size","uploader","upload_stream","upload_chunked_stream","uploadStream","err","image","message","includes","utils","errors","PayloadTooLargeError","Error","previewUrl","url","video_sampling","delay","width","crop","secure_url","provider_metadata","stream","pipe","buffer","intoStream","delete","resourceType","publicId","deleteConfig","invalidate","response","destroy","result","error"],"mappings":"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"}