diff --git a/examples/plugins/workspace-plugin/package.json b/examples/plugins/workspace-plugin/package.json index dbf760aa37..ce8e30df9d 100644 --- a/examples/plugins/workspace-plugin/package.json +++ b/examples/plugins/workspace-plugin/package.json @@ -10,9 +10,9 @@ "default": "./admin/src/index.js" }, "./strapi-server": { - "source": "./strapi-server.js", - "require": "./strapi-server.js", - "default": "./strapi-server.js" + "source": "./server/index.js", + "require": "./server/index.js", + "default": "./server/index.js" }, "./package.json": "./package.json" }, diff --git a/examples/plugins/workspace-plugin/server/index.js b/examples/plugins/workspace-plugin/server/index.js new file mode 100644 index 0000000000..2c6ddbfc0e --- /dev/null +++ b/examples/plugins/workspace-plugin/server/index.js @@ -0,0 +1,11 @@ +'use strict'; + +const config = require('./config'); +const register = require('./register'); + +module.exports = () => { + return { + register, + config, + }; +}; diff --git a/examples/plugins/workspace-plugin/strapi-server.js b/examples/plugins/workspace-plugin/strapi-server.js deleted file mode 100644 index 1c527a228b..0000000000 --- a/examples/plugins/workspace-plugin/strapi-server.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -const config = require('./server/config'); -const register = require('./server/register'); -module.exports = () => { - return { - register, - config, - }; -}; diff --git a/packages/core/admin/ee/server/src/index.ts b/packages/core/admin/ee/server/src/index.ts index fcf577a336..3d6a4e71cb 100644 --- a/packages/core/admin/ee/server/src/index.ts +++ b/packages/core/admin/ee/server/src/index.ts @@ -63,4 +63,4 @@ const getAdminEE = () => { return eeAdmin; }; -export default getAdminEE(); +export default getAdminEE; diff --git a/packages/core/admin/ee/server/src/routes/utils.ts b/packages/core/admin/ee/server/src/routes/utils.ts index 07cdff072a..a0200e880e 100644 --- a/packages/core/admin/ee/server/src/routes/utils.ts +++ b/packages/core/admin/ee/server/src/routes/utils.ts @@ -1,14 +1,11 @@ import type { Core } from '@strapi/types'; -export const enableFeatureMiddleware: Core.MiddlewareFactory = - (featureName: string) => (ctx, next) => { +export const enableFeatureMiddleware = + (featureName: string): Core.MiddlewareHandler => + (ctx, next) => { if (strapi.ee.features.isEnabled(featureName)) { return next(); } ctx.status = 404; }; - -export default { - enableFeatureMiddleware, -}; diff --git a/packages/core/admin/package.json b/packages/core/admin/package.json index fcb82c7f18..93886b29a0 100644 --- a/packages/core/admin/package.json +++ b/packages/core/admin/package.json @@ -51,8 +51,9 @@ "./strapi-server": { "types": "./dist/server/src/index.d.ts", "source": "./server/src/index.js", - "require": "./strapi-server.js", - "default": "./strapi-server.js" + "import": "./dist/server/index.mjs", + "require": "./dist/server/index.js", + "default": "./dist/server/index.js" }, "./package.json": "./package.json" }, diff --git a/packages/core/admin/packup.config.ts b/packages/core/admin/packup.config.ts index 00bece6441..88da5c8e5c 100644 --- a/packages/core/admin/packup.config.ts +++ b/packages/core/admin/packup.config.ts @@ -17,12 +17,6 @@ const config: Config = defineConfig({ tsconfig: './server/tsconfig.build.json', runtime: 'node', }, - { - source: './ee/server/src/index.ts', - import: './dist/ee/server/index.mjs', - require: './dist/ee/server/index.js', - runtime: 'node', - }, ], dist: './dist', /** diff --git a/packages/core/admin/server/src/index.ts b/packages/core/admin/server/src/index.ts index ee6d6004b9..cc5addf987 100644 --- a/packages/core/admin/server/src/index.ts +++ b/packages/core/admin/server/src/index.ts @@ -1,11 +1,37 @@ -export { default as bootstrap } from './bootstrap'; -export { default as register } from './register'; -export { default as destroy } from './destroy'; +import _ from 'lodash'; -export { default as config } from './config'; -export { default as policies } from './policies'; -export { default as routes } from './routes'; -export { default as services } from './services'; -export { default as controllers } from './controllers'; -export { default as contentTypes } from './content-types'; -export { default as middlewares } from './middlewares'; +import bootstrap from './bootstrap'; +import register from './register'; +import destroy from './destroy'; +import config from './config'; +import policies from './policies'; +import routes from './routes'; +import services from './services'; +import controllers from './controllers'; +import contentTypes from './content-types'; +import middlewares from './middlewares'; +import getEEAdmin from '../../ee/server/src'; + +// eslint-disable-next-line import/no-mutable-exports +let admin = { + bootstrap, + register, + destroy, + config, + policies, + routes, + services, + controllers, + contentTypes, + middlewares, +}; + +const mergeRoutes = (a: any, b: any, key: string) => { + return _.isArray(a) && _.isArray(b) && key === 'routes' ? a.concat(b) : undefined; +}; + +if (strapi.EE) { + admin = _.mergeWith({}, admin, getEEAdmin(), mergeRoutes); +} + +export default admin; diff --git a/packages/core/admin/strapi-server.js b/packages/core/admin/strapi-server.js deleted file mode 100644 index ccfe4e9333..0000000000 --- a/packages/core/admin/strapi-server.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -const _ = require('lodash'); - -const admin = require('./dist/server'); - -const mergeRoutes = (a, b, key) => { - return _.isArray(a) && _.isArray(b) && key === 'routes' ? a.concat(b) : undefined; -}; - -if (strapi.EE) { - const eeAdmin = require('./dist/ee/server'); - // module.exports = admin; - // TODO: change to avoid issue with lodash merging frozen objects - module.exports = _.mergeWith({}, admin, eeAdmin, mergeRoutes); -} else { - module.exports = admin; -} diff --git a/packages/core/content-manager/package.json b/packages/core/content-manager/package.json index bd342a0d76..6aca327426 100644 --- a/packages/core/content-manager/package.json +++ b/packages/core/content-manager/package.json @@ -37,8 +37,8 @@ "./strapi-server": { "types": "./dist/server/src/index.d.ts", "source": "./server/src/index.ts", - "require": "./strapi-server.js", - "default": "./strapi-server.js" + "require": "./dist/server/index.js", + "default": "./dist/server/index.js" }, "./package.json": "./package.json" }, diff --git a/packages/core/content-manager/strapi-server.js b/packages/core/content-manager/strapi-server.js deleted file mode 100644 index bf55958861..0000000000 --- a/packages/core/content-manager/strapi-server.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('./dist/server'); diff --git a/packages/core/content-releases/strapi-server.js b/packages/core/content-releases/strapi-server.js deleted file mode 100644 index bf55958861..0000000000 --- a/packages/core/content-releases/strapi-server.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('./dist/server'); diff --git a/packages/core/content-type-builder/strapi-server.js b/packages/core/content-type-builder/strapi-server.js deleted file mode 100644 index bf55958861..0000000000 --- a/packages/core/content-type-builder/strapi-server.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('./dist/server'); diff --git a/packages/core/core/package.json b/packages/core/core/package.json index 0929eebdc7..30243b80f9 100644 --- a/packages/core/core/package.json +++ b/packages/core/core/package.json @@ -99,6 +99,7 @@ "package-json": "7.0.0", "pkg-up": "3.1.0", "qs": "6.11.1", + "resolve.exports": "2.0.2", "semver": "7.5.4", "statuses": "2.0.1", "typescript": "5.2.2", diff --git a/packages/core/core/src/loaders/plugins/get-enabled-plugins.ts b/packages/core/core/src/loaders/plugins/get-enabled-plugins.ts index ee5f7eddc6..e6e6dedd42 100644 --- a/packages/core/core/src/loaders/plugins/get-enabled-plugins.ts +++ b/packages/core/core/src/loaders/plugins/get-enabled-plugins.ts @@ -11,6 +11,7 @@ interface PluginMeta { enabled: boolean; pathToPlugin?: string; info: Record; + packageInfo?: Record; } type PluginMetas = Record; @@ -102,6 +103,7 @@ export const getEnabledPlugins = async (strapi: Core.Strapi, { client } = { clie internalPlugins[packageInfo.strapi.name] = { ...toDetailedDeclaration({ enabled: true, resolve: packagePath, isModule: client }), info: packageInfo.strapi, + packageInfo, }; } @@ -125,6 +127,7 @@ export const getEnabledPlugins = async (strapi: Core.Strapi, { client } = { clie ...packageInfo.strapi, packageName: packageInfo.name, }, + packageInfo, }; } } @@ -149,6 +152,7 @@ export const getEnabledPlugins = async (strapi: Core.Strapi, { client } = { clie if (isStrapiPlugin(packageInfo)) { declaredPlugins[pluginName].info = packageInfo.strapi || {}; + declaredPlugins[pluginName].packageInfo = packageInfo; } } }); diff --git a/packages/core/core/src/loaders/plugins/index.ts b/packages/core/core/src/loaders/plugins/index.ts index 6a352bc580..f4e6b627ea 100644 --- a/packages/core/core/src/loaders/plugins/index.ts +++ b/packages/core/core/src/loaders/plugins/index.ts @@ -1,6 +1,8 @@ import { join } from 'path'; import fse from 'fs-extra'; import { defaultsDeep, defaults, getOr, get } from 'lodash/fp'; +import * as resolve from 'resolve.exports'; + import { env } from '@strapi/utils'; import type { Core, Plugin, Struct } from '@strapi/types'; import { loadConfigFile } from '../../utils/load-config-file'; @@ -94,9 +96,20 @@ export default async function loadPlugins(strapi: Core.Strapi) { const enabledPlugin = enabledPlugins[pluginName]; let serverEntrypointPath; + let resolvedExport = './strapi-server'; try { - serverEntrypointPath = join(enabledPlugin.pathToPlugin, 'strapi-server.js'); + resolvedExport = ( + resolve.exports(enabledPlugin.packageInfo, 'strapi-server', { + require: true, + }) ?? './strapi-server' + ).toString(); + } catch (e) { + // key missing in exports map or no export map -> let's try the legacy way + } + + try { + serverEntrypointPath = join(enabledPlugin.pathToPlugin, resolvedExport); } catch (e) { throw new Error( `Error loading the plugin ${pluginName} because ${pluginName} is not installed. Please either install the plugin or remove it's configuration.` diff --git a/packages/core/core/src/providers/admin.ts b/packages/core/core/src/providers/admin.ts index 5b62b88605..fd79bb0ba8 100644 --- a/packages/core/core/src/providers/admin.ts +++ b/packages/core/core/src/providers/admin.ts @@ -3,6 +3,7 @@ import loadAdmin from '../loaders/admin'; export default defineProvider({ init(strapi) { + // eslint-disable-next-line node/no-missing-require strapi.add('admin', () => require('@strapi/admin/strapi-server')); }, diff --git a/packages/core/email/strapi-server.js b/packages/core/email/strapi-server.js deleted file mode 100644 index bf55958861..0000000000 --- a/packages/core/email/strapi-server.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('./dist/server'); diff --git a/packages/core/review-workflows/strapi-server.js b/packages/core/review-workflows/strapi-server.js deleted file mode 100644 index bf55958861..0000000000 --- a/packages/core/review-workflows/strapi-server.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('./dist/server'); diff --git a/packages/core/upload/strapi-server.js b/packages/core/upload/strapi-server.js deleted file mode 100644 index bf55958861..0000000000 --- a/packages/core/upload/strapi-server.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('./dist/server'); diff --git a/packages/plugins/color-picker/strapi-server.js b/packages/plugins/color-picker/strapi-server.js deleted file mode 100644 index bf55958861..0000000000 --- a/packages/plugins/color-picker/strapi-server.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('./dist/server'); diff --git a/packages/plugins/documentation/strapi-server.js b/packages/plugins/documentation/strapi-server.js deleted file mode 100644 index bf55958861..0000000000 --- a/packages/plugins/documentation/strapi-server.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('./dist/server'); diff --git a/packages/plugins/graphql/strapi-server.js b/packages/plugins/graphql/strapi-server.js deleted file mode 100644 index bf55958861..0000000000 --- a/packages/plugins/graphql/strapi-server.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('./dist/server'); diff --git a/packages/plugins/i18n/strapi-server.js b/packages/plugins/i18n/strapi-server.js deleted file mode 100644 index bf55958861..0000000000 --- a/packages/plugins/i18n/strapi-server.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('./dist/server'); diff --git a/packages/plugins/sentry/strapi-server.js b/packages/plugins/sentry/strapi-server.js deleted file mode 100644 index bf55958861..0000000000 --- a/packages/plugins/sentry/strapi-server.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('./dist/server'); diff --git a/packages/plugins/users-permissions/package.json b/packages/plugins/users-permissions/package.json index 5fee30e855..4c9098b3b7 100644 --- a/packages/plugins/users-permissions/package.json +++ b/packages/plugins/users-permissions/package.json @@ -27,9 +27,9 @@ "default": "./dist/admin/index.js" }, "./strapi-server": { - "source": "./strapi-server.js", - "require": "./strapi-server.js", - "default": "./strapi-server.js" + "source": "./server/index.js", + "require": "./server/index.js", + "default": "./server/index.js" }, "./package.json": "./package.json" }, diff --git a/packages/plugins/users-permissions/strapi-server.js b/packages/plugins/users-permissions/strapi-server.js deleted file mode 100644 index 8a908be91d..0000000000 --- a/packages/plugins/users-permissions/strapi-server.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('./server'); diff --git a/yarn.lock b/yarn.lock index 8cfbce2a51..c307298d01 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8757,6 +8757,7 @@ __metadata: package-json: "npm:7.0.0" pkg-up: "npm:3.1.0" qs: "npm:6.11.1" + resolve.exports: "npm:2.0.2" semver: "npm:7.5.4" statuses: "npm:2.0.1" supertest: "npm:6.3.3" @@ -28113,7 +28114,7 @@ __metadata: languageName: node linkType: hard -"resolve.exports@npm:^2.0.0": +"resolve.exports@npm:2.0.2, resolve.exports@npm:^2.0.0": version: 2.0.2 resolution: "resolve.exports@npm:2.0.2" checksum: 10c0/cc4cffdc25447cf34730f388dca5021156ba9302a3bad3d7f168e790dc74b2827dff603f1bc6ad3d299bac269828dca96dd77e036dc9fba6a2a1807c47ab5c98