@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.
Files changed (60) hide show
  1. package/dist/assemblers/document/factory.d.ts +2 -0
  2. package/dist/assemblers/document/factory.d.ts.map +1 -1
  3. package/dist/assemblers/document/factory.js +10 -0
  4. package/dist/assemblers/document/factory.js.map +1 -1
  5. package/dist/assemblers/document/factory.mjs +10 -0
  6. package/dist/assemblers/document/factory.mjs.map +1 -1
  7. package/dist/assemblers/document/path/path-item/operation/body.d.ts.map +1 -1
  8. package/dist/assemblers/document/path/path-item/operation/body.js +5 -1
  9. package/dist/assemblers/document/path/path-item/operation/body.js.map +1 -1
  10. package/dist/assemblers/document/path/path-item/operation/body.mjs +5 -1
  11. package/dist/assemblers/document/path/path-item/operation/body.mjs.map +1 -1
  12. package/dist/assemblers/document/path/path-item/operation/parameters.d.ts +6 -0
  13. package/dist/assemblers/document/path/path-item/operation/parameters.d.ts.map +1 -1
  14. package/dist/assemblers/document/path/path-item/operation/parameters.js +115 -17
  15. package/dist/assemblers/document/path/path-item/operation/parameters.js.map +1 -1
  16. package/dist/assemblers/document/path/path-item/operation/parameters.mjs +115 -17
  17. package/dist/assemblers/document/path/path-item/operation/parameters.mjs.map +1 -1
  18. package/dist/assemblers/document/path/path-item/operation/responses.d.ts.map +1 -1
  19. package/dist/assemblers/document/path/path-item/operation/responses.js +3 -1
  20. package/dist/assemblers/document/path/path-item/operation/responses.js.map +1 -1
  21. package/dist/assemblers/document/path/path-item/operation/responses.mjs +3 -1
  22. package/dist/assemblers/document/path/path-item/operation/responses.mjs.map +1 -1
  23. package/dist/assemblers/document/query-param-styles.d.ts +10 -0
  24. package/dist/assemblers/document/query-param-styles.d.ts.map +1 -0
  25. package/dist/assemblers/document/query-param-styles.js +23 -0
  26. package/dist/assemblers/document/query-param-styles.js.map +1 -0
  27. package/dist/assemblers/document/query-param-styles.mjs +19 -0
  28. package/dist/assemblers/document/query-param-styles.mjs.map +1 -0
  29. package/dist/assemblers/document/security.d.ts +8 -0
  30. package/dist/assemblers/document/security.d.ts.map +1 -0
  31. package/dist/assemblers/document/security.js +45 -0
  32. package/dist/assemblers/document/security.js.map +1 -0
  33. package/dist/assemblers/document/security.mjs +43 -0
  34. package/dist/assemblers/document/security.mjs.map +1 -0
  35. package/dist/assemblers/document/server.d.ts +13 -0
  36. package/dist/assemblers/document/server.d.ts.map +1 -0
  37. package/dist/assemblers/document/server.js +25 -0
  38. package/dist/assemblers/document/server.js.map +1 -0
  39. package/dist/assemblers/document/server.mjs +23 -0
  40. package/dist/assemblers/document/server.mjs.map +1 -0
  41. package/dist/context/types.d.ts +2 -2
  42. package/dist/context/types.d.ts.map +1 -1
  43. package/dist/post-processor/component-writer.d.ts.map +1 -1
  44. package/dist/post-processor/component-writer.js +21 -3
  45. package/dist/post-processor/component-writer.js.map +1 -1
  46. package/dist/post-processor/component-writer.mjs +22 -4
  47. package/dist/post-processor/component-writer.mjs.map +1 -1
  48. package/dist/registries/factory.d.ts +4 -1
  49. package/dist/registries/factory.d.ts.map +1 -1
  50. package/dist/registries/factory.js +3 -1
  51. package/dist/registries/factory.js.map +1 -1
  52. package/dist/registries/factory.mjs +3 -1
  53. package/dist/registries/factory.mjs.map +1 -1
  54. package/dist/utils/zod.d.ts +53 -10
  55. package/dist/utils/zod.d.ts.map +1 -1
  56. package/dist/utils/zod.js +128 -14
  57. package/dist/utils/zod.js.map +1 -1
  58. package/dist/utils/zod.mjs +126 -15
  59. package/dist/utils/zod.mjs.map +1 -1
  60. 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;AAMpC,qBAAa,wBAAwB;IACnC,SAAS,IAAI,SAAS,CAAC,QAAQ,EAAE;IAQjC,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,wBAAwB;IAIhC,OAAO,CAAC,qBAAqB;CAQ9B"}
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":";;;;;;;;;;;;;;;;AAQO,MAAMA,wBAAAA,CAAAA;IACXC,SAAAA,GAAkC;QAChC,OAAO;AACL,YAAA,IAAI,CAACC,wBAAwB,EAAA;AAC7B,YAAA,IAAI,CAACC,oBAAoB,EAAA;AACzB,YAAA,IAAI,CAACC,qBAAqB;AAC3B,SAAA;AACH,IAAA;IAEQD,oBAAAA,GAAuB;AAC7B,QAAA,OAAO,IAAIE,0BAAAA,EAAAA;AACb,IAAA;IAEQH,wBAAAA,GAA2B;AACjC,QAAA,OAAO,IAAII,kCAAAA,EAAAA;AACb,IAAA;AAEQF,IAAAA,qBAAAA,CACNG,mBAAyC,IAAIC,4BAAAA,EAAsB,EACnEC,cAAAA,GAAqC,IAAIC,yBAAoB,EAC7D;QACA,MAAMC,UAAAA,GAAaJ,iBAAiBN,SAAS,EAAA;QAE7C,OAAO,IAAIW,8BAAuBD,UAAAA,EAAYF,cAAAA,CAAAA;AAChD,IAAA;AACF;;;;"}
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":";;;;;;;;;;;;;;AAQO,MAAMA,wBAAAA,CAAAA;IACXC,SAAAA,GAAkC;QAChC,OAAO;AACL,YAAA,IAAI,CAACC,wBAAwB,EAAA;AAC7B,YAAA,IAAI,CAACC,oBAAoB,EAAA;AACzB,YAAA,IAAI,CAACC,qBAAqB;AAC3B,SAAA;AACH,IAAA;IAEQD,oBAAAA,GAAuB;AAC7B,QAAA,OAAO,IAAIE,qBAAAA,EAAAA;AACb,IAAA;IAEQH,wBAAAA,GAA2B;AACjC,QAAA,OAAO,IAAII,yBAAAA,EAAAA;AACb,IAAA;AAEQF,IAAAA,qBAAAA,CACNG,mBAAyC,IAAIC,oBAAAA,EAAsB,EACnEC,cAAAA,GAAqC,IAAIC,oBAAoB,EAC7D;QACA,MAAMC,UAAAA,GAAaJ,iBAAiBN,SAAS,EAAA;QAE7C,OAAO,IAAIW,uBAAuBD,UAAAA,EAAYF,cAAAA,CAAAA;AAChD,IAAA;AACF;;;;"}
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;CAmB7D"}
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;QAE9D,KAAK,MAAM,CAACC,KAAAA,EAAOC,SAAAA,CAAU,IAAIC,MAAAA,CAAOC,OAAO,CAACN,IAAAA,CAAAA,CAAO;YACrDE,OAAO,CAACC,MAAM,GAAG;AACfI,gBAAAA,MAAAA,EAAQC,gBAAAA,CAAaJ,SAAAA;AACvB,aAAA;AACF,QAAA;QAEAL,MAAAA,CAAOU,IAAI,CAACC,WAAW,GAAG;AAAER,YAAAA;AAAQ,SAAA;AACtC,IAAA;AACF;;;;"}
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;QAE9D,KAAK,MAAM,CAACC,KAAAA,EAAOC,SAAAA,CAAU,IAAIC,MAAAA,CAAOC,OAAO,CAACN,IAAAA,CAAAA,CAAO;YACrDE,OAAO,CAACC,MAAM,GAAG;AACfI,gBAAAA,MAAAA,EAAQC,YAAAA,CAAaJ,SAAAA;AACvB,aAAA;AACF,QAAA;QAEAL,MAAAA,CAAOU,IAAI,CAACC,WAAW,GAAG;AAAER,YAAAA;AAAQ,SAAA;AACtC,IAAA;AACF;;;;"}
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;AAQ7D,qBAAa,4BAA6B,YAAW,SAAS,CAAC,SAAS;IACtE,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI;IAe5D,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,mBAAmB;CAuB5B"}
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 pathParameters = this._getPathParameters(route);
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
- const param = {
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
- queryParams.push(param);
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 pathParameters = this._getPathParameters(route);
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
- const param = {
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
- queryParams.push(param);
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 };