{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import { pipeline } from 'stream';\nimport fs, { ReadStream } from 'fs';\nimport path from 'path';\nimport fse from 'fs-extra';\nimport * as utils from '@strapi/utils';\n\n// Needed to load global.strapi without having to put @strapi/types in the regular dependencies\nimport type {} from '@strapi/types';\n\ninterface File {\n name: string;\n alternativeText?: string;\n caption?: string;\n width?: number;\n height?: number;\n formats?: Record;\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;\n stream?: ReadStream;\n buffer?: Buffer;\n}\n\nconst { PayloadTooLargeError } = utils.errors;\nconst { kbytesToBytes, bytesToHumanReadable } = utils.file;\n\nconst UPLOADS_FOLDER_NAME = 'uploads';\n\ninterface InitOptions {\n sizeLimit?: number;\n}\n\ninterface CheckFileSizeOptions {\n sizeLimit?: number;\n}\n\nexport default {\n init({ sizeLimit: providerOptionsSizeLimit }: InitOptions = {}) {\n // TODO V5: remove providerOptions sizeLimit\n if (providerOptionsSizeLimit) {\n process.emitWarning(\n '[deprecated] In future versions, \"sizeLimit\" argument will be ignored from upload.config.providerOptions. Move it to upload.config'\n );\n }\n\n // Ensure uploads folder exists\n const uploadPath = path.resolve(strapi.dirs.static.public, UPLOADS_FOLDER_NAME);\n if (!fse.pathExistsSync(uploadPath)) {\n throw new Error(\n `The upload folder (${uploadPath}) doesn't exist or is not accessible. Please make sure it exists.`\n );\n }\n\n return {\n checkFileSize(file: File, options: CheckFileSizeOptions) {\n const { sizeLimit } = options ?? {};\n\n // TODO V5: remove providerOptions sizeLimit\n if (providerOptionsSizeLimit) {\n if (kbytesToBytes(file.size) > providerOptionsSizeLimit)\n throw new PayloadTooLargeError(\n `${file.name} exceeds size limit of ${bytesToHumanReadable(\n providerOptionsSizeLimit\n )}.`\n );\n } else if (sizeLimit) {\n if (kbytesToBytes(file.size) > sizeLimit)\n throw new PayloadTooLargeError(\n `${file.name} exceeds size limit of ${bytesToHumanReadable(sizeLimit)}.`\n );\n }\n },\n uploadStream(file: File): Promise {\n if (!file.stream) {\n return Promise.reject(new Error('Missing file stream'));\n }\n\n const { stream } = file;\n\n return new Promise((resolve, reject) => {\n pipeline(\n stream,\n fs.createWriteStream(path.join(uploadPath, `${file.hash}${file.ext}`)),\n (err) => {\n if (err) {\n return reject(err);\n }\n\n file.url = `/${UPLOADS_FOLDER_NAME}/${file.hash}${file.ext}`;\n\n resolve();\n }\n );\n });\n },\n upload(file: File): Promise {\n if (!file.buffer) {\n return Promise.reject(new Error('Missing file buffer'));\n }\n\n const { buffer } = file;\n\n return new Promise((resolve, reject) => {\n // write file in public/assets folder\n fs.writeFile(path.join(uploadPath, `${file.hash}${file.ext}`), buffer, (err) => {\n if (err) {\n return reject(err);\n }\n\n file.url = `/${UPLOADS_FOLDER_NAME}/${file.hash}${file.ext}`;\n\n resolve();\n });\n });\n },\n replaceStream(newFile: File, oldFile: File): Promise {\n if (!newFile.stream) {\n return Promise.reject(new Error('Missing file stream'));\n }\n\n // If the destination path is unchanged, writing the new file overwrites\n // the old one atomically. If the hash or extension changed, write the\n // new file first then unlink the old one so we never leave a gap.\n const newPath = path.join(uploadPath, `${newFile.hash}${newFile.ext}`);\n const oldPath = path.join(uploadPath, `${oldFile.hash}${oldFile.ext}`);\n const samePath = newPath === oldPath;\n\n const { stream } = newFile;\n\n return new Promise((resolve, reject) => {\n pipeline(stream, fs.createWriteStream(newPath), (err) => {\n if (err) {\n return reject(err);\n }\n\n newFile.url = `/${UPLOADS_FOLDER_NAME}/${newFile.hash}${newFile.ext}`;\n\n if (!samePath && fs.existsSync(oldPath)) {\n fs.unlink(oldPath, (unlinkErr) => {\n if (unlinkErr) {\n return reject(unlinkErr);\n }\n resolve();\n });\n return;\n }\n\n resolve();\n });\n });\n },\n replace(newFile: File, oldFile: File): Promise {\n if (!newFile.buffer) {\n return Promise.reject(new Error('Missing file buffer'));\n }\n\n const newPath = path.join(uploadPath, `${newFile.hash}${newFile.ext}`);\n const oldPath = path.join(uploadPath, `${oldFile.hash}${oldFile.ext}`);\n const samePath = newPath === oldPath;\n\n const { buffer } = newFile;\n\n return new Promise((resolve, reject) => {\n fs.writeFile(newPath, buffer, (err) => {\n if (err) {\n return reject(err);\n }\n\n newFile.url = `/${UPLOADS_FOLDER_NAME}/${newFile.hash}${newFile.ext}`;\n\n if (!samePath && fs.existsSync(oldPath)) {\n fs.unlink(oldPath, (unlinkErr) => {\n if (unlinkErr) {\n return reject(unlinkErr);\n }\n resolve();\n });\n return;\n }\n\n resolve();\n });\n });\n },\n delete(file: File): Promise {\n return new Promise((resolve, reject) => {\n const filePath = path.join(uploadPath, `${file.hash}${file.ext}`);\n\n if (!fs.existsSync(filePath)) {\n resolve(\"File doesn't exist\");\n return;\n }\n\n // remove file from public/assets folder\n fs.unlink(filePath, (err) => {\n if (err) {\n return reject(err);\n }\n\n resolve();\n });\n });\n },\n };\n },\n};\n"],"names":["PayloadTooLargeError","utils","errors","kbytesToBytes","bytesToHumanReadable","file","UPLOADS_FOLDER_NAME","init","sizeLimit","providerOptionsSizeLimit","process","emitWarning","uploadPath","path","resolve","strapi","dirs","static","public","fse","pathExistsSync","Error","checkFileSize","options","size","name","uploadStream","stream","Promise","reject","pipeline","fs","createWriteStream","join","hash","ext","err","url","upload","buffer","writeFile","replaceStream","newFile","oldFile","newPath","oldPath","samePath","existsSync","unlink","unlinkErr","replace","delete","filePath"],"mappings":"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"}