{"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      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","delete","filePath","existsSync","unlink"],"mappings":"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"}