{"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;\nexport type ControllerMap = Record;\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":";;;AAWA,MAAMA,sBAAsB,CAACC,MAAAA,GAAAA;AAC3B,IAAA,MAAMC,cAAoC,EAAC;AAC3C,IAAA,MAAMC,YAA2B,EAAC;IAElC,OAAO;AACL;;QAGAC,IAAAA,CAAAA,GAAAA;YACE,OAAOC,MAAAA,CAAOD,IAAI,CAACF,WAAAA,CAAAA;AACrB,SAAA;AAEA;;AAEC,QACDI,KAAIC,GAAmB,EAAA;YACrB,IAAIJ,SAAS,CAACI,GAAAA,CAAI,EAAE;gBAClB,OAAOJ,SAAS,CAACI,GAAI,CAAA;AACvB;YAEA,MAAMC,UAAAA,GAAaN,WAAW,CAACK,GAAI,CAAA;AAEnC,YAAA,IAAIC,UAAY,EAAA;AACdL,gBAAAA,SAAS,CAACI,GAAI,CAAA,GAAG,OAAOC,UAAAA,KAAe,aAAaA,UAAW,CAAA;AAAEP,oBAAAA;iBAAYO,CAAAA,GAAAA,UAAAA;gBAC7E,OAAOL,SAAS,CAACI,GAAI,CAAA;AACvB;AACF,SAAA;AAEA;;AAEC,QACDE,QAAOC,SAAiB,EAAA;AACtB,YAAA,MAAMC,sBAAsBC,MAAO,CAAA,CAACC,GAAGN,GAAQO,GAAAA,YAAAA,CAAaP,KAAKG,SAAYR,CAAAA,CAAAA,CAAAA,WAAAA,CAAAA;AAE7E,YAAA,MAAMa,MAAM,EAAC;AACb,YAAA,KAAK,MAAMR,GAAAA,IAAOF,MAAOD,CAAAA,IAAI,CAACO,mBAA0C,CAAA,CAAA;gBACtEN,MAAOW,CAAAA,cAAc,CAACD,GAAAA,EAAKR,GAAK,EAAA;oBAC9BU,UAAY,EAAA,IAAA;oBACZX,GAAK,EAAA,IAAA;wBACH,OAAO,IAAI,CAACA,GAAG,CAACC,GAAAA,CAAAA;AAClB;AACF,iBAAA,CAAA;AACF;YAEA,OAAOQ,GAAAA;AACT,SAAA;AAEA;;QAGAG,GAAAA,CAAAA,CAAIX,GAAmB,EAAEY,KAAwB,EAAA;YAC/CjB,WAAW,CAACK,IAAI,GAAGY,KAAAA;YACnB,OAAOhB,SAAS,CAACI,GAAI,CAAA;AACrB,YAAA,OAAO,IAAI;AACb,SAAA;AAEA;;QAGAa,GAAAA,CAAAA,CAAIV,SAAiB,EAAEW,cAAoC,EAAA;AACzD,YAAA,KAAK,MAAMC,cAAAA,IAAkBjB,MAAOD,CAAAA,IAAI,CAACiB,cAAqC,CAAA,CAAA;gBAC5E,MAAMb,UAAAA,GAAaa,cAAc,CAACC,cAAe,CAAA;gBACjD,MAAMf,GAAAA,GAAMgB,aAAaD,cAAgBZ,EAAAA,SAAAA,CAAAA;gBAEzC,IAAIc,GAAAA,CAAIjB,KAAKL,WAAc,CAAA,EAAA;AACzB,oBAAA,MAAM,IAAIuB,KAAM,CAAA,CAAC,WAAW,EAAElB,GAAAA,CAAI,6BAA6B,CAAC,CAAA;AAClE;gBAEAL,WAAW,CAACK,IAAI,GAAGC,UAAAA;AACrB;AAEA,YAAA,OAAO,IAAI;AACb,SAAA;AAEA;;QAGAkB,MAAAA,CAAAA,CAAOC,aAA6B,EAAEC,QAA4B,EAAA;AAChE,YAAA,MAAMC,iBAAoB,GAAA,IAAI,CAACvB,GAAG,CAACqB,aAAAA,CAAAA;AAEnC,YAAA,IAAI,CAACE,iBAAmB,EAAA;AACtB,gBAAA,MAAM,IAAIJ,KAAM,CAAA,CAAC,WAAW,EAAEE,aAAAA,CAAc,cAAc,CAAC,CAAA;AAC7D;AAEA,YAAA,MAAMG,gBAAgBF,QAASC,CAAAA,iBAAAA,CAAAA;YAC/B1B,SAAS,CAACwB,cAAc,GAAGG,aAAAA;AAE3B,YAAA,OAAO,IAAI;AACb;AACF,KAAA;AACF;;;;"}