{"version":3,"file":"controllers.mjs","sources":["../../../src/core/registries/controllers.ts"],"sourcesContent":["import { pickBy, has } from 'lodash/fp';\nimport type { Strapi, Common } from '@strapi/types';\nimport { addNamespace, hasNamespace } from '../utils';\n\nexport type ControllerFactory =\n  | ((params: { strapi: Strapi }) => Common.Controller)\n  | Common.Controller;\nexport type ControllerFactoryMap = Record<Common.UID.Controller, ControllerFactory>;\nexport type ControllerMap = Record<Common.UID.Controller, Common.Controller>;\nexport type ControllerExtendFn = (service: Common.Controller) => Common.Controller;\n\nconst controllersRegistry = (strapi: 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: Common.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 Common.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: Common.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 Common.UID.Controller[]) {\n        const controller = newControllers[controllerName];\n        const uid = addNamespace(controllerName, namespace) as Common.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: Common.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":[],"mappings":";;AAWM,MAAA,sBAAsB,CAAC,WAAmB;AAC9C,QAAM,cAAoC,CAAA;AAC1C,QAAM,YAA2B,CAAA;AAE1B,SAAA;AAAA;AAAA;AAAA;AAAA,IAIL,OAAO;AACE,aAAA,OAAO,KAAK,WAAW;AAAA,IAChC;AAAA;AAAA;AAAA;AAAA,IAKA,IAAI,KAA4B;AAC1B,UAAA,UAAU,GAAG,GAAG;AAClB,eAAO,UAAU,GAAG;AAAA,MACtB;AAEM,YAAA,aAAa,YAAY,GAAG;AAElC,UAAI,YAAY;AACJ,kBAAA,GAAG,IAAI,OAAO,eAAe,aAAa,WAAW,EAAE,QAAQ,IAAI;AAC7E,eAAO,UAAU,GAAG;AAAA,MACtB;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKA,OAAO,WAAmB;AAClB,YAAA,sBAAsB,OAAO,CAAC,GAAG,QAAQ,aAAa,KAAK,SAAS,CAAC,EAAE,WAAW;AAExF,YAAM,MAAM,CAAA;AACZ,iBAAW,OAAO,OAAO,KAAK,mBAAmB,GAA8B;AACtE,eAAA,eAAe,KAAK,KAAK;AAAA,UAC9B,YAAY;AAAA,UACZ,KAAK,MAAM;AACF,mBAAA,KAAK,IAAI,GAAG;AAAA,UACrB;AAAA,QAAA,CACD;AAAA,MACH;AAEO,aAAA;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,IAKA,IAAI,KAA4B,OAA0B;AACxD,kBAAY,GAAG,IAAI;AACnB,aAAO,UAAU,GAAG;AACb,aAAA;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,IAKA,IAAI,WAAmB,gBAAsC;AAC3D,iBAAW,kBAAkB,OAAO,KAAK,cAAc,GAA8B;AAC7E,cAAA,aAAa,eAAe,cAAc;AAC1C,cAAA,MAAM,aAAa,gBAAgB,SAAS;AAE9C,YAAA,IAAI,KAAK,WAAW,GAAG;AACzB,gBAAM,IAAI,MAAM,cAAc,GAAG,+BAA+B;AAAA,QAClE;AAEA,oBAAY,GAAG,IAAI;AAAA,MACrB;AAEO,aAAA;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,IAKA,OAAO,eAAsC,UAA8B;AACnE,YAAA,oBAAoB,KAAK,IAAI,aAAa;AAEhD,UAAI,CAAC,mBAAmB;AACtB,cAAM,IAAI,MAAM,cAAc,aAAa,gBAAgB;AAAA,MAC7D;AAEM,YAAA,gBAAgB,SAAS,iBAAiB;AAChD,gBAAU,aAAa,IAAI;AAEpB,aAAA;AAAA,IACT;AAAA,EAAA;AAEJ;"}