@strapi/core 5.46.1 → 5.47.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/core-api/routes/index.js +2 -0
- package/dist/core-api/routes/index.js.map +1 -1
- package/dist/core-api/routes/index.mjs +2 -0
- package/dist/core-api/routes/index.mjs.map +1 -1
- package/dist/core-api/routes/validation/content-type.d.ts +13 -1
- package/dist/core-api/routes/validation/content-type.d.ts.map +1 -1
- package/dist/core-api/routes/validation/content-type.js +15 -2
- package/dist/core-api/routes/validation/content-type.js.map +1 -1
- package/dist/core-api/routes/validation/content-type.mjs +15 -2
- package/dist/core-api/routes/validation/content-type.mjs.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts +2 -1
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.js +41 -30
- package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.mjs +41 -30
- package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
- package/dist/package.json.js +14 -12
- package/dist/package.json.js.map +1 -1
- package/dist/package.json.mjs +14 -12
- package/dist/package.json.mjs.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +3 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/index.mjs +3 -1
- package/dist/providers/index.mjs.map +1 -1
- package/dist/providers/mcp.d.ts +3 -0
- package/dist/providers/mcp.d.ts.map +1 -0
- package/dist/providers/mcp.js +39 -0
- package/dist/providers/mcp.js.map +1 -0
- package/dist/providers/mcp.mjs +37 -0
- package/dist/providers/mcp.mjs.map +1 -0
- package/dist/services/ai.d.ts.map +1 -1
- package/dist/services/ai.js +3 -0
- package/dist/services/ai.js.map +1 -1
- package/dist/services/ai.mjs +3 -0
- package/dist/services/ai.mjs.map +1 -1
- package/dist/services/document-service/draft-and-publish.d.ts +2 -16
- package/dist/services/document-service/draft-and-publish.d.ts.map +1 -1
- package/dist/services/document-service/draft-and-publish.js +0 -53
- package/dist/services/document-service/draft-and-publish.js.map +1 -1
- package/dist/services/document-service/draft-and-publish.mjs +2 -53
- package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
- package/dist/services/document-service/params.d.ts +2 -2
- package/dist/services/document-service/params.d.ts.map +1 -1
- package/dist/services/document-service/publication-filter.d.ts +6 -0
- package/dist/services/document-service/publication-filter.d.ts.map +1 -0
- package/dist/services/document-service/publication-filter.js +20 -0
- package/dist/services/document-service/publication-filter.js.map +1 -0
- package/dist/services/document-service/publication-filter.mjs +15 -0
- package/dist/services/document-service/publication-filter.mjs.map +1 -0
- package/dist/services/document-service/transform/query.d.ts +1 -1
- package/dist/services/document-service/transform/query.d.ts.map +1 -1
- package/dist/services/document-service/transform/query.js +32 -19
- package/dist/services/document-service/transform/query.js.map +1 -1
- package/dist/services/document-service/transform/query.mjs +33 -20
- package/dist/services/document-service/transform/query.mjs.map +1 -1
- package/dist/services/entity-validator/blocks-validator.js +1 -1
- package/dist/services/entity-validator/blocks-validator.js.map +1 -1
- package/dist/services/entity-validator/blocks-validator.mjs +1 -1
- package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
- package/dist/services/mcp/authentication.d.ts +23 -0
- package/dist/services/mcp/authentication.d.ts.map +1 -0
- package/dist/services/mcp/authentication.js +45 -0
- package/dist/services/mcp/authentication.js.map +1 -0
- package/dist/services/mcp/authentication.mjs +43 -0
- package/dist/services/mcp/authentication.mjs.map +1 -0
- package/dist/services/mcp/handlers/handlePost.d.ts +4 -0
- package/dist/services/mcp/handlers/handlePost.d.ts.map +1 -0
- package/dist/services/mcp/handlers/handlePost.js +59 -0
- package/dist/services/mcp/handlers/handlePost.js.map +1 -0
- package/dist/services/mcp/handlers/handlePost.mjs +57 -0
- package/dist/services/mcp/handlers/handlePost.mjs.map +1 -0
- package/dist/services/mcp/handlers/types.d.ts +12 -0
- package/dist/services/mcp/handlers/types.d.ts.map +1 -0
- package/dist/services/mcp/index.d.ts +6 -0
- package/dist/services/mcp/index.d.ts.map +1 -0
- package/dist/services/mcp/index.js +101 -0
- package/dist/services/mcp/index.js.map +1 -0
- package/dist/services/mcp/index.mjs +99 -0
- package/dist/services/mcp/index.mjs.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts +13 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js +53 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs +51 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts +43 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.js +108 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.js.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.mjs +106 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.mjs.map +1 -0
- package/dist/services/mcp/internal/McpConfiguration.d.ts +11 -0
- package/dist/services/mcp/internal/McpConfiguration.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpConfiguration.js +34 -0
- package/dist/services/mcp/internal/McpConfiguration.js.map +1 -0
- package/dist/services/mcp/internal/McpConfiguration.mjs +32 -0
- package/dist/services/mcp/internal/McpConfiguration.mjs.map +1 -0
- package/dist/services/mcp/internal/McpServerFactory.d.ts +37 -0
- package/dist/services/mcp/internal/McpServerFactory.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpServerFactory.js +71 -0
- package/dist/services/mcp/internal/McpServerFactory.js.map +1 -0
- package/dist/services/mcp/internal/McpServerFactory.mjs +69 -0
- package/dist/services/mcp/internal/McpServerFactory.mjs.map +1 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts +21 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts.map +1 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.js +76 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.js.map +1 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs +73 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs.map +1 -0
- package/dist/services/mcp/metrics/metrics.d.ts +29 -0
- package/dist/services/mcp/metrics/metrics.d.ts.map +1 -0
- package/dist/services/mcp/metrics/metrics.js +97 -0
- package/dist/services/mcp/metrics/metrics.js.map +1 -0
- package/dist/services/mcp/metrics/metrics.mjs +88 -0
- package/dist/services/mcp/metrics/metrics.mjs.map +1 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts +11 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts.map +1 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.js +10 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.js.map +1 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.mjs +8 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.mjs.map +1 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts +4 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts.map +1 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js +27 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js.map +1 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs +25 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs.map +1 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts +3 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts.map +1 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.js +47 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.js.map +1 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs +45 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs.map +1 -0
- package/dist/services/mcp/prompt-registry.d.ts +16 -0
- package/dist/services/mcp/prompt-registry.d.ts.map +1 -0
- package/dist/services/mcp/prompt-registry.js +77 -0
- package/dist/services/mcp/prompt-registry.js.map +1 -0
- package/dist/services/mcp/prompt-registry.mjs +75 -0
- package/dist/services/mcp/prompt-registry.mjs.map +1 -0
- package/dist/services/mcp/resource-registry.d.ts +14 -0
- package/dist/services/mcp/resource-registry.d.ts.map +1 -0
- package/dist/services/mcp/resource-registry.js +67 -0
- package/dist/services/mcp/resource-registry.js.map +1 -0
- package/dist/services/mcp/resource-registry.mjs +65 -0
- package/dist/services/mcp/resource-registry.mjs.map +1 -0
- package/dist/services/mcp/routes.d.ts +11 -0
- package/dist/services/mcp/routes.d.ts.map +1 -0
- package/dist/services/mcp/routes.js +58 -0
- package/dist/services/mcp/routes.js.map +1 -0
- package/dist/services/mcp/routes.mjs +56 -0
- package/dist/services/mcp/routes.mjs.map +1 -0
- package/dist/services/mcp/tool-registry.d.ts +25 -0
- package/dist/services/mcp/tool-registry.d.ts.map +1 -0
- package/dist/services/mcp/tool-registry.js +102 -0
- package/dist/services/mcp/tool-registry.js.map +1 -0
- package/dist/services/mcp/tool-registry.mjs +99 -0
- package/dist/services/mcp/tool-registry.mjs.map +1 -0
- package/dist/services/mcp/tools/log.d.ts +87 -0
- package/dist/services/mcp/tools/log.d.ts.map +1 -0
- package/dist/services/mcp/tools/log.js +88 -0
- package/dist/services/mcp/tools/log.js.map +1 -0
- package/dist/services/mcp/tools/log.mjs +86 -0
- package/dist/services/mcp/tools/log.mjs.map +1 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts +36 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts.map +1 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.js +59 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.js.map +1 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs +56 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs.map +1 -0
- package/dist/services/mcp/utils/jsonRpcErrors.d.ts +22 -0
- package/dist/services/mcp/utils/jsonRpcErrors.d.ts.map +1 -0
- package/dist/services/mcp/utils/jsonRpcErrors.js +25 -0
- package/dist/services/mcp/utils/jsonRpcErrors.js.map +1 -0
- package/dist/services/mcp/utils/jsonRpcErrors.mjs +23 -0
- package/dist/services/mcp/utils/jsonRpcErrors.mjs.map +1 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.d.ts +18 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.d.ts.map +1 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.js +29 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.js.map +1 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.mjs +27 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.mjs.map +1 -0
- package/dist/services/mcp/utils/sendJsonRpcError.d.ts +5 -0
- package/dist/services/mcp/utils/sendJsonRpcError.d.ts.map +1 -0
- package/dist/services/mcp/utils/sendJsonRpcError.js +23 -0
- package/dist/services/mcp/utils/sendJsonRpcError.js.map +1 -0
- package/dist/services/mcp/utils/sendJsonRpcError.mjs +21 -0
- package/dist/services/mcp/utils/sendJsonRpcError.mjs.map +1 -0
- package/dist/services/mcp/utils/withTimeout.d.ts +7 -0
- package/dist/services/mcp/utils/withTimeout.d.ts.map +1 -0
- package/dist/services/mcp/utils/withTimeout.js +23 -0
- package/dist/services/mcp/utils/withTimeout.js.map +1 -0
- package/dist/services/mcp/utils/withTimeout.mjs +21 -0
- package/dist/services/mcp/utils/withTimeout.mjs.map +1 -0
- package/dist/services/metrics/index.d.ts.map +1 -1
- package/dist/services/metrics/index.js +3 -1
- package/dist/services/metrics/index.js.map +1 -1
- package/dist/services/metrics/index.mjs +3 -1
- package/dist/services/metrics/index.mjs.map +1 -1
- package/package.json +14 -12
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var strapiUtils = require('@strapi/utils');
|
|
4
|
+
|
|
5
|
+
const getPublicationFilterCondition = (uid, mode, status)=>{
|
|
6
|
+
const model = strapi.getModel(uid);
|
|
7
|
+
if (!model || !strapiUtils.contentTypes.hasDraftAndPublish(model)) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const knex = strapi.db.connection;
|
|
11
|
+
const meta = strapi.db.metadata.get(uid);
|
|
12
|
+
return strapiUtils.buildPublicationFilterWhere(knex, meta, model, mode, status);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
Object.defineProperty(exports, "parsePublicationFilter", {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return strapiUtils.parsePublicationFilter; }
|
|
18
|
+
});
|
|
19
|
+
exports.getPublicationFilterCondition = getPublicationFilterCondition;
|
|
20
|
+
//# sourceMappingURL=publication-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication-filter.js","sources":["../../../src/services/document-service/publication-filter.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\nimport {\n contentTypes,\n buildPublicationFilterWhere,\n parsePublicationFilter,\n type PublicationFilterMode,\n} from '@strapi/utils';\n\nexport { parsePublicationFilter };\nexport type { PublicationFilterMode };\n\nexport const getPublicationFilterCondition = (\n uid: UID.Schema,\n mode: PublicationFilterMode,\n status: 'draft' | 'published'\n): Record<string, unknown> | null => {\n const model = strapi.getModel(uid);\n\n if (!model || !contentTypes.hasDraftAndPublish(model)) {\n return null;\n }\n\n const knex = strapi.db.connection;\n const meta = strapi.db.metadata.get(uid);\n\n return buildPublicationFilterWhere(knex, meta, model, mode, status);\n};\n"],"names":["getPublicationFilterCondition","uid","mode","status","model","strapi","getModel","contentTypes","hasDraftAndPublish","knex","db","connection","meta","metadata","get","buildPublicationFilterWhere"],"mappings":";;;;AAWO,MAAMA,6BAAAA,GAAgC,CAC3CC,GAAAA,EACAC,IAAAA,EACAC,MAAAA,GAAAA;IAEA,MAAMC,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACL,GAAAA,CAAAA;AAE9B,IAAA,IAAI,CAACG,KAAAA,IAAS,CAACG,wBAAAA,CAAaC,kBAAkB,CAACJ,KAAAA,CAAAA,EAAQ;QACrD,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMK,IAAAA,GAAOJ,MAAAA,CAAOK,EAAE,CAACC,UAAU;AACjC,IAAA,MAAMC,OAAOP,MAAAA,CAAOK,EAAE,CAACG,QAAQ,CAACC,GAAG,CAACb,GAAAA,CAAAA;AAEpC,IAAA,OAAOc,uCAAAA,CAA4BN,IAAAA,EAAMG,IAAAA,EAAMR,KAAAA,EAAOF,IAAAA,EAAMC,MAAAA,CAAAA;AAC9D;;;;;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { contentTypes, buildPublicationFilterWhere } from '@strapi/utils';
|
|
2
|
+
export { parsePublicationFilter } from '@strapi/utils';
|
|
3
|
+
|
|
4
|
+
const getPublicationFilterCondition = (uid, mode, status)=>{
|
|
5
|
+
const model = strapi.getModel(uid);
|
|
6
|
+
if (!model || !contentTypes.hasDraftAndPublish(model)) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const knex = strapi.db.connection;
|
|
10
|
+
const meta = strapi.db.metadata.get(uid);
|
|
11
|
+
return buildPublicationFilterWhere(knex, meta, model, mode, status);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { getPublicationFilterCondition };
|
|
15
|
+
//# sourceMappingURL=publication-filter.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication-filter.mjs","sources":["../../../src/services/document-service/publication-filter.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\nimport {\n contentTypes,\n buildPublicationFilterWhere,\n parsePublicationFilter,\n type PublicationFilterMode,\n} from '@strapi/utils';\n\nexport { parsePublicationFilter };\nexport type { PublicationFilterMode };\n\nexport const getPublicationFilterCondition = (\n uid: UID.Schema,\n mode: PublicationFilterMode,\n status: 'draft' | 'published'\n): Record<string, unknown> | null => {\n const model = strapi.getModel(uid);\n\n if (!model || !contentTypes.hasDraftAndPublish(model)) {\n return null;\n }\n\n const knex = strapi.db.connection;\n const meta = strapi.db.metadata.get(uid);\n\n return buildPublicationFilterWhere(knex, meta, model, mode, status);\n};\n"],"names":["getPublicationFilterCondition","uid","mode","status","model","strapi","getModel","contentTypes","hasDraftAndPublish","knex","db","connection","meta","metadata","get","buildPublicationFilterWhere"],"mappings":";;;AAWO,MAAMA,6BAAAA,GAAgC,CAC3CC,GAAAA,EACAC,IAAAA,EACAC,MAAAA,GAAAA;IAEA,MAAMC,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACL,GAAAA,CAAAA;AAE9B,IAAA,IAAI,CAACG,KAAAA,IAAS,CAACG,YAAAA,CAAaC,kBAAkB,CAACJ,KAAAA,CAAAA,EAAQ;QACrD,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMK,IAAAA,GAAOJ,MAAAA,CAAOK,EAAE,CAACC,UAAU;AACjC,IAAA,MAAMC,OAAOP,MAAAA,CAAOK,EAAE,CAACG,QAAQ,CAACC,GAAG,CAACb,GAAAA,CAAAA;AAEpC,IAAA,OAAOc,2BAAAA,CAA4BN,IAAAA,EAAMG,IAAAA,EAAMR,KAAAA,EAAOF,IAAAA,EAAMC,MAAAA,CAAAA;AAC9D;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="lodash" />
|
|
2
2
|
import type { UID } from '@strapi/types';
|
|
3
|
-
declare const transformParamsToQuery: import("lodash").CurriedFunction2<UID.Schema, any, any
|
|
3
|
+
declare const transformParamsToQuery: import("lodash").CurriedFunction2<UID.Schema, any, Partial<any>>;
|
|
4
4
|
export { transformParamsToQuery };
|
|
5
5
|
//# sourceMappingURL=query.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/services/document-service/transform/query.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/services/document-service/transform/query.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAazC,QAAA,MAAM,sBAAsB,kEAmE1B,CAAC;AAEH,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -1,21 +1,37 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var fp = require('lodash/fp');
|
|
4
|
-
var
|
|
4
|
+
var strapiUtils = require('@strapi/utils');
|
|
5
|
+
var publicationFilter = require('../publication-filter.js');
|
|
5
6
|
var params = require('../params.js');
|
|
6
7
|
|
|
7
8
|
const transformParamsToQuery = fp.curry((uid, params$1)=>{
|
|
8
|
-
const
|
|
9
|
+
const rawParams = params$1 ?? {};
|
|
10
|
+
const allowlisted = params.pickAllowedQueryParams(rawParams);
|
|
9
11
|
const query = strapi.get('query-params').transform(uid, allowlisted);
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
const explicitPublicationFilter = strapiUtils.parsePublicationFilter(allowlisted.publicationFilter);
|
|
13
|
+
const legacyHasPublishedVersion = strapiUtils.parseHasPublishedVersionQueryParam(rawParams.hasPublishedVersion);
|
|
14
|
+
let effectivePublicationFilter = explicitPublicationFilter;
|
|
15
|
+
if (effectivePublicationFilter === undefined && legacyHasPublishedVersion !== undefined) {
|
|
16
|
+
effectivePublicationFilter = strapiUtils.hasPublishedVersionBooleanToPublicationFilterMode(legacyHasPublishedVersion);
|
|
17
|
+
}
|
|
18
|
+
const status = allowlisted.status === 'published' ? 'published' : 'draft';
|
|
19
|
+
const baseWhere = {
|
|
20
|
+
...params$1?.lookup,
|
|
21
|
+
...query.where
|
|
22
|
+
};
|
|
23
|
+
// `transformQueryParams` leaves `publicationFilter` / `hasPublishedVersion` on the query object
|
|
24
|
+
// via `...rest`; the DB layer must not receive them as extra top-level keys.
|
|
25
|
+
const stripPublicationParamsFromQuery = fp.omit([
|
|
26
|
+
'publicationFilter',
|
|
27
|
+
'hasPublishedVersion'
|
|
28
|
+
]);
|
|
29
|
+
// Publication filtering must go through `query.filters`, not only `where`, so the same
|
|
30
|
+
// cohort logic applies to nested populate queries (each sub-query uses `meta.uid`).
|
|
31
|
+
// Merging into `where` alone breaks populate cascade — see has-published-version API tests.
|
|
32
|
+
if (effectivePublicationFilter !== undefined) {
|
|
16
33
|
const existingFilters = query.filters;
|
|
17
|
-
|
|
18
|
-
// Get the existing filters result (from status param)
|
|
34
|
+
const wrappedFilters = ({ meta, ...rest })=>{
|
|
19
35
|
let existingResult = {};
|
|
20
36
|
if (typeof existingFilters === 'function') {
|
|
21
37
|
existingResult = existingFilters({
|
|
@@ -25,13 +41,11 @@ const transformParamsToQuery = fp.curry((uid, params$1)=>{
|
|
|
25
41
|
} else if (existingFilters) {
|
|
26
42
|
existingResult = existingFilters;
|
|
27
43
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
// Merge both conditions
|
|
31
|
-
if (hasPublishedCondition) {
|
|
44
|
+
const publicationCondition = publicationFilter.getPublicationFilterCondition(meta.uid, effectivePublicationFilter, status);
|
|
45
|
+
if (publicationCondition && Object.keys(publicationCondition).length > 0) {
|
|
32
46
|
const conditions = [
|
|
33
47
|
existingResult,
|
|
34
|
-
|
|
48
|
+
publicationCondition
|
|
35
49
|
].filter((c)=>Object.keys(c).length);
|
|
36
50
|
return {
|
|
37
51
|
$and: conditions
|
|
@@ -39,11 +53,10 @@ const transformParamsToQuery = fp.curry((uid, params$1)=>{
|
|
|
39
53
|
}
|
|
40
54
|
return existingResult;
|
|
41
55
|
};
|
|
56
|
+
const queryWithoutPublicationParams = stripPublicationParamsFromQuery(query);
|
|
57
|
+
return fp.assoc('where', baseWhere, fp.assoc('filters', wrappedFilters, queryWithoutPublicationParams));
|
|
42
58
|
}
|
|
43
|
-
return fp.assoc('where',
|
|
44
|
-
...params$1?.lookup,
|
|
45
|
-
...query.where
|
|
46
|
-
}, query);
|
|
59
|
+
return fp.assoc('where', baseWhere, stripPublicationParamsFromQuery(query));
|
|
47
60
|
});
|
|
48
61
|
|
|
49
62
|
exports.transformParamsToQuery = transformParamsToQuery;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sources":["../../../../src/services/document-service/transform/query.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\nimport { curry, assoc } from 'lodash/fp';\nimport {
|
|
1
|
+
{"version":3,"file":"query.js","sources":["../../../../src/services/document-service/transform/query.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\nimport { curry, assoc, omit } from 'lodash/fp';\nimport {\n parseHasPublishedVersionQueryParam,\n hasPublishedVersionBooleanToPublicationFilterMode,\n type PublicationFilterMode,\n} from '@strapi/utils';\n\nimport { parsePublicationFilter, getPublicationFilterCondition } from '../publication-filter';\n\nimport { pickAllowedQueryParams } from '../params';\n\nconst transformParamsToQuery = curry((uid: UID.Schema, params: any) => {\n const rawParams = (params ?? {}) as Record<string, unknown>;\n const allowlisted = pickAllowedQueryParams(rawParams);\n const query = strapi.get('query-params').transform(uid, allowlisted);\n\n const explicitPublicationFilter = parsePublicationFilter(allowlisted.publicationFilter);\n const legacyHasPublishedVersion = parseHasPublishedVersionQueryParam(\n rawParams.hasPublishedVersion\n );\n\n let effectivePublicationFilter: PublicationFilterMode | undefined = explicitPublicationFilter;\n if (effectivePublicationFilter === undefined && legacyHasPublishedVersion !== undefined) {\n effectivePublicationFilter =\n hasPublishedVersionBooleanToPublicationFilterMode(legacyHasPublishedVersion);\n }\n\n const status: 'draft' | 'published' = allowlisted.status === 'published' ? 'published' : 'draft';\n\n const baseWhere = { ...params?.lookup, ...query.where };\n\n // `transformQueryParams` leaves `publicationFilter` / `hasPublishedVersion` on the query object\n // via `...rest`; the DB layer must not receive them as extra top-level keys.\n const stripPublicationParamsFromQuery = omit([\n 'publicationFilter',\n 'hasPublishedVersion',\n ] as const);\n\n // Publication filtering must go through `query.filters`, not only `where`, so the same\n // cohort logic applies to nested populate queries (each sub-query uses `meta.uid`).\n // Merging into `where` alone breaks populate cascade — see has-published-version API tests.\n if (effectivePublicationFilter !== undefined) {\n const existingFilters = query.filters;\n\n const wrappedFilters = ({ meta, ...rest }: { meta: { uid: UID.Schema } }) => {\n let existingResult = {};\n if (typeof existingFilters === 'function') {\n existingResult = existingFilters({ meta, ...rest }) || {};\n } else if (existingFilters) {\n existingResult = existingFilters;\n }\n\n const publicationCondition = getPublicationFilterCondition(\n meta.uid,\n effectivePublicationFilter,\n status\n );\n\n if (publicationCondition && Object.keys(publicationCondition).length > 0) {\n const conditions = [existingResult, publicationCondition].filter(\n (c) => Object.keys(c).length\n );\n return { $and: conditions };\n }\n\n return existingResult;\n };\n\n const queryWithoutPublicationParams = stripPublicationParamsFromQuery(query);\n\n return assoc(\n 'where',\n baseWhere,\n assoc('filters', wrappedFilters, queryWithoutPublicationParams)\n );\n }\n\n return assoc('where', baseWhere, stripPublicationParamsFromQuery(query));\n});\n\nexport { transformParamsToQuery };\n"],"names":["transformParamsToQuery","curry","uid","params","rawParams","allowlisted","pickAllowedQueryParams","query","strapi","get","transform","explicitPublicationFilter","parsePublicationFilter","publicationFilter","legacyHasPublishedVersion","parseHasPublishedVersionQueryParam","hasPublishedVersion","effectivePublicationFilter","undefined","hasPublishedVersionBooleanToPublicationFilterMode","status","baseWhere","lookup","where","stripPublicationParamsFromQuery","omit","existingFilters","filters","wrappedFilters","meta","rest","existingResult","publicationCondition","getPublicationFilterCondition","Object","keys","length","conditions","filter","c","$and","queryWithoutPublicationParams","assoc"],"mappings":";;;;;;;AAaA,MAAMA,sBAAAA,GAAyBC,QAAAA,CAAM,CAACC,GAAAA,EAAiBC,QAAAA,GAAAA;IACrD,MAAMC,SAAAA,GAAaD,YAAU,EAAC;AAC9B,IAAA,MAAME,cAAcC,6BAAAA,CAAuBF,SAAAA,CAAAA;AAC3C,IAAA,MAAMG,QAAQC,MAAAA,CAAOC,GAAG,CAAC,cAAA,CAAA,CAAgBC,SAAS,CAACR,GAAAA,EAAKG,WAAAA,CAAAA;IAExD,MAAMM,yBAAAA,GAA4BC,kCAAAA,CAAuBP,WAAAA,CAAYQ,iBAAiB,CAAA;IACtF,MAAMC,yBAAAA,GAA4BC,8CAAAA,CAChCX,SAAAA,CAAUY,mBAAmB,CAAA;AAG/B,IAAA,IAAIC,0BAAAA,GAAgEN,yBAAAA;IACpE,IAAIM,0BAAAA,KAA+BC,SAAAA,IAAaJ,yBAAAA,KAA8BI,SAAAA,EAAW;AACvFD,QAAAA,0BAAAA,GACEE,6DAAAA,CAAkDL,yBAAAA,CAAAA;AACtD,IAAA;AAEA,IAAA,MAAMM,MAAAA,GAAgCf,WAAAA,CAAYe,MAAM,KAAK,cAAc,WAAA,GAAc,OAAA;AAEzF,IAAA,MAAMC,SAAAA,GAAY;AAAE,QAAA,GAAGlB,UAAQmB,MAAM;AAAE,QAAA,GAAGf,MAAMgB;AAAM,KAAA;;;AAItD,IAAA,MAAMC,kCAAkCC,OAAAA,CAAK;AAC3C,QAAA,mBAAA;AACA,QAAA;AACD,KAAA,CAAA;;;;AAKD,IAAA,IAAIR,+BAA+BC,SAAAA,EAAW;QAC5C,MAAMQ,eAAAA,GAAkBnB,MAAMoB,OAAO;AAErC,QAAA,MAAMC,iBAAiB,CAAC,EAAEC,IAAI,EAAE,GAAGC,IAAAA,EAAqC,GAAA;AACtE,YAAA,IAAIC,iBAAiB,EAAC;YACtB,IAAI,OAAOL,oBAAoB,UAAA,EAAY;AACzCK,gBAAAA,cAAAA,GAAiBL,eAAAA,CAAgB;AAAEG,oBAAAA,IAAAA;AAAM,oBAAA,GAAGC;AAAK,iBAAA,CAAA,IAAM,EAAC;AAC1D,YAAA,CAAA,MAAO,IAAIJ,eAAAA,EAAiB;gBAC1BK,cAAAA,GAAiBL,eAAAA;AACnB,YAAA;AAEA,YAAA,MAAMM,oBAAAA,GAAuBC,+CAAAA,CAC3BJ,IAAAA,CAAK3B,GAAG,EACRe,0BAAAA,EACAG,MAAAA,CAAAA;AAGF,YAAA,IAAIY,wBAAwBE,MAAAA,CAAOC,IAAI,CAACH,oBAAAA,CAAAA,CAAsBI,MAAM,GAAG,CAAA,EAAG;AACxE,gBAAA,MAAMC,UAAAA,GAAa;AAACN,oBAAAA,cAAAA;AAAgBC,oBAAAA;iBAAqB,CAACM,MAAM,CAC9D,CAACC,CAAAA,GAAML,OAAOC,IAAI,CAACI,GAAGH,MAAM,CAAA;gBAE9B,OAAO;oBAAEI,IAAAA,EAAMH;AAAW,iBAAA;AAC5B,YAAA;YAEA,OAAON,cAAAA;AACT,QAAA,CAAA;AAEA,QAAA,MAAMU,gCAAgCjB,+BAAAA,CAAgCjB,KAAAA,CAAAA;AAEtE,QAAA,OAAOmC,QAAAA,CACL,OAAA,EACArB,SAAAA,EACAqB,QAAAA,CAAM,WAAWd,cAAAA,EAAgBa,6BAAAA,CAAAA,CAAAA;AAErC,IAAA;IAEA,OAAOC,QAAAA,CAAM,OAAA,EAASrB,SAAAA,EAAWG,+BAAAA,CAAgCjB,KAAAA,CAAAA,CAAAA;AACnE,CAAA;;;;"}
|
|
@@ -1,19 +1,35 @@
|
|
|
1
|
-
import { curry, assoc } from 'lodash/fp';
|
|
2
|
-
import {
|
|
1
|
+
import { curry, omit, assoc } from 'lodash/fp';
|
|
2
|
+
import { parsePublicationFilter, parseHasPublishedVersionQueryParam, hasPublishedVersionBooleanToPublicationFilterMode } from '@strapi/utils';
|
|
3
|
+
import { getPublicationFilterCondition } from '../publication-filter.mjs';
|
|
3
4
|
import { pickAllowedQueryParams } from '../params.mjs';
|
|
4
5
|
|
|
5
6
|
const transformParamsToQuery = curry((uid, params)=>{
|
|
6
|
-
const
|
|
7
|
+
const rawParams = params ?? {};
|
|
8
|
+
const allowlisted = pickAllowedQueryParams(rawParams);
|
|
7
9
|
const query = strapi.get('query-params').transform(uid, allowlisted);
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
const explicitPublicationFilter = parsePublicationFilter(allowlisted.publicationFilter);
|
|
11
|
+
const legacyHasPublishedVersion = parseHasPublishedVersionQueryParam(rawParams.hasPublishedVersion);
|
|
12
|
+
let effectivePublicationFilter = explicitPublicationFilter;
|
|
13
|
+
if (effectivePublicationFilter === undefined && legacyHasPublishedVersion !== undefined) {
|
|
14
|
+
effectivePublicationFilter = hasPublishedVersionBooleanToPublicationFilterMode(legacyHasPublishedVersion);
|
|
15
|
+
}
|
|
16
|
+
const status = allowlisted.status === 'published' ? 'published' : 'draft';
|
|
17
|
+
const baseWhere = {
|
|
18
|
+
...params?.lookup,
|
|
19
|
+
...query.where
|
|
20
|
+
};
|
|
21
|
+
// `transformQueryParams` leaves `publicationFilter` / `hasPublishedVersion` on the query object
|
|
22
|
+
// via `...rest`; the DB layer must not receive them as extra top-level keys.
|
|
23
|
+
const stripPublicationParamsFromQuery = omit([
|
|
24
|
+
'publicationFilter',
|
|
25
|
+
'hasPublishedVersion'
|
|
26
|
+
]);
|
|
27
|
+
// Publication filtering must go through `query.filters`, not only `where`, so the same
|
|
28
|
+
// cohort logic applies to nested populate queries (each sub-query uses `meta.uid`).
|
|
29
|
+
// Merging into `where` alone breaks populate cascade — see has-published-version API tests.
|
|
30
|
+
if (effectivePublicationFilter !== undefined) {
|
|
14
31
|
const existingFilters = query.filters;
|
|
15
|
-
|
|
16
|
-
// Get the existing filters result (from status param)
|
|
32
|
+
const wrappedFilters = ({ meta, ...rest })=>{
|
|
17
33
|
let existingResult = {};
|
|
18
34
|
if (typeof existingFilters === 'function') {
|
|
19
35
|
existingResult = existingFilters({
|
|
@@ -23,13 +39,11 @@ const transformParamsToQuery = curry((uid, params)=>{
|
|
|
23
39
|
} else if (existingFilters) {
|
|
24
40
|
existingResult = existingFilters;
|
|
25
41
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
// Merge both conditions
|
|
29
|
-
if (hasPublishedCondition) {
|
|
42
|
+
const publicationCondition = getPublicationFilterCondition(meta.uid, effectivePublicationFilter, status);
|
|
43
|
+
if (publicationCondition && Object.keys(publicationCondition).length > 0) {
|
|
30
44
|
const conditions = [
|
|
31
45
|
existingResult,
|
|
32
|
-
|
|
46
|
+
publicationCondition
|
|
33
47
|
].filter((c)=>Object.keys(c).length);
|
|
34
48
|
return {
|
|
35
49
|
$and: conditions
|
|
@@ -37,11 +51,10 @@ const transformParamsToQuery = curry((uid, params)=>{
|
|
|
37
51
|
}
|
|
38
52
|
return existingResult;
|
|
39
53
|
};
|
|
54
|
+
const queryWithoutPublicationParams = stripPublicationParamsFromQuery(query);
|
|
55
|
+
return assoc('where', baseWhere, assoc('filters', wrappedFilters, queryWithoutPublicationParams));
|
|
40
56
|
}
|
|
41
|
-
return assoc('where',
|
|
42
|
-
...params?.lookup,
|
|
43
|
-
...query.where
|
|
44
|
-
}, query);
|
|
57
|
+
return assoc('where', baseWhere, stripPublicationParamsFromQuery(query));
|
|
45
58
|
});
|
|
46
59
|
|
|
47
60
|
export { transformParamsToQuery };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.mjs","sources":["../../../../src/services/document-service/transform/query.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\nimport { curry, assoc } from 'lodash/fp';\nimport {
|
|
1
|
+
{"version":3,"file":"query.mjs","sources":["../../../../src/services/document-service/transform/query.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\nimport { curry, assoc, omit } from 'lodash/fp';\nimport {\n parseHasPublishedVersionQueryParam,\n hasPublishedVersionBooleanToPublicationFilterMode,\n type PublicationFilterMode,\n} from '@strapi/utils';\n\nimport { parsePublicationFilter, getPublicationFilterCondition } from '../publication-filter';\n\nimport { pickAllowedQueryParams } from '../params';\n\nconst transformParamsToQuery = curry((uid: UID.Schema, params: any) => {\n const rawParams = (params ?? {}) as Record<string, unknown>;\n const allowlisted = pickAllowedQueryParams(rawParams);\n const query = strapi.get('query-params').transform(uid, allowlisted);\n\n const explicitPublicationFilter = parsePublicationFilter(allowlisted.publicationFilter);\n const legacyHasPublishedVersion = parseHasPublishedVersionQueryParam(\n rawParams.hasPublishedVersion\n );\n\n let effectivePublicationFilter: PublicationFilterMode | undefined = explicitPublicationFilter;\n if (effectivePublicationFilter === undefined && legacyHasPublishedVersion !== undefined) {\n effectivePublicationFilter =\n hasPublishedVersionBooleanToPublicationFilterMode(legacyHasPublishedVersion);\n }\n\n const status: 'draft' | 'published' = allowlisted.status === 'published' ? 'published' : 'draft';\n\n const baseWhere = { ...params?.lookup, ...query.where };\n\n // `transformQueryParams` leaves `publicationFilter` / `hasPublishedVersion` on the query object\n // via `...rest`; the DB layer must not receive them as extra top-level keys.\n const stripPublicationParamsFromQuery = omit([\n 'publicationFilter',\n 'hasPublishedVersion',\n ] as const);\n\n // Publication filtering must go through `query.filters`, not only `where`, so the same\n // cohort logic applies to nested populate queries (each sub-query uses `meta.uid`).\n // Merging into `where` alone breaks populate cascade — see has-published-version API tests.\n if (effectivePublicationFilter !== undefined) {\n const existingFilters = query.filters;\n\n const wrappedFilters = ({ meta, ...rest }: { meta: { uid: UID.Schema } }) => {\n let existingResult = {};\n if (typeof existingFilters === 'function') {\n existingResult = existingFilters({ meta, ...rest }) || {};\n } else if (existingFilters) {\n existingResult = existingFilters;\n }\n\n const publicationCondition = getPublicationFilterCondition(\n meta.uid,\n effectivePublicationFilter,\n status\n );\n\n if (publicationCondition && Object.keys(publicationCondition).length > 0) {\n const conditions = [existingResult, publicationCondition].filter(\n (c) => Object.keys(c).length\n );\n return { $and: conditions };\n }\n\n return existingResult;\n };\n\n const queryWithoutPublicationParams = stripPublicationParamsFromQuery(query);\n\n return assoc(\n 'where',\n baseWhere,\n assoc('filters', wrappedFilters, queryWithoutPublicationParams)\n );\n }\n\n return assoc('where', baseWhere, stripPublicationParamsFromQuery(query));\n});\n\nexport { transformParamsToQuery };\n"],"names":["transformParamsToQuery","curry","uid","params","rawParams","allowlisted","pickAllowedQueryParams","query","strapi","get","transform","explicitPublicationFilter","parsePublicationFilter","publicationFilter","legacyHasPublishedVersion","parseHasPublishedVersionQueryParam","hasPublishedVersion","effectivePublicationFilter","undefined","hasPublishedVersionBooleanToPublicationFilterMode","status","baseWhere","lookup","where","stripPublicationParamsFromQuery","omit","existingFilters","filters","wrappedFilters","meta","rest","existingResult","publicationCondition","getPublicationFilterCondition","Object","keys","length","conditions","filter","c","$and","queryWithoutPublicationParams","assoc"],"mappings":";;;;;AAaA,MAAMA,sBAAAA,GAAyBC,KAAAA,CAAM,CAACC,GAAAA,EAAiBC,MAAAA,GAAAA;IACrD,MAAMC,SAAAA,GAAaD,UAAU,EAAC;AAC9B,IAAA,MAAME,cAAcC,sBAAAA,CAAuBF,SAAAA,CAAAA;AAC3C,IAAA,MAAMG,QAAQC,MAAAA,CAAOC,GAAG,CAAC,cAAA,CAAA,CAAgBC,SAAS,CAACR,GAAAA,EAAKG,WAAAA,CAAAA;IAExD,MAAMM,yBAAAA,GAA4BC,sBAAAA,CAAuBP,WAAAA,CAAYQ,iBAAiB,CAAA;IACtF,MAAMC,yBAAAA,GAA4BC,kCAAAA,CAChCX,SAAAA,CAAUY,mBAAmB,CAAA;AAG/B,IAAA,IAAIC,0BAAAA,GAAgEN,yBAAAA;IACpE,IAAIM,0BAAAA,KAA+BC,SAAAA,IAAaJ,yBAAAA,KAA8BI,SAAAA,EAAW;AACvFD,QAAAA,0BAAAA,GACEE,iDAAAA,CAAkDL,yBAAAA,CAAAA;AACtD,IAAA;AAEA,IAAA,MAAMM,MAAAA,GAAgCf,WAAAA,CAAYe,MAAM,KAAK,cAAc,WAAA,GAAc,OAAA;AAEzF,IAAA,MAAMC,SAAAA,GAAY;AAAE,QAAA,GAAGlB,QAAQmB,MAAM;AAAE,QAAA,GAAGf,MAAMgB;AAAM,KAAA;;;AAItD,IAAA,MAAMC,kCAAkCC,IAAAA,CAAK;AAC3C,QAAA,mBAAA;AACA,QAAA;AACD,KAAA,CAAA;;;;AAKD,IAAA,IAAIR,+BAA+BC,SAAAA,EAAW;QAC5C,MAAMQ,eAAAA,GAAkBnB,MAAMoB,OAAO;AAErC,QAAA,MAAMC,iBAAiB,CAAC,EAAEC,IAAI,EAAE,GAAGC,IAAAA,EAAqC,GAAA;AACtE,YAAA,IAAIC,iBAAiB,EAAC;YACtB,IAAI,OAAOL,oBAAoB,UAAA,EAAY;AACzCK,gBAAAA,cAAAA,GAAiBL,eAAAA,CAAgB;AAAEG,oBAAAA,IAAAA;AAAM,oBAAA,GAAGC;AAAK,iBAAA,CAAA,IAAM,EAAC;AAC1D,YAAA,CAAA,MAAO,IAAIJ,eAAAA,EAAiB;gBAC1BK,cAAAA,GAAiBL,eAAAA;AACnB,YAAA;AAEA,YAAA,MAAMM,oBAAAA,GAAuBC,6BAAAA,CAC3BJ,IAAAA,CAAK3B,GAAG,EACRe,0BAAAA,EACAG,MAAAA,CAAAA;AAGF,YAAA,IAAIY,wBAAwBE,MAAAA,CAAOC,IAAI,CAACH,oBAAAA,CAAAA,CAAsBI,MAAM,GAAG,CAAA,EAAG;AACxE,gBAAA,MAAMC,UAAAA,GAAa;AAACN,oBAAAA,cAAAA;AAAgBC,oBAAAA;iBAAqB,CAACM,MAAM,CAC9D,CAACC,CAAAA,GAAML,OAAOC,IAAI,CAACI,GAAGH,MAAM,CAAA;gBAE9B,OAAO;oBAAEI,IAAAA,EAAMH;AAAW,iBAAA;AAC5B,YAAA;YAEA,OAAON,cAAAA;AACT,QAAA,CAAA;AAEA,QAAA,MAAMU,gCAAgCjB,+BAAAA,CAAgCjB,KAAAA,CAAAA;AAEtE,QAAA,OAAOmC,KAAAA,CACL,OAAA,EACArB,SAAAA,EACAqB,KAAAA,CAAM,WAAWd,cAAAA,EAAgBa,6BAAAA,CAAAA,CAAAA;AAErC,IAAA;IAEA,OAAOC,KAAAA,CAAM,OAAA,EAASrB,SAAAA,EAAWG,+BAAAA,CAAgCjB,KAAAA,CAAAA,CAAAA;AACnE,CAAA;;;;"}
|
|
@@ -74,7 +74,7 @@ const codeBlockValidator = strapiUtils.yup.object().shape({
|
|
|
74
74
|
type: strapiUtils.yup.string().equals([
|
|
75
75
|
'code'
|
|
76
76
|
]).required(),
|
|
77
|
-
|
|
77
|
+
language: strapiUtils.yup.string().nullable(),
|
|
78
78
|
children: strapiUtils.yup.array().of(textNodeValidator).min(1, 'Quote node children must have at least one Text or Link node').required()
|
|
79
79
|
});
|
|
80
80
|
const listItemNode = strapiUtils.yup.object().shape({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocks-validator.js","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch (error) {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n syntax: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().nullable(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":["textNodeValidator","yup","object","shape","type","string","equals","required","text","test","bold","boolean","italic","underline","strikethrough","code","checkValidLink","link","URL","startsWith","error","linkNodeValidator","url","value","children","array","of","inlineNodeValidator","lazy","mixed","paragraphNodeValidator","min","headingNodeValidator","level","number","oneOf","quoteNodeValidator","codeBlockValidator","syntax","nullable","listItemNode","listChildrenValidator","listNodeValidator","format","imageNodeValidator","image","name","alternativeText","caption","width","height","formats","hash","ext","mime","size","previewUrl","provider","provider_metadata","createdAt","updatedAt","blockNodeValidator","blocksValidatorSchema","blocksValidator"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"blocks-validator.js","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch (error) {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n language: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().nullable(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":["textNodeValidator","yup","object","shape","type","string","equals","required","text","test","bold","boolean","italic","underline","strikethrough","code","checkValidLink","link","URL","startsWith","error","linkNodeValidator","url","value","children","array","of","inlineNodeValidator","lazy","mixed","paragraphNodeValidator","min","headingNodeValidator","level","number","oneOf","quoteNodeValidator","codeBlockValidator","language","nullable","listItemNode","listChildrenValidator","listNodeValidator","format","imageNodeValidator","image","name","alternativeText","caption","width","height","formats","hash","ext","mime","size","previewUrl","provider","provider_metadata","createdAt","updatedAt","blockNodeValidator","blocksValidatorSchema","blocksValidator"],"mappings":"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"}
|
|
@@ -72,7 +72,7 @@ const codeBlockValidator = yup.object().shape({
|
|
|
72
72
|
type: yup.string().equals([
|
|
73
73
|
'code'
|
|
74
74
|
]).required(),
|
|
75
|
-
|
|
75
|
+
language: yup.string().nullable(),
|
|
76
76
|
children: yup.array().of(textNodeValidator).min(1, 'Quote node children must have at least one Text or Link node').required()
|
|
77
77
|
});
|
|
78
78
|
const listItemNode = yup.object().shape({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocks-validator.mjs","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch (error) {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n syntax: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().nullable(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":["textNodeValidator","yup","object","shape","type","string","equals","required","text","test","bold","boolean","italic","underline","strikethrough","code","checkValidLink","link","URL","startsWith","error","linkNodeValidator","url","value","children","array","of","inlineNodeValidator","lazy","mixed","paragraphNodeValidator","min","headingNodeValidator","level","number","oneOf","quoteNodeValidator","codeBlockValidator","syntax","nullable","listItemNode","listChildrenValidator","listNodeValidator","format","imageNodeValidator","image","name","alternativeText","caption","width","height","formats","hash","ext","mime","size","previewUrl","provider","provider_metadata","createdAt","updatedAt","blockNodeValidator","blocksValidatorSchema","blocksValidator"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"blocks-validator.mjs","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch (error) {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n language: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().nullable(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":["textNodeValidator","yup","object","shape","type","string","equals","required","text","test","bold","boolean","italic","underline","strikethrough","code","checkValidLink","link","URL","startsWith","error","linkNodeValidator","url","value","children","array","of","inlineNodeValidator","lazy","mixed","paragraphNodeValidator","min","headingNodeValidator","level","number","oneOf","quoteNodeValidator","codeBlockValidator","language","nullable","listItemNode","listChildrenValidator","listNodeValidator","format","imageNodeValidator","image","name","alternativeText","caption","width","height","formats","hash","ext","mime","size","previewUrl","provider","provider_metadata","createdAt","updatedAt","blockNodeValidator","blocksValidatorSchema","blocksValidator"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Core, Data } from '@strapi/types';
|
|
2
|
+
import type { Ability } from '@casl/ability';
|
|
3
|
+
import type { Context } from 'koa';
|
|
4
|
+
export type McpAdminTokenAbility = Ability;
|
|
5
|
+
export type McpAuthFailureReason = 'missing_token' | 'invalid_token';
|
|
6
|
+
export type McpAdminTokenAuthResult = {
|
|
7
|
+
authenticated: false;
|
|
8
|
+
reason: McpAuthFailureReason;
|
|
9
|
+
error?: Error;
|
|
10
|
+
} | {
|
|
11
|
+
authenticated: true;
|
|
12
|
+
credentials: {
|
|
13
|
+
id: Data.ID;
|
|
14
|
+
};
|
|
15
|
+
user: {
|
|
16
|
+
id: Data.ID;
|
|
17
|
+
};
|
|
18
|
+
ability: McpAdminTokenAbility;
|
|
19
|
+
};
|
|
20
|
+
export declare const createMcpAdminTokenAuthenticator: (strapi: Core.Strapi) => {
|
|
21
|
+
authenticate(ctx: Context): Promise<McpAdminTokenAuthResult>;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=authentication.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authentication.d.ts","sourceRoot":"","sources":["../../../src/services/mcp/authentication.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAEnC,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAE3C,MAAM,MAAM,oBAAoB,GAAG,eAAe,GAAG,eAAe,CAAC;AAErE,MAAM,MAAM,uBAAuB,GAC/B;IAAE,aAAa,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GACrE;IACE,aAAa,EAAE,IAAI,CAAC;IACpB,WAAW,EAAE;QAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAA;KAAE,CAAC;IAC7B,IAAI,EAAE;QAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAA;KAAE,CAAC;IACtB,OAAO,EAAE,oBAAoB,CAAC;CAC/B,CAAC;AAkBN,eAAO,MAAM,gCAAgC,WAAY,KAAK,MAAM;sBAC1C,OAAO,GAAG,QAAQ,uBAAuB,CAAC;CA0BlE,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const extractBearerToken = (ctx)=>{
|
|
4
|
+
const authorization = ctx.request.header.authorization;
|
|
5
|
+
if (authorization === undefined) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const parts = authorization.split(/\s+/);
|
|
9
|
+
if (parts[0].toLowerCase() !== 'bearer' || parts.length !== 2) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
return parts[1];
|
|
13
|
+
};
|
|
14
|
+
const createMcpAdminTokenAuthenticator = (strapi)=>({
|
|
15
|
+
async authenticate (ctx) {
|
|
16
|
+
const token = extractBearerToken(ctx);
|
|
17
|
+
if (token === null) {
|
|
18
|
+
return {
|
|
19
|
+
authenticated: false,
|
|
20
|
+
reason: 'missing_token'
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const authResult = await strapi.admin.services['api-token-admin'].authenticateAdminToken(token);
|
|
24
|
+
if (authResult.authenticated === false) {
|
|
25
|
+
return {
|
|
26
|
+
authenticated: false,
|
|
27
|
+
reason: 'invalid_token',
|
|
28
|
+
error: authResult.error
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
authenticated: true,
|
|
33
|
+
credentials: {
|
|
34
|
+
id: authResult.credentials.id
|
|
35
|
+
},
|
|
36
|
+
user: {
|
|
37
|
+
id: authResult.user.id
|
|
38
|
+
},
|
|
39
|
+
ability: authResult.ability
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
exports.createMcpAdminTokenAuthenticator = createMcpAdminTokenAuthenticator;
|
|
45
|
+
//# sourceMappingURL=authentication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authentication.js","sources":["../../../src/services/mcp/authentication.ts"],"sourcesContent":["import type { Core, Data } from '@strapi/types';\nimport type { Ability } from '@casl/ability';\nimport type { Context } from 'koa';\n\nexport type McpAdminTokenAbility = Ability;\n\nexport type McpAuthFailureReason = 'missing_token' | 'invalid_token';\n\nexport type McpAdminTokenAuthResult =\n | { authenticated: false; reason: McpAuthFailureReason; error?: Error }\n | {\n authenticated: true;\n credentials: { id: Data.ID };\n user: { id: Data.ID };\n ability: McpAdminTokenAbility;\n };\n\nconst extractBearerToken = (ctx: Context): string | null => {\n const authorization = ctx.request.header.authorization;\n\n if (authorization === undefined) {\n return null;\n }\n\n const parts = authorization.split(/\\s+/);\n\n if (parts[0].toLowerCase() !== 'bearer' || parts.length !== 2) {\n return null;\n }\n\n return parts[1];\n};\n\nexport const createMcpAdminTokenAuthenticator = (strapi: Core.Strapi) => ({\n async authenticate(ctx: Context): Promise<McpAdminTokenAuthResult> {\n const token = extractBearerToken(ctx);\n\n if (token === null) {\n return { authenticated: false, reason: 'missing_token' };\n }\n\n const authResult = (await strapi.admin.services['api-token-admin'].authenticateAdminToken(\n token\n )) as McpAdminTokenAuthResult;\n\n if (authResult.authenticated === false) {\n return {\n authenticated: false,\n reason: 'invalid_token',\n error: authResult.error,\n };\n }\n\n return {\n authenticated: true,\n credentials: { id: authResult.credentials.id },\n user: { id: authResult.user.id },\n ability: authResult.ability,\n };\n },\n});\n"],"names":["extractBearerToken","ctx","authorization","request","header","undefined","parts","split","toLowerCase","length","createMcpAdminTokenAuthenticator","strapi","authenticate","token","authenticated","reason","authResult","admin","services","authenticateAdminToken","error","credentials","id","user","ability"],"mappings":";;AAiBA,MAAMA,qBAAqB,CAACC,GAAAA,GAAAA;AAC1B,IAAA,MAAMC,gBAAgBD,GAAAA,CAAIE,OAAO,CAACC,MAAM,CAACF,aAAa;AAEtD,IAAA,IAAIA,kBAAkBG,SAAAA,EAAW;QAC/B,OAAO,IAAA;AACT,IAAA;IAEA,MAAMC,KAAAA,GAAQJ,aAAAA,CAAcK,KAAK,CAAC,KAAA,CAAA;IAElC,IAAID,KAAK,CAAC,CAAA,CAAE,CAACE,WAAW,OAAO,QAAA,IAAYF,KAAAA,CAAMG,MAAM,KAAK,CAAA,EAAG;QAC7D,OAAO,IAAA;AACT,IAAA;IAEA,OAAOH,KAAK,CAAC,CAAA,CAAE;AACjB,CAAA;AAEO,MAAMI,gCAAAA,GAAmC,CAACC,MAAAA,IAAyB;AACxE,QAAA,MAAMC,cAAaX,GAAY,EAAA;AAC7B,YAAA,MAAMY,QAAQb,kBAAAA,CAAmBC,GAAAA,CAAAA;AAEjC,YAAA,IAAIY,UAAU,IAAA,EAAM;gBAClB,OAAO;oBAAEC,aAAAA,EAAe,KAAA;oBAAOC,MAAAA,EAAQ;AAAgB,iBAAA;AACzD,YAAA;YAEA,MAAMC,UAAAA,GAAc,MAAML,MAAAA,CAAOM,KAAK,CAACC,QAAQ,CAAC,iBAAA,CAAkB,CAACC,sBAAsB,CACvFN,KAAAA,CAAAA;YAGF,IAAIG,UAAAA,CAAWF,aAAa,KAAK,KAAA,EAAO;gBACtC,OAAO;oBACLA,aAAAA,EAAe,KAAA;oBACfC,MAAAA,EAAQ,eAAA;AACRK,oBAAAA,KAAAA,EAAOJ,WAAWI;AACpB,iBAAA;AACF,YAAA;YAEA,OAAO;gBACLN,aAAAA,EAAe,IAAA;gBACfO,WAAAA,EAAa;oBAAEC,EAAAA,EAAIN,UAAAA,CAAWK,WAAW,CAACC;AAAG,iBAAA;gBAC7CC,IAAAA,EAAM;oBAAED,EAAAA,EAAIN,UAAAA,CAAWO,IAAI,CAACD;AAAG,iBAAA;AAC/BE,gBAAAA,OAAAA,EAASR,WAAWQ;AACtB,aAAA;AACF,QAAA;AACF,KAAA;;;;"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const extractBearerToken = (ctx)=>{
|
|
2
|
+
const authorization = ctx.request.header.authorization;
|
|
3
|
+
if (authorization === undefined) {
|
|
4
|
+
return null;
|
|
5
|
+
}
|
|
6
|
+
const parts = authorization.split(/\s+/);
|
|
7
|
+
if (parts[0].toLowerCase() !== 'bearer' || parts.length !== 2) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
return parts[1];
|
|
11
|
+
};
|
|
12
|
+
const createMcpAdminTokenAuthenticator = (strapi)=>({
|
|
13
|
+
async authenticate (ctx) {
|
|
14
|
+
const token = extractBearerToken(ctx);
|
|
15
|
+
if (token === null) {
|
|
16
|
+
return {
|
|
17
|
+
authenticated: false,
|
|
18
|
+
reason: 'missing_token'
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const authResult = await strapi.admin.services['api-token-admin'].authenticateAdminToken(token);
|
|
22
|
+
if (authResult.authenticated === false) {
|
|
23
|
+
return {
|
|
24
|
+
authenticated: false,
|
|
25
|
+
reason: 'invalid_token',
|
|
26
|
+
error: authResult.error
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
authenticated: true,
|
|
31
|
+
credentials: {
|
|
32
|
+
id: authResult.credentials.id
|
|
33
|
+
},
|
|
34
|
+
user: {
|
|
35
|
+
id: authResult.user.id
|
|
36
|
+
},
|
|
37
|
+
ability: authResult.ability
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
export { createMcpAdminTokenAuthenticator };
|
|
43
|
+
//# sourceMappingURL=authentication.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authentication.mjs","sources":["../../../src/services/mcp/authentication.ts"],"sourcesContent":["import type { Core, Data } from '@strapi/types';\nimport type { Ability } from '@casl/ability';\nimport type { Context } from 'koa';\n\nexport type McpAdminTokenAbility = Ability;\n\nexport type McpAuthFailureReason = 'missing_token' | 'invalid_token';\n\nexport type McpAdminTokenAuthResult =\n | { authenticated: false; reason: McpAuthFailureReason; error?: Error }\n | {\n authenticated: true;\n credentials: { id: Data.ID };\n user: { id: Data.ID };\n ability: McpAdminTokenAbility;\n };\n\nconst extractBearerToken = (ctx: Context): string | null => {\n const authorization = ctx.request.header.authorization;\n\n if (authorization === undefined) {\n return null;\n }\n\n const parts = authorization.split(/\\s+/);\n\n if (parts[0].toLowerCase() !== 'bearer' || parts.length !== 2) {\n return null;\n }\n\n return parts[1];\n};\n\nexport const createMcpAdminTokenAuthenticator = (strapi: Core.Strapi) => ({\n async authenticate(ctx: Context): Promise<McpAdminTokenAuthResult> {\n const token = extractBearerToken(ctx);\n\n if (token === null) {\n return { authenticated: false, reason: 'missing_token' };\n }\n\n const authResult = (await strapi.admin.services['api-token-admin'].authenticateAdminToken(\n token\n )) as McpAdminTokenAuthResult;\n\n if (authResult.authenticated === false) {\n return {\n authenticated: false,\n reason: 'invalid_token',\n error: authResult.error,\n };\n }\n\n return {\n authenticated: true,\n credentials: { id: authResult.credentials.id },\n user: { id: authResult.user.id },\n ability: authResult.ability,\n };\n },\n});\n"],"names":["extractBearerToken","ctx","authorization","request","header","undefined","parts","split","toLowerCase","length","createMcpAdminTokenAuthenticator","strapi","authenticate","token","authenticated","reason","authResult","admin","services","authenticateAdminToken","error","credentials","id","user","ability"],"mappings":"AAiBA,MAAMA,qBAAqB,CAACC,GAAAA,GAAAA;AAC1B,IAAA,MAAMC,gBAAgBD,GAAAA,CAAIE,OAAO,CAACC,MAAM,CAACF,aAAa;AAEtD,IAAA,IAAIA,kBAAkBG,SAAAA,EAAW;QAC/B,OAAO,IAAA;AACT,IAAA;IAEA,MAAMC,KAAAA,GAAQJ,aAAAA,CAAcK,KAAK,CAAC,KAAA,CAAA;IAElC,IAAID,KAAK,CAAC,CAAA,CAAE,CAACE,WAAW,OAAO,QAAA,IAAYF,KAAAA,CAAMG,MAAM,KAAK,CAAA,EAAG;QAC7D,OAAO,IAAA;AACT,IAAA;IAEA,OAAOH,KAAK,CAAC,CAAA,CAAE;AACjB,CAAA;AAEO,MAAMI,gCAAAA,GAAmC,CAACC,MAAAA,IAAyB;AACxE,QAAA,MAAMC,cAAaX,GAAY,EAAA;AAC7B,YAAA,MAAMY,QAAQb,kBAAAA,CAAmBC,GAAAA,CAAAA;AAEjC,YAAA,IAAIY,UAAU,IAAA,EAAM;gBAClB,OAAO;oBAAEC,aAAAA,EAAe,KAAA;oBAAOC,MAAAA,EAAQ;AAAgB,iBAAA;AACzD,YAAA;YAEA,MAAMC,UAAAA,GAAc,MAAML,MAAAA,CAAOM,KAAK,CAACC,QAAQ,CAAC,iBAAA,CAAkB,CAACC,sBAAsB,CACvFN,KAAAA,CAAAA;YAGF,IAAIG,UAAAA,CAAWF,aAAa,KAAK,KAAA,EAAO;gBACtC,OAAO;oBACLA,aAAAA,EAAe,KAAA;oBACfC,MAAAA,EAAQ,eAAA;AACRK,oBAAAA,KAAAA,EAAOJ,WAAWI;AACpB,iBAAA;AACF,YAAA;YAEA,OAAO;gBACLN,aAAAA,EAAe,IAAA;gBACfO,WAAAA,EAAa;oBAAEC,EAAAA,EAAIN,UAAAA,CAAWK,WAAW,CAACC;AAAG,iBAAA;gBAC7CC,IAAAA,EAAM;oBAAED,EAAAA,EAAIN,UAAAA,CAAWO,IAAI,CAACD;AAAG,iBAAA;AAC/BE,gBAAAA,OAAAA,EAASR,WAAWQ;AACtB,aAAA;AACF,QAAA;AACF,KAAA;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlePost.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/handlers/handlePost.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAS1C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEtD,eAAO,MAAM,iBAAiB,SAAU,sBAAsB,KAAG,KAAK,iBAuErE,CAAC"}
|