{"version":3,"file":"index.mjs","sources":["../../../../src/core/loaders/plugins/index.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\nimport { defaultsDeep, defaults, getOr, get } from 'lodash/fp';\nimport { env } from '@strapi/utils';\nimport type { Strapi, Plugin } from '@strapi/types';\nimport { loadFile } from '../../app-configuration/load-config-file';\nimport loadFiles from '../../../load/load-files';\nimport { getEnabledPlugins } from './get-enabled-plugins';\nimport { getUserPluginsConfig } from './get-user-plugins-config';\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: 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\n    try {\n      serverEntrypointPath = join(enabledPlugin.pathToPlugin, 'strapi-server.js');\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 it's 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 = loadFile(serverEntrypointPath);\n    plugins[pluginName] = {\n      ...defaultPlugin,\n      ...pluginServer,\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.container.get('plugins').add(pluginName, plugins[pluginName]);\n  }\n}\n"],"names":["strapi"],"mappings":"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"}