{"version":3,"file":"factories.mjs","sources":["../src/factories.ts"],"sourcesContent":["import { pipe, omit, pick } from 'lodash/fp';\nimport type { Core, UID, Utils } from '@strapi/types';\n\nimport { createController } from './core-api/controller';\nimport { CoreContentTypeRouteValidator } from './core-api/routes/validation';\nimport { createService } from './core-api/service';\nimport { createRoutes } from './core-api/routes';\n\nconst symbols = {\n  CustomController: Symbol('StrapiCustomCoreController'),\n} as const;\n\ntype WithStrapiCallback<T> = T | (<S extends { strapi: Core.Strapi }>(params: S) => T);\n\nconst createCoreController = <\n  TUID extends UID.ContentType,\n  TController extends Core.CoreAPI.Controller.Extendable<TUID>,\n>(\n  uid: TUID,\n  cfg?: WithStrapiCallback<\n    Utils.PartialWithThis<Core.CoreAPI.Controller.Extendable<TUID> & TController>\n  >\n) => {\n  return ({\n    strapi,\n  }: {\n    strapi: Core.Strapi;\n  }): TController & Core.CoreAPI.Controller.ContentType<TUID> => {\n    const baseController = createController({ contentType: strapi.contentType(uid) });\n\n    const userCtrl = typeof cfg === 'function' ? cfg({ strapi }) : (cfg ?? ({} as any));\n\n    for (const methodName of Object.keys(baseController) as Array<keyof typeof baseController>) {\n      if (userCtrl[methodName] === undefined) {\n        userCtrl[methodName] = baseController[methodName];\n      }\n    }\n\n    Object.setPrototypeOf(userCtrl, baseController);\n\n    const isCustom = typeof cfg !== 'undefined';\n    if (isCustom) {\n      Object.defineProperty(userCtrl, symbols.CustomController, {\n        writable: false,\n        configurable: false,\n        enumerable: false,\n      });\n    }\n\n    return userCtrl;\n  };\n};\n\nfunction createCoreService<\n  TUID extends UID.ContentType,\n  TService extends Core.CoreAPI.Service.Extendable<TUID>,\n>(\n  uid: TUID,\n  cfg?: WithStrapiCallback<Utils.PartialWithThis<Core.CoreAPI.Service.Extendable<TUID> & TService>>\n) {\n  return ({\n    strapi,\n  }: {\n    strapi: Core.Strapi;\n  }): TService & Core.CoreAPI.Service.ContentType<TUID> => {\n    const baseService = createService({ contentType: strapi.contentType(uid) });\n\n    const userService = typeof cfg === 'function' ? cfg({ strapi }) : (cfg ?? ({} as any));\n\n    for (const methodName of Object.keys(baseService) as Array<keyof typeof baseService>) {\n      if (userService[methodName] === undefined) {\n        userService[methodName] = baseService[methodName];\n      }\n    }\n\n    Object.setPrototypeOf(userService, baseService);\n    return userService;\n  };\n}\n\nfunction createCoreRouter<T extends UID.ContentType>(\n  uid: T,\n  cfg?: Core.CoreAPI.Router.RouterConfig<T>\n): Core.CoreAPI.Router.Router {\n  const { prefix, config = {}, only, except, type = 'content-api' } = cfg ?? {};\n  let routes: Core.CoreAPI.Router.Route[];\n\n  return {\n    type,\n    prefix,\n    get routes(): Core.CoreAPI.Router.Route[] {\n      if (!routes) {\n        const contentType = strapi.contentType(uid);\n\n        const defaultRoutes = createRoutes({ contentType, strapi });\n        const keys = Object.keys(defaultRoutes) as Array<keyof typeof defaultRoutes>;\n\n        keys.forEach((routeName) => {\n          const defaultRoute = defaultRoutes[routeName];\n\n          defaultRoute.config = (config[routeName] ?? {}) as Core.RouteConfig;\n        });\n\n        const selectedRoutes = pipe(\n          (routes) => (except ? omit(except, routes) : routes),\n          (routes) => (only ? pick(only, routes) : routes)\n        )(defaultRoutes);\n\n        routes = Object.values(selectedRoutes);\n      }\n\n      return routes;\n    },\n  };\n}\n\nconst createCoreValidator = <T extends UID.ContentType>(\n  uid: T,\n  strapi: Core.Strapi\n): CoreContentTypeRouteValidator => {\n  return new CoreContentTypeRouteValidator(strapi, uid);\n};\n\nconst isCustomController = <T extends Core.Controller>(controller: T): boolean => {\n  return symbols.CustomController in controller;\n};\n\nexport {\n  createCoreController,\n  createCoreService,\n  createCoreRouter,\n  createCoreValidator,\n  isCustomController,\n};\n"],"names":["symbols","CustomController","Symbol","createCoreController","uid","cfg","strapi","baseController","createController","contentType","userCtrl","methodName","Object","keys","undefined","setPrototypeOf","isCustom","defineProperty","writable","configurable","enumerable","createCoreService","baseService","createService","userService","createCoreRouter","prefix","config","only","except","type","routes","defaultRoutes","createRoutes","forEach","routeName","defaultRoute","selectedRoutes","pipe","omit","pick","values","createCoreValidator","CoreContentTypeRouteValidator","isCustomController","controller"],"mappings":"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"}