@strapi/openapi 0.0.0-experimental.6340da17068c3bed7fb006e7bcc554c71129e282 → 0.0.0-experimental.64145e1b4fc1bac8bc4f84d51c88d0e9f139e826
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/assemblers/document/factory.d.ts +2 -0
- package/dist/assemblers/document/factory.d.ts.map +1 -1
- package/dist/assemblers/document/factory.js +10 -0
- package/dist/assemblers/document/factory.js.map +1 -1
- package/dist/assemblers/document/factory.mjs +10 -0
- package/dist/assemblers/document/factory.mjs.map +1 -1
- package/dist/assemblers/document/path/path-item/operation/body.d.ts.map +1 -1
- package/dist/assemblers/document/path/path-item/operation/body.js +5 -1
- package/dist/assemblers/document/path/path-item/operation/body.js.map +1 -1
- package/dist/assemblers/document/path/path-item/operation/body.mjs +5 -1
- package/dist/assemblers/document/path/path-item/operation/body.mjs.map +1 -1
- package/dist/assemblers/document/path/path-item/operation/parameters.d.ts +6 -0
- package/dist/assemblers/document/path/path-item/operation/parameters.d.ts.map +1 -1
- package/dist/assemblers/document/path/path-item/operation/parameters.js +115 -17
- package/dist/assemblers/document/path/path-item/operation/parameters.js.map +1 -1
- package/dist/assemblers/document/path/path-item/operation/parameters.mjs +115 -17
- package/dist/assemblers/document/path/path-item/operation/parameters.mjs.map +1 -1
- package/dist/assemblers/document/path/path-item/operation/responses.d.ts.map +1 -1
- package/dist/assemblers/document/path/path-item/operation/responses.js +3 -1
- package/dist/assemblers/document/path/path-item/operation/responses.js.map +1 -1
- package/dist/assemblers/document/path/path-item/operation/responses.mjs +3 -1
- package/dist/assemblers/document/path/path-item/operation/responses.mjs.map +1 -1
- package/dist/assemblers/document/query-param-styles.d.ts +10 -0
- package/dist/assemblers/document/query-param-styles.d.ts.map +1 -0
- package/dist/assemblers/document/query-param-styles.js +23 -0
- package/dist/assemblers/document/query-param-styles.js.map +1 -0
- package/dist/assemblers/document/query-param-styles.mjs +19 -0
- package/dist/assemblers/document/query-param-styles.mjs.map +1 -0
- package/dist/assemblers/document/security.d.ts +8 -0
- package/dist/assemblers/document/security.d.ts.map +1 -0
- package/dist/assemblers/document/security.js +45 -0
- package/dist/assemblers/document/security.js.map +1 -0
- package/dist/assemblers/document/security.mjs +43 -0
- package/dist/assemblers/document/security.mjs.map +1 -0
- package/dist/assemblers/document/server.d.ts +13 -0
- package/dist/assemblers/document/server.d.ts.map +1 -0
- package/dist/assemblers/document/server.js +25 -0
- package/dist/assemblers/document/server.js.map +1 -0
- package/dist/assemblers/document/server.mjs +23 -0
- package/dist/assemblers/document/server.mjs.map +1 -0
- package/dist/context/types.d.ts +2 -2
- package/dist/context/types.d.ts.map +1 -1
- package/dist/post-processor/component-writer.d.ts.map +1 -1
- package/dist/post-processor/component-writer.js +21 -3
- package/dist/post-processor/component-writer.js.map +1 -1
- package/dist/post-processor/component-writer.mjs +22 -4
- package/dist/post-processor/component-writer.mjs.map +1 -1
- package/dist/registries/factory.d.ts +4 -1
- package/dist/registries/factory.d.ts.map +1 -1
- package/dist/registries/factory.js +3 -1
- package/dist/registries/factory.js.map +1 -1
- package/dist/registries/factory.mjs +3 -1
- package/dist/registries/factory.mjs.map +1 -1
- package/dist/utils/zod.d.ts +53 -10
- package/dist/utils/zod.d.ts.map +1 -1
- package/dist/utils/zod.js +128 -14
- package/dist/utils/zod.js.map +1 -1
- package/dist/utils/zod.mjs +126 -15
- package/dist/utils/zod.mjs.map +1 -1
- package/package.json +10 -6
|
@@ -3,6 +3,8 @@ export declare class DocumentAssemblerFactory {
|
|
|
3
3
|
createAll(): Assembler.Document[];
|
|
4
4
|
private _createInfoAssembler;
|
|
5
5
|
private _createMetadataAssembler;
|
|
6
|
+
private _createSecurityAssembler;
|
|
7
|
+
private _createServerAssembler;
|
|
6
8
|
private _createPathsAssembler;
|
|
7
9
|
}
|
|
8
10
|
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/assemblers/document/factory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/assemblers/document/factory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAQpC,qBAAa,wBAAwB;IACnC,SAAS,IAAI,SAAS,CAAC,QAAQ,EAAE;IAUjC,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,wBAAwB;IAIhC,OAAO,CAAC,wBAAwB;IAIhC,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,qBAAqB;CAQ9B"}
|
|
@@ -13,12 +13,16 @@ require('./path/path-item/operation/operation.js');
|
|
|
13
13
|
require('./path/path-item/operation/operation-id.js');
|
|
14
14
|
require('./path/path-item/operation/parameters.js');
|
|
15
15
|
require('./path/path-item/operation/tags.js');
|
|
16
|
+
var security = require('./security.js');
|
|
17
|
+
var server = require('./server.js');
|
|
16
18
|
|
|
17
19
|
class DocumentAssemblerFactory {
|
|
18
20
|
createAll() {
|
|
19
21
|
return [
|
|
20
22
|
this._createMetadataAssembler(),
|
|
21
23
|
this._createInfoAssembler(),
|
|
24
|
+
this._createServerAssembler(),
|
|
25
|
+
this._createSecurityAssembler(),
|
|
22
26
|
this._createPathsAssembler()
|
|
23
27
|
];
|
|
24
28
|
}
|
|
@@ -28,6 +32,12 @@ class DocumentAssemblerFactory {
|
|
|
28
32
|
_createMetadataAssembler() {
|
|
29
33
|
return new metadata.DocumentMetadataAssembler();
|
|
30
34
|
}
|
|
35
|
+
_createSecurityAssembler() {
|
|
36
|
+
return new security.DocumentSecurityAssembler();
|
|
37
|
+
}
|
|
38
|
+
_createServerAssembler() {
|
|
39
|
+
return new server.DocumentServerAssembler();
|
|
40
|
+
}
|
|
31
41
|
_createPathsAssembler(assemblerFactory = new factory.PathAssemblerFactory(), contextFactory = new path.PathContextFactory()) {
|
|
32
42
|
const assemblers = assemblerFactory.createAll();
|
|
33
43
|
return new path$1.DocumentPathsAssembler(assemblers, contextFactory);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sources":["../../../src/assemblers/document/factory.ts"],"sourcesContent":["import { PathContextFactory } from '../../context';\n\nimport type { Assembler } from '..';\n\nimport { DocumentInfoAssembler } from './info';\nimport { DocumentMetadataAssembler } from './metadata';\nimport { DocumentPathsAssembler, PathAssemblerFactory } from './path';\n\nexport class DocumentAssemblerFactory {\n createAll(): Assembler.Document[] {\n return [\n this._createMetadataAssembler(),\n this._createInfoAssembler(),\n this._createPathsAssembler(),\n ];\n }\n\n private _createInfoAssembler() {\n return new DocumentInfoAssembler();\n }\n\n private _createMetadataAssembler() {\n return new DocumentMetadataAssembler();\n }\n\n private _createPathsAssembler(\n assemblerFactory: PathAssemblerFactory = new PathAssemblerFactory(),\n contextFactory: PathContextFactory = new PathContextFactory()\n ) {\n const assemblers = assemblerFactory.createAll();\n\n return new DocumentPathsAssembler(assemblers, contextFactory);\n }\n}\n"],"names":["DocumentAssemblerFactory","createAll","_createMetadataAssembler","_createInfoAssembler","_createPathsAssembler","DocumentInfoAssembler","DocumentMetadataAssembler","assemblerFactory","PathAssemblerFactory","contextFactory","PathContextFactory","assemblers","DocumentPathsAssembler"],"mappings":"
|
|
1
|
+
{"version":3,"file":"factory.js","sources":["../../../src/assemblers/document/factory.ts"],"sourcesContent":["import { PathContextFactory } from '../../context';\n\nimport type { Assembler } from '..';\n\nimport { DocumentInfoAssembler } from './info';\nimport { DocumentMetadataAssembler } from './metadata';\nimport { DocumentPathsAssembler, PathAssemblerFactory } from './path';\nimport { DocumentSecurityAssembler } from './security';\nimport { DocumentServerAssembler } from './server';\n\nexport class DocumentAssemblerFactory {\n createAll(): Assembler.Document[] {\n return [\n this._createMetadataAssembler(),\n this._createInfoAssembler(),\n this._createServerAssembler(),\n this._createSecurityAssembler(),\n this._createPathsAssembler(),\n ];\n }\n\n private _createInfoAssembler() {\n return new DocumentInfoAssembler();\n }\n\n private _createMetadataAssembler() {\n return new DocumentMetadataAssembler();\n }\n\n private _createSecurityAssembler() {\n return new DocumentSecurityAssembler();\n }\n\n private _createServerAssembler() {\n return new DocumentServerAssembler();\n }\n\n private _createPathsAssembler(\n assemblerFactory: PathAssemblerFactory = new PathAssemblerFactory(),\n contextFactory: PathContextFactory = new PathContextFactory()\n ) {\n const assemblers = assemblerFactory.createAll();\n\n return new DocumentPathsAssembler(assemblers, contextFactory);\n }\n}\n"],"names":["DocumentAssemblerFactory","createAll","_createMetadataAssembler","_createInfoAssembler","_createServerAssembler","_createSecurityAssembler","_createPathsAssembler","DocumentInfoAssembler","DocumentMetadataAssembler","DocumentSecurityAssembler","DocumentServerAssembler","assemblerFactory","PathAssemblerFactory","contextFactory","PathContextFactory","assemblers","DocumentPathsAssembler"],"mappings":";;;;;;;;;;;;;;;;;;AAUO,MAAMA,wBAAAA,CAAAA;IACXC,SAAAA,GAAkC;QAChC,OAAO;AACL,YAAA,IAAI,CAACC,wBAAwB,EAAA;AAC7B,YAAA,IAAI,CAACC,oBAAoB,EAAA;AACzB,YAAA,IAAI,CAACC,sBAAsB,EAAA;AAC3B,YAAA,IAAI,CAACC,wBAAwB,EAAA;AAC7B,YAAA,IAAI,CAACC,qBAAqB;AAC3B,SAAA;AACH,IAAA;IAEQH,oBAAAA,GAAuB;AAC7B,QAAA,OAAO,IAAII,0BAAAA,EAAAA;AACb,IAAA;IAEQL,wBAAAA,GAA2B;AACjC,QAAA,OAAO,IAAIM,kCAAAA,EAAAA;AACb,IAAA;IAEQH,wBAAAA,GAA2B;AACjC,QAAA,OAAO,IAAII,kCAAAA,EAAAA;AACb,IAAA;IAEQL,sBAAAA,GAAyB;AAC/B,QAAA,OAAO,IAAIM,8BAAAA,EAAAA;AACb,IAAA;AAEQJ,IAAAA,qBAAAA,CACNK,mBAAyC,IAAIC,4BAAAA,EAAsB,EACnEC,cAAAA,GAAqC,IAAIC,yBAAoB,EAC7D;QACA,MAAMC,UAAAA,GAAaJ,iBAAiBV,SAAS,EAAA;QAE7C,OAAO,IAAIe,8BAAuBD,UAAAA,EAAYF,cAAAA,CAAAA;AAChD,IAAA;AACF;;;;"}
|
|
@@ -11,12 +11,16 @@ import './path/path-item/operation/operation.mjs';
|
|
|
11
11
|
import './path/path-item/operation/operation-id.mjs';
|
|
12
12
|
import './path/path-item/operation/parameters.mjs';
|
|
13
13
|
import './path/path-item/operation/tags.mjs';
|
|
14
|
+
import { DocumentSecurityAssembler } from './security.mjs';
|
|
15
|
+
import { DocumentServerAssembler } from './server.mjs';
|
|
14
16
|
|
|
15
17
|
class DocumentAssemblerFactory {
|
|
16
18
|
createAll() {
|
|
17
19
|
return [
|
|
18
20
|
this._createMetadataAssembler(),
|
|
19
21
|
this._createInfoAssembler(),
|
|
22
|
+
this._createServerAssembler(),
|
|
23
|
+
this._createSecurityAssembler(),
|
|
20
24
|
this._createPathsAssembler()
|
|
21
25
|
];
|
|
22
26
|
}
|
|
@@ -26,6 +30,12 @@ class DocumentAssemblerFactory {
|
|
|
26
30
|
_createMetadataAssembler() {
|
|
27
31
|
return new DocumentMetadataAssembler();
|
|
28
32
|
}
|
|
33
|
+
_createSecurityAssembler() {
|
|
34
|
+
return new DocumentSecurityAssembler();
|
|
35
|
+
}
|
|
36
|
+
_createServerAssembler() {
|
|
37
|
+
return new DocumentServerAssembler();
|
|
38
|
+
}
|
|
29
39
|
_createPathsAssembler(assemblerFactory = new PathAssemblerFactory(), contextFactory = new PathContextFactory()) {
|
|
30
40
|
const assemblers = assemblerFactory.createAll();
|
|
31
41
|
return new DocumentPathsAssembler(assemblers, contextFactory);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.mjs","sources":["../../../src/assemblers/document/factory.ts"],"sourcesContent":["import { PathContextFactory } from '../../context';\n\nimport type { Assembler } from '..';\n\nimport { DocumentInfoAssembler } from './info';\nimport { DocumentMetadataAssembler } from './metadata';\nimport { DocumentPathsAssembler, PathAssemblerFactory } from './path';\n\nexport class DocumentAssemblerFactory {\n createAll(): Assembler.Document[] {\n return [\n this._createMetadataAssembler(),\n this._createInfoAssembler(),\n this._createPathsAssembler(),\n ];\n }\n\n private _createInfoAssembler() {\n return new DocumentInfoAssembler();\n }\n\n private _createMetadataAssembler() {\n return new DocumentMetadataAssembler();\n }\n\n private _createPathsAssembler(\n assemblerFactory: PathAssemblerFactory = new PathAssemblerFactory(),\n contextFactory: PathContextFactory = new PathContextFactory()\n ) {\n const assemblers = assemblerFactory.createAll();\n\n return new DocumentPathsAssembler(assemblers, contextFactory);\n }\n}\n"],"names":["DocumentAssemblerFactory","createAll","_createMetadataAssembler","_createInfoAssembler","_createPathsAssembler","DocumentInfoAssembler","DocumentMetadataAssembler","assemblerFactory","PathAssemblerFactory","contextFactory","PathContextFactory","assemblers","DocumentPathsAssembler"],"mappings":"
|
|
1
|
+
{"version":3,"file":"factory.mjs","sources":["../../../src/assemblers/document/factory.ts"],"sourcesContent":["import { PathContextFactory } from '../../context';\n\nimport type { Assembler } from '..';\n\nimport { DocumentInfoAssembler } from './info';\nimport { DocumentMetadataAssembler } from './metadata';\nimport { DocumentPathsAssembler, PathAssemblerFactory } from './path';\nimport { DocumentSecurityAssembler } from './security';\nimport { DocumentServerAssembler } from './server';\n\nexport class DocumentAssemblerFactory {\n createAll(): Assembler.Document[] {\n return [\n this._createMetadataAssembler(),\n this._createInfoAssembler(),\n this._createServerAssembler(),\n this._createSecurityAssembler(),\n this._createPathsAssembler(),\n ];\n }\n\n private _createInfoAssembler() {\n return new DocumentInfoAssembler();\n }\n\n private _createMetadataAssembler() {\n return new DocumentMetadataAssembler();\n }\n\n private _createSecurityAssembler() {\n return new DocumentSecurityAssembler();\n }\n\n private _createServerAssembler() {\n return new DocumentServerAssembler();\n }\n\n private _createPathsAssembler(\n assemblerFactory: PathAssemblerFactory = new PathAssemblerFactory(),\n contextFactory: PathContextFactory = new PathContextFactory()\n ) {\n const assemblers = assemblerFactory.createAll();\n\n return new DocumentPathsAssembler(assemblers, contextFactory);\n }\n}\n"],"names":["DocumentAssemblerFactory","createAll","_createMetadataAssembler","_createInfoAssembler","_createServerAssembler","_createSecurityAssembler","_createPathsAssembler","DocumentInfoAssembler","DocumentMetadataAssembler","DocumentSecurityAssembler","DocumentServerAssembler","assemblerFactory","PathAssemblerFactory","contextFactory","PathContextFactory","assemblers","DocumentPathsAssembler"],"mappings":";;;;;;;;;;;;;;;;AAUO,MAAMA,wBAAAA,CAAAA;IACXC,SAAAA,GAAkC;QAChC,OAAO;AACL,YAAA,IAAI,CAACC,wBAAwB,EAAA;AAC7B,YAAA,IAAI,CAACC,oBAAoB,EAAA;AACzB,YAAA,IAAI,CAACC,sBAAsB,EAAA;AAC3B,YAAA,IAAI,CAACC,wBAAwB,EAAA;AAC7B,YAAA,IAAI,CAACC,qBAAqB;AAC3B,SAAA;AACH,IAAA;IAEQH,oBAAAA,GAAuB;AAC7B,QAAA,OAAO,IAAII,qBAAAA,EAAAA;AACb,IAAA;IAEQL,wBAAAA,GAA2B;AACjC,QAAA,OAAO,IAAIM,yBAAAA,EAAAA;AACb,IAAA;IAEQH,wBAAAA,GAA2B;AACjC,QAAA,OAAO,IAAII,yBAAAA,EAAAA;AACb,IAAA;IAEQL,sBAAAA,GAAyB;AAC/B,QAAA,OAAO,IAAIM,uBAAAA,EAAAA;AACb,IAAA;AAEQJ,IAAAA,qBAAAA,CACNK,mBAAyC,IAAIC,oBAAAA,EAAsB,EACnEC,cAAAA,GAAqC,IAAIC,oBAAoB,EAC7D;QACA,MAAMC,UAAAA,GAAaJ,iBAAiBV,SAAS,EAAA;QAE7C,OAAO,IAAIe,uBAAuBD,UAAAA,EAAYF,cAAAA,CAAAA;AAChD,IAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body.d.ts","sourceRoot":"","sources":["../../../../../../src/assemblers/document/path/path-item/operation/body.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,qBAAa,aAAc,YAAW,SAAS,CAAC,SAAS;IACvD,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"body.d.ts","sourceRoot":"","sources":["../../../../../../src/assemblers/document/path/path-item/operation/body.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,qBAAa,aAAc,YAAW,SAAS,CAAC,SAAS;IACvD,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI;CAsB7D"}
|
|
@@ -12,9 +12,13 @@ class BodyAssembler {
|
|
|
12
12
|
return;
|
|
13
13
|
}
|
|
14
14
|
const content = {};
|
|
15
|
+
const schemaStore = context.strapi.contentAPISchemaRegistry;
|
|
16
|
+
const { extractedComponentSchemas } = context.registries;
|
|
15
17
|
for (const [media, zodSchema] of Object.entries(body)){
|
|
16
18
|
content[media] = {
|
|
17
|
-
schema: zod.zodToOpenAPI(zodSchema
|
|
19
|
+
schema: zod.zodToOpenAPI(zodSchema, schemaStore, {
|
|
20
|
+
extractedComponentSchemas
|
|
21
|
+
})
|
|
18
22
|
};
|
|
19
23
|
}
|
|
20
24
|
output.data.requestBody = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body.js","sources":["../../../../../../src/assemblers/document/path/path-item/operation/body.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { OpenAPIV3_1 } from 'openapi-types';\n\nimport type { OperationContext } from '../../../../../types';\nimport type { Assembler } from '../../../..';\n\nimport { zodToOpenAPI } from '../../../../../utils';\n\nexport class BodyAssembler implements Assembler.Operation {\n assemble(context: OperationContext, route: Core.Route): void {\n const { output } = context;\n const { body } = route.request ?? {};\n\n // If no `body` property is defined, we don't need to do anything\n if (!body) {\n return;\n }\n\n const content: Record<string, OpenAPIV3_1.MediaTypeObject> = {};\n\n for (const [media, zodSchema] of Object.entries(body)) {\n content[media] = {\n schema: zodToOpenAPI(zodSchema) as any,\n };\n }\n\n output.data.requestBody = { content };\n }\n}\n"],"names":["BodyAssembler","assemble","context","route","output","body","request","content","media","zodSchema","Object","entries","schema","zodToOpenAPI","data","requestBody"],"mappings":";;;;;AAQO,MAAMA,aAAAA,CAAAA;IACXC,QAAAA,CAASC,OAAyB,EAAEC,KAAiB,EAAQ;QAC3D,MAAM,EAAEC,MAAM,EAAE,GAAGF,OAAAA;AACnB,QAAA,MAAM,EAAEG,IAAI,EAAE,GAAGF,KAAAA,CAAMG,OAAO,IAAI,EAAC;;AAGnC,QAAA,IAAI,CAACD,IAAAA,EAAM;AACT,YAAA;AACF,QAAA;AAEA,QAAA,MAAME,UAAuD,EAAC;
|
|
1
|
+
{"version":3,"file":"body.js","sources":["../../../../../../src/assemblers/document/path/path-item/operation/body.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { OpenAPIV3_1 } from 'openapi-types';\n\nimport type { OperationContext } from '../../../../../types';\nimport type { Assembler } from '../../../..';\n\nimport { zodToOpenAPI } from '../../../../../utils';\n\nexport class BodyAssembler implements Assembler.Operation {\n assemble(context: OperationContext, route: Core.Route): void {\n const { output } = context;\n const { body } = route.request ?? {};\n\n // If no `body` property is defined, we don't need to do anything\n if (!body) {\n return;\n }\n\n const content: Record<string, OpenAPIV3_1.MediaTypeObject> = {};\n\n const schemaStore = context.strapi.contentAPISchemaRegistry;\n const { extractedComponentSchemas } = context.registries;\n\n for (const [media, zodSchema] of Object.entries(body)) {\n content[media] = {\n schema: zodToOpenAPI(zodSchema, schemaStore, { extractedComponentSchemas }) as any,\n };\n }\n\n output.data.requestBody = { content };\n }\n}\n"],"names":["BodyAssembler","assemble","context","route","output","body","request","content","schemaStore","strapi","contentAPISchemaRegistry","extractedComponentSchemas","registries","media","zodSchema","Object","entries","schema","zodToOpenAPI","data","requestBody"],"mappings":";;;;;AAQO,MAAMA,aAAAA,CAAAA;IACXC,QAAAA,CAASC,OAAyB,EAAEC,KAAiB,EAAQ;QAC3D,MAAM,EAAEC,MAAM,EAAE,GAAGF,OAAAA;AACnB,QAAA,MAAM,EAAEG,IAAI,EAAE,GAAGF,KAAAA,CAAMG,OAAO,IAAI,EAAC;;AAGnC,QAAA,IAAI,CAACD,IAAAA,EAAM;AACT,YAAA;AACF,QAAA;AAEA,QAAA,MAAME,UAAuD,EAAC;AAE9D,QAAA,MAAMC,WAAAA,GAAcN,OAAAA,CAAQO,MAAM,CAACC,wBAAwB;AAC3D,QAAA,MAAM,EAAEC,yBAAyB,EAAE,GAAGT,QAAQU,UAAU;QAExD,KAAK,MAAM,CAACC,KAAAA,EAAOC,SAAAA,CAAU,IAAIC,MAAAA,CAAOC,OAAO,CAACX,IAAAA,CAAAA,CAAO;YACrDE,OAAO,CAACM,MAAM,GAAG;gBACfI,MAAAA,EAAQC,gBAAAA,CAAaJ,WAAWN,WAAAA,EAAa;AAAEG,oBAAAA;AAA0B,iBAAA;AAC3E,aAAA;AACF,QAAA;QAEAP,MAAAA,CAAOe,IAAI,CAACC,WAAW,GAAG;AAAEb,YAAAA;AAAQ,SAAA;AACtC,IAAA;AACF;;;;"}
|
|
@@ -10,9 +10,13 @@ class BodyAssembler {
|
|
|
10
10
|
return;
|
|
11
11
|
}
|
|
12
12
|
const content = {};
|
|
13
|
+
const schemaStore = context.strapi.contentAPISchemaRegistry;
|
|
14
|
+
const { extractedComponentSchemas } = context.registries;
|
|
13
15
|
for (const [media, zodSchema] of Object.entries(body)){
|
|
14
16
|
content[media] = {
|
|
15
|
-
schema: zodToOpenAPI(zodSchema
|
|
17
|
+
schema: zodToOpenAPI(zodSchema, schemaStore, {
|
|
18
|
+
extractedComponentSchemas
|
|
19
|
+
})
|
|
16
20
|
};
|
|
17
21
|
}
|
|
18
22
|
output.data.requestBody = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body.mjs","sources":["../../../../../../src/assemblers/document/path/path-item/operation/body.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { OpenAPIV3_1 } from 'openapi-types';\n\nimport type { OperationContext } from '../../../../../types';\nimport type { Assembler } from '../../../..';\n\nimport { zodToOpenAPI } from '../../../../../utils';\n\nexport class BodyAssembler implements Assembler.Operation {\n assemble(context: OperationContext, route: Core.Route): void {\n const { output } = context;\n const { body } = route.request ?? {};\n\n // If no `body` property is defined, we don't need to do anything\n if (!body) {\n return;\n }\n\n const content: Record<string, OpenAPIV3_1.MediaTypeObject> = {};\n\n for (const [media, zodSchema] of Object.entries(body)) {\n content[media] = {\n schema: zodToOpenAPI(zodSchema) as any,\n };\n }\n\n output.data.requestBody = { content };\n }\n}\n"],"names":["BodyAssembler","assemble","context","route","output","body","request","content","media","zodSchema","Object","entries","schema","zodToOpenAPI","data","requestBody"],"mappings":";;;AAQO,MAAMA,aAAAA,CAAAA;IACXC,QAAAA,CAASC,OAAyB,EAAEC,KAAiB,EAAQ;QAC3D,MAAM,EAAEC,MAAM,EAAE,GAAGF,OAAAA;AACnB,QAAA,MAAM,EAAEG,IAAI,EAAE,GAAGF,KAAAA,CAAMG,OAAO,IAAI,EAAC;;AAGnC,QAAA,IAAI,CAACD,IAAAA,EAAM;AACT,YAAA;AACF,QAAA;AAEA,QAAA,MAAME,UAAuD,EAAC;
|
|
1
|
+
{"version":3,"file":"body.mjs","sources":["../../../../../../src/assemblers/document/path/path-item/operation/body.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { OpenAPIV3_1 } from 'openapi-types';\n\nimport type { OperationContext } from '../../../../../types';\nimport type { Assembler } from '../../../..';\n\nimport { zodToOpenAPI } from '../../../../../utils';\n\nexport class BodyAssembler implements Assembler.Operation {\n assemble(context: OperationContext, route: Core.Route): void {\n const { output } = context;\n const { body } = route.request ?? {};\n\n // If no `body` property is defined, we don't need to do anything\n if (!body) {\n return;\n }\n\n const content: Record<string, OpenAPIV3_1.MediaTypeObject> = {};\n\n const schemaStore = context.strapi.contentAPISchemaRegistry;\n const { extractedComponentSchemas } = context.registries;\n\n for (const [media, zodSchema] of Object.entries(body)) {\n content[media] = {\n schema: zodToOpenAPI(zodSchema, schemaStore, { extractedComponentSchemas }) as any,\n };\n }\n\n output.data.requestBody = { content };\n }\n}\n"],"names":["BodyAssembler","assemble","context","route","output","body","request","content","schemaStore","strapi","contentAPISchemaRegistry","extractedComponentSchemas","registries","media","zodSchema","Object","entries","schema","zodToOpenAPI","data","requestBody"],"mappings":";;;AAQO,MAAMA,aAAAA,CAAAA;IACXC,QAAAA,CAASC,OAAyB,EAAEC,KAAiB,EAAQ;QAC3D,MAAM,EAAEC,MAAM,EAAE,GAAGF,OAAAA;AACnB,QAAA,MAAM,EAAEG,IAAI,EAAE,GAAGF,KAAAA,CAAMG,OAAO,IAAI,EAAC;;AAGnC,QAAA,IAAI,CAACD,IAAAA,EAAM;AACT,YAAA;AACF,QAAA;AAEA,QAAA,MAAME,UAAuD,EAAC;AAE9D,QAAA,MAAMC,WAAAA,GAAcN,OAAAA,CAAQO,MAAM,CAACC,wBAAwB;AAC3D,QAAA,MAAM,EAAEC,yBAAyB,EAAE,GAAGT,QAAQU,UAAU;QAExD,KAAK,MAAM,CAACC,KAAAA,EAAOC,SAAAA,CAAU,IAAIC,MAAAA,CAAOC,OAAO,CAACX,IAAAA,CAAAA,CAAO;YACrDE,OAAO,CAACM,MAAM,GAAG;gBACfI,MAAAA,EAAQC,YAAAA,CAAaJ,WAAWN,WAAAA,EAAa;AAAEG,oBAAAA;AAA0B,iBAAA;AAC3E,aAAA;AACF,QAAA;QAEAP,MAAAA,CAAOe,IAAI,CAACC,WAAW,GAAG;AAAEb,YAAAA;AAAQ,SAAA;AACtC,IAAA;AACF;;;;"}
|
|
@@ -5,5 +5,11 @@ export declare class OperationParametersAssembler implements Assembler.Operation
|
|
|
5
5
|
assemble(context: OperationContext, route: Core.Route): void;
|
|
6
6
|
private _getPathParameters;
|
|
7
7
|
private _getQueryParameters;
|
|
8
|
+
/**
|
|
9
|
+
* Resolve composite OpenAPI schemas (allOf/anyOf/oneOf) into a flat object shape
|
|
10
|
+
* so nested Strapi query params can be emitted as bracket notation (e.g. pagination[page]).
|
|
11
|
+
*/
|
|
12
|
+
private _resolveSchema;
|
|
13
|
+
private _extractCommonProperties;
|
|
8
14
|
}
|
|
9
15
|
//# sourceMappingURL=parameters.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parameters.d.ts","sourceRoot":"","sources":["../../../../../../src/assemblers/document/path/path-item/operation/parameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"parameters.d.ts","sourceRoot":"","sources":["../../../../../../src/assemblers/document/path/path-item/operation/parameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAY7D,qBAAa,4BAA6B,YAAW,SAAS,CAAC,SAAS;IACtE,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI;IAiB5D,OAAO,CAAC,kBAAkB;IA0B1B,OAAO,CAAC,mBAAmB;IAyD3B;;;OAGG;IACH,OAAO,CAAC,cAAc;IA2CtB,OAAO,CAAC,wBAAwB;CAqCjC"}
|
|
@@ -2,14 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
var debug$1 = require('../../../../../utils/debug.js');
|
|
4
4
|
var zod = require('../../../../../utils/zod.js');
|
|
5
|
+
var queryParamStyles = require('../../../query-param-styles.js');
|
|
5
6
|
|
|
6
7
|
const debug = debug$1.createDebugger('assembler:parameters');
|
|
7
8
|
class OperationParametersAssembler {
|
|
8
9
|
assemble(context, route) {
|
|
9
10
|
debug('assembling parameters for %o %o...', route.method, route.path);
|
|
10
|
-
const
|
|
11
|
+
const schemaStore = context.strapi.contentAPISchemaRegistry;
|
|
12
|
+
const { extractedComponentSchemas } = context.registries;
|
|
13
|
+
const pathParameters = this._getPathParameters(route, schemaStore, extractedComponentSchemas);
|
|
11
14
|
debug('found %o path parameters', pathParameters.length);
|
|
12
|
-
const queryParameters = this._getQueryParameters(route);
|
|
15
|
+
const queryParameters = this._getQueryParameters(route, schemaStore, extractedComponentSchemas);
|
|
13
16
|
debug('found %o query parameters', queryParameters.length);
|
|
14
17
|
const parameters = [
|
|
15
18
|
...pathParameters,
|
|
@@ -18,7 +21,7 @@ class OperationParametersAssembler {
|
|
|
18
21
|
debug('assembled %o parameters for %o %o', parameters.length, route.method, route.path);
|
|
19
22
|
context.output.data.parameters = parameters;
|
|
20
23
|
}
|
|
21
|
-
_getPathParameters(route) {
|
|
24
|
+
_getPathParameters(route, schemaStore, extractedComponentSchemas) {
|
|
22
25
|
const { params } = route.request ?? {};
|
|
23
26
|
// TODO: Allow auto inference (from path) if enabled through configuration
|
|
24
27
|
if (!params) {
|
|
@@ -27,7 +30,9 @@ class OperationParametersAssembler {
|
|
|
27
30
|
const pathParams = [];
|
|
28
31
|
for (const [name, zodSchema] of Object.entries(params)){
|
|
29
32
|
const required = !zodSchema.isOptional();
|
|
30
|
-
const schema = zod.zodToOpenAPI(zodSchema
|
|
33
|
+
const schema = zod.zodToOpenAPI(zodSchema, schemaStore, {
|
|
34
|
+
extractedComponentSchemas
|
|
35
|
+
});
|
|
31
36
|
pathParams.push({
|
|
32
37
|
name,
|
|
33
38
|
in: 'path',
|
|
@@ -37,7 +42,7 @@ class OperationParametersAssembler {
|
|
|
37
42
|
}
|
|
38
43
|
return pathParams;
|
|
39
44
|
}
|
|
40
|
-
_getQueryParameters(route) {
|
|
45
|
+
_getQueryParameters(route, schemaStore, extractedComponentSchemas) {
|
|
41
46
|
const { query } = route.request ?? {};
|
|
42
47
|
if (!query) {
|
|
43
48
|
return [];
|
|
@@ -45,22 +50,115 @@ class OperationParametersAssembler {
|
|
|
45
50
|
const queryParams = [];
|
|
46
51
|
for (const [name, zodSchema] of Object.entries(query)){
|
|
47
52
|
const required = !zodSchema.isOptional();
|
|
48
|
-
const schema = zod.zodToOpenAPI(zodSchema
|
|
49
|
-
|
|
50
|
-
name,
|
|
51
|
-
in: 'query',
|
|
52
|
-
required,
|
|
53
|
-
schema
|
|
54
|
-
};
|
|
55
|
-
// In Strapi, query params are always interpreted as query strings, which isn't supported by the specification
|
|
56
|
-
// TODO: Make that configurable somehow
|
|
57
|
-
Object.assign(param, {
|
|
58
|
-
'x-strapi-serialize': 'querystring'
|
|
53
|
+
const schema = zod.zodToOpenAPI(zodSchema, schemaStore, {
|
|
54
|
+
extractedComponentSchemas
|
|
59
55
|
});
|
|
60
|
-
|
|
56
|
+
const resolvedSchema = this._resolveSchema(schema);
|
|
57
|
+
if (queryParamStyles.hasExpandableObjectProperties(resolvedSchema)) {
|
|
58
|
+
for (const [propName, propSchema] of Object.entries(resolvedSchema.properties)){
|
|
59
|
+
const isRequired = resolvedSchema.required?.includes(propName) ?? false;
|
|
60
|
+
const param = {
|
|
61
|
+
name: `${name}[${propName}]`,
|
|
62
|
+
in: 'query',
|
|
63
|
+
required: isRequired,
|
|
64
|
+
schema: propSchema
|
|
65
|
+
};
|
|
66
|
+
Object.assign(param, {
|
|
67
|
+
'x-strapi-serialize': 'querystring'
|
|
68
|
+
});
|
|
69
|
+
queryParams.push(param);
|
|
70
|
+
}
|
|
71
|
+
} else if (queryParamStyles.shouldUseDeepObjectStyle(name, resolvedSchema)) {
|
|
72
|
+
const param = {
|
|
73
|
+
name,
|
|
74
|
+
in: 'query',
|
|
75
|
+
required,
|
|
76
|
+
schema: resolvedSchema,
|
|
77
|
+
style: 'deepObject',
|
|
78
|
+
explode: true
|
|
79
|
+
};
|
|
80
|
+
Object.assign(param, {
|
|
81
|
+
'x-strapi-serialize': 'querystring'
|
|
82
|
+
});
|
|
83
|
+
queryParams.push(param);
|
|
84
|
+
} else {
|
|
85
|
+
const param = {
|
|
86
|
+
name,
|
|
87
|
+
in: 'query',
|
|
88
|
+
required,
|
|
89
|
+
schema
|
|
90
|
+
};
|
|
91
|
+
Object.assign(param, {
|
|
92
|
+
'x-strapi-serialize': 'querystring'
|
|
93
|
+
});
|
|
94
|
+
queryParams.push(param);
|
|
95
|
+
}
|
|
61
96
|
}
|
|
62
97
|
return queryParams;
|
|
63
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* Resolve composite OpenAPI schemas (allOf/anyOf/oneOf) into a flat object shape
|
|
101
|
+
* so nested Strapi query params can be emitted as bracket notation (e.g. pagination[page]).
|
|
102
|
+
*/ _resolveSchema(schema) {
|
|
103
|
+
if (schema.type === 'object' && schema.properties) {
|
|
104
|
+
return schema;
|
|
105
|
+
}
|
|
106
|
+
if (schema.allOf && Array.isArray(schema.allOf)) {
|
|
107
|
+
const mergedSchema = {
|
|
108
|
+
type: 'object',
|
|
109
|
+
properties: {},
|
|
110
|
+
required: []
|
|
111
|
+
};
|
|
112
|
+
for (const subSchema of schema.allOf){
|
|
113
|
+
if (!('$ref' in subSchema)) {
|
|
114
|
+
const hasAnyOfOneOf = Boolean(subSchema.anyOf || subSchema.oneOf);
|
|
115
|
+
const resolved = this._resolveSchema(subSchema);
|
|
116
|
+
if (resolved.type === 'object' && resolved.properties) {
|
|
117
|
+
Object.assign(mergedSchema.properties, resolved.properties);
|
|
118
|
+
if (resolved.required && !hasAnyOfOneOf) {
|
|
119
|
+
mergedSchema.required = [
|
|
120
|
+
...mergedSchema.required ?? [],
|
|
121
|
+
...resolved.required
|
|
122
|
+
];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return queryParamStyles.hasExpandableObjectProperties(mergedSchema) ? mergedSchema : schema;
|
|
128
|
+
}
|
|
129
|
+
if (schema.anyOf && Array.isArray(schema.anyOf)) {
|
|
130
|
+
return this._extractCommonProperties(schema.anyOf, false);
|
|
131
|
+
}
|
|
132
|
+
if (schema.oneOf && Array.isArray(schema.oneOf)) {
|
|
133
|
+
return this._extractCommonProperties(schema.oneOf, false);
|
|
134
|
+
}
|
|
135
|
+
return schema;
|
|
136
|
+
}
|
|
137
|
+
_extractCommonProperties(schemas, preserveRequired = true) {
|
|
138
|
+
const objectSchemas = schemas.filter((s)=>!('$ref' in s)).map((s)=>this._resolveSchema(s)).filter((s)=>s.type === 'object' && s.properties);
|
|
139
|
+
if (objectSchemas.length === 0) {
|
|
140
|
+
return schemas[0];
|
|
141
|
+
}
|
|
142
|
+
const allProperties = {};
|
|
143
|
+
let allRequired = [];
|
|
144
|
+
for (const objSchema of objectSchemas){
|
|
145
|
+
Object.assign(allProperties, objSchema.properties);
|
|
146
|
+
if (preserveRequired && objSchema.required) {
|
|
147
|
+
allRequired.push(...objSchema.required);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (!preserveRequired) {
|
|
151
|
+
allRequired = [];
|
|
152
|
+
}
|
|
153
|
+
if (Object.keys(allProperties).length === 0) {
|
|
154
|
+
return schemas[0];
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
type: 'object',
|
|
158
|
+
properties: allProperties,
|
|
159
|
+
required: allRequired
|
|
160
|
+
};
|
|
161
|
+
}
|
|
64
162
|
}
|
|
65
163
|
|
|
66
164
|
exports.OperationParametersAssembler = OperationParametersAssembler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parameters.js","sources":["../../../../../../src/assemblers/document/path/path-item/operation/parameters.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { OpenAPIV3_1 } from 'openapi-types';\nimport type { Assembler } from '../../../..';\n\nimport type { OperationContext } from '../../../../../types';\nimport { createDebugger, zodToOpenAPI } from '../../../../../utils';\n\nconst debug = createDebugger('assembler:parameters');\n\ntype PathParameterObject = OpenAPIV3_1.ParameterObject & { in: 'path' };\ntype QueryParameterObject = OpenAPIV3_1.ParameterObject & { in: 'query' };\n\nexport class OperationParametersAssembler implements Assembler.Operation {\n assemble(context: OperationContext, route: Core.Route): void {\n debug('assembling parameters for %o %o...', route.method, route.path);\n\n const pathParameters = this._getPathParameters(route);\n debug('found %o path parameters', pathParameters.length);\n\n const queryParameters = this._getQueryParameters(route);\n debug('found %o query parameters', queryParameters.length);\n\n const parameters = [...pathParameters, ...queryParameters];\n debug('assembled %o parameters for %o %o', parameters.length, route.method, route.path);\n\n context.output.data.parameters = parameters;\n }\n\n private _getPathParameters(route: Core.Route): PathParameterObject[] {\n const { params } = route.request ?? {};\n\n // TODO: Allow auto inference (from path) if enabled through configuration\n if (!params) {\n return [];\n }\n\n const pathParams: PathParameterObject[] = [];\n\n for (const [name, zodSchema] of Object.entries(params)) {\n const required = !zodSchema.isOptional();\n const schema = zodToOpenAPI(zodSchema) as any;\n\n pathParams.push({ name, in: 'path', required, schema });\n }\n\n return pathParams;\n }\n\n private _getQueryParameters(route: Core.Route): QueryParameterObject[] {\n const { query } = route.request ?? {};\n\n if (!query) {\n return [];\n }\n\n const queryParams: QueryParameterObject[] = [];\n\n for (const [name, zodSchema] of Object.entries(query)) {\n const required = !zodSchema.isOptional();\n const schema = zodToOpenAPI(zodSchema) as any;\n const param: QueryParameterObject = { name, in: 'query', required, schema };\n\n // In Strapi, query params are always interpreted as query strings, which isn't supported by the specification\n // TODO: Make that configurable somehow\n Object.assign(param, { 'x-strapi-serialize': 'querystring' });\n\n queryParams.push(param);\n }\n\n return queryParams;\n }\n}\n"],"names":["debug","createDebugger","OperationParametersAssembler","assemble","context","route","method","path","pathParameters","_getPathParameters","length","queryParameters","_getQueryParameters","parameters","output","data","params","request","pathParams","name","zodSchema","Object","entries","required","isOptional","schema","zodToOpenAPI","push","in","query","queryParams","param","assign"],"mappings":";;;;;AAOA,MAAMA,QAAQC,sBAAAA,CAAe,sBAAA,CAAA;AAKtB,MAAMC,4BAAAA,CAAAA;IACXC,QAAAA,CAASC,OAAyB,EAAEC,KAAiB,EAAQ;AAC3DL,QAAAA,KAAAA,CAAM,oCAAA,EAAsCK,KAAAA,CAAMC,MAAM,EAAED,MAAME,IAAI,CAAA;AAEpE,QAAA,MAAMC,cAAAA,GAAiB,IAAI,CAACC,kBAAkB,CAACJ,KAAAA,CAAAA;QAC/CL,KAAAA,CAAM,0BAAA,EAA4BQ,eAAeE,MAAM,CAAA;AAEvD,QAAA,MAAMC,eAAAA,GAAkB,IAAI,CAACC,mBAAmB,CAACP,KAAAA,CAAAA;QACjDL,KAAAA,CAAM,2BAAA,EAA6BW,gBAAgBD,MAAM,CAAA;AAEzD,QAAA,MAAMG,UAAAA,GAAa;AAAIL,YAAAA,GAAAA,cAAAA;AAAmBG,YAAAA,GAAAA;AAAgB,SAAA;QAC1DX,KAAAA,CAAM,mCAAA,EAAqCa,WAAWH,MAAM,EAAEL,MAAMC,MAAM,EAAED,MAAME,IAAI,CAAA;AAEtFH,QAAAA,OAAAA,CAAQU,MAAM,CAACC,IAAI,CAACF,UAAU,GAAGA,UAAAA;AACnC,IAAA;AAEQJ,IAAAA,kBAAAA,CAAmBJ,KAAiB,EAAyB;AACnE,QAAA,MAAM,EAAEW,MAAM,EAAE,GAAGX,KAAAA,CAAMY,OAAO,IAAI,EAAC;;AAGrC,QAAA,IAAI,CAACD,MAAAA,EAAQ;AACX,YAAA,OAAO,EAAE;AACX,QAAA;AAEA,QAAA,MAAME,aAAoC,EAAE;QAE5C,KAAK,MAAM,CAACC,IAAAA,EAAMC,SAAAA,CAAU,IAAIC,MAAAA,CAAOC,OAAO,CAACN,MAAAA,CAAAA,CAAS;YACtD,MAAMO,QAAAA,GAAW,CAACH,SAAAA,CAAUI,UAAU,EAAA;AACtC,YAAA,MAAMC,SAASC,gBAAAA,CAAaN,SAAAA,CAAAA;AAE5BF,YAAAA,UAAAA,CAAWS,IAAI,CAAC;AAAER,gBAAAA,IAAAA;gBAAMS,EAAAA,EAAI,MAAA;AAAQL,gBAAAA,QAAAA;AAAUE,gBAAAA;AAAO,aAAA,CAAA;AACvD,QAAA;QAEA,OAAOP,UAAAA;AACT,IAAA;AAEQN,IAAAA,mBAAAA,CAAoBP,KAAiB,EAA0B;AACrE,QAAA,MAAM,EAAEwB,KAAK,EAAE,GAAGxB,KAAAA,CAAMY,OAAO,IAAI,EAAC;AAEpC,QAAA,IAAI,CAACY,KAAAA,EAAO;AACV,YAAA,OAAO,EAAE;AACX,QAAA;AAEA,QAAA,MAAMC,cAAsC,EAAE;QAE9C,KAAK,MAAM,CAACX,IAAAA,EAAMC,SAAAA,CAAU,IAAIC,MAAAA,CAAOC,OAAO,CAACO,KAAAA,CAAAA,CAAQ;YACrD,MAAMN,QAAAA,GAAW,CAACH,SAAAA,CAAUI,UAAU,EAAA;AACtC,YAAA,MAAMC,SAASC,gBAAAA,CAAaN,SAAAA,CAAAA;AAC5B,YAAA,MAAMW,KAAAA,GAA8B;AAAEZ,gBAAAA,IAAAA;gBAAMS,EAAAA,EAAI,OAAA;AAASL,gBAAAA,QAAAA;AAAUE,gBAAAA;AAAO,aAAA;;;YAI1EJ,MAAAA,CAAOW,MAAM,CAACD,KAAAA,EAAO;gBAAE,oBAAA,EAAsB;AAAc,aAAA,CAAA;AAE3DD,YAAAA,WAAAA,CAAYH,IAAI,CAACI,KAAAA,CAAAA;AACnB,QAAA;QAEA,OAAOD,WAAAA;AACT,IAAA;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"parameters.js","sources":["../../../../../../src/assemblers/document/path/path-item/operation/parameters.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { OpenAPIV3_1 } from 'openapi-types';\nimport type { Assembler } from '../../../..';\n\nimport type { OperationContext } from '../../../../../types';\nimport { createDebugger, zodToOpenAPI } from '../../../../../utils';\nimport {\n hasExpandableObjectProperties,\n shouldUseDeepObjectStyle,\n} from '../../../query-param-styles';\n\nconst debug = createDebugger('assembler:parameters');\n\ntype PathParameterObject = OpenAPIV3_1.ParameterObject & { in: 'path' };\ntype QueryParameterObject = OpenAPIV3_1.ParameterObject & { in: 'query' };\n\nexport class OperationParametersAssembler implements Assembler.Operation {\n assemble(context: OperationContext, route: Core.Route): void {\n debug('assembling parameters for %o %o...', route.method, route.path);\n\n const schemaStore = context.strapi.contentAPISchemaRegistry;\n const { extractedComponentSchemas } = context.registries;\n const pathParameters = this._getPathParameters(route, schemaStore, extractedComponentSchemas);\n debug('found %o path parameters', pathParameters.length);\n\n const queryParameters = this._getQueryParameters(route, schemaStore, extractedComponentSchemas);\n debug('found %o query parameters', queryParameters.length);\n\n const parameters = [...pathParameters, ...queryParameters];\n debug('assembled %o parameters for %o %o', parameters.length, route.method, route.path);\n\n context.output.data.parameters = parameters;\n }\n\n private _getPathParameters(\n route: Core.Route,\n schemaStore: Core.ContentAPISchemaRegistry,\n extractedComponentSchemas: Record<string, OpenAPIV3_1.SchemaObject>\n ): PathParameterObject[] {\n const { params } = route.request ?? {};\n\n // TODO: Allow auto inference (from path) if enabled through configuration\n if (!params) {\n return [];\n }\n\n const pathParams: PathParameterObject[] = [];\n\n for (const [name, zodSchema] of Object.entries(params)) {\n const required = !zodSchema.isOptional();\n const schema = zodToOpenAPI(zodSchema, schemaStore, {\n extractedComponentSchemas,\n }) as any;\n\n pathParams.push({ name, in: 'path', required, schema });\n }\n\n return pathParams;\n }\n\n private _getQueryParameters(\n route: Core.Route,\n schemaStore: Core.ContentAPISchemaRegistry,\n extractedComponentSchemas: Record<string, OpenAPIV3_1.SchemaObject>\n ): QueryParameterObject[] {\n const { query } = route.request ?? {};\n\n if (!query) {\n return [];\n }\n\n const queryParams: QueryParameterObject[] = [];\n\n for (const [name, zodSchema] of Object.entries(query)) {\n const required = !zodSchema.isOptional();\n const schema = zodToOpenAPI(zodSchema, schemaStore, {\n extractedComponentSchemas,\n }) as any;\n\n const resolvedSchema = this._resolveSchema(schema);\n\n if (hasExpandableObjectProperties(resolvedSchema)) {\n for (const [propName, propSchema] of Object.entries(resolvedSchema.properties!)) {\n const isRequired = resolvedSchema.required?.includes(propName) ?? false;\n\n const param: QueryParameterObject = {\n name: `${name}[${propName}]`,\n in: 'query',\n required: isRequired,\n schema: propSchema as any,\n };\n\n Object.assign(param, { 'x-strapi-serialize': 'querystring' });\n queryParams.push(param);\n }\n } else if (shouldUseDeepObjectStyle(name, resolvedSchema)) {\n const param: QueryParameterObject = {\n name,\n in: 'query',\n required,\n schema: resolvedSchema as any,\n style: 'deepObject',\n explode: true,\n };\n\n Object.assign(param, { 'x-strapi-serialize': 'querystring' });\n queryParams.push(param);\n } else {\n const param: QueryParameterObject = { name, in: 'query', required, schema };\n Object.assign(param, { 'x-strapi-serialize': 'querystring' });\n queryParams.push(param);\n }\n }\n\n return queryParams;\n }\n\n /**\n * Resolve composite OpenAPI schemas (allOf/anyOf/oneOf) into a flat object shape\n * so nested Strapi query params can be emitted as bracket notation (e.g. pagination[page]).\n */\n private _resolveSchema(schema: OpenAPIV3_1.SchemaObject): OpenAPIV3_1.SchemaObject {\n if (schema.type === 'object' && schema.properties) {\n return schema;\n }\n\n if (schema.allOf && Array.isArray(schema.allOf)) {\n const mergedSchema: OpenAPIV3_1.SchemaObject = {\n type: 'object',\n properties: {},\n required: [],\n };\n\n for (const subSchema of schema.allOf) {\n if (!('$ref' in subSchema)) {\n const hasAnyOfOneOf = Boolean(subSchema.anyOf || subSchema.oneOf);\n const resolved = this._resolveSchema(subSchema);\n\n if (resolved.type === 'object' && resolved.properties) {\n Object.assign(mergedSchema.properties!, resolved.properties);\n if (resolved.required && !hasAnyOfOneOf) {\n mergedSchema.required = [\n ...(mergedSchema.required ?? []),\n ...(resolved.required as string[]),\n ];\n }\n }\n }\n }\n\n return hasExpandableObjectProperties(mergedSchema) ? mergedSchema : schema;\n }\n\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n return this._extractCommonProperties(schema.anyOf, false);\n }\n\n if (schema.oneOf && Array.isArray(schema.oneOf)) {\n return this._extractCommonProperties(schema.oneOf, false);\n }\n\n return schema;\n }\n\n private _extractCommonProperties(\n schemas: OpenAPIV3_1.SchemaObject[],\n preserveRequired = true\n ): OpenAPIV3_1.SchemaObject {\n const objectSchemas = schemas\n .filter((s): s is OpenAPIV3_1.SchemaObject => !('$ref' in s))\n .map((s) => this._resolveSchema(s))\n .filter((s) => s.type === 'object' && s.properties);\n\n if (objectSchemas.length === 0) {\n return schemas[0] as OpenAPIV3_1.SchemaObject;\n }\n\n const allProperties: Record<string, OpenAPIV3_1.SchemaObject> = {};\n let allRequired: string[] = [];\n\n for (const objSchema of objectSchemas) {\n Object.assign(allProperties, objSchema.properties);\n if (preserveRequired && objSchema.required) {\n allRequired.push(...(objSchema.required as string[]));\n }\n }\n\n if (!preserveRequired) {\n allRequired = [];\n }\n\n if (Object.keys(allProperties).length === 0) {\n return schemas[0] as OpenAPIV3_1.SchemaObject;\n }\n\n return {\n type: 'object',\n properties: allProperties,\n required: allRequired,\n };\n }\n}\n"],"names":["debug","createDebugger","OperationParametersAssembler","assemble","context","route","method","path","schemaStore","strapi","contentAPISchemaRegistry","extractedComponentSchemas","registries","pathParameters","_getPathParameters","length","queryParameters","_getQueryParameters","parameters","output","data","params","request","pathParams","name","zodSchema","Object","entries","required","isOptional","schema","zodToOpenAPI","push","in","query","queryParams","resolvedSchema","_resolveSchema","hasExpandableObjectProperties","propName","propSchema","properties","isRequired","includes","param","assign","shouldUseDeepObjectStyle","style","explode","type","allOf","Array","isArray","mergedSchema","subSchema","hasAnyOfOneOf","Boolean","anyOf","oneOf","resolved","_extractCommonProperties","schemas","preserveRequired","objectSchemas","filter","s","map","allProperties","allRequired","objSchema","keys"],"mappings":"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"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { createDebugger } from '../../../../../utils/debug.mjs';
|
|
2
2
|
import { zodToOpenAPI } from '../../../../../utils/zod.mjs';
|
|
3
|
+
import { hasExpandableObjectProperties, shouldUseDeepObjectStyle } from '../../../query-param-styles.mjs';
|
|
3
4
|
|
|
4
5
|
const debug = createDebugger('assembler:parameters');
|
|
5
6
|
class OperationParametersAssembler {
|
|
6
7
|
assemble(context, route) {
|
|
7
8
|
debug('assembling parameters for %o %o...', route.method, route.path);
|
|
8
|
-
const
|
|
9
|
+
const schemaStore = context.strapi.contentAPISchemaRegistry;
|
|
10
|
+
const { extractedComponentSchemas } = context.registries;
|
|
11
|
+
const pathParameters = this._getPathParameters(route, schemaStore, extractedComponentSchemas);
|
|
9
12
|
debug('found %o path parameters', pathParameters.length);
|
|
10
|
-
const queryParameters = this._getQueryParameters(route);
|
|
13
|
+
const queryParameters = this._getQueryParameters(route, schemaStore, extractedComponentSchemas);
|
|
11
14
|
debug('found %o query parameters', queryParameters.length);
|
|
12
15
|
const parameters = [
|
|
13
16
|
...pathParameters,
|
|
@@ -16,7 +19,7 @@ class OperationParametersAssembler {
|
|
|
16
19
|
debug('assembled %o parameters for %o %o', parameters.length, route.method, route.path);
|
|
17
20
|
context.output.data.parameters = parameters;
|
|
18
21
|
}
|
|
19
|
-
_getPathParameters(route) {
|
|
22
|
+
_getPathParameters(route, schemaStore, extractedComponentSchemas) {
|
|
20
23
|
const { params } = route.request ?? {};
|
|
21
24
|
// TODO: Allow auto inference (from path) if enabled through configuration
|
|
22
25
|
if (!params) {
|
|
@@ -25,7 +28,9 @@ class OperationParametersAssembler {
|
|
|
25
28
|
const pathParams = [];
|
|
26
29
|
for (const [name, zodSchema] of Object.entries(params)){
|
|
27
30
|
const required = !zodSchema.isOptional();
|
|
28
|
-
const schema = zodToOpenAPI(zodSchema
|
|
31
|
+
const schema = zodToOpenAPI(zodSchema, schemaStore, {
|
|
32
|
+
extractedComponentSchemas
|
|
33
|
+
});
|
|
29
34
|
pathParams.push({
|
|
30
35
|
name,
|
|
31
36
|
in: 'path',
|
|
@@ -35,7 +40,7 @@ class OperationParametersAssembler {
|
|
|
35
40
|
}
|
|
36
41
|
return pathParams;
|
|
37
42
|
}
|
|
38
|
-
_getQueryParameters(route) {
|
|
43
|
+
_getQueryParameters(route, schemaStore, extractedComponentSchemas) {
|
|
39
44
|
const { query } = route.request ?? {};
|
|
40
45
|
if (!query) {
|
|
41
46
|
return [];
|
|
@@ -43,22 +48,115 @@ class OperationParametersAssembler {
|
|
|
43
48
|
const queryParams = [];
|
|
44
49
|
for (const [name, zodSchema] of Object.entries(query)){
|
|
45
50
|
const required = !zodSchema.isOptional();
|
|
46
|
-
const schema = zodToOpenAPI(zodSchema
|
|
47
|
-
|
|
48
|
-
name,
|
|
49
|
-
in: 'query',
|
|
50
|
-
required,
|
|
51
|
-
schema
|
|
52
|
-
};
|
|
53
|
-
// In Strapi, query params are always interpreted as query strings, which isn't supported by the specification
|
|
54
|
-
// TODO: Make that configurable somehow
|
|
55
|
-
Object.assign(param, {
|
|
56
|
-
'x-strapi-serialize': 'querystring'
|
|
51
|
+
const schema = zodToOpenAPI(zodSchema, schemaStore, {
|
|
52
|
+
extractedComponentSchemas
|
|
57
53
|
});
|
|
58
|
-
|
|
54
|
+
const resolvedSchema = this._resolveSchema(schema);
|
|
55
|
+
if (hasExpandableObjectProperties(resolvedSchema)) {
|
|
56
|
+
for (const [propName, propSchema] of Object.entries(resolvedSchema.properties)){
|
|
57
|
+
const isRequired = resolvedSchema.required?.includes(propName) ?? false;
|
|
58
|
+
const param = {
|
|
59
|
+
name: `${name}[${propName}]`,
|
|
60
|
+
in: 'query',
|
|
61
|
+
required: isRequired,
|
|
62
|
+
schema: propSchema
|
|
63
|
+
};
|
|
64
|
+
Object.assign(param, {
|
|
65
|
+
'x-strapi-serialize': 'querystring'
|
|
66
|
+
});
|
|
67
|
+
queryParams.push(param);
|
|
68
|
+
}
|
|
69
|
+
} else if (shouldUseDeepObjectStyle(name, resolvedSchema)) {
|
|
70
|
+
const param = {
|
|
71
|
+
name,
|
|
72
|
+
in: 'query',
|
|
73
|
+
required,
|
|
74
|
+
schema: resolvedSchema,
|
|
75
|
+
style: 'deepObject',
|
|
76
|
+
explode: true
|
|
77
|
+
};
|
|
78
|
+
Object.assign(param, {
|
|
79
|
+
'x-strapi-serialize': 'querystring'
|
|
80
|
+
});
|
|
81
|
+
queryParams.push(param);
|
|
82
|
+
} else {
|
|
83
|
+
const param = {
|
|
84
|
+
name,
|
|
85
|
+
in: 'query',
|
|
86
|
+
required,
|
|
87
|
+
schema
|
|
88
|
+
};
|
|
89
|
+
Object.assign(param, {
|
|
90
|
+
'x-strapi-serialize': 'querystring'
|
|
91
|
+
});
|
|
92
|
+
queryParams.push(param);
|
|
93
|
+
}
|
|
59
94
|
}
|
|
60
95
|
return queryParams;
|
|
61
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Resolve composite OpenAPI schemas (allOf/anyOf/oneOf) into a flat object shape
|
|
99
|
+
* so nested Strapi query params can be emitted as bracket notation (e.g. pagination[page]).
|
|
100
|
+
*/ _resolveSchema(schema) {
|
|
101
|
+
if (schema.type === 'object' && schema.properties) {
|
|
102
|
+
return schema;
|
|
103
|
+
}
|
|
104
|
+
if (schema.allOf && Array.isArray(schema.allOf)) {
|
|
105
|
+
const mergedSchema = {
|
|
106
|
+
type: 'object',
|
|
107
|
+
properties: {},
|
|
108
|
+
required: []
|
|
109
|
+
};
|
|
110
|
+
for (const subSchema of schema.allOf){
|
|
111
|
+
if (!('$ref' in subSchema)) {
|
|
112
|
+
const hasAnyOfOneOf = Boolean(subSchema.anyOf || subSchema.oneOf);
|
|
113
|
+
const resolved = this._resolveSchema(subSchema);
|
|
114
|
+
if (resolved.type === 'object' && resolved.properties) {
|
|
115
|
+
Object.assign(mergedSchema.properties, resolved.properties);
|
|
116
|
+
if (resolved.required && !hasAnyOfOneOf) {
|
|
117
|
+
mergedSchema.required = [
|
|
118
|
+
...mergedSchema.required ?? [],
|
|
119
|
+
...resolved.required
|
|
120
|
+
];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return hasExpandableObjectProperties(mergedSchema) ? mergedSchema : schema;
|
|
126
|
+
}
|
|
127
|
+
if (schema.anyOf && Array.isArray(schema.anyOf)) {
|
|
128
|
+
return this._extractCommonProperties(schema.anyOf, false);
|
|
129
|
+
}
|
|
130
|
+
if (schema.oneOf && Array.isArray(schema.oneOf)) {
|
|
131
|
+
return this._extractCommonProperties(schema.oneOf, false);
|
|
132
|
+
}
|
|
133
|
+
return schema;
|
|
134
|
+
}
|
|
135
|
+
_extractCommonProperties(schemas, preserveRequired = true) {
|
|
136
|
+
const objectSchemas = schemas.filter((s)=>!('$ref' in s)).map((s)=>this._resolveSchema(s)).filter((s)=>s.type === 'object' && s.properties);
|
|
137
|
+
if (objectSchemas.length === 0) {
|
|
138
|
+
return schemas[0];
|
|
139
|
+
}
|
|
140
|
+
const allProperties = {};
|
|
141
|
+
let allRequired = [];
|
|
142
|
+
for (const objSchema of objectSchemas){
|
|
143
|
+
Object.assign(allProperties, objSchema.properties);
|
|
144
|
+
if (preserveRequired && objSchema.required) {
|
|
145
|
+
allRequired.push(...objSchema.required);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (!preserveRequired) {
|
|
149
|
+
allRequired = [];
|
|
150
|
+
}
|
|
151
|
+
if (Object.keys(allProperties).length === 0) {
|
|
152
|
+
return schemas[0];
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
type: 'object',
|
|
156
|
+
properties: allProperties,
|
|
157
|
+
required: allRequired
|
|
158
|
+
};
|
|
159
|
+
}
|
|
62
160
|
}
|
|
63
161
|
|
|
64
162
|
export { OperationParametersAssembler };
|