{"version":3,"file":"get-enabled-plugins.mjs","sources":["../../../src/loaders/plugins/get-enabled-plugins.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport { dirname, join, resolve } from 'path';\nimport { statSync, existsSync } from 'fs';\nimport _ from 'lodash';\nimport { get, pickBy, defaultsDeep, map, prop, pipe } from 'lodash/fp';\nimport { strings } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { getUserPluginsConfig } from './get-user-plugins-config';\n\ninterface PluginMeta {\n  enabled: boolean;\n  pathToPlugin?: string;\n  info: Record<string, unknown>;\n  packageInfo?: Record<string, unknown>;\n}\n\ntype PluginMetas = Record<string, PluginMeta>;\n\ninterface PluginInfo {\n  name: string;\n  kind: string;\n}\n\ninterface PluginDeclaration {\n  enabled: boolean;\n  resolve: string;\n  isModule: boolean;\n}\n\n/**\n * otherwise known as \"core features\"\n *\n * NOTE: These are excluded from the content manager plugin list, as they are always enabled.\n *       See admin.ts server controller on the content-manager plugin for more details.\n */\nconst INTERNAL_PLUGINS = [\n  '@strapi/content-manager',\n  '@strapi/content-type-builder',\n  '@strapi/email',\n  '@strapi/upload',\n  '@strapi/i18n',\n  '@strapi/content-releases',\n  '@strapi/review-workflows',\n];\n\nconst isStrapiPlugin = (info: PluginInfo) => get('strapi.kind', info) === 'plugin';\n\nconst validatePluginName = (pluginName: string) => {\n  if (!strings.isKebabCase(pluginName)) {\n    throw new Error(`Plugin name \"${pluginName}\" is not in kebab (an-example-of-kebab-case)`);\n  }\n};\n\nconst toDetailedDeclaration = (declaration: boolean | PluginDeclaration) => {\n  if (typeof declaration === 'boolean') {\n    return { enabled: declaration };\n  }\n\n  const detailedDeclaration: { enabled: boolean; pathToPlugin?: string } = {\n    enabled: declaration.enabled,\n  };\n\n  if (declaration?.resolve) {\n    let pathToPlugin = '';\n\n    if (declaration.isModule) {\n      /**\n       * we only want the node_module here, not the package.json\n       */\n      pathToPlugin = join(declaration.resolve, '..');\n    } else {\n      try {\n        pathToPlugin = dirname(require.resolve(declaration.resolve));\n      } catch (e) {\n        pathToPlugin = resolve(strapi.dirs.app.root, declaration.resolve);\n\n        if (!existsSync(pathToPlugin) || !statSync(pathToPlugin).isDirectory()) {\n          throw new Error(`${declaration.resolve} couldn't be resolved`);\n        }\n      }\n    }\n\n    detailedDeclaration.pathToPlugin = pathToPlugin;\n  }\n\n  return detailedDeclaration;\n};\n\nexport const getEnabledPlugins = async (strapi: Core.Strapi, { client } = { client: false }) => {\n  const internalPlugins: PluginMetas = {};\n\n  for (const dep of INTERNAL_PLUGINS) {\n    const packagePath = join(dep, 'package.json');\n\n    // NOTE: internal plugins should be resolved from the strapi package\n    const packageModulePath = require.resolve(packagePath, {\n      paths: [require.resolve('@strapi/strapi/package.json'), process.cwd()],\n    });\n\n    const packageInfo = require(packageModulePath);\n\n    validatePluginName(packageInfo.strapi.name);\n    internalPlugins[packageInfo.strapi.name] = {\n      ...toDetailedDeclaration({ enabled: true, resolve: packageModulePath, isModule: client }),\n      info: packageInfo.strapi,\n      packageInfo,\n    };\n  }\n\n  const installedPlugins: PluginMetas = {};\n  const dependencies = strapi.config.get('info.dependencies', {});\n\n  for (const dep of Object.keys(dependencies)) {\n    const packagePath = join(dep, 'package.json');\n    let packageInfo;\n    try {\n      packageInfo = require(packagePath);\n    } catch {\n      continue;\n    }\n\n    if (isStrapiPlugin(packageInfo)) {\n      validatePluginName(packageInfo.strapi.name);\n      installedPlugins[packageInfo.strapi.name] = {\n        ...toDetailedDeclaration({ enabled: true, resolve: packagePath, isModule: client }),\n        info: {\n          ...packageInfo.strapi,\n          packageName: packageInfo.name,\n        },\n        packageInfo,\n      };\n    }\n  }\n\n  const declaredPlugins: PluginMetas = {};\n  const userPluginsConfig = await getUserPluginsConfig();\n\n  _.forEach(userPluginsConfig, (declaration, pluginName) => {\n    validatePluginName(pluginName);\n\n    declaredPlugins[pluginName] = {\n      ...toDetailedDeclaration(declaration),\n      info: {},\n    };\n\n    const { pathToPlugin } = declaredPlugins[pluginName];\n\n    // for manually resolved plugins\n    if (pathToPlugin) {\n      const packagePath = join(pathToPlugin, 'package.json');\n      const packageInfo = require(packagePath);\n\n      if (isStrapiPlugin(packageInfo)) {\n        declaredPlugins[pluginName].info = packageInfo.strapi || {};\n        declaredPlugins[pluginName].packageInfo = packageInfo;\n      }\n    }\n  });\n\n  const declaredPluginsResolves = map(prop('pathToPlugin'), declaredPlugins);\n  const installedPluginsNotAlreadyUsed = pickBy(\n    (p) => !declaredPluginsResolves.includes(p.pathToPlugin),\n    installedPlugins\n  );\n\n  const enabledPlugins = pipe(\n    defaultsDeep(declaredPlugins),\n    defaultsDeep(installedPluginsNotAlreadyUsed),\n    pickBy((p: PluginMeta) => p.enabled)\n  )(internalPlugins);\n\n  return enabledPlugins;\n};\n"],"names":["INTERNAL_PLUGINS","isStrapiPlugin","info","get","validatePluginName","pluginName","strings","isKebabCase","Error","toDetailedDeclaration","declaration","enabled","detailedDeclaration","resolve","pathToPlugin","isModule","join","dirname","require","e","strapi","dirs","app","root","existsSync","statSync","isDirectory","getEnabledPlugins","client","internalPlugins","dep","packagePath","packageModulePath","paths","process","cwd","packageInfo","name","installedPlugins","dependencies","config","Object","keys","packageName","declaredPlugins","userPluginsConfig","getUserPluginsConfig","_","forEach","declaredPluginsResolves","map","prop","installedPluginsNotAlreadyUsed","pickBy","p","includes","enabledPlugins","pipe","defaultsDeep"],"mappings":"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"}