{"version":3,"file":"services.mjs","sources":["../../src/registries/services.ts"],"sourcesContent":["import { pickBy, has } from 'lodash/fp';\nimport type { Core, UID } from '@strapi/types';\nimport { addNamespace, hasNamespace } from './namespace';\n\nexport type ServiceFactory = (params: { strapi: Core.Strapi }) => Core.Service | Core.Service;\nexport type ServiceFactoryMap = Record<string, ServiceFactory>;\nexport type ServiceMap = Record<string, Core.Service>;\nexport type ServiceExtendFn = (service: Core.Service) => Core.Service;\n\nconst servicesRegistry = (strapi: Core.Strapi) => {\n  const services: ServiceFactoryMap = {};\n  const instantiatedServices: ServiceMap = {};\n\n  return {\n    /**\n     * Returns this list of registered services uids\n     */\n    keys() {\n      return Object.keys(services);\n    },\n\n    /**\n     * Returns the instance of a service. Instantiate the service if not already done\n     */\n    get(uid: UID.Service) {\n      if (instantiatedServices[uid]) {\n        return instantiatedServices[uid];\n      }\n\n      const service = services[uid];\n      if (service) {\n        instantiatedServices[uid] = typeof service === 'function' ? service({ strapi }) : service;\n        return instantiatedServices[uid];\n      }\n    },\n\n    /**\n     * Returns a map with all the services in a namespace\n     */\n    getAll(namespace: string): ServiceMap {\n      const filteredServices = pickBy((_, uid) => hasNamespace(uid, namespace))(services);\n\n      // create lazy accessor to avoid instantiating the services;\n      const map = {};\n      for (const uid of Object.keys(filteredServices)) {\n        Object.defineProperty(map, uid, {\n          enumerable: true,\n          get: () => {\n            return this.get(uid as UID.Service);\n          },\n        });\n      }\n\n      return map;\n    },\n\n    /**\n     * Registers a service\n     */\n    set(uid: string, service: ServiceFactory) {\n      services[uid] = service;\n      delete instantiatedServices[uid];\n      return this;\n    },\n\n    /**\n     * Registers a map of services for a specific namespace\n     */\n    add(namespace: string, newServices: ServiceFactoryMap) {\n      for (const serviceName of Object.keys(newServices)) {\n        const service = newServices[serviceName];\n        const uid = addNamespace(serviceName, namespace);\n\n        if (has(uid, services)) {\n          throw new Error(`Service ${uid} has already been registered.`);\n        }\n        services[uid] = service;\n      }\n\n      return this;\n    },\n\n    /**\n     * Wraps a service to extend it\n     */\n    extend(uid: UID.Service, extendFn: ServiceExtendFn) {\n      const currentService = this.get(uid);\n\n      if (!currentService) {\n        throw new Error(`Service ${uid} doesn't exist`);\n      }\n\n      const newService = extendFn(currentService);\n      instantiatedServices[uid] = newService;\n\n      return this;\n    },\n  };\n};\n\nexport default servicesRegistry;\n"],"names":["servicesRegistry","strapi","services","instantiatedServices","keys","Object","get","uid","service","getAll","namespace","filteredServices","pickBy","_","hasNamespace","map","defineProperty","enumerable","set","add","newServices","serviceName","addNamespace","has","Error","extend","extendFn","currentService","newService"],"mappings":"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"}