@strapi/core 5.48.1 → 5.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Strapi.js +9 -5
- package/dist/Strapi.js.map +1 -1
- package/dist/Strapi.mjs +0 -1
- package/dist/Strapi.mjs.map +1 -1
- package/dist/ai.d.ts +2 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +8 -0
- package/dist/ai.js.map +1 -0
- package/dist/ai.mjs +3 -0
- package/dist/ai.mjs.map +1 -0
- package/dist/configuration/config-loader.js +11 -6
- package/dist/configuration/config-loader.js.map +1 -1
- package/dist/configuration/index.js +22 -15
- package/dist/configuration/index.js.map +1 -1
- package/dist/configuration/urls.js +11 -7
- package/dist/configuration/urls.js.map +1 -1
- package/dist/core-api/routes/index.js +3 -2
- package/dist/core-api/routes/index.js.map +1 -1
- package/dist/core-api/routes/validation/common.js +3 -2
- package/dist/core-api/routes/validation/common.js.map +1 -1
- package/dist/core-api/routes/validation/content-type.js +3 -2
- package/dist/core-api/routes/validation/content-type.js.map +1 -1
- package/dist/core-api/routes/validation/mappers.js +3 -2
- package/dist/core-api/routes/validation/mappers.js.map +1 -1
- package/dist/core-api/routes/validation/utils.js +3 -2
- package/dist/core-api/routes/validation/utils.js.map +1 -1
- package/dist/domain/content-type/index.js +9 -5
- package/dist/domain/content-type/index.js.map +1 -1
- package/dist/domain/content-type/validator.js +6 -2
- package/dist/domain/content-type/validator.js.map +1 -1
- package/dist/domain/module/index.js +6 -2
- package/dist/domain/module/index.js.map +1 -1
- package/dist/ee/license.js +8 -3
- package/dist/ee/license.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -1
- package/dist/loaders/admin.js +5 -1
- package/dist/loaders/admin.js.map +1 -1
- package/dist/loaders/apis.js +16 -11
- package/dist/loaders/apis.js.map +1 -1
- package/dist/loaders/components.js +6 -2
- package/dist/loaders/components.js.map +1 -1
- package/dist/loaders/middlewares.js +6 -2
- package/dist/loaders/middlewares.js.map +1 -1
- package/dist/loaders/plugins/get-enabled-plugins.js +5 -1
- package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
- package/dist/loaders/plugins/get-user-plugins-config.js +6 -2
- package/dist/loaders/plugins/get-user-plugins-config.js.map +1 -1
- package/dist/loaders/plugins/index.js +8 -4
- package/dist/loaders/plugins/index.js.map +1 -1
- package/dist/loaders/policies.js +6 -2
- package/dist/loaders/policies.js.map +1 -1
- package/dist/mcp.d.ts +4 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +12 -0
- package/dist/mcp.js.map +1 -0
- package/dist/mcp.mjs +4 -0
- package/dist/mcp.mjs.map +1 -0
- package/dist/middlewares/body.js +8 -3
- package/dist/middlewares/body.js.map +1 -1
- package/dist/middlewares/compression.js +5 -1
- package/dist/middlewares/compression.js.map +1 -1
- package/dist/middlewares/cors.js +5 -1
- package/dist/middlewares/cors.js.map +1 -1
- package/dist/middlewares/favicon.js +5 -1
- package/dist/middlewares/favicon.js.map +1 -1
- package/dist/middlewares/ip.js +5 -1
- package/dist/middlewares/ip.js.map +1 -1
- package/dist/middlewares/public.js +5 -1
- package/dist/middlewares/public.js.map +1 -1
- package/dist/middlewares/query.js +6 -2
- package/dist/middlewares/query.js.map +1 -1
- package/dist/middlewares/security.js +5 -1
- package/dist/middlewares/security.js.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.js +5 -1
- package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
- package/dist/migrations/first-published-at.js +5 -1
- package/dist/migrations/first-published-at.js.map +1 -1
- package/dist/package.json.js +15 -15
- package/dist/package.json.mjs +15 -15
- package/dist/registries/sanitizers.js +7 -3
- package/dist/registries/sanitizers.js.map +1 -1
- package/dist/registries/validators.js +7 -3
- package/dist/registries/validators.js.map +1 -1
- package/dist/services/auth/index.js +7 -3
- package/dist/services/auth/index.js.map +1 -1
- package/dist/services/content-api/index.js +10 -6
- package/dist/services/content-api/index.js.map +1 -1
- package/dist/services/content-api/permissions/engine.js +5 -1
- package/dist/services/content-api/permissions/engine.js.map +1 -1
- package/dist/services/content-api/permissions/index.js +10 -6
- package/dist/services/content-api/permissions/index.js.map +1 -1
- package/dist/services/document-service/attributes/transforms.js +5 -1
- package/dist/services/document-service/attributes/transforms.js.map +1 -1
- package/dist/services/document-service/components.d.ts.map +1 -1
- package/dist/services/document-service/components.js +14 -10
- package/dist/services/document-service/components.js.map +1 -1
- package/dist/services/document-service/components.mjs.map +1 -1
- package/dist/services/document-service/draft-and-publish.js +1 -1
- package/dist/services/document-service/draft-and-publish.js.map +1 -1
- package/dist/services/document-service/draft-and-publish.mjs +1 -1
- package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
- package/dist/services/document-service/entries.d.ts.map +1 -1
- package/dist/services/document-service/entries.js +6 -2
- package/dist/services/document-service/entries.js.map +1 -1
- package/dist/services/document-service/entries.mjs +7 -3
- package/dist/services/document-service/entries.mjs.map +1 -1
- package/dist/services/document-service/internationalization.js.map +1 -1
- package/dist/services/document-service/internationalization.mjs.map +1 -1
- package/dist/services/document-service/transform/data.d.ts +2 -0
- package/dist/services/document-service/transform/data.d.ts.map +1 -1
- package/dist/services/document-service/transform/data.js +7 -1
- package/dist/services/document-service/transform/data.js.map +1 -1
- package/dist/services/document-service/transform/data.mjs +7 -2
- package/dist/services/document-service/transform/data.mjs.map +1 -1
- package/dist/services/document-service/utils/populate.d.ts +1 -1
- package/dist/services/document-service/utils/populate.d.ts.map +1 -1
- package/dist/services/document-service/utils/populate.js.map +1 -1
- package/dist/services/document-service/utils/populate.mjs.map +1 -1
- package/dist/services/entity-service/index.js +9 -4
- package/dist/services/entity-service/index.js.map +1 -1
- package/dist/services/entity-validator/index.d.ts.map +1 -1
- package/dist/services/entity-validator/index.js +9 -4
- package/dist/services/entity-validator/index.js.map +1 -1
- package/dist/services/entity-validator/index.mjs.map +1 -1
- package/dist/services/entity-validator/validators.js +10 -6
- package/dist/services/entity-validator/validators.js.map +1 -1
- package/dist/services/errors.js +7 -3
- package/dist/services/errors.js.map +1 -1
- package/dist/services/fs.js +10 -5
- package/dist/services/fs.js.map +1 -1
- package/dist/services/mcp/prompt-registry.d.ts +31 -3
- package/dist/services/mcp/prompt-registry.d.ts.map +1 -1
- package/dist/services/mcp/prompt-registry.js +31 -0
- package/dist/services/mcp/prompt-registry.js.map +1 -1
- package/dist/services/mcp/prompt-registry.mjs +31 -1
- package/dist/services/mcp/prompt-registry.mjs.map +1 -1
- package/dist/services/mcp/resource-registry.d.ts +31 -1
- package/dist/services/mcp/resource-registry.d.ts.map +1 -1
- package/dist/services/mcp/resource-registry.js +31 -0
- package/dist/services/mcp/resource-registry.js.map +1 -1
- package/dist/services/mcp/resource-registry.mjs +31 -1
- package/dist/services/mcp/resource-registry.mjs.map +1 -1
- package/dist/services/mcp/tool-registry.d.ts +36 -9
- package/dist/services/mcp/tool-registry.d.ts.map +1 -1
- package/dist/services/mcp/tool-registry.js +35 -3
- package/dist/services/mcp/tool-registry.js.map +1 -1
- package/dist/services/mcp/tool-registry.mjs +35 -3
- package/dist/services/mcp/tool-registry.mjs.map +1 -1
- package/dist/services/mcp/tools/log.d.ts +15 -85
- package/dist/services/mcp/tools/log.d.ts.map +1 -1
- package/dist/services/metrics/admin-user-hash.js +5 -1
- package/dist/services/metrics/admin-user-hash.js.map +1 -1
- package/dist/services/metrics/is-truthy.js +5 -1
- package/dist/services/metrics/is-truthy.js.map +1 -1
- package/dist/services/metrics/sender.js +17 -9
- package/dist/services/metrics/sender.js.map +1 -1
- package/dist/services/server/api.js +5 -1
- package/dist/services/server/api.js.map +1 -1
- package/dist/services/server/compose-endpoint.js +5 -1
- package/dist/services/server/compose-endpoint.js.map +1 -1
- package/dist/services/server/http-server.js +5 -1
- package/dist/services/server/http-server.js.map +1 -1
- package/dist/services/server/index.js +5 -1
- package/dist/services/server/index.js.map +1 -1
- package/dist/services/server/koa.js +12 -5
- package/dist/services/server/koa.js.map +1 -1
- package/dist/services/server/middleware.js +5 -1
- package/dist/services/server/middleware.js.map +1 -1
- package/dist/services/server/openapi.js +11 -6
- package/dist/services/server/openapi.js.map +1 -1
- package/dist/services/server/register-routes.js +8 -4
- package/dist/services/server/register-routes.js.map +1 -1
- package/dist/services/server/routing.js +5 -1
- package/dist/services/server/routing.js.map +1 -1
- package/dist/services/session-manager.js +14 -9
- package/dist/services/session-manager.js.map +1 -1
- package/dist/services/webhook-runner.js +7 -2
- package/dist/services/webhook-runner.js.map +1 -1
- package/dist/services/worker-queue.js +5 -1
- package/dist/services/worker-queue.js.map +1 -1
- package/dist/utils/filepath-to-prop-path.js +13 -8
- package/dist/utils/filepath-to-prop-path.js.map +1 -1
- package/dist/utils/load-config-file.js +7 -2
- package/dist/utils/load-config-file.js.map +1 -1
- package/dist/utils/load-files.js +12 -6
- package/dist/utils/load-files.js.map +1 -1
- package/dist/utils/open-browser.js +5 -1
- package/dist/utils/open-browser.js.map +1 -1
- package/dist/utils/resolve-working-dirs.js +6 -2
- package/dist/utils/resolve-working-dirs.js.map +1 -1
- package/dist/utils/startup-logger.js +27 -21
- package/dist/utils/startup-logger.js.map +1 -1
- package/dist/utils/transform-content-types-to-models.js +10 -5
- package/dist/utils/transform-content-types-to-models.js.map +1 -1
- package/dist/utils/update-notifier/index.d.ts.map +1 -1
- package/dist/utils/update-notifier/index.js +21 -8
- package/dist/utils/update-notifier/index.js.map +1 -1
- package/dist/utils/update-notifier/index.mjs +6 -1
- package/dist/utils/update-notifier/index.mjs.map +1 -1
- package/package.json +15 -15
|
@@ -5,6 +5,10 @@ var fse = require('fs-extra');
|
|
|
5
5
|
var strapiUtils = require('@strapi/utils');
|
|
6
6
|
var index = require('../middlewares/index.js');
|
|
7
7
|
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var fse__default = /*#__PURE__*/_interopDefault(fse);
|
|
11
|
+
|
|
8
12
|
// TODO:: allow folders with index.js inside for bigger policies
|
|
9
13
|
async function loadMiddlewares(strapi) {
|
|
10
14
|
const localMiddlewares = await loadLocalMiddlewares(strapi);
|
|
@@ -13,11 +17,11 @@ async function loadMiddlewares(strapi) {
|
|
|
13
17
|
}
|
|
14
18
|
const loadLocalMiddlewares = async (strapi)=>{
|
|
15
19
|
const dir = strapi.dirs.dist.middlewares;
|
|
16
|
-
if (!await
|
|
20
|
+
if (!await fse__default.default.pathExists(dir)) {
|
|
17
21
|
return {};
|
|
18
22
|
}
|
|
19
23
|
const middlewares = {};
|
|
20
|
-
const paths = await
|
|
24
|
+
const paths = await fse__default.default.readdir(dir, {
|
|
21
25
|
withFileTypes: true
|
|
22
26
|
});
|
|
23
27
|
for (const fd of paths){
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middlewares.js","sources":["../../src/loaders/middlewares.ts"],"sourcesContent":["import { join, extname, basename } from 'path';\nimport fse from 'fs-extra';\nimport { importDefault } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { middlewares as internalMiddlewares } from '../middlewares';\n\n// TODO:: allow folders with index.js inside for bigger policies\nexport default async function loadMiddlewares(strapi: Core.Strapi) {\n const localMiddlewares = await loadLocalMiddlewares(strapi);\n\n strapi.get('middlewares').add(`global::`, localMiddlewares);\n strapi.get('middlewares').add(`strapi::`, internalMiddlewares);\n}\n\nconst loadLocalMiddlewares = async (strapi: Core.Strapi) => {\n const dir = strapi.dirs.dist.middlewares;\n\n if (!(await fse.pathExists(dir))) {\n return {};\n }\n\n const middlewares: Record<string, Core.MiddlewareFactory> = {};\n const paths = await fse.readdir(dir, { withFileTypes: true });\n\n for (const fd of paths) {\n const { name } = fd;\n const fullPath = join(dir, name);\n\n if (fd.isFile() && extname(name) === '.js') {\n const key = basename(name, '.js');\n middlewares[key] = importDefault(fullPath);\n }\n }\n\n return middlewares;\n};\n"],"names":["loadMiddlewares","strapi","localMiddlewares","loadLocalMiddlewares","get","add","internalMiddlewares","dir","dirs","dist","middlewares","fse","pathExists","paths","readdir","withFileTypes","fd","name","fullPath","join","isFile","extname","key","basename","importDefault"],"mappings":"
|
|
1
|
+
{"version":3,"file":"middlewares.js","sources":["../../src/loaders/middlewares.ts"],"sourcesContent":["import { join, extname, basename } from 'path';\nimport fse from 'fs-extra';\nimport { importDefault } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { middlewares as internalMiddlewares } from '../middlewares';\n\n// TODO:: allow folders with index.js inside for bigger policies\nexport default async function loadMiddlewares(strapi: Core.Strapi) {\n const localMiddlewares = await loadLocalMiddlewares(strapi);\n\n strapi.get('middlewares').add(`global::`, localMiddlewares);\n strapi.get('middlewares').add(`strapi::`, internalMiddlewares);\n}\n\nconst loadLocalMiddlewares = async (strapi: Core.Strapi) => {\n const dir = strapi.dirs.dist.middlewares;\n\n if (!(await fse.pathExists(dir))) {\n return {};\n }\n\n const middlewares: Record<string, Core.MiddlewareFactory> = {};\n const paths = await fse.readdir(dir, { withFileTypes: true });\n\n for (const fd of paths) {\n const { name } = fd;\n const fullPath = join(dir, name);\n\n if (fd.isFile() && extname(name) === '.js') {\n const key = basename(name, '.js');\n middlewares[key] = importDefault(fullPath);\n }\n }\n\n return middlewares;\n};\n"],"names":["loadMiddlewares","strapi","localMiddlewares","loadLocalMiddlewares","get","add","internalMiddlewares","dir","dirs","dist","middlewares","fse","pathExists","paths","readdir","withFileTypes","fd","name","fullPath","join","isFile","extname","key","basename","importDefault"],"mappings":";;;;;;;;;;;AAMA;AACe,eAAeA,gBAAgBC,MAAmB,EAAA;IAC/D,MAAMC,gBAAAA,GAAmB,MAAMC,oBAAAA,CAAqBF,MAAAA,CAAAA;IAEpDA,MAAAA,CAAOG,GAAG,CAAC,aAAA,CAAA,CAAeC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAEH,gBAAAA,CAAAA;IAC1CD,MAAAA,CAAOG,GAAG,CAAC,aAAA,CAAA,CAAeC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAEC,iBAAAA,CAAAA;AAC5C;AAEA,MAAMH,uBAAuB,OAAOF,MAAAA,GAAAA;AAClC,IAAA,MAAMM,MAAMN,MAAAA,CAAOO,IAAI,CAACC,IAAI,CAACC,WAAW;AAExC,IAAA,IAAI,CAAE,MAAMC,oBAAAA,CAAIC,UAAU,CAACL,GAAAA,CAAAA,EAAO;AAChC,QAAA,OAAO,EAAC;AACV,IAAA;AAEA,IAAA,MAAMG,cAAsD,EAAC;AAC7D,IAAA,MAAMG,KAAAA,GAAQ,MAAMF,oBAAAA,CAAIG,OAAO,CAACP,GAAAA,EAAK;QAAEQ,aAAAA,EAAe;AAAK,KAAA,CAAA;IAE3D,KAAK,MAAMC,MAAMH,KAAAA,CAAO;QACtB,MAAM,EAAEI,IAAI,EAAE,GAAGD,EAAAA;QACjB,MAAME,QAAAA,GAAWC,UAAKZ,GAAAA,EAAKU,IAAAA,CAAAA;AAE3B,QAAA,IAAID,EAAAA,CAAGI,MAAM,EAAA,IAAMC,YAAAA,CAAQJ,UAAU,KAAA,EAAO;YAC1C,MAAMK,GAAAA,GAAMC,cAASN,IAAAA,EAAM,KAAA,CAAA;YAC3BP,WAAW,CAACY,GAAAA,CAAI,GAAGE,yBAAAA,CAAcN,QAAAA,CAAAA;AACnC,QAAA;AACF,IAAA;IAEA,OAAOR,WAAAA;AACT,CAAA;;;;"}
|
|
@@ -7,6 +7,10 @@ var fp = require('lodash/fp');
|
|
|
7
7
|
var strapiUtils = require('@strapi/utils');
|
|
8
8
|
var getUserPluginsConfig = require('./get-user-plugins-config.js');
|
|
9
9
|
|
|
10
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
13
|
+
|
|
10
14
|
/**
|
|
11
15
|
* otherwise known as "core features"
|
|
12
16
|
*
|
|
@@ -109,7 +113,7 @@ const getEnabledPlugins = async (strapi1, { client } = {
|
|
|
109
113
|
}
|
|
110
114
|
const declaredPlugins = {};
|
|
111
115
|
const userPluginsConfig = await getUserPluginsConfig.getUserPluginsConfig();
|
|
112
|
-
|
|
116
|
+
___default.default.forEach(userPluginsConfig, (declaration, pluginName)=>{
|
|
113
117
|
validatePluginName(pluginName);
|
|
114
118
|
declaredPlugins[pluginName] = {
|
|
115
119
|
...toDetailedDeclaration(declaration),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-enabled-plugins.js","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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"}
|
|
1
|
+
{"version":3,"file":"get-enabled-plugins.js","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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"}
|
|
@@ -5,6 +5,10 @@ var fse = require('fs-extra');
|
|
|
5
5
|
var fp = require('lodash/fp');
|
|
6
6
|
var loadConfigFile = require('../../utils/load-config-file.js');
|
|
7
7
|
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var fse__default = /*#__PURE__*/_interopDefault(fse);
|
|
11
|
+
|
|
8
12
|
/**
|
|
9
13
|
* Return user defined plugins' config
|
|
10
14
|
* first load config from `config/plugins.js`
|
|
@@ -14,11 +18,11 @@ var loadConfigFile = require('../../utils/load-config-file.js');
|
|
|
14
18
|
const currentEnvUserConfigPath = path.join(strapi.dirs.dist.config, 'env', process.env.NODE_ENV, 'plugins.js');
|
|
15
19
|
let config = {};
|
|
16
20
|
// assign global user config if exists
|
|
17
|
-
if (await
|
|
21
|
+
if (await fse__default.default.pathExists(globalUserConfigPath)) {
|
|
18
22
|
config = loadConfigFile.loadConfigFile(globalUserConfigPath);
|
|
19
23
|
}
|
|
20
24
|
// and merge user config by environment if exists
|
|
21
|
-
if (await
|
|
25
|
+
if (await fse__default.default.pathExists(currentEnvUserConfigPath)) {
|
|
22
26
|
config = fp.merge(config, loadConfigFile.loadConfigFile(currentEnvUserConfigPath));
|
|
23
27
|
}
|
|
24
28
|
return config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-user-plugins-config.js","sources":["../../../src/loaders/plugins/get-user-plugins-config.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\nimport { merge } from 'lodash/fp';\nimport { loadConfigFile } from '../../utils/load-config-file';\n\n/**\n * Return user defined plugins' config\n * first load config from `config/plugins.js`\n * and then merge config from `config/env/{env}/plugins.js`\n */\nexport const getUserPluginsConfig = async () => {\n const globalUserConfigPath = join(strapi.dirs.dist.config, 'plugins.js');\n const currentEnvUserConfigPath = join(\n strapi.dirs.dist.config,\n 'env',\n process.env.NODE_ENV as string,\n 'plugins.js'\n );\n let config = {};\n\n // assign global user config if exists\n if (await fse.pathExists(globalUserConfigPath)) {\n config = loadConfigFile(globalUserConfigPath);\n }\n\n // and merge user config by environment if exists\n if (await fse.pathExists(currentEnvUserConfigPath)) {\n config = merge(config, loadConfigFile(currentEnvUserConfigPath));\n }\n\n return config;\n};\n"],"names":["getUserPluginsConfig","globalUserConfigPath","join","strapi","dirs","dist","config","currentEnvUserConfigPath","process","env","NODE_ENV","fse","pathExists","loadConfigFile","merge"],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-user-plugins-config.js","sources":["../../../src/loaders/plugins/get-user-plugins-config.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\nimport { merge } from 'lodash/fp';\nimport { loadConfigFile } from '../../utils/load-config-file';\n\n/**\n * Return user defined plugins' config\n * first load config from `config/plugins.js`\n * and then merge config from `config/env/{env}/plugins.js`\n */\nexport const getUserPluginsConfig = async () => {\n const globalUserConfigPath = join(strapi.dirs.dist.config, 'plugins.js');\n const currentEnvUserConfigPath = join(\n strapi.dirs.dist.config,\n 'env',\n process.env.NODE_ENV as string,\n 'plugins.js'\n );\n let config = {};\n\n // assign global user config if exists\n if (await fse.pathExists(globalUserConfigPath)) {\n config = loadConfigFile(globalUserConfigPath);\n }\n\n // and merge user config by environment if exists\n if (await fse.pathExists(currentEnvUserConfigPath)) {\n config = merge(config, loadConfigFile(currentEnvUserConfigPath));\n }\n\n return config;\n};\n"],"names":["getUserPluginsConfig","globalUserConfigPath","join","strapi","dirs","dist","config","currentEnvUserConfigPath","process","env","NODE_ENV","fse","pathExists","loadConfigFile","merge"],"mappings":";;;;;;;;;;;AAKA;;;;UAKaA,oBAAAA,GAAuB,UAAA;IAClC,MAAMC,oBAAAA,GAAuBC,UAAKC,MAAAA,CAAOC,IAAI,CAACC,IAAI,CAACC,MAAM,EAAE,YAAA,CAAA;AAC3D,IAAA,MAAMC,wBAAAA,GAA2BL,SAAAA,CAC/BC,MAAAA,CAAOC,IAAI,CAACC,IAAI,CAACC,MAAM,EACvB,KAAA,EACAE,OAAAA,CAAQC,GAAG,CAACC,QAAQ,EACpB,YAAA,CAAA;AAEF,IAAA,IAAIJ,SAAS,EAAC;;AAGd,IAAA,IAAI,MAAMK,oBAAAA,CAAIC,UAAU,CAACX,oBAAAA,CAAAA,EAAuB;AAC9CK,QAAAA,MAAAA,GAASO,6BAAAA,CAAeZ,oBAAAA,CAAAA;AAC1B,IAAA;;AAGA,IAAA,IAAI,MAAMU,oBAAAA,CAAIC,UAAU,CAACL,wBAAAA,CAAAA,EAA2B;QAClDD,MAAAA,GAASQ,QAAAA,CAAMR,QAAQO,6BAAAA,CAAeN,wBAAAA,CAAAA,CAAAA;AACxC,IAAA;IAEA,OAAOD,MAAAA;AACT;;;;"}
|
|
@@ -11,7 +11,10 @@ var getEnabledPlugins = require('./get-enabled-plugins.js');
|
|
|
11
11
|
var getUserPluginsConfig = require('./get-user-plugins-config.js');
|
|
12
12
|
var index = require('../../domain/content-type/index.js');
|
|
13
13
|
|
|
14
|
-
function
|
|
14
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
|
+
|
|
16
|
+
function _interopNamespace(e) {
|
|
17
|
+
if (e && e.__esModule) return e;
|
|
15
18
|
var n = Object.create(null);
|
|
16
19
|
if (e) {
|
|
17
20
|
Object.keys(e).forEach(function (k) {
|
|
@@ -28,7 +31,8 @@ function _interopNamespaceDefault(e) {
|
|
|
28
31
|
return Object.freeze(n);
|
|
29
32
|
}
|
|
30
33
|
|
|
31
|
-
var
|
|
34
|
+
var fse__default = /*#__PURE__*/_interopDefault(fse);
|
|
35
|
+
var resolve__namespace = /*#__PURE__*/_interopNamespace(resolve);
|
|
32
36
|
|
|
33
37
|
const defaultPlugin = {
|
|
34
38
|
bootstrap () {},
|
|
@@ -47,7 +51,7 @@ const defaultPlugin = {
|
|
|
47
51
|
};
|
|
48
52
|
const applyUserExtension = async (plugins)=>{
|
|
49
53
|
const extensionsDir = strapi.dirs.dist.extensions;
|
|
50
|
-
if (!await
|
|
54
|
+
if (!await fse__default.default.pathExists(extensionsDir)) {
|
|
51
55
|
return;
|
|
52
56
|
}
|
|
53
57
|
const extendedSchemas = await loadFiles.loadFiles(extensionsDir, '**/content-types/**/schema.json');
|
|
@@ -130,7 +134,7 @@ async function loadPlugins(strapi1) {
|
|
|
130
134
|
throw new Error(`Error loading the plugin ${pluginName} because ${pluginName} is not installed. Please either install the plugin or remove its configuration.`);
|
|
131
135
|
}
|
|
132
136
|
// only load plugins with a server entrypoint
|
|
133
|
-
if (!await
|
|
137
|
+
if (!await fse__default.default.pathExists(serverEntrypointPath)) {
|
|
134
138
|
continue;
|
|
135
139
|
}
|
|
136
140
|
const pluginServer = loadConfigFile.loadConfigFile(serverEntrypointPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","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 const extendedContentTypes = get([pluginName, 'content-types'], extendedSchemas) ?? {};\n for (const ctName of Object.keys(extendedContentTypes)) {\n const extendedSchema = get([ctName, 'schema'], extendedContentTypes);\n if (!extendedSchema) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (!plugin.contentTypes[ctName]) {\n plugin.contentTypes[ctName] = { schema: extendedSchema };\n } else {\n plugin.contentTypes[ctName].schema = {\n ...plugin.contentTypes[ctName].schema,\n ...extendedSchema,\n };\n }\n }\n\n formatContentTypes(pluginName, plugin.contentTypes);\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","extendedContentTypes","get","ctName","extendedSchema","schema","formatContentTypes","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","defaults","add","values","forEach","definition","assign","collectionName","info","singularName","toLowerCase","globalId","getGlobalId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","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 const extendedContentTypes = get([pluginName, 'content-types'], extendedSchemas) ?? {};\n for (const ctName of Object.keys(extendedContentTypes)) {\n const extendedSchema = get([ctName, 'schema'], extendedContentTypes);\n if (!extendedSchema) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (!plugin.contentTypes[ctName]) {\n plugin.contentTypes[ctName] = { schema: extendedSchema };\n } else {\n plugin.contentTypes[ctName].schema = {\n ...plugin.contentTypes[ctName].schema,\n ...extendedSchema,\n };\n }\n }\n\n formatContentTypes(pluginName, plugin.contentTypes);\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","extendedContentTypes","get","ctName","extendedSchema","schema","formatContentTypes","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","defaults","add","values","forEach","definition","assign","collectionName","info","singularName","toLowerCase","globalId","getGlobalId"],"mappings":"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"}
|
package/dist/loaders/policies.js
CHANGED
|
@@ -4,14 +4,18 @@ var path = require('path');
|
|
|
4
4
|
var fse = require('fs-extra');
|
|
5
5
|
var strapiUtils = require('@strapi/utils');
|
|
6
6
|
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var fse__default = /*#__PURE__*/_interopDefault(fse);
|
|
10
|
+
|
|
7
11
|
// TODO:: allow folders with index.js inside for bigger policies
|
|
8
12
|
async function loadPolicies(strapi) {
|
|
9
13
|
const dir = strapi.dirs.dist.policies;
|
|
10
|
-
if (!await
|
|
14
|
+
if (!await fse__default.default.pathExists(dir)) {
|
|
11
15
|
return;
|
|
12
16
|
}
|
|
13
17
|
const policies = {};
|
|
14
|
-
const paths = await
|
|
18
|
+
const paths = await fse__default.default.readdir(dir, {
|
|
15
19
|
withFileTypes: true
|
|
16
20
|
});
|
|
17
21
|
for (const fd of paths){
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policies.js","sources":["../../src/loaders/policies.ts"],"sourcesContent":["import { join, extname, basename } from 'path';\nimport fse from 'fs-extra';\nimport { importDefault } from '@strapi/utils';\n\nimport type { Core } from '@strapi/types';\n\n// TODO:: allow folders with index.js inside for bigger policies\nexport default async function loadPolicies(strapi: Core.Strapi) {\n const dir = strapi.dirs.dist.policies;\n\n if (!(await fse.pathExists(dir))) {\n return;\n }\n\n const policies: Record<string, Core.Policy> = {};\n const paths = await fse.readdir(dir, { withFileTypes: true });\n\n for (const fd of paths) {\n const { name } = fd;\n const fullPath = join(dir, name);\n\n if (fd.isFile() && extname(name) === '.js') {\n const key = basename(name, '.js');\n policies[key] = importDefault(fullPath);\n }\n }\n\n strapi.get('policies').add(`global::`, policies);\n}\n"],"names":["loadPolicies","strapi","dir","dirs","dist","policies","fse","pathExists","paths","readdir","withFileTypes","fd","name","fullPath","join","isFile","extname","key","basename","importDefault","get","add"],"mappings":"
|
|
1
|
+
{"version":3,"file":"policies.js","sources":["../../src/loaders/policies.ts"],"sourcesContent":["import { join, extname, basename } from 'path';\nimport fse from 'fs-extra';\nimport { importDefault } from '@strapi/utils';\n\nimport type { Core } from '@strapi/types';\n\n// TODO:: allow folders with index.js inside for bigger policies\nexport default async function loadPolicies(strapi: Core.Strapi) {\n const dir = strapi.dirs.dist.policies;\n\n if (!(await fse.pathExists(dir))) {\n return;\n }\n\n const policies: Record<string, Core.Policy> = {};\n const paths = await fse.readdir(dir, { withFileTypes: true });\n\n for (const fd of paths) {\n const { name } = fd;\n const fullPath = join(dir, name);\n\n if (fd.isFile() && extname(name) === '.js') {\n const key = basename(name, '.js');\n policies[key] = importDefault(fullPath);\n }\n }\n\n strapi.get('policies').add(`global::`, policies);\n}\n"],"names":["loadPolicies","strapi","dir","dirs","dist","policies","fse","pathExists","paths","readdir","withFileTypes","fd","name","fullPath","join","isFile","extname","key","basename","importDefault","get","add"],"mappings":";;;;;;;;;;AAMA;AACe,eAAeA,aAAaC,MAAmB,EAAA;AAC5D,IAAA,MAAMC,MAAMD,MAAAA,CAAOE,IAAI,CAACC,IAAI,CAACC,QAAQ;AAErC,IAAA,IAAI,CAAE,MAAMC,oBAAAA,CAAIC,UAAU,CAACL,GAAAA,CAAAA,EAAO;AAChC,QAAA;AACF,IAAA;AAEA,IAAA,MAAMG,WAAwC,EAAC;AAC/C,IAAA,MAAMG,KAAAA,GAAQ,MAAMF,oBAAAA,CAAIG,OAAO,CAACP,GAAAA,EAAK;QAAEQ,aAAAA,EAAe;AAAK,KAAA,CAAA;IAE3D,KAAK,MAAMC,MAAMH,KAAAA,CAAO;QACtB,MAAM,EAAEI,IAAI,EAAE,GAAGD,EAAAA;QACjB,MAAME,QAAAA,GAAWC,UAAKZ,GAAAA,EAAKU,IAAAA,CAAAA;AAE3B,QAAA,IAAID,EAAAA,CAAGI,MAAM,EAAA,IAAMC,YAAAA,CAAQJ,UAAU,KAAA,EAAO;YAC1C,MAAMK,GAAAA,GAAMC,cAASN,IAAAA,EAAM,KAAA,CAAA;YAC3BP,QAAQ,CAACY,GAAAA,CAAI,GAAGE,yBAAAA,CAAcN,QAAAA,CAAAA;AAChC,QAAA;AACF,IAAA;IAEAZ,MAAAA,CAAOmB,GAAG,CAAC,UAAA,CAAA,CAAYC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAEhB,QAAAA,CAAAA;AACzC;;;;"}
|
package/dist/mcp.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { makeMcpToolDefinition as defineTool } from './services/mcp/tool-registry';
|
|
2
|
+
export { makeMcpResourceDefinition as defineResource } from './services/mcp/resource-registry';
|
|
3
|
+
export { makeMcpPromptDefinition as definePrompt } from './services/mcp/prompt-registry';
|
|
4
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,IAAI,UAAU,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,yBAAyB,IAAI,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAC/F,OAAO,EAAE,uBAAuB,IAAI,YAAY,EAAE,MAAM,gCAAgC,CAAC"}
|
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var toolRegistry = require('./services/mcp/tool-registry.js');
|
|
4
|
+
var resourceRegistry = require('./services/mcp/resource-registry.js');
|
|
5
|
+
var promptRegistry = require('./services/mcp/prompt-registry.js');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
exports.defineTool = toolRegistry.makeMcpToolDefinition;
|
|
10
|
+
exports.defineResource = resourceRegistry.makeMcpResourceDefinition;
|
|
11
|
+
exports.definePrompt = promptRegistry.makeMcpPromptDefinition;
|
|
12
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
|
package/dist/mcp.mjs
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { makeMcpToolDefinition as defineTool } from './services/mcp/tool-registry.mjs';
|
|
2
|
+
export { makeMcpResourceDefinition as defineResource } from './services/mcp/resource-registry.mjs';
|
|
3
|
+
export { makeMcpPromptDefinition as definePrompt } from './services/mcp/prompt-registry.mjs';
|
|
4
|
+
//# sourceMappingURL=mcp.mjs.map
|
package/dist/mcp.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
package/dist/middlewares/body.js
CHANGED
|
@@ -5,13 +5,18 @@ var fp = require('lodash/fp');
|
|
|
5
5
|
var koaBody = require('koa-body');
|
|
6
6
|
var mime = require('mime-types');
|
|
7
7
|
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var fse__default = /*#__PURE__*/_interopDefault(fse);
|
|
11
|
+
var mime__default = /*#__PURE__*/_interopDefault(mime);
|
|
12
|
+
|
|
8
13
|
const defaults = {
|
|
9
14
|
multipart: true,
|
|
10
15
|
patchKoa: true
|
|
11
16
|
};
|
|
12
17
|
function ensureFileMimeType(file) {
|
|
13
18
|
if (!file.type) {
|
|
14
|
-
file.type =
|
|
19
|
+
file.type = mime__default.default.lookup(file.name) || 'application/octet-stream';
|
|
15
20
|
}
|
|
16
21
|
}
|
|
17
22
|
function getFiles(ctx) {
|
|
@@ -55,10 +60,10 @@ const bodyMiddleware = (config, { strapi })=>{
|
|
|
55
60
|
if (files) {
|
|
56
61
|
if (Array.isArray(files)) {
|
|
57
62
|
// not awaiting to not slow the request
|
|
58
|
-
Promise.all(files.map((file)=>
|
|
63
|
+
Promise.all(files.map((file)=>fse__default.default.remove(file.filepath)));
|
|
59
64
|
} else if (files && files.filepath) {
|
|
60
65
|
// not awaiting to not slow the request
|
|
61
|
-
|
|
66
|
+
fse__default.default.remove(files.filepath);
|
|
62
67
|
}
|
|
63
68
|
delete ctx.request.files;
|
|
64
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body.js","sources":["../../src/middlewares/body.ts"],"sourcesContent":["import fse from 'fs-extra';\nimport { defaultsDeep } from 'lodash/fp';\nimport { koaBody, KoaBodyMiddlewareOptions } from 'koa-body';\nimport mime from 'mime-types';\nimport type Koa from 'koa';\nimport type { Core } from '@strapi/types';\n\nexport type Config = KoaBodyMiddlewareOptions;\n\nconst defaults = {\n multipart: true,\n patchKoa: true,\n};\n\nfunction ensureFileMimeType(file: any): void {\n if (!file.type) {\n file.type = mime.lookup(file.name) || 'application/octet-stream';\n }\n}\n\nfunction getFiles(ctx: Koa.Context) {\n return ctx?.request?.files?.files;\n}\n\nconst bodyMiddleware: Core.MiddlewareFactory<Config> = (config, { strapi }) => {\n const bodyConfig: Config = defaultsDeep(defaults, config);\n\n let gqlEndpoint: string | undefined;\n if (strapi.plugin('graphql')) {\n const { config: gqlConfig } = strapi.plugin('graphql');\n gqlEndpoint = gqlConfig('endpoint');\n }\n\n return async (ctx, next) => {\n // TODO: find a better way later\n if (gqlEndpoint && ctx.url === gqlEndpoint) {\n await next();\n } else {\n try {\n await koaBody(bodyConfig)(ctx, async () => {});\n\n const files = getFiles(ctx);\n\n /**\n * in case the mime-type wasn't sent, Strapi tries to guess it\n * from the file extension, to avoid a corrupt database state\n */\n if (files) {\n if (Array.isArray(files)) {\n files.forEach(ensureFileMimeType);\n } else {\n ensureFileMimeType(files);\n }\n }\n\n await next();\n } catch (error) {\n if (\n error instanceof Error &&\n error.message &&\n error.message.includes('maxFileSize exceeded')\n ) {\n return ctx.payloadTooLarge('FileTooBig');\n }\n\n throw error;\n }\n }\n\n const files = getFiles(ctx);\n\n // clean any file that was uploaded\n if (files) {\n if (Array.isArray(files)) {\n // not awaiting to not slow the request\n Promise.all(files.map((file) => fse.remove(file.filepath)));\n } else if (files && files.filepath) {\n // not awaiting to not slow the request\n fse.remove(files.filepath);\n }\n delete ctx.request.files;\n }\n };\n};\n\nexport { bodyMiddleware as body };\n"],"names":["defaults","multipart","patchKoa","ensureFileMimeType","file","type","mime","lookup","name","getFiles","ctx","request","files","bodyMiddleware","config","strapi","bodyConfig","defaultsDeep","gqlEndpoint","plugin","gqlConfig","next","url","koaBody","Array","isArray","forEach","error","Error","message","includes","payloadTooLarge","Promise","all","map","fse","remove","filepath"],"mappings":"
|
|
1
|
+
{"version":3,"file":"body.js","sources":["../../src/middlewares/body.ts"],"sourcesContent":["import fse from 'fs-extra';\nimport { defaultsDeep } from 'lodash/fp';\nimport { koaBody, KoaBodyMiddlewareOptions } from 'koa-body';\nimport mime from 'mime-types';\nimport type Koa from 'koa';\nimport type { Core } from '@strapi/types';\n\nexport type Config = KoaBodyMiddlewareOptions;\n\nconst defaults = {\n multipart: true,\n patchKoa: true,\n};\n\nfunction ensureFileMimeType(file: any): void {\n if (!file.type) {\n file.type = mime.lookup(file.name) || 'application/octet-stream';\n }\n}\n\nfunction getFiles(ctx: Koa.Context) {\n return ctx?.request?.files?.files;\n}\n\nconst bodyMiddleware: Core.MiddlewareFactory<Config> = (config, { strapi }) => {\n const bodyConfig: Config = defaultsDeep(defaults, config);\n\n let gqlEndpoint: string | undefined;\n if (strapi.plugin('graphql')) {\n const { config: gqlConfig } = strapi.plugin('graphql');\n gqlEndpoint = gqlConfig('endpoint');\n }\n\n return async (ctx, next) => {\n // TODO: find a better way later\n if (gqlEndpoint && ctx.url === gqlEndpoint) {\n await next();\n } else {\n try {\n await koaBody(bodyConfig)(ctx, async () => {});\n\n const files = getFiles(ctx);\n\n /**\n * in case the mime-type wasn't sent, Strapi tries to guess it\n * from the file extension, to avoid a corrupt database state\n */\n if (files) {\n if (Array.isArray(files)) {\n files.forEach(ensureFileMimeType);\n } else {\n ensureFileMimeType(files);\n }\n }\n\n await next();\n } catch (error) {\n if (\n error instanceof Error &&\n error.message &&\n error.message.includes('maxFileSize exceeded')\n ) {\n return ctx.payloadTooLarge('FileTooBig');\n }\n\n throw error;\n }\n }\n\n const files = getFiles(ctx);\n\n // clean any file that was uploaded\n if (files) {\n if (Array.isArray(files)) {\n // not awaiting to not slow the request\n Promise.all(files.map((file) => fse.remove(file.filepath)));\n } else if (files && files.filepath) {\n // not awaiting to not slow the request\n fse.remove(files.filepath);\n }\n delete ctx.request.files;\n }\n };\n};\n\nexport { bodyMiddleware as body };\n"],"names":["defaults","multipart","patchKoa","ensureFileMimeType","file","type","mime","lookup","name","getFiles","ctx","request","files","bodyMiddleware","config","strapi","bodyConfig","defaultsDeep","gqlEndpoint","plugin","gqlConfig","next","url","koaBody","Array","isArray","forEach","error","Error","message","includes","payloadTooLarge","Promise","all","map","fse","remove","filepath"],"mappings":";;;;;;;;;;;;AASA,MAAMA,QAAAA,GAAW;IACfC,SAAAA,EAAW,IAAA;IACXC,QAAAA,EAAU;AACZ,CAAA;AAEA,SAASC,mBAAmBC,IAAS,EAAA;IACnC,IAAI,CAACA,IAAAA,CAAKC,IAAI,EAAE;AACdD,QAAAA,IAAAA,CAAKC,IAAI,GAAGC,qBAAAA,CAAKC,MAAM,CAACH,IAAAA,CAAKI,IAAI,CAAA,IAAK,0BAAA;AACxC,IAAA;AACF;AAEA,SAASC,SAASC,GAAgB,EAAA;IAChC,OAAOA,GAAAA,EAAKC,SAASC,KAAAA,EAAOA,KAAAA;AAC9B;AAEA,MAAMC,cAAAA,GAAiD,CAACC,MAAAA,EAAQ,EAAEC,MAAM,EAAE,GAAA;IACxE,MAAMC,UAAAA,GAAqBC,gBAAajB,QAAAA,EAAUc,MAAAA,CAAAA;IAElD,IAAII,WAAAA;IACJ,IAAIH,MAAAA,CAAOI,MAAM,CAAC,SAAA,CAAA,EAAY;AAC5B,QAAA,MAAM,EAAEL,MAAAA,EAAQM,SAAS,EAAE,GAAGL,MAAAA,CAAOI,MAAM,CAAC,SAAA,CAAA;AAC5CD,QAAAA,WAAAA,GAAcE,SAAAA,CAAU,UAAA,CAAA;AAC1B,IAAA;AAEA,IAAA,OAAO,OAAOV,GAAAA,EAAKW,IAAAA,GAAAA;;AAEjB,QAAA,IAAIH,WAAAA,IAAeR,GAAAA,CAAIY,GAAG,KAAKJ,WAAAA,EAAa;YAC1C,MAAMG,IAAAA,EAAAA;QACR,CAAA,MAAO;YACL,IAAI;gBACF,MAAME,eAAAA,CAAQP,UAAAA,CAAAA,CAAYN,GAAAA,EAAK,UAAA,CAAa,CAAA,CAAA;AAE5C,gBAAA,MAAME,QAAQH,QAAAA,CAASC,GAAAA,CAAAA;AAEvB;;;AAGC,YACD,IAAIE,KAAAA,EAAO;oBACT,IAAIY,KAAAA,CAAMC,OAAO,CAACb,KAAAA,CAAAA,EAAQ;AACxBA,wBAAAA,KAAAA,CAAMc,OAAO,CAACvB,kBAAAA,CAAAA;oBAChB,CAAA,MAAO;wBACLA,kBAAAA,CAAmBS,KAAAA,CAAAA;AACrB,oBAAA;AACF,gBAAA;gBAEA,MAAMS,IAAAA,EAAAA;AACR,YAAA,CAAA,CAAE,OAAOM,KAAAA,EAAO;gBACd,IACEA,KAAAA,YAAiBC,KAAAA,IACjBD,KAAAA,CAAME,OAAO,IACbF,MAAME,OAAO,CAACC,QAAQ,CAAC,sBAAA,CAAA,EACvB;oBACA,OAAOpB,GAAAA,CAAIqB,eAAe,CAAC,YAAA,CAAA;AAC7B,gBAAA;gBAEA,MAAMJ,KAAAA;AACR,YAAA;AACF,QAAA;AAEA,QAAA,MAAMf,QAAQH,QAAAA,CAASC,GAAAA,CAAAA;;AAGvB,QAAA,IAAIE,KAAAA,EAAO;YACT,IAAIY,KAAAA,CAAMC,OAAO,CAACb,KAAAA,CAAAA,EAAQ;;gBAExBoB,OAAAA,CAAQC,GAAG,CAACrB,KAAAA,CAAMsB,GAAG,CAAC,CAAC9B,IAAAA,GAAS+B,oBAAAA,CAAIC,MAAM,CAAChC,IAAAA,CAAKiC,QAAQ,CAAA,CAAA,CAAA;AAC1D,YAAA,CAAA,MAAO,IAAIzB,KAAAA,IAASA,KAAAA,CAAMyB,QAAQ,EAAE;;gBAElCF,oBAAAA,CAAIC,MAAM,CAACxB,KAAAA,CAAMyB,QAAQ,CAAA;AAC3B,YAAA;YACA,OAAO3B,GAAAA,CAAIC,OAAO,CAACC,KAAK;AAC1B,QAAA;AACF,IAAA,CAAA;AACF;;;;"}
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
var compress = require('koa-compress');
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var compress__default = /*#__PURE__*/_interopDefault(compress);
|
|
8
|
+
|
|
9
|
+
const compression = (config)=>compress__default.default(config);
|
|
6
10
|
|
|
7
11
|
exports.compression = compression;
|
|
8
12
|
//# sourceMappingURL=compression.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compression.js","sources":["../../src/middlewares/compression.ts"],"sourcesContent":["import compress from 'koa-compress';\nimport type { Core } from '@strapi/types';\n\nexport type Config = compress.CompressOptions;\n\nexport const compression: Core.MiddlewareFactory<Config> = (config) => compress(config);\n"],"names":["compression","config","compress"],"mappings":"
|
|
1
|
+
{"version":3,"file":"compression.js","sources":["../../src/middlewares/compression.ts"],"sourcesContent":["import compress from 'koa-compress';\nimport type { Core } from '@strapi/types';\n\nexport type Config = compress.CompressOptions;\n\nexport const compression: Core.MiddlewareFactory<Config> = (config) => compress(config);\n"],"names":["compression","config","compress"],"mappings":";;;;;;;;AAKO,MAAMA,WAAAA,GAA8C,CAACC,MAAAA,GAAWC,0BAASD,MAAAA;;;;"}
|
package/dist/middlewares/cors.js
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
var koaCors = require('@koa/cors');
|
|
4
4
|
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var koaCors__default = /*#__PURE__*/_interopDefault(koaCors);
|
|
8
|
+
|
|
5
9
|
const defaults = {
|
|
6
10
|
origin: '*',
|
|
7
11
|
maxAge: 31536000,
|
|
@@ -67,7 +71,7 @@ const cors = (config)=>{
|
|
|
67
71
|
if (config.enabled !== undefined) {
|
|
68
72
|
strapi.log.warn('The strapi::cors middleware no longer supports the `enabled` option. Using it' + ' to conditionally enable CORS might cause an insecure default. To disable strapi::cors, remove it from' + ' the exported array in config/middleware.js');
|
|
69
73
|
}
|
|
70
|
-
return
|
|
74
|
+
return koaCors__default.default({
|
|
71
75
|
async origin (ctx) {
|
|
72
76
|
const requestOrigin = ctx.get('Origin');
|
|
73
77
|
return matchOrigin(requestOrigin, origin, ctx);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cors.js","sources":["../../src/middlewares/cors.ts"],"sourcesContent":["import koaCors from '@koa/cors';\n\nimport type { Core } from '@strapi/types';\n\nexport type Config = {\n enabled?: boolean;\n origin: string | string[] | ((ctx: any) => string | string[] | Promise<string | string[]>);\n expose?: string | string[];\n maxAge?: number;\n credentials?: boolean;\n methods?: string | string[];\n headers?: string | string[];\n keepHeadersOnError?: boolean;\n};\n\nconst defaults: Config = {\n origin: '*',\n maxAge: 31536000,\n credentials: true,\n methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],\n headers: ['Content-Type', 'Authorization', 'Origin', 'Accept'],\n keepHeadersOnError: false,\n};\n\n/**\n * Determines if a request origin is allowed based on the configured origin list\n * @param requestOrigin - The origin from the request header\n * @param configuredOrigin - The origin configuration (string, array, or function)\n * @param ctx - The Koa context (for function-based origin)\n * @returns The allowed origin string or empty string if blocked\n */\nexport const matchOrigin = async (\n requestOrigin: string | undefined,\n configuredOrigin:\n | string\n | string[]\n | ((ctx: any) => string | string[] | Promise<string | string[]>),\n ctx?: any\n): Promise<string> => {\n if (!requestOrigin) {\n return '*';\n }\n\n let originList: string | string[];\n\n if (typeof configuredOrigin === 'function') {\n originList = await configuredOrigin(ctx);\n } else {\n originList = configuredOrigin;\n }\n\n // Normalize originList into an array\n let normalizedOrigins: string[];\n if (Array.isArray(originList)) {\n normalizedOrigins = originList;\n } else if (originList === undefined || originList === null) {\n // Handle undefined/null - treat as wildcard\n normalizedOrigins = ['*'];\n } else {\n // Handle comma-separated string of origins\n normalizedOrigins = originList.split(',').map((origin) => origin.trim());\n }\n\n // Check if wildcard is in the normalized origins\n if (normalizedOrigins.includes('*')) {\n return requestOrigin;\n }\n\n // Check if request origin is in the normalized origins\n return normalizedOrigins.includes(requestOrigin) ? requestOrigin : '';\n};\n\nexport const cors: Core.MiddlewareFactory<Config> = (config) => {\n const { origin, expose, maxAge, credentials, methods, headers, keepHeadersOnError } = {\n ...defaults,\n ...config,\n };\n\n if (config.enabled !== undefined) {\n strapi.log.warn(\n 'The strapi::cors middleware no longer supports the `enabled` option. Using it' +\n ' to conditionally enable CORS might cause an insecure default. To disable strapi::cors, remove it from' +\n ' the exported array in config/middleware.js'\n );\n }\n\n return koaCors({\n async origin(ctx) {\n const requestOrigin = ctx.get('Origin');\n return matchOrigin(requestOrigin, origin, ctx);\n },\n exposeHeaders: expose,\n maxAge,\n credentials,\n allowMethods: methods,\n allowHeaders: headers,\n keepHeadersOnError,\n });\n};\n"],"names":["defaults","origin","maxAge","credentials","methods","headers","keepHeadersOnError","matchOrigin","requestOrigin","configuredOrigin","ctx","originList","normalizedOrigins","Array","isArray","undefined","split","map","trim","includes","cors","config","expose","enabled","strapi","log","warn","koaCors","get","exposeHeaders","allowMethods","allowHeaders"],"mappings":"
|
|
1
|
+
{"version":3,"file":"cors.js","sources":["../../src/middlewares/cors.ts"],"sourcesContent":["import koaCors from '@koa/cors';\n\nimport type { Core } from '@strapi/types';\n\nexport type Config = {\n enabled?: boolean;\n origin: string | string[] | ((ctx: any) => string | string[] | Promise<string | string[]>);\n expose?: string | string[];\n maxAge?: number;\n credentials?: boolean;\n methods?: string | string[];\n headers?: string | string[];\n keepHeadersOnError?: boolean;\n};\n\nconst defaults: Config = {\n origin: '*',\n maxAge: 31536000,\n credentials: true,\n methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],\n headers: ['Content-Type', 'Authorization', 'Origin', 'Accept'],\n keepHeadersOnError: false,\n};\n\n/**\n * Determines if a request origin is allowed based on the configured origin list\n * @param requestOrigin - The origin from the request header\n * @param configuredOrigin - The origin configuration (string, array, or function)\n * @param ctx - The Koa context (for function-based origin)\n * @returns The allowed origin string or empty string if blocked\n */\nexport const matchOrigin = async (\n requestOrigin: string | undefined,\n configuredOrigin:\n | string\n | string[]\n | ((ctx: any) => string | string[] | Promise<string | string[]>),\n ctx?: any\n): Promise<string> => {\n if (!requestOrigin) {\n return '*';\n }\n\n let originList: string | string[];\n\n if (typeof configuredOrigin === 'function') {\n originList = await configuredOrigin(ctx);\n } else {\n originList = configuredOrigin;\n }\n\n // Normalize originList into an array\n let normalizedOrigins: string[];\n if (Array.isArray(originList)) {\n normalizedOrigins = originList;\n } else if (originList === undefined || originList === null) {\n // Handle undefined/null - treat as wildcard\n normalizedOrigins = ['*'];\n } else {\n // Handle comma-separated string of origins\n normalizedOrigins = originList.split(',').map((origin) => origin.trim());\n }\n\n // Check if wildcard is in the normalized origins\n if (normalizedOrigins.includes('*')) {\n return requestOrigin;\n }\n\n // Check if request origin is in the normalized origins\n return normalizedOrigins.includes(requestOrigin) ? requestOrigin : '';\n};\n\nexport const cors: Core.MiddlewareFactory<Config> = (config) => {\n const { origin, expose, maxAge, credentials, methods, headers, keepHeadersOnError } = {\n ...defaults,\n ...config,\n };\n\n if (config.enabled !== undefined) {\n strapi.log.warn(\n 'The strapi::cors middleware no longer supports the `enabled` option. Using it' +\n ' to conditionally enable CORS might cause an insecure default. To disable strapi::cors, remove it from' +\n ' the exported array in config/middleware.js'\n );\n }\n\n return koaCors({\n async origin(ctx) {\n const requestOrigin = ctx.get('Origin');\n return matchOrigin(requestOrigin, origin, ctx);\n },\n exposeHeaders: expose,\n maxAge,\n credentials,\n allowMethods: methods,\n allowHeaders: headers,\n keepHeadersOnError,\n });\n};\n"],"names":["defaults","origin","maxAge","credentials","methods","headers","keepHeadersOnError","matchOrigin","requestOrigin","configuredOrigin","ctx","originList","normalizedOrigins","Array","isArray","undefined","split","map","trim","includes","cors","config","expose","enabled","strapi","log","warn","koaCors","get","exposeHeaders","allowMethods","allowHeaders"],"mappings":";;;;;;;;AAeA,MAAMA,QAAAA,GAAmB;IACvBC,MAAAA,EAAQ,GAAA;IACRC,MAAAA,EAAQ,QAAA;IACRC,WAAAA,EAAa,IAAA;IACbC,OAAAA,EAAS;AAAC,QAAA,KAAA;AAAO,QAAA,MAAA;AAAQ,QAAA,KAAA;AAAO,QAAA,OAAA;AAAS,QAAA,QAAA;AAAU,QAAA,MAAA;AAAQ,QAAA;AAAU,KAAA;IACrEC,OAAAA,EAAS;AAAC,QAAA,cAAA;AAAgB,QAAA,eAAA;AAAiB,QAAA,QAAA;AAAU,QAAA;AAAS,KAAA;IAC9DC,kBAAAA,EAAoB;AACtB,CAAA;AAEA;;;;;;AAMC,IACM,MAAMC,WAAAA,GAAc,OACzBC,eACAC,gBAAAA,EAIAC,GAAAA,GAAAA;AAEA,IAAA,IAAI,CAACF,aAAAA,EAAe;QAClB,OAAO,GAAA;AACT,IAAA;IAEA,IAAIG,UAAAA;IAEJ,IAAI,OAAOF,qBAAqB,UAAA,EAAY;AAC1CE,QAAAA,UAAAA,GAAa,MAAMF,gBAAAA,CAAiBC,GAAAA,CAAAA;IACtC,CAAA,MAAO;QACLC,UAAAA,GAAaF,gBAAAA;AACf,IAAA;;IAGA,IAAIG,iBAAAA;IACJ,IAAIC,KAAAA,CAAMC,OAAO,CAACH,UAAAA,CAAAA,EAAa;QAC7BC,iBAAAA,GAAoBD,UAAAA;AACtB,IAAA,CAAA,MAAO,IAAIA,UAAAA,KAAeI,SAAAA,IAAaJ,UAAAA,KAAe,IAAA,EAAM;;QAE1DC,iBAAAA,GAAoB;AAAC,YAAA;AAAI,SAAA;IAC3B,CAAA,MAAO;;QAELA,iBAAAA,GAAoBD,UAAAA,CAAWK,KAAK,CAAC,GAAA,CAAA,CAAKC,GAAG,CAAC,CAAChB,MAAAA,GAAWA,MAAAA,CAAOiB,IAAI,EAAA,CAAA;AACvE,IAAA;;IAGA,IAAIN,iBAAAA,CAAkBO,QAAQ,CAAC,GAAA,CAAA,EAAM;QACnC,OAAOX,aAAAA;AACT,IAAA;;AAGA,IAAA,OAAOI,iBAAAA,CAAkBO,QAAQ,CAACX,aAAAA,CAAAA,GAAiBA,aAAAA,GAAgB,EAAA;AACrE;AAEO,MAAMY,OAAuC,CAACC,MAAAA,GAAAA;AACnD,IAAA,MAAM,EAAEpB,MAAM,EAAEqB,MAAM,EAAEpB,MAAM,EAAEC,WAAW,EAAEC,OAAO,EAAEC,OAAO,EAAEC,kBAAkB,EAAE,GAAG;AACpF,QAAA,GAAGN,QAAQ;AACX,QAAA,GAAGqB;AACL,KAAA;IAEA,IAAIA,MAAAA,CAAOE,OAAO,KAAKR,SAAAA,EAAW;AAChCS,QAAAA,MAAAA,CAAOC,GAAG,CAACC,IAAI,CACb,kFACE,wGAAA,GACA,6CAAA,CAAA;AAEN,IAAA;AAEA,IAAA,OAAOC,wBAAAA,CAAQ;AACb,QAAA,MAAM1B,QAAOS,GAAG,EAAA;YACd,MAAMF,aAAAA,GAAgBE,GAAAA,CAAIkB,GAAG,CAAC,QAAA,CAAA;YAC9B,OAAOrB,WAAAA,CAAYC,eAAeP,MAAAA,EAAQS,GAAAA,CAAAA;AAC5C,QAAA,CAAA;QACAmB,aAAAA,EAAeP,MAAAA;AACfpB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA;QACA2B,YAAAA,EAAc1B,OAAAA;QACd2B,YAAAA,EAAc1B,OAAAA;AACdC,QAAAA;AACF,KAAA,CAAA;AACF;;;;;"}
|
|
@@ -4,6 +4,10 @@ var fs = require('fs');
|
|
|
4
4
|
var path = require('path');
|
|
5
5
|
var koaFavicon = require('koa-favicon');
|
|
6
6
|
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var koaFavicon__default = /*#__PURE__*/_interopDefault(koaFavicon);
|
|
10
|
+
|
|
7
11
|
const defaults = {
|
|
8
12
|
path: 'favicon.png',
|
|
9
13
|
maxAge: 86400000
|
|
@@ -22,7 +26,7 @@ const favicon = (config, { strapi })=>{
|
|
|
22
26
|
faviconPath = 'favicon.ico';
|
|
23
27
|
}
|
|
24
28
|
}
|
|
25
|
-
return
|
|
29
|
+
return koaFavicon__default.default(path.resolve(appRoot, faviconPath), {
|
|
26
30
|
maxAge
|
|
27
31
|
});
|
|
28
32
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"favicon.js","sources":["../../src/middlewares/favicon.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport { resolve } from 'path';\nimport koaFavicon from 'koa-favicon';\nimport type { Core } from '@strapi/types';\n\nexport type Config = NonNullable<Parameters<typeof koaFavicon>[1]>;\n\nconst defaults = {\n path: 'favicon.png',\n maxAge: 86400000,\n};\n\nexport const favicon: Core.MiddlewareFactory<Config> = (config, { strapi }) => {\n const { maxAge, path: faviconPathConfig } = { ...defaults, ...config };\n const { root: appRoot } = strapi.dirs.app;\n let faviconPath = faviconPathConfig;\n\n if (!existsSync(resolve(appRoot, faviconPathConfig))) {\n if (existsSync(resolve(appRoot, defaults.path))) {\n faviconPath = defaults.path;\n } else if (existsSync(resolve(appRoot, 'favicon.ico'))) {\n faviconPath = 'favicon.ico';\n }\n }\n\n return koaFavicon(resolve(appRoot, faviconPath), { maxAge });\n};\n"],"names":["defaults","path","maxAge","favicon","config","strapi","faviconPathConfig","root","appRoot","dirs","app","faviconPath","existsSync","resolve","koaFavicon"],"mappings":"
|
|
1
|
+
{"version":3,"file":"favicon.js","sources":["../../src/middlewares/favicon.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport { resolve } from 'path';\nimport koaFavicon from 'koa-favicon';\nimport type { Core } from '@strapi/types';\n\nexport type Config = NonNullable<Parameters<typeof koaFavicon>[1]>;\n\nconst defaults = {\n path: 'favicon.png',\n maxAge: 86400000,\n};\n\nexport const favicon: Core.MiddlewareFactory<Config> = (config, { strapi }) => {\n const { maxAge, path: faviconPathConfig } = { ...defaults, ...config };\n const { root: appRoot } = strapi.dirs.app;\n let faviconPath = faviconPathConfig;\n\n if (!existsSync(resolve(appRoot, faviconPathConfig))) {\n if (existsSync(resolve(appRoot, defaults.path))) {\n faviconPath = defaults.path;\n } else if (existsSync(resolve(appRoot, 'favicon.ico'))) {\n faviconPath = 'favicon.ico';\n }\n }\n\n return koaFavicon(resolve(appRoot, faviconPath), { maxAge });\n};\n"],"names":["defaults","path","maxAge","favicon","config","strapi","faviconPathConfig","root","appRoot","dirs","app","faviconPath","existsSync","resolve","koaFavicon"],"mappings":";;;;;;;;;;AAOA,MAAMA,QAAAA,GAAW;IACfC,IAAAA,EAAM,aAAA;IACNC,MAAAA,EAAQ;AACV,CAAA;MAEaC,OAAAA,GAA0C,CAACC,MAAAA,EAAQ,EAAEC,MAAM,EAAE,GAAA;AACxE,IAAA,MAAM,EAAEH,MAAM,EAAED,IAAAA,EAAMK,iBAAiB,EAAE,GAAG;AAAE,QAAA,GAAGN,QAAQ;AAAE,QAAA,GAAGI;AAAO,KAAA;IACrE,MAAM,EAAEG,MAAMC,OAAO,EAAE,GAAGH,MAAAA,CAAOI,IAAI,CAACC,GAAG;AACzC,IAAA,IAAIC,WAAAA,GAAcL,iBAAAA;AAElB,IAAA,IAAI,CAACM,aAAAA,CAAWC,YAAAA,CAAQL,OAAAA,EAASF,iBAAAA,CAAAA,CAAAA,EAAqB;AACpD,QAAA,IAAIM,aAAAA,CAAWC,YAAAA,CAAQL,OAAAA,EAASR,QAAAA,CAASC,IAAI,CAAA,CAAA,EAAI;AAC/CU,YAAAA,WAAAA,GAAcX,SAASC,IAAI;AAC7B,QAAA,CAAA,MAAO,IAAIW,aAAAA,CAAWC,YAAAA,CAAQL,OAAAA,EAAS,aAAA,CAAA,CAAA,EAAiB;YACtDG,WAAAA,GAAc,aAAA;AAChB,QAAA;AACF,IAAA;IAEA,OAAOG,2BAAAA,CAAWD,YAAAA,CAAQL,OAAAA,EAASG,WAAAA,CAAAA,EAAc;AAAET,QAAAA;AAAO,KAAA,CAAA;AAC5D;;;;"}
|
package/dist/middlewares/ip.js
CHANGED
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
var koaIp = require('koa-ip');
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var koaIp__default = /*#__PURE__*/_interopDefault(koaIp);
|
|
8
|
+
|
|
9
|
+
const ip = (config)=>koaIp__default.default(config);
|
|
6
10
|
|
|
7
11
|
exports.ip = ip;
|
|
8
12
|
//# sourceMappingURL=ip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ip.js","sources":["../../src/middlewares/ip.ts"],"sourcesContent":["import koaIp from 'koa-ip';\nimport type { Core } from '@strapi/types';\n\nexport type Config = koaIp.KoaIPOptions;\n\nexport const ip: Core.MiddlewareFactory<Config> = (config) => koaIp(config);\n"],"names":["ip","config","koaIp"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ip.js","sources":["../../src/middlewares/ip.ts"],"sourcesContent":["import koaIp from 'koa-ip';\nimport type { Core } from '@strapi/types';\n\nexport type Config = koaIp.KoaIPOptions;\n\nexport const ip: Core.MiddlewareFactory<Config> = (config) => koaIp(config);\n"],"names":["ip","config","koaIp"],"mappings":";;;;;;;;AAKO,MAAMA,EAAAA,GAAqC,CAACC,MAAAA,GAAWC,uBAAMD,MAAAA;;;;"}
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
var fp = require('lodash/fp');
|
|
4
4
|
var koaStatic = require('koa-static');
|
|
5
5
|
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var koaStatic__default = /*#__PURE__*/_interopDefault(koaStatic);
|
|
9
|
+
|
|
6
10
|
const defaults = {
|
|
7
11
|
maxAge: 60000
|
|
8
12
|
};
|
|
@@ -23,7 +27,7 @@ const publicStatic = (config, { strapi })=>{
|
|
|
23
27
|
{
|
|
24
28
|
method: 'GET',
|
|
25
29
|
path: '/((?!uploads/).+)',
|
|
26
|
-
handler:
|
|
30
|
+
handler: koaStatic__default.default(strapi.dirs.static.public, {
|
|
27
31
|
maxage: maxAge,
|
|
28
32
|
defer: true
|
|
29
33
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public.js","sources":["../../src/middlewares/public.ts"],"sourcesContent":["import { defaultsDeep } from 'lodash/fp';\nimport koaStatic from 'koa-static';\nimport type { Core } from '@strapi/types';\n\ntype Config = koaStatic.Options;\n\nconst defaults = {\n maxAge: 60000,\n};\n\nexport const publicStatic: Core.MiddlewareFactory = (\n config: Config,\n { strapi }: { strapi: Core.Strapi }\n) => {\n const { maxAge } = defaultsDeep(defaults, config);\n\n strapi.server.routes([\n {\n method: 'GET',\n path: '/',\n handler(ctx) {\n ctx.redirect(strapi.config.get('admin.url', '/admin'));\n },\n config: { auth: false },\n },\n // All other public GET-routes except /uploads/(.*) which is handled in upload middleware\n {\n method: 'GET',\n path: '/((?!uploads/).+)',\n handler: koaStatic(strapi.dirs.static.public, {\n maxage: maxAge,\n defer: true,\n }),\n config: { auth: false },\n },\n ]);\n};\n"],"names":["defaults","maxAge","publicStatic","config","strapi","defaultsDeep","server","routes","method","path","handler","ctx","redirect","get","auth","koaStatic","dirs","static","public","maxage","defer"],"mappings":"
|
|
1
|
+
{"version":3,"file":"public.js","sources":["../../src/middlewares/public.ts"],"sourcesContent":["import { defaultsDeep } from 'lodash/fp';\nimport koaStatic from 'koa-static';\nimport type { Core } from '@strapi/types';\n\ntype Config = koaStatic.Options;\n\nconst defaults = {\n maxAge: 60000,\n};\n\nexport const publicStatic: Core.MiddlewareFactory = (\n config: Config,\n { strapi }: { strapi: Core.Strapi }\n) => {\n const { maxAge } = defaultsDeep(defaults, config);\n\n strapi.server.routes([\n {\n method: 'GET',\n path: '/',\n handler(ctx) {\n ctx.redirect(strapi.config.get('admin.url', '/admin'));\n },\n config: { auth: false },\n },\n // All other public GET-routes except /uploads/(.*) which is handled in upload middleware\n {\n method: 'GET',\n path: '/((?!uploads/).+)',\n handler: koaStatic(strapi.dirs.static.public, {\n maxage: maxAge,\n defer: true,\n }),\n config: { auth: false },\n },\n ]);\n};\n"],"names":["defaults","maxAge","publicStatic","config","strapi","defaultsDeep","server","routes","method","path","handler","ctx","redirect","get","auth","koaStatic","dirs","static","public","maxage","defer"],"mappings":";;;;;;;;;AAMA,MAAMA,QAAAA,GAAW;IACfC,MAAAA,EAAQ;AACV,CAAA;MAEaC,YAAAA,GAAuC,CAClDC,MAAAA,EACA,EAAEC,MAAM,EAA2B,GAAA;AAEnC,IAAA,MAAM,EAAEH,MAAM,EAAE,GAAGI,gBAAaL,QAAAA,EAAUG,MAAAA,CAAAA;IAE1CC,MAAAA,CAAOE,MAAM,CAACC,MAAM,CAAC;AACnB,QAAA;YACEC,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,GAAA;AACNC,YAAAA,OAAAA,CAAAA,CAAQC,GAAG,EAAA;AACTA,gBAAAA,GAAAA,CAAIC,QAAQ,CAACR,MAAAA,CAAOD,MAAM,CAACU,GAAG,CAAC,WAAA,EAAa,QAAA,CAAA,CAAA;AAC9C,YAAA,CAAA;YACAV,MAAAA,EAAQ;gBAAEW,IAAAA,EAAM;AAAM;AACxB,SAAA;;AAEA,QAAA;YACEN,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,mBAAA;AACNC,YAAAA,OAAAA,EAASK,2BAAUX,MAAAA,CAAOY,IAAI,CAACC,MAAM,CAACC,MAAM,EAAE;gBAC5CC,MAAAA,EAAQlB,MAAAA;gBACRmB,KAAAA,EAAO;AACT,aAAA,CAAA;YACAjB,MAAAA,EAAQ;gBAAEW,IAAAA,EAAM;AAAM;AACxB;AACD,KAAA,CAAA;AACH;;;;"}
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
var qs = require('qs');
|
|
4
4
|
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var qs__default = /*#__PURE__*/_interopDefault(qs);
|
|
8
|
+
|
|
5
9
|
const defaults = {
|
|
6
10
|
strictNullHandling: true,
|
|
7
11
|
arrayLimit: 100,
|
|
@@ -20,14 +24,14 @@ const defaults = {
|
|
|
20
24
|
this._querycache = this._querycache || {};
|
|
21
25
|
const cache = this._querycache;
|
|
22
26
|
if (!cache[qstr]) {
|
|
23
|
-
cache[qstr] =
|
|
27
|
+
cache[qstr] = qs__default.default.parse(qstr, settings);
|
|
24
28
|
}
|
|
25
29
|
return cache[qstr];
|
|
26
30
|
},
|
|
27
31
|
/*
|
|
28
32
|
* Set query-string as an object.
|
|
29
33
|
*/ set (obj) {
|
|
30
|
-
this.querystring =
|
|
34
|
+
this.querystring = qs__default.default.stringify(obj);
|
|
31
35
|
}
|
|
32
36
|
});
|
|
33
37
|
return app;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sources":["../../src/middlewares/query.ts"],"sourcesContent":["import qs from 'qs';\nimport type Koa from 'koa';\nimport type { Core } from '@strapi/types';\n\ntype Config = Parameters<typeof qs.parse>[1];\n\nconst defaults: Config = {\n strictNullHandling: true,\n arrayLimit: 100,\n depth: 20,\n};\n\n/**\n * Body parser hook\n */\nconst addQsParser = (app: Koa, settings: Config) => {\n Object.defineProperty(app.request, 'query', {\n configurable: false,\n enumerable: true,\n /*\n * Get parsed query-string.\n */\n get() {\n const qstr = this.querystring;\n\n this._querycache = this._querycache || {};\n const cache = this._querycache;\n\n if (!cache[qstr]) {\n cache[qstr] = qs.parse(qstr, settings);\n }\n\n return cache[qstr];\n },\n\n /*\n * Set query-string as an object.\n */\n set(obj) {\n this.querystring = qs.stringify(obj);\n },\n } satisfies PropertyDescriptor & ThisType<Koa.BaseRequest>);\n\n return app;\n};\n\nexport const query: Core.MiddlewareFactory = (\n config: Partial<Config>,\n { strapi }: { strapi: Core.Strapi }\n) => {\n addQsParser(strapi.server.app, { ...defaults, ...config } as Config);\n};\n"],"names":["defaults","strictNullHandling","arrayLimit","depth","addQsParser","app","settings","Object","defineProperty","request","configurable","enumerable","get","qstr","querystring","_querycache","cache","qs","parse","set","obj","stringify","query","config","strapi","server"],"mappings":"
|
|
1
|
+
{"version":3,"file":"query.js","sources":["../../src/middlewares/query.ts"],"sourcesContent":["import qs from 'qs';\nimport type Koa from 'koa';\nimport type { Core } from '@strapi/types';\n\ntype Config = Parameters<typeof qs.parse>[1];\n\nconst defaults: Config = {\n strictNullHandling: true,\n arrayLimit: 100,\n depth: 20,\n};\n\n/**\n * Body parser hook\n */\nconst addQsParser = (app: Koa, settings: Config) => {\n Object.defineProperty(app.request, 'query', {\n configurable: false,\n enumerable: true,\n /*\n * Get parsed query-string.\n */\n get() {\n const qstr = this.querystring;\n\n this._querycache = this._querycache || {};\n const cache = this._querycache;\n\n if (!cache[qstr]) {\n cache[qstr] = qs.parse(qstr, settings);\n }\n\n return cache[qstr];\n },\n\n /*\n * Set query-string as an object.\n */\n set(obj) {\n this.querystring = qs.stringify(obj);\n },\n } satisfies PropertyDescriptor & ThisType<Koa.BaseRequest>);\n\n return app;\n};\n\nexport const query: Core.MiddlewareFactory = (\n config: Partial<Config>,\n { strapi }: { strapi: Core.Strapi }\n) => {\n addQsParser(strapi.server.app, { ...defaults, ...config } as Config);\n};\n"],"names":["defaults","strictNullHandling","arrayLimit","depth","addQsParser","app","settings","Object","defineProperty","request","configurable","enumerable","get","qstr","querystring","_querycache","cache","qs","parse","set","obj","stringify","query","config","strapi","server"],"mappings":";;;;;;;;AAMA,MAAMA,QAAAA,GAAmB;IACvBC,kBAAAA,EAAoB,IAAA;IACpBC,UAAAA,EAAY,GAAA;IACZC,KAAAA,EAAO;AACT,CAAA;AAEA;;IAGA,MAAMC,WAAAA,GAAc,CAACC,GAAAA,EAAUC,QAAAA,GAAAA;AAC7BC,IAAAA,MAAAA,CAAOC,cAAc,CAACH,GAAAA,CAAII,OAAO,EAAE,OAAA,EAAS;QAC1CC,YAAAA,EAAc,KAAA;QACdC,UAAAA,EAAY,IAAA;AACZ;;QAGAC,GAAAA,CAAAA,GAAAA;YACE,MAAMC,IAAAA,GAAO,IAAI,CAACC,WAAW;AAE7B,YAAA,IAAI,CAACC,WAAW,GAAG,IAAI,CAACA,WAAW,IAAI,EAAC;YACxC,MAAMC,KAAAA,GAAQ,IAAI,CAACD,WAAW;AAE9B,YAAA,IAAI,CAACC,KAAK,CAACH,IAAAA,CAAK,EAAE;AAChBG,gBAAAA,KAAK,CAACH,IAAAA,CAAK,GAAGI,mBAAAA,CAAGC,KAAK,CAACL,IAAAA,EAAMP,QAAAA,CAAAA;AAC/B,YAAA;YAEA,OAAOU,KAAK,CAACH,IAAAA,CAAK;AACpB,QAAA,CAAA;AAEA;;AAEC,QACDM,KAAIC,GAAG,EAAA;AACL,YAAA,IAAI,CAACN,WAAW,GAAGG,mBAAAA,CAAGI,SAAS,CAACD,GAAAA,CAAAA;AAClC,QAAA;AACF,KAAA,CAAA;IAEA,OAAOf,GAAAA;AACT,CAAA;MAEaiB,KAAAA,GAAgC,CAC3CC,MAAAA,EACA,EAAEC,MAAM,EAA2B,GAAA;AAEnCpB,IAAAA,WAAAA,CAAYoB,MAAAA,CAAOC,MAAM,CAACpB,GAAG,EAAE;AAAE,QAAA,GAAGL,QAAQ;AAAE,QAAA,GAAGuB;AAAO,KAAA,CAAA;AAC1D;;;;"}
|