{"version":3,"file":"index.mjs","sources":["../../../src/domain/module/index.ts"],"sourcesContent":["import _, { type PropertyPath, flatten } from 'lodash';\nimport { yup } from '@strapi/utils';\nimport type { Core, UID, Struct } from '@strapi/types';\n\nimport { removeNamespace } from '../../registries/namespace';\nimport { validateModule } from './validation';\n\ninterface LifecyclesState {\n  bootstrap?: boolean;\n  register?: boolean;\n  destroy?: boolean;\n}\n\nexport interface RawModule {\n  config?: Record<string, unknown>;\n  routes?: Core.Module['routes'];\n  controllers?: Core.Module['controllers'];\n  services?: Core.Module['services'];\n  contentTypes?: Core.Module['contentTypes'];\n  policies?: Core.Module['policies'];\n  middlewares?: Core.Module['middlewares'];\n  bootstrap?: (params: { strapi: Core.Strapi }) => Promise<void>;\n  register?: (params: { strapi: Core.Strapi }) => Promise<void>;\n  destroy?: (params: { strapi: Core.Strapi }) => Promise<void>;\n}\n\nexport interface Module {\n  bootstrap: () => Promise<void>;\n  register: () => Promise<void>;\n  destroy: () => Promise<void>;\n  load: () => void;\n  routes: Core.Module['routes'];\n  config<T = unknown>(key: PropertyPath, defaultVal?: T): T; // TODO: this mirrors ConfigProvider.get, we should use it directly\n  contentType: (ctName: UID.ContentType) => Struct.ContentTypeSchema;\n  contentTypes: Record<string, Struct.ContentTypeSchema>;\n  service: (serviceName: UID.Service) => Core.Service;\n  services: Record<string, Core.Service>;\n  policy: (policyName: UID.Policy) => Core.Policy;\n  policies: Record<string, Core.Policy>;\n  middleware: (middlewareName: UID.Middleware) => Core.Middleware;\n  middlewares: Record<string, Core.Middleware>;\n  controller: (controllerName: UID.Controller) => Core.Controller;\n  controllers: Record<string, Core.Controller>;\n}\n\n// Removes the namespace from a map with keys prefixed with a namespace\nconst removeNamespacedKeys = <T extends Record<string, unknown>>(map: T, namespace: string) => {\n  return _.mapKeys(map, (value, key) => removeNamespace(key, namespace));\n};\n\nconst defaultModule = {\n  config: {},\n  routes: [],\n  controllers: {},\n  services: {},\n  contentTypes: {},\n  policies: {},\n  middlewares: {},\n};\n\nexport const createModule = (\n  namespace: string,\n  rawModule: RawModule,\n  strapi: Core.Strapi\n): Module => {\n  _.defaults(rawModule, defaultModule);\n\n  try {\n    validateModule(rawModule);\n  } catch (e) {\n    if (e instanceof yup.ValidationError) {\n      throw new Error(`strapi-server.js is invalid for '${namespace}'.\\n${e.errors.join('\\n')}`);\n    }\n  }\n\n  const called: LifecyclesState = {};\n  return {\n    async bootstrap() {\n      if (called.bootstrap) {\n        throw new Error(`Bootstrap for ${namespace} has already been called`);\n      }\n      called.bootstrap = true;\n      await (rawModule.bootstrap && rawModule.bootstrap({ strapi }));\n    },\n    async register() {\n      if (called.register) {\n        throw new Error(`Register for ${namespace} has already been called`);\n      }\n      called.register = true;\n      await (rawModule.register && rawModule.register({ strapi }));\n    },\n    async destroy() {\n      if (called.destroy) {\n        throw new Error(`Destroy for ${namespace} has already been called`);\n      }\n      called.destroy = true;\n      await (rawModule.destroy && rawModule.destroy({ strapi }));\n    },\n    load() {\n      strapi.get('content-types').add(namespace, rawModule.contentTypes);\n      strapi.get('services').add(namespace, rawModule.services);\n      strapi.get('policies').add(namespace, rawModule.policies);\n      strapi.get('middlewares').add(namespace, rawModule.middlewares);\n      strapi.get('controllers').add(namespace, rawModule.controllers);\n      strapi.get('config').set(namespace, rawModule.config);\n    },\n    get routes() {\n      return rawModule.routes ?? {};\n    },\n    set routes(routes: Record<string, Core.Router>) {\n      rawModule.routes = routes;\n    },\n    config(path: PropertyPath, defaultValue: unknown) {\n      const pathArray = flatten([namespace, path]);\n      return strapi.get('config').get(pathArray, defaultValue);\n    },\n    contentType(ctName: UID.ContentType) {\n      return strapi.get('content-types').get(`${namespace}.${ctName}`);\n    },\n    get contentTypes() {\n      const contentTypes = strapi.get('content-types').getAll(namespace);\n      return removeNamespacedKeys(contentTypes, namespace);\n    },\n    service(serviceName: UID.Service) {\n      return strapi.get('services').get(`${namespace}.${serviceName}`);\n    },\n    get services() {\n      const services = strapi.get('services').getAll(namespace);\n      return removeNamespacedKeys(services, namespace);\n    },\n    policy(policyName: UID.Policy) {\n      return strapi.get('policies').get(`${namespace}.${policyName}`);\n    },\n    get policies() {\n      const policies = strapi.get('policies').getAll(namespace);\n      return removeNamespacedKeys(policies, namespace);\n    },\n    middleware(middlewareName: UID.Middleware) {\n      return strapi.get('middlewares').get(`${namespace}.${middlewareName}`);\n    },\n    get middlewares() {\n      const middlewares = strapi.get('middlewares').getAll(namespace);\n      return removeNamespacedKeys(middlewares, namespace);\n    },\n    controller(controllerName: UID.Controller) {\n      return strapi.get('controllers').get(`${namespace}.${controllerName}`);\n    },\n    get controllers() {\n      const controllers = strapi.get('controllers').getAll(namespace);\n      return removeNamespacedKeys(controllers, namespace);\n    },\n  };\n};\n"],"names":["removeNamespacedKeys","map","namespace","_","mapKeys","value","key","removeNamespace","defaultModule","config","routes","controllers","services","contentTypes","policies","middlewares","createModule","rawModule","strapi","defaults","validateModule","e","yup","ValidationError","Error","errors","join","called","bootstrap","register","destroy","load","get","add","set","path","defaultValue","pathArray","flatten","contentType","ctName","getAll","service","serviceName","policy","policyName","middleware","middlewareName","controller","controllerName"],"mappings":"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"}