{"version":3,"file":"index.mjs","sources":["../../../src/loaders/plugins/index.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\nimport { defaultsDeep, defaults, getOr, get } from 'lodash/fp';\nimport * as resolve from 'resolve.exports';\n\nimport { env } from '@strapi/utils';\nimport type { Core, Plugin, Struct } from '@strapi/types';\nimport { loadConfigFile } from '../../utils/load-config-file';\nimport { loadFiles } from '../../utils/load-files';\nimport { getEnabledPlugins } from './get-enabled-plugins';\nimport { getUserPluginsConfig } from './get-user-plugins-config';\nimport { getGlobalId } from '../../domain/content-type';\n\ninterface Plugins {\n  [key: string]: Plugin.LoadedPlugin;\n}\n\nconst defaultPlugin = {\n  bootstrap() {},\n  destroy() {},\n  register() {},\n  config: {\n    default: {},\n    validator() {},\n  },\n  routes: [],\n  controllers: {},\n  services: {},\n  policies: {},\n  middlewares: {},\n  contentTypes: {},\n};\n\nconst applyUserExtension = async (plugins: Plugins) => {\n  const extensionsDir = strapi.dirs.dist.extensions;\n  if (!(await fse.pathExists(extensionsDir))) {\n    return;\n  }\n\n  const extendedSchemas = await loadFiles(extensionsDir, '**/content-types/**/schema.json');\n  const strapiServers = await loadFiles(extensionsDir, '**/strapi-server.js');\n\n  for (const pluginName of Object.keys(plugins)) {\n    const plugin = plugins[pluginName];\n    // first: load json schema\n    for (const ctName of Object.keys(plugin.contentTypes)) {\n      const extendedSchema = get([pluginName, 'content-types', ctName, 'schema'], extendedSchemas);\n      if (extendedSchema) {\n        plugin.contentTypes[ctName].schema = {\n          ...plugin.contentTypes[ctName].schema,\n          ...extendedSchema,\n        };\n      }\n    }\n    // second: execute strapi-server extension\n    const strapiServer = get([pluginName, 'strapi-server'], strapiServers);\n    if (strapiServer) {\n      plugins[pluginName] = await strapiServer(plugin);\n    }\n  }\n};\n\nconst applyUserConfig = async (plugins: Plugins) => {\n  const userPluginsConfig = await getUserPluginsConfig();\n\n  for (const pluginName of Object.keys(plugins)) {\n    const plugin = plugins[pluginName];\n    const userPluginConfig = getOr({}, `${pluginName}.config`, userPluginsConfig);\n    const defaultConfig =\n      typeof plugin.config.default === 'function'\n        ? plugin.config.default({ env })\n        : plugin.config.default;\n\n    const config = defaultsDeep(defaultConfig, userPluginConfig);\n    try {\n      plugin.config.validator(config);\n    } catch (e) {\n      if (e instanceof Error) {\n        throw new Error(`Error regarding ${pluginName} config: ${e.message}`);\n      }\n\n      throw e;\n    }\n    plugin.config = config;\n  }\n};\n\nexport default async function loadPlugins(strapi: Core.Strapi) {\n  const plugins: Plugins = {};\n\n  const enabledPlugins = await getEnabledPlugins(strapi);\n\n  strapi.config.set('enabledPlugins', enabledPlugins);\n\n  for (const pluginName of Object.keys(enabledPlugins)) {\n    const enabledPlugin = enabledPlugins[pluginName];\n\n    let serverEntrypointPath;\n    let resolvedExport = './strapi-server.js';\n\n    try {\n      resolvedExport = (\n        resolve.exports(enabledPlugin.packageInfo, 'strapi-server', {\n          require: true,\n        }) ?? './strapi-server.js'\n      ).toString();\n    } catch (e) {\n      // no export map or missing strapi-server export => fallback to default\n    }\n\n    try {\n      serverEntrypointPath = join(enabledPlugin.pathToPlugin, resolvedExport);\n    } catch (e) {\n      throw new Error(\n        `Error loading the plugin ${pluginName} because ${pluginName} is not installed. Please either install the plugin or remove its configuration.`\n      );\n    }\n\n    // only load plugins with a server entrypoint\n    if (!(await fse.pathExists(serverEntrypointPath))) {\n      continue;\n    }\n\n    const pluginServer = loadConfigFile(serverEntrypointPath);\n    plugins[pluginName] = {\n      ...defaultPlugin,\n      ...pluginServer,\n      contentTypes: formatContentTypes(pluginName, pluginServer.contentTypes ?? {}),\n      config: defaults(defaultPlugin.config, pluginServer.config),\n      routes: pluginServer.routes ?? defaultPlugin.routes,\n    };\n  }\n\n  // TODO: validate plugin format\n  await applyUserConfig(plugins);\n  await applyUserExtension(plugins);\n\n  for (const pluginName of Object.keys(plugins)) {\n    strapi.get('plugins').add(pluginName, plugins[pluginName]);\n  }\n}\n\nconst formatContentTypes = (\n  pluginName: string,\n  contentTypes: Record<string, { schema: Struct.ContentTypeSchema }>\n) => {\n  Object.values(contentTypes).forEach((definition) => {\n    const { schema } = definition;\n\n    Object.assign(schema, {\n      plugin: pluginName,\n      collectionName:\n        schema.collectionName || `${pluginName}_${schema.info.singularName}`.toLowerCase(),\n      globalId: getGlobalId(schema, pluginName),\n    });\n  });\n\n  return contentTypes;\n};\n"],"names":["defaultPlugin","bootstrap","destroy","register","config","default","validator","routes","controllers","services","policies","middlewares","contentTypes","applyUserExtension","plugins","extensionsDir","strapi","dirs","dist","extensions","fse","pathExists","extendedSchemas","loadFiles","strapiServers","pluginName","Object","keys","plugin","ctName","extendedSchema","get","schema","strapiServer","applyUserConfig","userPluginsConfig","getUserPluginsConfig","userPluginConfig","getOr","defaultConfig","env","defaultsDeep","e","Error","message","loadPlugins","enabledPlugins","getEnabledPlugins","set","enabledPlugin","serverEntrypointPath","resolvedExport","resolve","exports","packageInfo","require","toString","join","pathToPlugin","pluginServer","loadConfigFile","formatContentTypes","defaults","add","values","forEach","definition","assign","collectionName","info","singularName","toLowerCase","globalId","getGlobalId"],"mappings":"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"}