{"version":3,"file":"controllers.mjs","sources":["../../src/registries/controllers.ts"],"sourcesContent":["import { pickBy, has } from 'lodash/fp';\nimport type { Core, UID } from '@strapi/types';\nimport { addNamespace, hasNamespace } from './namespace';\n\nexport type ControllerFactory =\n  | ((params: { strapi: Core.Strapi }) => Core.Controller)\n  | Core.Controller;\nexport type ControllerFactoryMap = Record<UID.Controller, ControllerFactory>;\nexport type ControllerMap = Record<UID.Controller, Core.Controller>;\nexport type ControllerExtendFn = (service: Core.Controller) => Core.Controller;\n\nconst controllersRegistry = (strapi: Core.Strapi) => {\n  const controllers: ControllerFactoryMap = {};\n  const instances: ControllerMap = {};\n\n  return {\n    /**\n     * Returns this list of registered controllers uids\n     */\n    keys() {\n      return Object.keys(controllers);\n    },\n\n    /**\n     * Returns the instance of a controller. Instantiate the controller if not already done\n     */\n    get(uid: UID.Controller) {\n      if (instances[uid]) {\n        return instances[uid];\n      }\n\n      const controller = controllers[uid];\n\n      if (controller) {\n        instances[uid] = typeof controller === 'function' ? controller({ strapi }) : controller;\n        return instances[uid];\n      }\n    },\n\n    /**\n     * Returns a map with all the controller in a namespace\n     */\n    getAll(namespace: string) {\n      const filteredControllers = pickBy((_, uid) => hasNamespace(uid, namespace))(controllers);\n\n      const map = {};\n      for (const uid of Object.keys(filteredControllers) as UID.Controller[]) {\n        Object.defineProperty(map, uid, {\n          enumerable: true,\n          get: () => {\n            return this.get(uid);\n          },\n        });\n      }\n\n      return map;\n    },\n\n    /**\n     * Registers a controller\n     */\n    set(uid: UID.Controller, value: ControllerFactory) {\n      controllers[uid] = value;\n      delete instances[uid];\n      return this;\n    },\n\n    /**\n     * Registers a map of controllers for a specific namespace\n     */\n    add(namespace: string, newControllers: ControllerFactoryMap) {\n      for (const controllerName of Object.keys(newControllers) as UID.Controller[]) {\n        const controller = newControllers[controllerName];\n        const uid = addNamespace(controllerName, namespace) as UID.Controller;\n\n        if (has(uid, controllers)) {\n          throw new Error(`Controller ${uid} has already been registered.`);\n        }\n\n        controllers[uid] = controller;\n      }\n\n      return this;\n    },\n\n    /**\n     * Wraps a controller to extend it\n     */\n    extend(controllerUID: UID.Controller, extendFn: ControllerExtendFn) {\n      const currentController = this.get(controllerUID);\n\n      if (!currentController) {\n        throw new Error(`Controller ${controllerUID} doesn't exist`);\n      }\n\n      const newController = extendFn(currentController);\n      instances[controllerUID] = newController;\n\n      return this;\n    },\n  };\n};\n\nexport default controllersRegistry;\n"],"names":["controllersRegistry","strapi","controllers","instances","keys","Object","get","uid","controller","getAll","namespace","filteredControllers","pickBy","_","hasNamespace","map","defineProperty","enumerable","set","value","add","newControllers","controllerName","addNamespace","has","Error","extend","controllerUID","extendFn","currentController","newController"],"mappings":"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"}