{"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<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\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<void> {\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<void> {\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<void> {\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<void> {\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<string | void> {\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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"}