@strapi/core 5.52.3 → 5.53.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/container.d.ts +1 -0
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +3 -0
- package/dist/container.js.map +1 -1
- package/dist/container.mjs +3 -0
- package/dist/container.mjs.map +1 -1
- package/dist/core-api/controller/single-type.d.ts.map +1 -1
- package/dist/core-api/controller/single-type.js +7 -4
- package/dist/core-api/controller/single-type.js.map +1 -1
- package/dist/core-api/controller/single-type.mjs +7 -4
- package/dist/core-api/controller/single-type.mjs.map +1 -1
- package/dist/package.json.js +19 -15
- package/dist/package.json.js.map +1 -1
- package/dist/package.json.mjs +19 -15
- package/dist/package.json.mjs.map +1 -1
- package/dist/services/document-service/transform/query.d.ts.map +1 -1
- package/dist/services/document-service/transform/query.js +4 -2
- package/dist/services/document-service/transform/query.js.map +1 -1
- package/dist/services/document-service/transform/query.mjs +4 -2
- package/dist/services/document-service/transform/query.mjs.map +1 -1
- package/dist/services/entity-validator/blocks-validator.d.ts.map +1 -1
- package/dist/services/entity-validator/blocks-validator.js +9 -3
- package/dist/services/entity-validator/blocks-validator.js.map +1 -1
- package/dist/services/entity-validator/blocks-validator.mjs +9 -3
- package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
- package/dist/services/mcp/handlers/handlePost.d.ts.map +1 -1
- package/dist/services/mcp/handlers/handlePost.js +2 -3
- package/dist/services/mcp/handlers/handlePost.js.map +1 -1
- package/dist/services/mcp/handlers/handlePost.mjs +2 -3
- package/dist/services/mcp/handlers/handlePost.mjs.map +1 -1
- package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts +1 -1
- package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts.map +1 -1
- package/dist/services/mcp/internal/McpCapabilityRegistry.js.map +1 -1
- package/dist/services/mcp/internal/McpCapabilityRegistry.mjs.map +1 -1
- package/dist/services/mcp/internal/McpServerFactory.d.ts +1 -1
- package/dist/services/mcp/internal/McpServerFactory.d.ts.map +1 -1
- package/dist/services/mcp/internal/McpServerFactory.js +2 -3
- package/dist/services/mcp/internal/McpServerFactory.js.map +1 -1
- package/dist/services/mcp/internal/McpServerFactory.mjs +1 -2
- package/dist/services/mcp/internal/McpServerFactory.mjs.map +1 -1
- package/dist/services/mcp/prompt-registry.d.ts +1 -1
- package/dist/services/mcp/prompt-registry.d.ts.map +1 -1
- package/dist/services/mcp/prompt-registry.js +18 -4
- package/dist/services/mcp/prompt-registry.js.map +1 -1
- package/dist/services/mcp/prompt-registry.mjs +18 -4
- package/dist/services/mcp/prompt-registry.mjs.map +1 -1
- package/dist/services/mcp/resource-registry.d.ts +1 -1
- package/dist/services/mcp/resource-registry.d.ts.map +1 -1
- package/dist/services/mcp/resource-registry.js +4 -2
- package/dist/services/mcp/resource-registry.js.map +1 -1
- package/dist/services/mcp/resource-registry.mjs +4 -2
- package/dist/services/mcp/resource-registry.mjs.map +1 -1
- package/dist/services/mcp/tool-registry.d.ts +1 -1
- package/dist/services/mcp/tool-registry.d.ts.map +1 -1
- package/dist/services/mcp/tool-registry.js +18 -11
- package/dist/services/mcp/tool-registry.js.map +1 -1
- package/dist/services/mcp/tool-registry.mjs +18 -11
- package/dist/services/mcp/tool-registry.mjs.map +1 -1
- package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.d.ts +7 -0
- package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.d.ts.map +1 -0
- package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.js +29 -0
- package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.js.map +1 -0
- package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.mjs +27 -0
- package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.mjs.map +1 -0
- package/dist/services/mcp/utils/toSdkMcpCapabilityResult.d.ts +18 -0
- package/dist/services/mcp/utils/toSdkMcpCapabilityResult.d.ts.map +1 -0
- package/dist/services/mcp/utils/toSdkMcpCapabilityResult.js +137 -0
- package/dist/services/mcp/utils/toSdkMcpCapabilityResult.js.map +1 -0
- package/dist/services/mcp/utils/toSdkMcpCapabilityResult.mjs +131 -0
- package/dist/services/mcp/utils/toSdkMcpCapabilityResult.mjs.map +1 -0
- package/dist/services/session-manager.d.ts.map +1 -1
- package/dist/services/session-manager.js +5 -0
- package/dist/services/session-manager.js.map +1 -1
- package/dist/services/session-manager.mjs +5 -0
- package/dist/services/session-manager.mjs.map +1 -1
- package/package.json +19 -15
package/dist/container.d.ts
CHANGED
package/dist/container.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,qBAAa,SAAU,YAAW,IAAI,CAAC,SAAS;IAC9C,OAAO,CAAC,WAAW,CAA8B;IAEjD,OAAO,CAAC,UAAU,CAAa;IAE/B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO;IASnC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;CAoBjC"}
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,qBAAa,SAAU,YAAW,IAAI,CAAC,SAAS;IAC9C,OAAO,CAAC,WAAW,CAA8B;IAEjD,OAAO,CAAC,UAAU,CAAa;IAE/B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO;IASnC,GAAG,CAAC,IAAI,EAAE,MAAM;IAIhB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;CAoBjC"}
|
package/dist/container.js
CHANGED
|
@@ -8,6 +8,9 @@ class Container {
|
|
|
8
8
|
this.registerMap.set(name, resolver);
|
|
9
9
|
return this;
|
|
10
10
|
}
|
|
11
|
+
has(name) {
|
|
12
|
+
return this.registerMap.has(name) || this.serviceMap.has(name);
|
|
13
|
+
}
|
|
11
14
|
get(name, args) {
|
|
12
15
|
// TODO: handle singleton vs instantiation everytime
|
|
13
16
|
if (this.serviceMap.has(name)) {
|
package/dist/container.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sources":["../src/container.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nexport class Container implements Core.Container {\n private registerMap = new Map<string, unknown>();\n\n private serviceMap = new Map();\n\n add(name: string, resolver: unknown) {\n if (this.registerMap.has(name)) {\n throw new Error(`Cannot register already registered service ${name}`);\n }\n\n this.registerMap.set(name, resolver);\n return this;\n }\n\n get(name: string, args?: unknown) {\n // TODO: handle singleton vs instantiation everytime\n if (this.serviceMap.has(name)) {\n return this.serviceMap.get(name);\n }\n\n if (this.registerMap.has(name)) {\n const resolver = this.registerMap.get(name);\n\n if (typeof resolver === 'function') {\n this.serviceMap.set(name, resolver(this, args));\n } else {\n this.serviceMap.set(name, resolver);\n }\n\n return this.serviceMap.get(name);\n }\n\n throw new Error(`Could not resolve service ${name}`);\n }\n}\n"],"names":["Container","add","name","resolver","registerMap","has","Error","set","
|
|
1
|
+
{"version":3,"file":"container.js","sources":["../src/container.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nexport class Container implements Core.Container {\n private registerMap = new Map<string, unknown>();\n\n private serviceMap = new Map();\n\n add(name: string, resolver: unknown) {\n if (this.registerMap.has(name)) {\n throw new Error(`Cannot register already registered service ${name}`);\n }\n\n this.registerMap.set(name, resolver);\n return this;\n }\n\n has(name: string) {\n return this.registerMap.has(name) || this.serviceMap.has(name);\n }\n\n get(name: string, args?: unknown) {\n // TODO: handle singleton vs instantiation everytime\n if (this.serviceMap.has(name)) {\n return this.serviceMap.get(name);\n }\n\n if (this.registerMap.has(name)) {\n const resolver = this.registerMap.get(name);\n\n if (typeof resolver === 'function') {\n this.serviceMap.set(name, resolver(this, args));\n } else {\n this.serviceMap.set(name, resolver);\n }\n\n return this.serviceMap.get(name);\n }\n\n throw new Error(`Could not resolve service ${name}`);\n }\n}\n"],"names":["Container","add","name","resolver","registerMap","has","Error","set","serviceMap","get","args","Map"],"mappings":";;AAEO,MAAMA,SAAAA,CAAAA;IAKXC,GAAAA,CAAIC,IAAY,EAAEC,QAAiB,EAAE;AACnC,QAAA,IAAI,IAAI,CAACC,WAAW,CAACC,GAAG,CAACH,IAAAA,CAAAA,EAAO;AAC9B,YAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,2CAA2C,EAAEJ,IAAAA,CAAAA,CAAM,CAAA;AACtE,QAAA;AAEA,QAAA,IAAI,CAACE,WAAW,CAACG,GAAG,CAACL,IAAAA,EAAMC,QAAAA,CAAAA;AAC3B,QAAA,OAAO,IAAI;AACb,IAAA;AAEAE,IAAAA,GAAAA,CAAIH,IAAY,EAAE;AAChB,QAAA,OAAO,IAAI,CAACE,WAAW,CAACC,GAAG,CAACH,IAAAA,CAAAA,IAAS,IAAI,CAACM,UAAU,CAACH,GAAG,CAACH,IAAAA,CAAAA;AAC3D,IAAA;IAEAO,GAAAA,CAAIP,IAAY,EAAEQ,IAAc,EAAE;;AAEhC,QAAA,IAAI,IAAI,CAACF,UAAU,CAACH,GAAG,CAACH,IAAAA,CAAAA,EAAO;AAC7B,YAAA,OAAO,IAAI,CAACM,UAAU,CAACC,GAAG,CAACP,IAAAA,CAAAA;AAC7B,QAAA;AAEA,QAAA,IAAI,IAAI,CAACE,WAAW,CAACC,GAAG,CAACH,IAAAA,CAAAA,EAAO;AAC9B,YAAA,MAAMC,WAAW,IAAI,CAACC,WAAW,CAACK,GAAG,CAACP,IAAAA,CAAAA;YAEtC,IAAI,OAAOC,aAAa,UAAA,EAAY;gBAClC,IAAI,CAACK,UAAU,CAACD,GAAG,CAACL,IAAAA,EAAMC,QAAAA,CAAS,IAAI,EAAEO,IAAAA,CAAAA,CAAAA;YAC3C,CAAA,MAAO;AACL,gBAAA,IAAI,CAACF,UAAU,CAACD,GAAG,CAACL,IAAAA,EAAMC,QAAAA,CAAAA;AAC5B,YAAA;AAEA,YAAA,OAAO,IAAI,CAACK,UAAU,CAACC,GAAG,CAACP,IAAAA,CAAAA;AAC7B,QAAA;AAEA,QAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,0BAA0B,EAAEJ,IAAAA,CAAAA,CAAM,CAAA;AACrD,IAAA;;AApCQE,QAAAA,IAAAA,CAAAA,WAAAA,GAAc,IAAIO,GAAAA,EAAAA;AAElBH,QAAAA,IAAAA,CAAAA,UAAAA,GAAa,IAAIG,GAAAA,EAAAA;;AAmC3B;;;;"}
|
package/dist/container.mjs
CHANGED
|
@@ -6,6 +6,9 @@ class Container {
|
|
|
6
6
|
this.registerMap.set(name, resolver);
|
|
7
7
|
return this;
|
|
8
8
|
}
|
|
9
|
+
has(name) {
|
|
10
|
+
return this.registerMap.has(name) || this.serviceMap.has(name);
|
|
11
|
+
}
|
|
9
12
|
get(name, args) {
|
|
10
13
|
// TODO: handle singleton vs instantiation everytime
|
|
11
14
|
if (this.serviceMap.has(name)) {
|
package/dist/container.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.mjs","sources":["../src/container.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nexport class Container implements Core.Container {\n private registerMap = new Map<string, unknown>();\n\n private serviceMap = new Map();\n\n add(name: string, resolver: unknown) {\n if (this.registerMap.has(name)) {\n throw new Error(`Cannot register already registered service ${name}`);\n }\n\n this.registerMap.set(name, resolver);\n return this;\n }\n\n get(name: string, args?: unknown) {\n // TODO: handle singleton vs instantiation everytime\n if (this.serviceMap.has(name)) {\n return this.serviceMap.get(name);\n }\n\n if (this.registerMap.has(name)) {\n const resolver = this.registerMap.get(name);\n\n if (typeof resolver === 'function') {\n this.serviceMap.set(name, resolver(this, args));\n } else {\n this.serviceMap.set(name, resolver);\n }\n\n return this.serviceMap.get(name);\n }\n\n throw new Error(`Could not resolve service ${name}`);\n }\n}\n"],"names":["Container","add","name","resolver","registerMap","has","Error","set","
|
|
1
|
+
{"version":3,"file":"container.mjs","sources":["../src/container.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nexport class Container implements Core.Container {\n private registerMap = new Map<string, unknown>();\n\n private serviceMap = new Map();\n\n add(name: string, resolver: unknown) {\n if (this.registerMap.has(name)) {\n throw new Error(`Cannot register already registered service ${name}`);\n }\n\n this.registerMap.set(name, resolver);\n return this;\n }\n\n has(name: string) {\n return this.registerMap.has(name) || this.serviceMap.has(name);\n }\n\n get(name: string, args?: unknown) {\n // TODO: handle singleton vs instantiation everytime\n if (this.serviceMap.has(name)) {\n return this.serviceMap.get(name);\n }\n\n if (this.registerMap.has(name)) {\n const resolver = this.registerMap.get(name);\n\n if (typeof resolver === 'function') {\n this.serviceMap.set(name, resolver(this, args));\n } else {\n this.serviceMap.set(name, resolver);\n }\n\n return this.serviceMap.get(name);\n }\n\n throw new Error(`Could not resolve service ${name}`);\n }\n}\n"],"names":["Container","add","name","resolver","registerMap","has","Error","set","serviceMap","get","args","Map"],"mappings":"AAEO,MAAMA,SAAAA,CAAAA;IAKXC,GAAAA,CAAIC,IAAY,EAAEC,QAAiB,EAAE;AACnC,QAAA,IAAI,IAAI,CAACC,WAAW,CAACC,GAAG,CAACH,IAAAA,CAAAA,EAAO;AAC9B,YAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,2CAA2C,EAAEJ,IAAAA,CAAAA,CAAM,CAAA;AACtE,QAAA;AAEA,QAAA,IAAI,CAACE,WAAW,CAACG,GAAG,CAACL,IAAAA,EAAMC,QAAAA,CAAAA;AAC3B,QAAA,OAAO,IAAI;AACb,IAAA;AAEAE,IAAAA,GAAAA,CAAIH,IAAY,EAAE;AAChB,QAAA,OAAO,IAAI,CAACE,WAAW,CAACC,GAAG,CAACH,IAAAA,CAAAA,IAAS,IAAI,CAACM,UAAU,CAACH,GAAG,CAACH,IAAAA,CAAAA;AAC3D,IAAA;IAEAO,GAAAA,CAAIP,IAAY,EAAEQ,IAAc,EAAE;;AAEhC,QAAA,IAAI,IAAI,CAACF,UAAU,CAACH,GAAG,CAACH,IAAAA,CAAAA,EAAO;AAC7B,YAAA,OAAO,IAAI,CAACM,UAAU,CAACC,GAAG,CAACP,IAAAA,CAAAA;AAC7B,QAAA;AAEA,QAAA,IAAI,IAAI,CAACE,WAAW,CAACC,GAAG,CAACH,IAAAA,CAAAA,EAAO;AAC9B,YAAA,MAAMC,WAAW,IAAI,CAACC,WAAW,CAACK,GAAG,CAACP,IAAAA,CAAAA;YAEtC,IAAI,OAAOC,aAAa,UAAA,EAAY;gBAClC,IAAI,CAACK,UAAU,CAACD,GAAG,CAACL,IAAAA,EAAMC,QAAAA,CAAS,IAAI,EAAEO,IAAAA,CAAAA,CAAAA;YAC3C,CAAA,MAAO;AACL,gBAAA,IAAI,CAACF,UAAU,CAACD,GAAG,CAACL,IAAAA,EAAMC,QAAAA,CAAAA;AAC5B,YAAA;AAEA,YAAA,OAAO,IAAI,CAACK,UAAU,CAACC,GAAG,CAACP,IAAAA,CAAAA;AAC7B,QAAA;AAEA,QAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,0BAA0B,EAAEJ,IAAAA,CAAAA,CAAM,CAAA;AACrD,IAAA;;AApCQE,QAAAA,IAAAA,CAAAA,WAAAA,GAAc,IAAIO,GAAAA,EAAAA;AAElBH,QAAAA,IAAAA,CAAAA,UAAAA,GAAa,IAAIG,GAAAA,EAAAA;;AAmC3B;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single-type.d.ts","sourceRoot":"","sources":["../../../src/core-api/controller/single-type.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAO,MAAM,eAAe,CAAC;AAE9D,UAAU,OAAO;IACf,WAAW,EAAE,MAAM,CAAC,gBAAgB,CAAC;CACtC;AAED;;GAEG;AACH,QAAA,MAAM,0BAA0B,GAAI,kBAEjC,OAAO,KAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,
|
|
1
|
+
{"version":3,"file":"single-type.d.ts","sourceRoot":"","sources":["../../../src/core-api/controller/single-type.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAO,MAAM,eAAe,CAAC;AAE9D,UAAU,OAAO;IACf,WAAW,EAAE,MAAM,CAAC,gBAAgB,CAAC;CACtC;AAED;;GAEG;AACH,QAAA,MAAM,0BAA0B,GAAI,kBAEjC,OAAO,KAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAwDpE,CAAC;AAEF,OAAO,EAAE,0BAA0B,EAAE,CAAC"}
|
|
@@ -22,22 +22,25 @@ var strapiUtils = require('@strapi/utils');
|
|
|
22
22
|
/**
|
|
23
23
|
* create or update single type content.
|
|
24
24
|
*/ async update (ctx) {
|
|
25
|
-
|
|
25
|
+
await this.validateQuery(ctx);
|
|
26
|
+
const sanitizedQuery = await this.sanitizeQuery(ctx);
|
|
27
|
+
const { body = {} } = ctx.request;
|
|
26
28
|
if (!fp.isObject(body.data)) {
|
|
27
29
|
throw new strapiUtils.errors.ValidationError('Missing "data" payload in the request body');
|
|
28
30
|
}
|
|
29
31
|
await this.validateInput(body.data, ctx);
|
|
30
32
|
const sanitizedInputData = await this.sanitizeInput(body.data, ctx);
|
|
31
33
|
const entity = await strapi.service(uid).createOrUpdate({
|
|
32
|
-
...
|
|
34
|
+
...sanitizedQuery,
|
|
33
35
|
data: sanitizedInputData
|
|
34
36
|
});
|
|
35
37
|
const sanitizedEntity = await this.sanitizeOutput(entity, ctx);
|
|
36
38
|
return this.transformResponse(sanitizedEntity);
|
|
37
39
|
},
|
|
38
40
|
async delete (ctx) {
|
|
39
|
-
|
|
40
|
-
await
|
|
41
|
+
await this.validateQuery(ctx);
|
|
42
|
+
const sanitizedQuery = await this.sanitizeQuery(ctx);
|
|
43
|
+
await strapi.service(uid).delete(sanitizedQuery);
|
|
41
44
|
ctx.status = 204;
|
|
42
45
|
}
|
|
43
46
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single-type.js","sources":["../../../src/core-api/controller/single-type.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport type { Struct, Core, Utils, UID } from '@strapi/types';\n\ninterface Options {\n contentType: Struct.SingleTypeSchema;\n}\n\n/**\n * Returns a single type controller to handle default core-api actions\n */\nconst createSingleTypeController = ({\n contentType,\n}: Options): Utils.PartialWithThis<Core.CoreAPI.Controller.SingleType> => {\n const uid = contentType.uid as UID.Service;\n\n // TODO: transform into a class\n return {\n /**\n * Retrieve single type content\n *\n */\n async find(ctx) {\n await this.validateQuery(ctx);\n const sanitizedQuery = await this.sanitizeQuery(ctx);\n\n const entity = await strapi.service(uid).find(sanitizedQuery);\n\n const sanitizedEntity = await this.sanitizeOutput(entity, ctx);\n\n return this.transformResponse(sanitizedEntity);\n },\n\n /**\n * create or update single type content.\n */\n async update(ctx) {\n const {
|
|
1
|
+
{"version":3,"file":"single-type.js","sources":["../../../src/core-api/controller/single-type.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport type { Struct, Core, Utils, UID } from '@strapi/types';\n\ninterface Options {\n contentType: Struct.SingleTypeSchema;\n}\n\n/**\n * Returns a single type controller to handle default core-api actions\n */\nconst createSingleTypeController = ({\n contentType,\n}: Options): Utils.PartialWithThis<Core.CoreAPI.Controller.SingleType> => {\n const uid = contentType.uid as UID.Service;\n\n // TODO: transform into a class\n return {\n /**\n * Retrieve single type content\n *\n */\n async find(ctx) {\n await this.validateQuery(ctx);\n const sanitizedQuery = await this.sanitizeQuery(ctx);\n\n const entity = await strapi.service(uid).find(sanitizedQuery);\n\n const sanitizedEntity = await this.sanitizeOutput(entity, ctx);\n\n return this.transformResponse(sanitizedEntity);\n },\n\n /**\n * create or update single type content.\n */\n async update(ctx) {\n await this.validateQuery(ctx);\n const sanitizedQuery = await this.sanitizeQuery(ctx);\n\n const { body = {} as any } = ctx.request;\n\n if (!isObject(body.data)) {\n throw new errors.ValidationError('Missing \"data\" payload in the request body');\n }\n\n await this.validateInput(body.data, ctx);\n\n const sanitizedInputData = await this.sanitizeInput(body.data, ctx);\n\n const entity = await strapi.service(uid).createOrUpdate({\n ...sanitizedQuery,\n data: sanitizedInputData,\n });\n\n const sanitizedEntity = await this.sanitizeOutput(entity, ctx);\n\n return this.transformResponse(sanitizedEntity);\n },\n\n async delete(ctx) {\n await this.validateQuery(ctx);\n const sanitizedQuery = await this.sanitizeQuery(ctx);\n\n await strapi.service(uid).delete(sanitizedQuery);\n\n ctx.status = 204;\n },\n };\n};\n\nexport { createSingleTypeController };\n"],"names":["createSingleTypeController","contentType","uid","find","ctx","validateQuery","sanitizedQuery","sanitizeQuery","entity","strapi","service","sanitizedEntity","sanitizeOutput","transformResponse","update","body","request","isObject","data","errors","ValidationError","validateInput","sanitizedInputData","sanitizeInput","createOrUpdate","delete","status"],"mappings":";;;;;AAQA;;AAEC,IACD,MAAMA,0BAAAA,GAA6B,CAAC,EAClCC,WAAW,EACH,GAAA;IACR,MAAMC,GAAAA,GAAMD,YAAYC,GAAG;;IAG3B,OAAO;AACL;;;QAIA,MAAMC,MAAKC,GAAG,EAAA;YACZ,MAAM,IAAI,CAACC,aAAa,CAACD,GAAAA,CAAAA;AACzB,YAAA,MAAME,cAAAA,GAAiB,MAAM,IAAI,CAACC,aAAa,CAACH,GAAAA,CAAAA;AAEhD,YAAA,MAAMI,SAAS,MAAMC,MAAAA,CAAOC,OAAO,CAACR,GAAAA,CAAAA,CAAKC,IAAI,CAACG,cAAAA,CAAAA;AAE9C,YAAA,MAAMK,kBAAkB,MAAM,IAAI,CAACC,cAAc,CAACJ,MAAAA,EAAQJ,GAAAA,CAAAA;YAE1D,OAAO,IAAI,CAACS,iBAAiB,CAACF,eAAAA,CAAAA;AAChC,QAAA,CAAA;AAEA;;QAGA,MAAMG,QAAOV,GAAG,EAAA;YACd,MAAM,IAAI,CAACC,aAAa,CAACD,GAAAA,CAAAA;AACzB,YAAA,MAAME,cAAAA,GAAiB,MAAM,IAAI,CAACC,aAAa,CAACH,GAAAA,CAAAA;AAEhD,YAAA,MAAM,EAAEW,IAAAA,GAAO,EAAS,EAAE,GAAGX,IAAIY,OAAO;AAExC,YAAA,IAAI,CAACC,WAAAA,CAASF,IAAAA,CAAKG,IAAI,CAAA,EAAG;gBACxB,MAAM,IAAIC,kBAAAA,CAAOC,eAAe,CAAC,4CAAA,CAAA;AACnC,YAAA;AAEA,YAAA,MAAM,IAAI,CAACC,aAAa,CAACN,IAAAA,CAAKG,IAAI,EAAEd,GAAAA,CAAAA;YAEpC,MAAMkB,kBAAAA,GAAqB,MAAM,IAAI,CAACC,aAAa,CAACR,IAAAA,CAAKG,IAAI,EAAEd,GAAAA,CAAAA;AAE/D,YAAA,MAAMI,SAAS,MAAMC,MAAAA,CAAOC,OAAO,CAACR,GAAAA,CAAAA,CAAKsB,cAAc,CAAC;AACtD,gBAAA,GAAGlB,cAAc;gBACjBY,IAAAA,EAAMI;AACR,aAAA,CAAA;AAEA,YAAA,MAAMX,kBAAkB,MAAM,IAAI,CAACC,cAAc,CAACJ,MAAAA,EAAQJ,GAAAA,CAAAA;YAE1D,OAAO,IAAI,CAACS,iBAAiB,CAACF,eAAAA,CAAAA;AAChC,QAAA,CAAA;AAEA,QAAA,MAAMc,QAAOrB,GAAG,EAAA;YACd,MAAM,IAAI,CAACC,aAAa,CAACD,GAAAA,CAAAA;AACzB,YAAA,MAAME,cAAAA,GAAiB,MAAM,IAAI,CAACC,aAAa,CAACH,GAAAA,CAAAA;AAEhD,YAAA,MAAMK,MAAAA,CAAOC,OAAO,CAACR,GAAAA,CAAAA,CAAKuB,MAAM,CAACnB,cAAAA,CAAAA;AAEjCF,YAAAA,GAAAA,CAAIsB,MAAM,GAAG,GAAA;AACf,QAAA;AACF,KAAA;AACF;;;;"}
|
|
@@ -20,22 +20,25 @@ import { errors } from '@strapi/utils';
|
|
|
20
20
|
/**
|
|
21
21
|
* create or update single type content.
|
|
22
22
|
*/ async update (ctx) {
|
|
23
|
-
|
|
23
|
+
await this.validateQuery(ctx);
|
|
24
|
+
const sanitizedQuery = await this.sanitizeQuery(ctx);
|
|
25
|
+
const { body = {} } = ctx.request;
|
|
24
26
|
if (!isObject(body.data)) {
|
|
25
27
|
throw new errors.ValidationError('Missing "data" payload in the request body');
|
|
26
28
|
}
|
|
27
29
|
await this.validateInput(body.data, ctx);
|
|
28
30
|
const sanitizedInputData = await this.sanitizeInput(body.data, ctx);
|
|
29
31
|
const entity = await strapi.service(uid).createOrUpdate({
|
|
30
|
-
...
|
|
32
|
+
...sanitizedQuery,
|
|
31
33
|
data: sanitizedInputData
|
|
32
34
|
});
|
|
33
35
|
const sanitizedEntity = await this.sanitizeOutput(entity, ctx);
|
|
34
36
|
return this.transformResponse(sanitizedEntity);
|
|
35
37
|
},
|
|
36
38
|
async delete (ctx) {
|
|
37
|
-
|
|
38
|
-
await
|
|
39
|
+
await this.validateQuery(ctx);
|
|
40
|
+
const sanitizedQuery = await this.sanitizeQuery(ctx);
|
|
41
|
+
await strapi.service(uid).delete(sanitizedQuery);
|
|
39
42
|
ctx.status = 204;
|
|
40
43
|
}
|
|
41
44
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single-type.mjs","sources":["../../../src/core-api/controller/single-type.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport type { Struct, Core, Utils, UID } from '@strapi/types';\n\ninterface Options {\n contentType: Struct.SingleTypeSchema;\n}\n\n/**\n * Returns a single type controller to handle default core-api actions\n */\nconst createSingleTypeController = ({\n contentType,\n}: Options): Utils.PartialWithThis<Core.CoreAPI.Controller.SingleType> => {\n const uid = contentType.uid as UID.Service;\n\n // TODO: transform into a class\n return {\n /**\n * Retrieve single type content\n *\n */\n async find(ctx) {\n await this.validateQuery(ctx);\n const sanitizedQuery = await this.sanitizeQuery(ctx);\n\n const entity = await strapi.service(uid).find(sanitizedQuery);\n\n const sanitizedEntity = await this.sanitizeOutput(entity, ctx);\n\n return this.transformResponse(sanitizedEntity);\n },\n\n /**\n * create or update single type content.\n */\n async update(ctx) {\n const {
|
|
1
|
+
{"version":3,"file":"single-type.mjs","sources":["../../../src/core-api/controller/single-type.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport type { Struct, Core, Utils, UID } from '@strapi/types';\n\ninterface Options {\n contentType: Struct.SingleTypeSchema;\n}\n\n/**\n * Returns a single type controller to handle default core-api actions\n */\nconst createSingleTypeController = ({\n contentType,\n}: Options): Utils.PartialWithThis<Core.CoreAPI.Controller.SingleType> => {\n const uid = contentType.uid as UID.Service;\n\n // TODO: transform into a class\n return {\n /**\n * Retrieve single type content\n *\n */\n async find(ctx) {\n await this.validateQuery(ctx);\n const sanitizedQuery = await this.sanitizeQuery(ctx);\n\n const entity = await strapi.service(uid).find(sanitizedQuery);\n\n const sanitizedEntity = await this.sanitizeOutput(entity, ctx);\n\n return this.transformResponse(sanitizedEntity);\n },\n\n /**\n * create or update single type content.\n */\n async update(ctx) {\n await this.validateQuery(ctx);\n const sanitizedQuery = await this.sanitizeQuery(ctx);\n\n const { body = {} as any } = ctx.request;\n\n if (!isObject(body.data)) {\n throw new errors.ValidationError('Missing \"data\" payload in the request body');\n }\n\n await this.validateInput(body.data, ctx);\n\n const sanitizedInputData = await this.sanitizeInput(body.data, ctx);\n\n const entity = await strapi.service(uid).createOrUpdate({\n ...sanitizedQuery,\n data: sanitizedInputData,\n });\n\n const sanitizedEntity = await this.sanitizeOutput(entity, ctx);\n\n return this.transformResponse(sanitizedEntity);\n },\n\n async delete(ctx) {\n await this.validateQuery(ctx);\n const sanitizedQuery = await this.sanitizeQuery(ctx);\n\n await strapi.service(uid).delete(sanitizedQuery);\n\n ctx.status = 204;\n },\n };\n};\n\nexport { createSingleTypeController };\n"],"names":["createSingleTypeController","contentType","uid","find","ctx","validateQuery","sanitizedQuery","sanitizeQuery","entity","strapi","service","sanitizedEntity","sanitizeOutput","transformResponse","update","body","request","isObject","data","errors","ValidationError","validateInput","sanitizedInputData","sanitizeInput","createOrUpdate","delete","status"],"mappings":";;;AAQA;;AAEC,IACD,MAAMA,0BAAAA,GAA6B,CAAC,EAClCC,WAAW,EACH,GAAA;IACR,MAAMC,GAAAA,GAAMD,YAAYC,GAAG;;IAG3B,OAAO;AACL;;;QAIA,MAAMC,MAAKC,GAAG,EAAA;YACZ,MAAM,IAAI,CAACC,aAAa,CAACD,GAAAA,CAAAA;AACzB,YAAA,MAAME,cAAAA,GAAiB,MAAM,IAAI,CAACC,aAAa,CAACH,GAAAA,CAAAA;AAEhD,YAAA,MAAMI,SAAS,MAAMC,MAAAA,CAAOC,OAAO,CAACR,GAAAA,CAAAA,CAAKC,IAAI,CAACG,cAAAA,CAAAA;AAE9C,YAAA,MAAMK,kBAAkB,MAAM,IAAI,CAACC,cAAc,CAACJ,MAAAA,EAAQJ,GAAAA,CAAAA;YAE1D,OAAO,IAAI,CAACS,iBAAiB,CAACF,eAAAA,CAAAA;AAChC,QAAA,CAAA;AAEA;;QAGA,MAAMG,QAAOV,GAAG,EAAA;YACd,MAAM,IAAI,CAACC,aAAa,CAACD,GAAAA,CAAAA;AACzB,YAAA,MAAME,cAAAA,GAAiB,MAAM,IAAI,CAACC,aAAa,CAACH,GAAAA,CAAAA;AAEhD,YAAA,MAAM,EAAEW,IAAAA,GAAO,EAAS,EAAE,GAAGX,IAAIY,OAAO;AAExC,YAAA,IAAI,CAACC,QAAAA,CAASF,IAAAA,CAAKG,IAAI,CAAA,EAAG;gBACxB,MAAM,IAAIC,MAAAA,CAAOC,eAAe,CAAC,4CAAA,CAAA;AACnC,YAAA;AAEA,YAAA,MAAM,IAAI,CAACC,aAAa,CAACN,IAAAA,CAAKG,IAAI,EAAEd,GAAAA,CAAAA;YAEpC,MAAMkB,kBAAAA,GAAqB,MAAM,IAAI,CAACC,aAAa,CAACR,IAAAA,CAAKG,IAAI,EAAEd,GAAAA,CAAAA;AAE/D,YAAA,MAAMI,SAAS,MAAMC,MAAAA,CAAOC,OAAO,CAACR,GAAAA,CAAAA,CAAKsB,cAAc,CAAC;AACtD,gBAAA,GAAGlB,cAAc;gBACjBY,IAAAA,EAAMI;AACR,aAAA,CAAA;AAEA,YAAA,MAAMX,kBAAkB,MAAM,IAAI,CAACC,cAAc,CAACJ,MAAAA,EAAQJ,GAAAA,CAAAA;YAE1D,OAAO,IAAI,CAACS,iBAAiB,CAACF,eAAAA,CAAAA;AAChC,QAAA,CAAA;AAEA,QAAA,MAAMc,QAAOrB,GAAG,EAAA;YACd,MAAM,IAAI,CAACC,aAAa,CAACD,GAAAA,CAAAA;AACzB,YAAA,MAAME,cAAAA,GAAiB,MAAM,IAAI,CAACC,aAAa,CAACH,GAAAA,CAAAA;AAEhD,YAAA,MAAMK,MAAAA,CAAOC,OAAO,CAACR,GAAAA,CAAAA,CAAKuB,MAAM,CAACnB,cAAAA,CAAAA;AAEjCF,YAAAA,GAAAA,CAAIsB,MAAM,GAAG,GAAA;AACf,QAAA;AACF,KAAA;AACF;;;;"}
|
package/dist/package.json.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var name = "@strapi/core";
|
|
6
|
-
var version = "5.
|
|
6
|
+
var version = "5.53.0";
|
|
7
7
|
var description = "Core of Strapi";
|
|
8
8
|
var homepage = "https://strapi.io";
|
|
9
9
|
var bugs = {
|
|
@@ -63,17 +63,18 @@ var dependencies = {
|
|
|
63
63
|
"@casl/ability": "6.7.5",
|
|
64
64
|
"@koa/cors": "5.0.0",
|
|
65
65
|
"@koa/router": "12.0.2",
|
|
66
|
-
"@modelcontextprotocol/
|
|
66
|
+
"@modelcontextprotocol/node": "2.0.0",
|
|
67
|
+
"@modelcontextprotocol/server": "2.0.0",
|
|
67
68
|
"@paralleldrive/cuid2": "2.2.2",
|
|
68
|
-
"@strapi/admin": "5.
|
|
69
|
-
"@strapi/database": "5.
|
|
70
|
-
"@strapi/generators": "5.
|
|
71
|
-
"@strapi/logger": "5.
|
|
72
|
-
"@strapi/openapi": "5.
|
|
73
|
-
"@strapi/permissions": "5.
|
|
74
|
-
"@strapi/types": "5.
|
|
75
|
-
"@strapi/typescript-utils": "5.
|
|
76
|
-
"@strapi/utils": "5.
|
|
69
|
+
"@strapi/admin": "5.53.0",
|
|
70
|
+
"@strapi/database": "5.53.0",
|
|
71
|
+
"@strapi/generators": "5.53.0",
|
|
72
|
+
"@strapi/logger": "5.53.0",
|
|
73
|
+
"@strapi/openapi": "5.53.0",
|
|
74
|
+
"@strapi/permissions": "5.53.0",
|
|
75
|
+
"@strapi/types": "5.53.0",
|
|
76
|
+
"@strapi/typescript-utils": "5.53.0",
|
|
77
|
+
"@strapi/utils": "5.53.0",
|
|
77
78
|
"@vercel/stega": "0.1.2",
|
|
78
79
|
bcryptjs: "2.4.3",
|
|
79
80
|
boxen: "5.1.2",
|
|
@@ -115,11 +116,12 @@ var dependencies = {
|
|
|
115
116
|
"resolve.exports": "2.0.2",
|
|
116
117
|
semver: "7.7.4",
|
|
117
118
|
typescript: "5.9.3",
|
|
118
|
-
undici: "6.28.
|
|
119
|
+
undici: "6.28.1",
|
|
119
120
|
yup: "0.32.9",
|
|
120
121
|
zod: "4.4.3"
|
|
121
122
|
};
|
|
122
123
|
var devDependencies = {
|
|
124
|
+
"@modelcontextprotocol/client": "2.0.0",
|
|
123
125
|
"@swc/core": "1.13.5",
|
|
124
126
|
"@types/bcryptjs": "2.4.3",
|
|
125
127
|
"@types/configstore": "5.0.1",
|
|
@@ -137,12 +139,14 @@ var devDependencies = {
|
|
|
137
139
|
"@types/mime-types": "2.1.1",
|
|
138
140
|
"@types/node": "20.19.41",
|
|
139
141
|
"@types/node-schedule": "2.1.7",
|
|
140
|
-
|
|
142
|
+
ajv: "8.20.0",
|
|
143
|
+
"ajv-formats": "3.0.1",
|
|
144
|
+
"eslint-config-custom": "5.53.0",
|
|
141
145
|
jest: "29.6.0",
|
|
142
146
|
supertest: "7.2.2",
|
|
143
|
-
tsconfig: "5.
|
|
147
|
+
tsconfig: "5.53.0",
|
|
144
148
|
vitest: "catalog:",
|
|
145
|
-
"vitest-config": "5.
|
|
149
|
+
"vitest-config": "5.53.0"
|
|
146
150
|
};
|
|
147
151
|
var engines = {
|
|
148
152
|
node: ">=20.0.0 <=26.x.x",
|
package/dist/package.json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/package.json.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
var name = "@strapi/core";
|
|
2
|
-
var version = "5.
|
|
2
|
+
var version = "5.53.0";
|
|
3
3
|
var description = "Core of Strapi";
|
|
4
4
|
var homepage = "https://strapi.io";
|
|
5
5
|
var bugs = {
|
|
@@ -59,17 +59,18 @@ var dependencies = {
|
|
|
59
59
|
"@casl/ability": "6.7.5",
|
|
60
60
|
"@koa/cors": "5.0.0",
|
|
61
61
|
"@koa/router": "12.0.2",
|
|
62
|
-
"@modelcontextprotocol/
|
|
62
|
+
"@modelcontextprotocol/node": "2.0.0",
|
|
63
|
+
"@modelcontextprotocol/server": "2.0.0",
|
|
63
64
|
"@paralleldrive/cuid2": "2.2.2",
|
|
64
|
-
"@strapi/admin": "5.
|
|
65
|
-
"@strapi/database": "5.
|
|
66
|
-
"@strapi/generators": "5.
|
|
67
|
-
"@strapi/logger": "5.
|
|
68
|
-
"@strapi/openapi": "5.
|
|
69
|
-
"@strapi/permissions": "5.
|
|
70
|
-
"@strapi/types": "5.
|
|
71
|
-
"@strapi/typescript-utils": "5.
|
|
72
|
-
"@strapi/utils": "5.
|
|
65
|
+
"@strapi/admin": "5.53.0",
|
|
66
|
+
"@strapi/database": "5.53.0",
|
|
67
|
+
"@strapi/generators": "5.53.0",
|
|
68
|
+
"@strapi/logger": "5.53.0",
|
|
69
|
+
"@strapi/openapi": "5.53.0",
|
|
70
|
+
"@strapi/permissions": "5.53.0",
|
|
71
|
+
"@strapi/types": "5.53.0",
|
|
72
|
+
"@strapi/typescript-utils": "5.53.0",
|
|
73
|
+
"@strapi/utils": "5.53.0",
|
|
73
74
|
"@vercel/stega": "0.1.2",
|
|
74
75
|
bcryptjs: "2.4.3",
|
|
75
76
|
boxen: "5.1.2",
|
|
@@ -111,11 +112,12 @@ var dependencies = {
|
|
|
111
112
|
"resolve.exports": "2.0.2",
|
|
112
113
|
semver: "7.7.4",
|
|
113
114
|
typescript: "5.9.3",
|
|
114
|
-
undici: "6.28.
|
|
115
|
+
undici: "6.28.1",
|
|
115
116
|
yup: "0.32.9",
|
|
116
117
|
zod: "4.4.3"
|
|
117
118
|
};
|
|
118
119
|
var devDependencies = {
|
|
120
|
+
"@modelcontextprotocol/client": "2.0.0",
|
|
119
121
|
"@swc/core": "1.13.5",
|
|
120
122
|
"@types/bcryptjs": "2.4.3",
|
|
121
123
|
"@types/configstore": "5.0.1",
|
|
@@ -133,12 +135,14 @@ var devDependencies = {
|
|
|
133
135
|
"@types/mime-types": "2.1.1",
|
|
134
136
|
"@types/node": "20.19.41",
|
|
135
137
|
"@types/node-schedule": "2.1.7",
|
|
136
|
-
|
|
138
|
+
ajv: "8.20.0",
|
|
139
|
+
"ajv-formats": "3.0.1",
|
|
140
|
+
"eslint-config-custom": "5.53.0",
|
|
137
141
|
jest: "29.6.0",
|
|
138
142
|
supertest: "7.2.2",
|
|
139
|
-
tsconfig: "5.
|
|
143
|
+
tsconfig: "5.53.0",
|
|
140
144
|
vitest: "catalog:",
|
|
141
|
-
"vitest-config": "5.
|
|
145
|
+
"vitest-config": "5.53.0"
|
|
142
146
|
};
|
|
143
147
|
var engines = {
|
|
144
148
|
node: ">=20.0.0 <=26.x.x",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -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;AAazC,QAAA,MAAM,sBAAsB,
|
|
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,kEAuE1B,CAAC;AAEH,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -54,9 +54,11 @@ const transformParamsToQuery = fp.curry((uid, params$1)=>{
|
|
|
54
54
|
return existingResult;
|
|
55
55
|
};
|
|
56
56
|
const queryWithoutPublicationParams = stripPublicationParamsFromQuery(query);
|
|
57
|
-
|
|
57
|
+
const transformedQuery = fp.assoc('where', baseWhere, fp.assoc('filters', wrappedFilters, queryWithoutPublicationParams));
|
|
58
|
+
return transformedQuery;
|
|
58
59
|
}
|
|
59
|
-
|
|
60
|
+
const transformedQuery = fp.assoc('where', baseWhere, stripPublicationParamsFromQuery(query));
|
|
61
|
+
return transformedQuery;
|
|
60
62
|
});
|
|
61
63
|
|
|
62
64
|
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, 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
|
|
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 const transformedQuery = assoc(\n 'where',\n baseWhere,\n assoc('filters', wrappedFilters, queryWithoutPublicationParams)\n );\n\n return transformedQuery;\n }\n\n const transformedQuery = assoc('where', baseWhere, stripPublicationParamsFromQuery(query));\n\n return transformedQuery;\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","transformedQuery","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,MAAMmC,mBAAmBC,QAAAA,CACvB,OAAA,EACAtB,SAAAA,EACAsB,QAAAA,CAAM,WAAWf,cAAAA,EAAgBa,6BAAAA,CAAAA,CAAAA;QAGnC,OAAOC,gBAAAA;AACT,IAAA;AAEA,IAAA,MAAMA,gBAAAA,GAAmBC,QAAAA,CAAM,OAAA,EAAStB,SAAAA,EAAWG,+BAAAA,CAAgCjB,KAAAA,CAAAA,CAAAA;IAEnF,OAAOmC,gBAAAA;AACT,CAAA;;;;"}
|
|
@@ -52,9 +52,11 @@ const transformParamsToQuery = curry((uid, params)=>{
|
|
|
52
52
|
return existingResult;
|
|
53
53
|
};
|
|
54
54
|
const queryWithoutPublicationParams = stripPublicationParamsFromQuery(query);
|
|
55
|
-
|
|
55
|
+
const transformedQuery = assoc('where', baseWhere, assoc('filters', wrappedFilters, queryWithoutPublicationParams));
|
|
56
|
+
return transformedQuery;
|
|
56
57
|
}
|
|
57
|
-
|
|
58
|
+
const transformedQuery = assoc('where', baseWhere, stripPublicationParamsFromQuery(query));
|
|
59
|
+
return transformedQuery;
|
|
58
60
|
});
|
|
59
61
|
|
|
60
62
|
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, 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
|
|
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 const transformedQuery = assoc(\n 'where',\n baseWhere,\n assoc('filters', wrappedFilters, queryWithoutPublicationParams)\n );\n\n return transformedQuery;\n }\n\n const transformedQuery = assoc('where', baseWhere, stripPublicationParamsFromQuery(query));\n\n return transformedQuery;\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","transformedQuery","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,MAAMmC,mBAAmBC,KAAAA,CACvB,OAAA,EACAtB,SAAAA,EACAsB,KAAAA,CAAM,WAAWf,cAAAA,EAAgBa,6BAAAA,CAAAA,CAAAA;QAGnC,OAAOC,gBAAAA;AACT,IAAA;AAEA,IAAA,MAAMA,gBAAAA,GAAmBC,KAAAA,CAAM,OAAA,EAAStB,SAAAA,EAAWG,+BAAAA,CAAgCjB,KAAAA,CAAAA,CAAAA;IAEnF,OAAOmC,gBAAAA;AACT,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocks-validator.d.ts","sourceRoot":"","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"blocks-validator.d.ts","sourceRoot":"","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AA0KpC,eAAO,MAAM,eAAe,qGAA8B,CAAC"}
|
|
@@ -15,14 +15,20 @@ const textNodeValidator = strapiUtils.yup.object().shape({
|
|
|
15
15
|
strikethrough: strapiUtils.yup.boolean(),
|
|
16
16
|
code: strapiUtils.yup.boolean()
|
|
17
17
|
});
|
|
18
|
+
const ALLOWED_LINK_PROTOCOLS = new Set([
|
|
19
|
+
'http:',
|
|
20
|
+
'https:',
|
|
21
|
+
'ftp:',
|
|
22
|
+
'mailto:',
|
|
23
|
+
'tel:'
|
|
24
|
+
]);
|
|
18
25
|
const checkValidLink = (link)=>{
|
|
19
26
|
try {
|
|
20
|
-
|
|
21
|
-
|
|
27
|
+
const url = new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);
|
|
28
|
+
return ALLOWED_LINK_PROTOCOLS.has(url.protocol);
|
|
22
29
|
} catch {
|
|
23
30
|
return false;
|
|
24
31
|
}
|
|
25
|
-
return true;
|
|
26
32
|
};
|
|
27
33
|
const linkNodeValidator = strapiUtils.yup.object().shape({
|
|
28
34
|
type: strapiUtils.yup.string().equals([
|
|
@@ -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 {\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","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":";;;;AAEA,MAAMA,iBAAAA,GAAoBC,eAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAC3CC,IAAAA,IAAAA,EAAMH,eAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAO,KAAA,CAAA,CAAEC,QAAQ,EAAA;AAC5CC,IAAAA,IAAAA,EAAMP,gBACHI,MAAM,EAAA,CACNI,IAAI,CACH,eAAA,EACA,sDACA,CAACD,IAAAA,GAAAA;QACC,OAAO,OAAOA,IAAAA,KAAS,QAAA,IAAYA,IAAAA,KAAS,EAAA;AAC9C,IAAA,CAAA,CAAA;AAEJE,IAAAA,IAAAA,EAAMT,gBAAIU,OAAO,EAAA;AACjBC,IAAAA,MAAAA,EAAQX,gBAAIU,OAAO,EAAA;AACnBE,IAAAA,SAAAA,EAAWZ,gBAAIU,OAAO,EAAA;AACtBG,IAAAA,aAAAA,EAAeb,gBAAIU,OAAO,EAAA;AAC1BI,IAAAA,IAAAA,EAAMd,gBAAIU,OAAO;AACnB,CAAA,CAAA;AAEA,MAAMK,iBAAiB,CAACC,IAAAA,GAAAA;IACtB,IAAI;;QAEF,IAAIC,GAAAA,CAAID,KAAKE,UAAU,CAAC,OAAO,CAAC,iBAAiB,EAAEF,IAAAA,CAAAA,CAAM,GAAGA,IAAAA,CAAAA;AAC9D,IAAA,CAAA,CAAE,OAAM;QACN,OAAO,KAAA;AACT,IAAA;IACA,OAAO,IAAA;AACT,CAAA;AAEA,MAAMG,iBAAAA,GAAoBnB,eAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAC3CC,IAAAA,IAAAA,EAAMH,eAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAO,KAAA,CAAA,CAAEC,QAAQ,EAAA;IAC5Cc,GAAAA,EAAKpB,eAAAA,CACFI,MAAM,EAAA,CACNI,IAAI,CAAC,eAAe,8BAAA,EAAgC,CAACa,KAAAA,GAAUN,cAAAA,CAAeM,KAAAA,IAAS,EAAA,CAAA,CAAA;AAC1FC,IAAAA,QAAAA,EAAUtB,gBAAIuB,KAAK,EAAA,CAAGC,EAAE,CAACzB,mBAAmBO,QAAQ;AACtD,CAAA,CAAA;AAEA;AACA,MAAMmB,mBAAAA,GAA2BzB,eAAAA,CAAI0B,IAAI,CAAC,CAACL,KAAAA,GAAAA;AACzC,IAAA,OAAQA,MAAMlB,IAAI;QAChB,KAAK,MAAA;YACH,OAAOJ,iBAAAA;QACT,KAAK,MAAA;YACH,OAAOoB,iBAAAA;AACT,QAAA;AACE,YAAA,OAAOnB,gBAAI2B,KAAK,EAAA,CAAGnB,IAAI,CAAC,gBAAgB,kCAAA,EAAoC,IAAA;gBAC1E,OAAO,KAAA;AACT,YAAA,CAAA,CAAA;AACJ;AACF,CAAA,CAAA;AAEA,MAAMoB,sBAAAA,GAAyB5B,eAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAChDC,IAAAA,IAAAA,EAAMH,eAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAY,KAAA,CAAA,CAAEC,QAAQ,EAAA;IACjDgB,QAAAA,EAAUtB,eAAAA,CACPuB,KAAK,EAAA,CACLC,EAAE,CAACC,qBACHI,GAAG,CAAC,CAAA,EAAG,kEAAA,CAAA,CACPvB,QAAQ;AACb,CAAA,CAAA;AAEA,MAAMwB,oBAAAA,GAAuB9B,eAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAC9CC,IAAAA,IAAAA,EAAMH,eAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAU,KAAA,CAAA,CAAEC,QAAQ,EAAA;AAC/CyB,IAAAA,KAAAA,EAAO/B,eAAAA,CAAIgC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAAC,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA;AAAE,KAAA,CAAA,CAAE3B,QAAQ,EAAA;IACtDgB,QAAAA,EAAUtB,eAAAA,CACPuB,KAAK,EAAA,CACLC,EAAE,CAACC,qBACHI,GAAG,CAAC,CAAA,EAAG,gEAAA,CAAA,CACPvB,QAAQ;AACb,CAAA,CAAA;AAEA,MAAM4B,kBAAAA,GAAqBlC,eAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAC5CC,IAAAA,IAAAA,EAAMH,eAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAQ,KAAA,CAAA,CAAEC,QAAQ,EAAA;IAC7CgB,QAAAA,EAAUtB,eAAAA,CACPuB,KAAK,EAAA,CACLC,EAAE,CAACC,qBACHI,GAAG,CAAC,CAAA,EAAG,8DAAA,CAAA,CACPvB,QAAQ;AACb,CAAA,CAAA;AAEA,MAAM6B,kBAAAA,GAAqBnC,eAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAC5CC,IAAAA,IAAAA,EAAMH,eAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAO,KAAA,CAAA,CAAEC,QAAQ,EAAA;IAC5C8B,QAAAA,EAAUpC,eAAAA,CAAII,MAAM,EAAA,CAAGiC,QAAQ,EAAA;IAC/Bf,QAAAA,EAAUtB,eAAAA,CACPuB,KAAK,EAAA,CACLC,EAAE,CAACzB,mBACH8B,GAAG,CAAC,CAAA,EAAG,8DAAA,CAAA,CACPvB,QAAQ;AACb,CAAA,CAAA;AAEA,MAAMgC,YAAAA,GAAetC,eAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACtCC,IAAAA,IAAAA,EAAMH,eAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAY,KAAA,CAAA,CAAEC,QAAQ,EAAA;AACjDgB,IAAAA,QAAAA,EAAUtB,gBAAIuB,KAAK,EAAA,CAAGC,EAAE,CAACC,qBAAqBnB,QAAQ;AACxD,CAAA,CAAA;AAEA;AACA;AACA,MAAMiC,qBAAAA,GAAwBvC,eAAAA,CAAI0B,IAAI,CAAC,CAACL,KAAAA,GAAAA;AACtC,IAAA,OAAQA,MAAMlB,IAAI;QAChB,KAAK,MAAA;YACH,OAAOqC,iBAAAA;QACT,KAAK,WAAA;YACH,OAAOF,YAAAA;AACT,QAAA;AACE,YAAA,OAAOtC,gBAAI2B,KAAK,EAAA,CAAGnB,IAAI,CAAC,gBAAgB,uCAAA,EAAyC,IAAA;gBAC/E,OAAO,KAAA;AACT,YAAA,CAAA,CAAA;AACJ;AACF,CAAA,CAAA;AAEA;AACA,MAAMgC,iBAAAA,GAAoBxC,eAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAC3CC,IAAAA,IAAAA,EAAMH,eAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAO,KAAA,CAAA,CAAEC,QAAQ,EAAA;AAC5CmC,IAAAA,MAAAA,EAAQzC,eAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA,SAAA;AAAW,QAAA;AAAY,KAAA,CAAA,CAAEC,QAAQ,EAAA;IAC9DgB,QAAAA,EAAUtB,eAAAA,CACPuB,KAAK,EAAA,CACLC,EAAE,CAACe,uBACHV,GAAG,CAAC,CAAA,EAAG,gEAAA,CAAA,CACPvB,QAAQ;AACb,CAAA,CAAA;AAEA,MAAMoC,kBAAAA,GAAqB1C,eAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAC5CC,IAAAA,IAAAA,EAAMH,eAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAQ,KAAA,CAAA,CAAEC,QAAQ,EAAA;AAC7CqC,IAAAA,KAAAA,EAAO3C,eAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;QACxB0C,IAAAA,EAAM5C,eAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC3BuC,eAAAA,EAAiB7C,eAAAA,CAAII,MAAM,EAAA,CAAGiC,QAAQ,EAAA;QACtCjB,GAAAA,EAAKpB,eAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC1BwC,OAAAA,EAAS9C,eAAAA,CAAII,MAAM,EAAA,CAAGiC,QAAQ,EAAA;QAC9BU,KAAAA,EAAO/C,eAAAA,CAAIgC,MAAM,EAAA,CAAG1B,QAAQ,EAAA;QAC5B0C,MAAAA,EAAQhD,eAAAA,CAAIgC,MAAM,EAAA,CAAG1B,QAAQ,EAAA;QAC7B2C,OAAAA,EAASjD,eAAAA,CAAIC,MAAM,EAAA,CAAGoC,QAAQ,EAAA;QAC9Ba,IAAAA,EAAMlD,eAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC3B6C,GAAAA,EAAKnD,eAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC1B8C,IAAAA,EAAMpD,eAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC3B+C,IAAAA,EAAMrD,eAAAA,CAAIgC,MAAM,EAAA,CAAG1B,QAAQ,EAAA;QAC3BgD,UAAAA,EAAYtD,eAAAA,CAAII,MAAM,EAAA,CAAGiC,QAAQ,EAAA;QACjCkB,QAAAA,EAAUvD,eAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC/BkD,iBAAAA,EAAmBxD,eAAAA,CAAI2B,KAAK,EAAA,CAAGU,QAAQ,EAAA;QACvCoB,SAAAA,EAAWzD,eAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAChCoD,SAAAA,EAAW1D,eAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ;AAClC,KAAA,CAAA;AACAgB,IAAAA,QAAAA,EAAUtB,gBAAIuB,KAAK,EAAA,CAAGC,EAAE,CAACC,qBAAqBnB,QAAQ;AACxD,CAAA,CAAA;AAEA;AACA,MAAMqD,kBAAAA,GAA0B3D,eAAAA,CAAI0B,IAAI,CAAC,CAACL,KAAAA,GAAAA;AACxC,IAAA,OAAQA,MAAMlB,IAAI;QAChB,KAAK,WAAA;YACH,OAAOyB,sBAAAA;QACT,KAAK,SAAA;YACH,OAAOE,oBAAAA;QACT,KAAK,OAAA;YACH,OAAOI,kBAAAA;QACT,KAAK,MAAA;YACH,OAAOM,iBAAAA;QACT,KAAK,OAAA;YACH,OAAOE,kBAAAA;QACT,KAAK,MAAA;YACH,OAAOP,kBAAAA;AACT,QAAA;AACE,YAAA,OAAOnC,gBAAI2B,KAAK,EAAA,CAAGnB,IAAI,CAAC,gBAAgB,+BAAA,EAAiC,IAAA;gBACvE,OAAO,KAAA;AACT,YAAA,CAAA,CAAA;AACJ;AACF,CAAA,CAAA;AAEA,MAAMoD,qBAAAA,GAAwB5D,eAAAA,CAAIuB,KAAK,EAAA,CAAGC,EAAE,CAACmC,kBAAAA,CAAAA;AAEtC,MAAME,eAAAA,GAAkB,IAAMD;;;;"}
|
|
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 ALLOWED_LINK_PROTOCOLS = new Set(['http:', 'https:', 'ftp:', 'mailto:', 'tel:']);\n\nconst checkValidLink = (link: string) => {\n try {\n const url = new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n\n return ALLOWED_LINK_PROTOCOLS.has(url.protocol);\n } catch {\n return false;\n }\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","ALLOWED_LINK_PROTOCOLS","Set","checkValidLink","link","url","URL","startsWith","has","protocol","linkNodeValidator","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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"}
|
|
@@ -13,14 +13,20 @@ const textNodeValidator = yup.object().shape({
|
|
|
13
13
|
strikethrough: yup.boolean(),
|
|
14
14
|
code: yup.boolean()
|
|
15
15
|
});
|
|
16
|
+
const ALLOWED_LINK_PROTOCOLS = new Set([
|
|
17
|
+
'http:',
|
|
18
|
+
'https:',
|
|
19
|
+
'ftp:',
|
|
20
|
+
'mailto:',
|
|
21
|
+
'tel:'
|
|
22
|
+
]);
|
|
16
23
|
const checkValidLink = (link)=>{
|
|
17
24
|
try {
|
|
18
|
-
|
|
19
|
-
|
|
25
|
+
const url = new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);
|
|
26
|
+
return ALLOWED_LINK_PROTOCOLS.has(url.protocol);
|
|
20
27
|
} catch {
|
|
21
28
|
return false;
|
|
22
29
|
}
|
|
23
|
-
return true;
|
|
24
30
|
};
|
|
25
31
|
const linkNodeValidator = yup.object().shape({
|
|
26
32
|
type: yup.string().equals([
|