{"version":3,"file":"register.mjs","sources":["../../server/src/register.ts"],"sourcesContent":["import _ from 'lodash';\nimport sharp from 'sharp';\n\nimport { errors, file } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nimport registerUploadMiddleware from './middlewares/upload';\nimport spec from '../../documentation/content-api.json';\nimport type { Config, File, InputFile } from './types';\nimport { aiMetadataJob } from './models/ai-metadata-job';\n\nconst { PayloadTooLargeError } = errors;\nconst { bytesToHumanReadable, kbytesToBytes } = file;\n\n/**\n * Register upload plugin\n */\nexport async function register({ strapi }: { strapi: Core.Strapi }) {\n  // Register AI metadata job model\n  strapi.get('models').add(aiMetadataJob);\n\n  const raw = strapi.config.get<Partial<Config> | null | undefined>('plugin::upload') ?? {};\n  // createProvider needs a provider; empty get() (e.g. in tests) still has defaults.\n  const uploadConfig = {\n    provider: 'local' as const,\n    providerOptions: {} as Config['providerOptions'],\n    actionOptions: {} as Config['actionOptions'],\n    ...raw,\n  } as Config;\n\n  // Configure sharp memory management\n  const { cache = false, concurrency = 1 } = uploadConfig.sharp ?? {};\n  sharp.cache(cache);\n  sharp.concurrency(concurrency);\n\n  strapi.plugin('upload').provider = createProvider(uploadConfig);\n\n  await registerUploadMiddleware({ strapi });\n\n  if (strapi.plugin('graphql')) {\n    const { installGraphqlExtension } = await import('./graphql.js');\n    installGraphqlExtension({ strapi });\n  }\n\n  if (strapi.plugin('documentation')) {\n    strapi\n      .plugin('documentation')\n      .service('override')\n      .registerOverride(spec, {\n        pluginOrigin: 'upload',\n        excludeFromGeneration: ['upload'],\n      });\n  }\n}\n\nconst createProvider = (config: Config) => {\n  const { providerOptions, actionOptions = {} } = config;\n\n  const providerName = _.toLower(config.provider);\n  let provider;\n\n  let modulePath;\n  try {\n    modulePath = require.resolve(`@strapi/provider-upload-${providerName}`);\n  } catch (error) {\n    if (\n      typeof error === 'object' &&\n      error !== null &&\n      'code' in error &&\n      error.code === 'MODULE_NOT_FOUND'\n    ) {\n      modulePath = providerName;\n    } else {\n      throw error;\n    }\n  }\n\n  try {\n    provider = require(modulePath);\n  } catch (err) {\n    const newError = new Error(`Could not load upload provider \"${providerName}\".`);\n\n    if (err instanceof Error) {\n      newError.stack = err.stack;\n    }\n\n    throw newError;\n  }\n\n  const providerInstance = provider.init(providerOptions);\n\n  if (!providerInstance.delete) {\n    throw new Error(`The upload provider \"${providerName}\" doesn't implement the delete method.`);\n  }\n\n  if (!providerInstance.upload && !providerInstance.uploadStream) {\n    throw new Error(\n      `The upload provider \"${providerName}\" doesn't implement the uploadStream nor the upload method.`\n    );\n  }\n\n  if (!providerInstance.uploadStream) {\n    process.emitWarning(\n      `The upload provider \"${providerName}\" doesn't implement the uploadStream function. Strapi will fallback on the upload method. Some performance issues may occur.`\n    );\n  }\n\n  const wrappedProvider = _.mapValues(providerInstance, (method, methodName) => {\n    return async (file: File, options = actionOptions[methodName]) =>\n      providerInstance[methodName](file, options);\n  });\n\n  return Object.assign(Object.create(baseProvider), wrappedProvider);\n};\n\nconst baseProvider = {\n  extend(obj: unknown) {\n    Object.assign(this, obj);\n  },\n  checkFileSize(file: InputFile, { sizeLimit }: { sizeLimit: number }) {\n    if (sizeLimit && kbytesToBytes(file.size) > sizeLimit) {\n      throw new PayloadTooLargeError(\n        `${file.originalFilename} exceeds size limit of ${bytesToHumanReadable(sizeLimit)}.`\n      );\n    }\n  },\n  getSignedUrl(file: File) {\n    return file;\n  },\n  isPrivate() {\n    return false;\n  },\n};\n"],"names":["PayloadTooLargeError","errors","bytesToHumanReadable","kbytesToBytes","file","register","strapi","get","add","aiMetadataJob","raw","config","uploadConfig","provider","providerOptions","actionOptions","cache","concurrency","sharp","plugin","createProvider","registerUploadMiddleware","installGraphqlExtension","service","registerOverride","spec","pluginOrigin","excludeFromGeneration","providerName","_","toLower","modulePath","require","resolve","error","code","err","newError","Error","stack","providerInstance","init","delete","upload","uploadStream","process","emitWarning","wrappedProvider","mapValues","method","methodName","options","Object","assign","create","baseProvider","extend","obj","checkFileSize","sizeLimit","size","originalFilename","getSignedUrl","isPrivate"],"mappings":"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"}