@aws/nx-plugin 1.0.0-rc.30 → 1.0.0-rc.32

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 (59) hide show
  1. package/LICENSE-THIRD-PARTY +235 -1336
  2. package/README.md +1 -1
  3. package/package.json +1 -2
  4. package/src/mcp-server/tools/create-workspace-command.js +2 -2
  5. package/src/mcp-server/tools/create-workspace-command.js.map +1 -1
  6. package/src/open-api/ts-client/__snapshots__/generator.additional-properties.spec.ts.snap +147 -33
  7. package/src/open-api/ts-client/__snapshots__/generator.arrays.spec.ts.snap +308 -75
  8. package/src/open-api/ts-client/__snapshots__/generator.complex-types.spec.ts.snap +286 -62
  9. package/src/open-api/ts-client/__snapshots__/generator.composite-types.spec.ts.snap +674 -93
  10. package/src/open-api/ts-client/__snapshots__/generator.content-type.spec.ts.snap +211 -36
  11. package/src/open-api/ts-client/__snapshots__/generator.duplicate-types.spec.ts.snap +196 -44
  12. package/src/open-api/ts-client/__snapshots__/generator.edge-cases.spec.ts.snap +5507 -0
  13. package/src/open-api/ts-client/__snapshots__/generator.fast-api.spec.ts.snap +219 -60
  14. package/src/open-api/ts-client/__snapshots__/generator.multipart.spec.ts.snap +280 -0
  15. package/src/open-api/ts-client/__snapshots__/generator.primitive-types.spec.ts.snap +351 -80
  16. package/src/open-api/ts-client/__snapshots__/generator.request.spec.ts.snap +170 -49
  17. package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +98 -22
  18. package/src/open-api/ts-client/__snapshots__/generator.response.spec.ts.snap +147 -33
  19. package/src/open-api/ts-client/__snapshots__/generator.streaming.spec.ts.snap +392 -88
  20. package/src/open-api/ts-client/__snapshots__/generator.tags.spec.ts.snap +196 -44
  21. package/src/open-api/ts-client/files/client.gen.ts.template +166 -19
  22. package/src/open-api/ts-client/files/types.gen.ts.template +4 -4
  23. package/src/open-api/ts-client/generator.js +1 -1
  24. package/src/open-api/ts-client/generator.js.map +1 -1
  25. package/src/open-api/ts-hooks/files/options-proxy.gen.ts.template +5 -0
  26. package/src/open-api/ts-hooks/generator.spec.tsx +70 -0
  27. package/src/open-api/utils/codegen-data/languages.d.ts +0 -6
  28. package/src/open-api/utils/codegen-data/languages.js +23 -18
  29. package/src/open-api/utils/codegen-data/languages.js.map +1 -1
  30. package/src/open-api/utils/codegen-data/types.d.ts +240 -10
  31. package/src/open-api/utils/codegen-data/types.js +24 -1
  32. package/src/open-api/utils/codegen-data/types.js.map +1 -1
  33. package/src/open-api/utils/codegen-data.d.ts +2 -2
  34. package/src/open-api/utils/codegen-data.js +357 -617
  35. package/src/open-api/utils/codegen-data.js.map +1 -1
  36. package/src/open-api/utils/normalise.js +167 -22
  37. package/src/open-api/utils/normalise.js.map +1 -1
  38. package/src/open-api/utils/parser.d.ts +55 -0
  39. package/src/open-api/utils/parser.js +754 -0
  40. package/src/open-api/utils/parser.js.map +1 -0
  41. package/src/open-api/utils/types.d.ts +18 -0
  42. package/src/open-api/utils/types.js.map +1 -1
  43. package/src/preset/__snapshots__/generator.spec.ts.snap +6 -6
  44. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +414 -6
  45. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +276 -4
  46. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +414 -6
  47. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +0 -23
  48. package/src/ts/mcp-server/generator.js +10 -22
  49. package/src/ts/mcp-server/generator.js.map +1 -1
  50. package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +69 -1
  51. package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +69 -1
  52. package/src/utils/mcp.js +1 -1
  53. package/src/utils/mcp.js.map +1 -1
  54. package/src/utils/names.d.ts +6 -0
  55. package/src/utils/names.js +6 -1
  56. package/src/utils/names.js.map +1 -1
  57. package/src/utils/versions.d.ts +5 -5
  58. package/src/utils/versions.js +4 -4
  59. package/src/utils/versions.js.map +1 -1
@@ -1,5 +1,270 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
+ exports[`openApiTsClientGenerator - composite schemas > marshals a polymorphic list as an array of a discriminated union > client.gen.ts 1`] = `
4
+ "import type { Animal, Cat, Dog } from './types.gen.js';
5
+
6
+ /**
7
+ * Utility for serialisation and deserialisation of API types.
8
+ */
9
+ export class $IO {
10
+ public static $mapValues = (data: any, fn: (item: any) => any) =>
11
+ Object.fromEntries(Object.entries(data).map(([k, v]) => [k, fn(v)]));
12
+
13
+ public static Animal = {
14
+ toJson: (model: Animal): any => {
15
+ if (model === undefined || model === null) {
16
+ return model;
17
+ }
18
+ switch ((model as any).kind) {
19
+ case 'cat':
20
+ return $IO.Cat.toJson(model as Cat);
21
+ case 'dog':
22
+ return $IO.Dog.toJson(model as Dog);
23
+ }
24
+ return {
25
+ ...$IO.Cat.toJson(model as Cat),
26
+ ...$IO.Dog.toJson(model as Dog),
27
+ };
28
+ },
29
+ fromJson: (json: any): Animal => {
30
+ if (json === undefined || json === null) {
31
+ return json;
32
+ }
33
+ switch (json?.['kind']) {
34
+ case 'cat':
35
+ return $IO.Cat.fromJson(json);
36
+ case 'dog':
37
+ return $IO.Dog.fromJson(json);
38
+ }
39
+ return {
40
+ ...$IO.Cat.fromJson(json),
41
+ ...$IO.Dog.fromJson(json),
42
+ };
43
+ },
44
+ };
45
+
46
+ public static Cat = {
47
+ toJson: (model: Cat): any => {
48
+ if (model === undefined || model === null) {
49
+ return model;
50
+ }
51
+ return {
52
+ ...(model.kind === undefined
53
+ ? {}
54
+ : {
55
+ kind: model.kind,
56
+ }),
57
+ ...(model.napAt === undefined
58
+ ? {}
59
+ : {
60
+ napAt: model.napAt.toISOString(),
61
+ }),
62
+ };
63
+ },
64
+ fromJson: (json: any): Cat => {
65
+ if (json === undefined || json === null) {
66
+ return json;
67
+ }
68
+ return {
69
+ kind: json['kind'],
70
+ napAt: new Date(json['napAt']),
71
+ };
72
+ },
73
+ };
74
+
75
+ public static Dog = {
76
+ toJson: (model: Dog): any => {
77
+ if (model === undefined || model === null) {
78
+ return model;
79
+ }
80
+ return {
81
+ ...(model.kind === undefined
82
+ ? {}
83
+ : {
84
+ kind: model.kind,
85
+ }),
86
+ ...(model.walkAt === undefined
87
+ ? {}
88
+ : {
89
+ walkAt: model.walkAt.toISOString(),
90
+ }),
91
+ };
92
+ },
93
+ fromJson: (json: any): Dog => {
94
+ if (json === undefined || json === null) {
95
+ return json;
96
+ }
97
+ return {
98
+ kind: json['kind'],
99
+ walkAt: new Date(json['walkAt']),
100
+ };
101
+ },
102
+ };
103
+ }
104
+
105
+ /**
106
+ * Client configuration for TestApi
107
+ */
108
+ export interface TestApiConfig {
109
+ /**
110
+ * Base URL for the API
111
+ */
112
+ url: string;
113
+ /**
114
+ * Custom instance of fetch. By default the global 'fetch' is used.
115
+ * You can override this to add custom middleware for use cases such as adding authentication headers.
116
+ */
117
+ fetch?: typeof fetch;
118
+ /**
119
+ * Additional configuration
120
+ */
121
+ options?: {
122
+ /**
123
+ * By default, the client will add a Content-Type header, set to the media type defined for
124
+ * the request in the OpenAPI specification.
125
+ * Set this to false to omit this header.
126
+ */
127
+ omitContentTypeHeader?: boolean;
128
+ };
129
+ }
130
+
131
+ /**
132
+ * API Client for TestApi
133
+ */
134
+ export class TestApi {
135
+ private $config: TestApiConfig;
136
+
137
+ constructor(config: TestApiConfig) {
138
+ this.$config = config;
139
+
140
+ this.listPets = this.listPets.bind(this);
141
+ }
142
+
143
+ private $collectionDelimiters: { [format: string]: string } = {
144
+ csv: ',',
145
+ ssv: ' ',
146
+ pipes: '|',
147
+ };
148
+
149
+ private $deepObject = (key: string, value: any): string[] => {
150
+ if (value === undefined || value === null) {
151
+ return [];
152
+ }
153
+ if (typeof value !== 'object') {
154
+ return [\`\${key}=\${encodeURIComponent(String(value))}\`];
155
+ }
156
+ return Object.entries(value).flatMap(([prop, v]) =>
157
+ this.$deepObject(\`\${key}[\${encodeURIComponent(prop)}]\`, v),
158
+ );
159
+ };
160
+
161
+ private $url = (
162
+ path: string,
163
+ pathParameters: { [key: string]: any },
164
+ queryParameters: { [key: string]: any },
165
+ collectionFormats?: {
166
+ [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' | 'deepObject';
167
+ },
168
+ ): string => {
169
+ const baseUrl = this.$config.url.endsWith('/')
170
+ ? this.$config.url.slice(0, -1)
171
+ : this.$config.url;
172
+ const pathWithParameters = Object.entries(pathParameters).reduce(
173
+ (withParams, [key, value]) =>
174
+ withParams.replace(\`{\${key}}\`, encodeURIComponent(\`\${value}\`)),
175
+ path,
176
+ );
177
+ const queryString = Object.entries(queryParameters)
178
+ .flatMap(([key, value]) => {
179
+ if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
180
+ return value.map(
181
+ (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
182
+ );
183
+ }
184
+ if (
185
+ collectionFormats?.[key] === 'deepObject' &&
186
+ value !== null &&
187
+ typeof value === 'object'
188
+ ) {
189
+ return this.$deepObject(encodeURIComponent(key), value);
190
+ }
191
+ const delimiter =
192
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
193
+ return [
194
+ \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(delimiter) : String(value))}\`,
195
+ ];
196
+ })
197
+ .join('&');
198
+ return (
199
+ baseUrl + pathWithParameters + (queryString ? \`?\${queryString}\` : '')
200
+ );
201
+ };
202
+
203
+ private $headers = (
204
+ headerParameters: { [key: string]: any },
205
+ collectionFormats?: { [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' },
206
+ ): [string, string][] => {
207
+ return Object.entries(headerParameters).flatMap(([key, value]) => {
208
+ if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
209
+ return value.map((v) => [key, String(v)]) as [string, string][];
210
+ }
211
+ const delimiter =
212
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
213
+ return [
214
+ [
215
+ key,
216
+ Array.isArray(value)
217
+ ? value.map(String).join(delimiter)
218
+ : String(value),
219
+ ],
220
+ ];
221
+ });
222
+ };
223
+
224
+ private $fetch: typeof fetch = (...args) =>
225
+ (this.$config.fetch ?? fetch)(...args);
226
+
227
+ public async listPets(): Promise<Array<Animal>> {
228
+ const pathParameters: { [key: string]: any } = {};
229
+ const queryParameters: { [key: string]: any } = {};
230
+ const headerParameters: { [key: string]: any } = {};
231
+
232
+ const body = undefined;
233
+
234
+ const response = await this.$fetch(
235
+ this.$url('/pets', pathParameters, queryParameters),
236
+ {
237
+ headers: this.$headers(headerParameters),
238
+ method: 'GET',
239
+ body,
240
+ },
241
+ );
242
+
243
+ if (response.status === 200) {
244
+ return ((await response.json()) as Array<any>).map($IO.Animal.fromJson);
245
+ }
246
+ throw new Error(
247
+ \`Unknown response status \${response.status} returned by API\`,
248
+ );
249
+ }
250
+ }
251
+ "
252
+ `;
253
+
254
+ exports[`openApiTsClientGenerator - composite schemas > marshals a polymorphic list as an array of a discriminated union > types.gen.ts 1`] = `
255
+ "export type Animal = Cat | Dog;
256
+ export type Cat = {
257
+ kind: 'cat';
258
+ napAt: Date;
259
+ };
260
+ export type Dog = {
261
+ kind: 'dog';
262
+ walkAt: Date;
263
+ };
264
+ export type ListPetsError = never;
265
+ "
266
+ `;
267
+
3
268
  exports[`openApiTsClientGenerator - composite schemas > should generate valid TypeScript for composite types 1`] = `
4
269
  "export type PutTest200Response = PutTest200ResponseAllOf &
5
270
  PutTest200ResponseAllOf1;
@@ -47,7 +312,7 @@ exports[`openApiTsClientGenerator - composite schemas > should generate valid Ty
47
312
  * Utility for serialisation and deserialisation of API types.
48
313
  */
49
314
  export class $IO {
50
- protected static $mapValues = (data: any, fn: (item: any) => any) =>
315
+ public static $mapValues = (data: any, fn: (item: any) => any) =>
51
316
  Object.fromEntries(Object.entries(data).map(([k, v]) => [k, fn(v)]));
52
317
 
53
318
  public static PutTest200Response = {
@@ -274,11 +539,31 @@ export class TestApi {
274
539
  this.putTest = this.putTest.bind(this);
275
540
  }
276
541
 
542
+ private $collectionDelimiters: { [format: string]: string } = {
543
+ csv: ',',
544
+ ssv: ' ',
545
+ pipes: '|',
546
+ };
547
+
548
+ private $deepObject = (key: string, value: any): string[] => {
549
+ if (value === undefined || value === null) {
550
+ return [];
551
+ }
552
+ if (typeof value !== 'object') {
553
+ return [\`\${key}=\${encodeURIComponent(String(value))}\`];
554
+ }
555
+ return Object.entries(value).flatMap(([prop, v]) =>
556
+ this.$deepObject(\`\${key}[\${encodeURIComponent(prop)}]\`, v),
557
+ );
558
+ };
559
+
277
560
  private $url = (
278
561
  path: string,
279
562
  pathParameters: { [key: string]: any },
280
563
  queryParameters: { [key: string]: any },
281
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
564
+ collectionFormats?: {
565
+ [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' | 'deepObject';
566
+ },
282
567
  ): string => {
283
568
  const baseUrl = this.$config.url.endsWith('/')
284
569
  ? this.$config.url.slice(0, -1)
@@ -289,15 +574,24 @@ export class TestApi {
289
574
  path,
290
575
  );
291
576
  const queryString = Object.entries(queryParameters)
292
- .map(([key, value]) => {
577
+ .flatMap(([key, value]) => {
293
578
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
294
- return value
295
- .map(
296
- (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
297
- )
298
- .join('&');
579
+ return value.map(
580
+ (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
581
+ );
299
582
  }
300
- return \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(',') : String(value))}\`;
583
+ if (
584
+ collectionFormats?.[key] === 'deepObject' &&
585
+ value !== null &&
586
+ typeof value === 'object'
587
+ ) {
588
+ return this.$deepObject(encodeURIComponent(key), value);
589
+ }
590
+ const delimiter =
591
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
592
+ return [
593
+ \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(delimiter) : String(value))}\`,
594
+ ];
301
595
  })
302
596
  .join('&');
303
597
  return (
@@ -307,13 +601,22 @@ export class TestApi {
307
601
 
308
602
  private $headers = (
309
603
  headerParameters: { [key: string]: any },
310
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
604
+ collectionFormats?: { [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' },
311
605
  ): [string, string][] => {
312
606
  return Object.entries(headerParameters).flatMap(([key, value]) => {
313
607
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
314
608
  return value.map((v) => [key, String(v)]) as [string, string][];
315
609
  }
316
- return [[key, String(value)]];
610
+ const delimiter =
611
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
612
+ return [
613
+ [
614
+ key,
615
+ Array.isArray(value)
616
+ ? value.map(String).join(delimiter)
617
+ : String(value),
618
+ ],
619
+ ];
317
620
  });
318
621
  };
319
622
 
@@ -356,7 +659,7 @@ export class TestApi {
356
659
 
357
660
  exports[`openApiTsClientGenerator - composite schemas > should handle FastAPI-style discriminated unions with string const (Literal) 1`] = `
358
661
  "export type Circle = {
359
- kind: string;
662
+ kind: 'circle';
360
663
  radius: number;
361
664
  };
362
665
  export type Kind = 'circle';
@@ -366,7 +669,7 @@ export type ShapesOut = {
366
669
  };
367
670
  export type ShapesOutCanonical = Circle | Square;
368
671
  export type Square = {
369
- kind: string;
672
+ kind: 'square';
370
673
  side: number;
371
674
  };
372
675
  export type GetShapesError = never;
@@ -385,7 +688,7 @@ exports[`openApiTsClientGenerator - composite schemas > should handle FastAPI-st
385
688
  * Utility for serialisation and deserialisation of API types.
386
689
  */
387
690
  export class $IO {
388
- protected static $mapValues = (data: any, fn: (item: any) => any) =>
691
+ public static $mapValues = (data: any, fn: (item: any) => any) =>
389
692
  Object.fromEntries(Object.entries(data).map(([k, v]) => [k, fn(v)]));
390
693
 
391
694
  public static Circle = {
@@ -445,6 +748,12 @@ export class $IO {
445
748
  if (model === undefined || model === null) {
446
749
  return model;
447
750
  }
751
+ switch ((model as any).kind) {
752
+ case 'circle':
753
+ return $IO.Circle.toJson(model as Circle);
754
+ case 'square':
755
+ return $IO.Square.toJson(model as Square);
756
+ }
448
757
  return {
449
758
  ...$IO.Circle.toJson(model as Circle),
450
759
  ...$IO.Square.toJson(model as Square),
@@ -454,6 +763,12 @@ export class $IO {
454
763
  if (json === undefined || json === null) {
455
764
  return json;
456
765
  }
766
+ switch (json?.['kind']) {
767
+ case 'circle':
768
+ return $IO.Circle.fromJson(json);
769
+ case 'square':
770
+ return $IO.Square.fromJson(json);
771
+ }
457
772
  return {
458
773
  ...$IO.Circle.fromJson(json),
459
774
  ...$IO.Square.fromJson(json),
@@ -529,11 +844,31 @@ export class TestApi {
529
844
  this.getShapes = this.getShapes.bind(this);
530
845
  }
531
846
 
847
+ private $collectionDelimiters: { [format: string]: string } = {
848
+ csv: ',',
849
+ ssv: ' ',
850
+ pipes: '|',
851
+ };
852
+
853
+ private $deepObject = (key: string, value: any): string[] => {
854
+ if (value === undefined || value === null) {
855
+ return [];
856
+ }
857
+ if (typeof value !== 'object') {
858
+ return [\`\${key}=\${encodeURIComponent(String(value))}\`];
859
+ }
860
+ return Object.entries(value).flatMap(([prop, v]) =>
861
+ this.$deepObject(\`\${key}[\${encodeURIComponent(prop)}]\`, v),
862
+ );
863
+ };
864
+
532
865
  private $url = (
533
866
  path: string,
534
867
  pathParameters: { [key: string]: any },
535
868
  queryParameters: { [key: string]: any },
536
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
869
+ collectionFormats?: {
870
+ [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' | 'deepObject';
871
+ },
537
872
  ): string => {
538
873
  const baseUrl = this.$config.url.endsWith('/')
539
874
  ? this.$config.url.slice(0, -1)
@@ -544,15 +879,24 @@ export class TestApi {
544
879
  path,
545
880
  );
546
881
  const queryString = Object.entries(queryParameters)
547
- .map(([key, value]) => {
882
+ .flatMap(([key, value]) => {
548
883
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
549
- return value
550
- .map(
551
- (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
552
- )
553
- .join('&');
884
+ return value.map(
885
+ (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
886
+ );
887
+ }
888
+ if (
889
+ collectionFormats?.[key] === 'deepObject' &&
890
+ value !== null &&
891
+ typeof value === 'object'
892
+ ) {
893
+ return this.$deepObject(encodeURIComponent(key), value);
554
894
  }
555
- return \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(',') : String(value))}\`;
895
+ const delimiter =
896
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
897
+ return [
898
+ \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(delimiter) : String(value))}\`,
899
+ ];
556
900
  })
557
901
  .join('&');
558
902
  return (
@@ -562,13 +906,22 @@ export class TestApi {
562
906
 
563
907
  private $headers = (
564
908
  headerParameters: { [key: string]: any },
565
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
909
+ collectionFormats?: { [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' },
566
910
  ): [string, string][] => {
567
911
  return Object.entries(headerParameters).flatMap(([key, value]) => {
568
912
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
569
913
  return value.map((v) => [key, String(v)]) as [string, string][];
570
914
  }
571
- return [[key, String(value)]];
915
+ const delimiter =
916
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
917
+ return [
918
+ [
919
+ key,
920
+ Array.isArray(value)
921
+ ? value.map(String).join(delimiter)
922
+ : String(value),
923
+ ],
924
+ ];
572
925
  });
573
926
  };
574
927
 
@@ -628,7 +981,7 @@ exports[`openApiTsClientGenerator - composite schemas > should handle anyOf with
628
981
  * Utility for serialisation and deserialisation of API types.
629
982
  */
630
983
  export class $IO {
631
- protected static $mapValues = (data: any, fn: (item: any) => any) =>
984
+ public static $mapValues = (data: any, fn: (item: any) => any) =>
632
985
  Object.fromEntries(Object.entries(data).map(([k, v]) => [k, fn(v)]));
633
986
 
634
987
  public static TestAnyOfAny200Response = {
@@ -743,11 +1096,31 @@ export class TestApi {
743
1096
  this.testAnyOfAny = this.testAnyOfAny.bind(this);
744
1097
  }
745
1098
 
1099
+ private $collectionDelimiters: { [format: string]: string } = {
1100
+ csv: ',',
1101
+ ssv: ' ',
1102
+ pipes: '|',
1103
+ };
1104
+
1105
+ private $deepObject = (key: string, value: any): string[] => {
1106
+ if (value === undefined || value === null) {
1107
+ return [];
1108
+ }
1109
+ if (typeof value !== 'object') {
1110
+ return [\`\${key}=\${encodeURIComponent(String(value))}\`];
1111
+ }
1112
+ return Object.entries(value).flatMap(([prop, v]) =>
1113
+ this.$deepObject(\`\${key}[\${encodeURIComponent(prop)}]\`, v),
1114
+ );
1115
+ };
1116
+
746
1117
  private $url = (
747
1118
  path: string,
748
1119
  pathParameters: { [key: string]: any },
749
1120
  queryParameters: { [key: string]: any },
750
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
1121
+ collectionFormats?: {
1122
+ [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' | 'deepObject';
1123
+ },
751
1124
  ): string => {
752
1125
  const baseUrl = this.$config.url.endsWith('/')
753
1126
  ? this.$config.url.slice(0, -1)
@@ -758,15 +1131,24 @@ export class TestApi {
758
1131
  path,
759
1132
  );
760
1133
  const queryString = Object.entries(queryParameters)
761
- .map(([key, value]) => {
1134
+ .flatMap(([key, value]) => {
762
1135
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
763
- return value
764
- .map(
765
- (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
766
- )
767
- .join('&');
1136
+ return value.map(
1137
+ (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
1138
+ );
1139
+ }
1140
+ if (
1141
+ collectionFormats?.[key] === 'deepObject' &&
1142
+ value !== null &&
1143
+ typeof value === 'object'
1144
+ ) {
1145
+ return this.$deepObject(encodeURIComponent(key), value);
768
1146
  }
769
- return \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(',') : String(value))}\`;
1147
+ const delimiter =
1148
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
1149
+ return [
1150
+ \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(delimiter) : String(value))}\`,
1151
+ ];
770
1152
  })
771
1153
  .join('&');
772
1154
  return (
@@ -776,13 +1158,22 @@ export class TestApi {
776
1158
 
777
1159
  private $headers = (
778
1160
  headerParameters: { [key: string]: any },
779
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
1161
+ collectionFormats?: { [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' },
780
1162
  ): [string, string][] => {
781
1163
  return Object.entries(headerParameters).flatMap(([key, value]) => {
782
1164
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
783
1165
  return value.map((v) => [key, String(v)]) as [string, string][];
784
1166
  }
785
- return [[key, String(value)]];
1167
+ const delimiter =
1168
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
1169
+ return [
1170
+ [
1171
+ key,
1172
+ Array.isArray(value)
1173
+ ? value.map(String).join(delimiter)
1174
+ : String(value),
1175
+ ],
1176
+ ];
786
1177
  });
787
1178
  };
788
1179
 
@@ -853,7 +1244,7 @@ exports[`openApiTsClientGenerator - composite schemas > should handle anyOf with
853
1244
  * Utility for serialisation and deserialisation of API types.
854
1245
  */
855
1246
  export class $IO {
856
- protected static $mapValues = (data: any, fn: (item: any) => any) =>
1247
+ public static $mapValues = (data: any, fn: (item: any) => any) =>
857
1248
  Object.fromEntries(Object.entries(data).map(([k, v]) => [k, fn(v)]));
858
1249
 
859
1250
  public static TestAnyOfEnum200Response = {
@@ -968,11 +1359,31 @@ export class TestApi {
968
1359
  this.testAnyOfEnum = this.testAnyOfEnum.bind(this);
969
1360
  }
970
1361
 
1362
+ private $collectionDelimiters: { [format: string]: string } = {
1363
+ csv: ',',
1364
+ ssv: ' ',
1365
+ pipes: '|',
1366
+ };
1367
+
1368
+ private $deepObject = (key: string, value: any): string[] => {
1369
+ if (value === undefined || value === null) {
1370
+ return [];
1371
+ }
1372
+ if (typeof value !== 'object') {
1373
+ return [\`\${key}=\${encodeURIComponent(String(value))}\`];
1374
+ }
1375
+ return Object.entries(value).flatMap(([prop, v]) =>
1376
+ this.$deepObject(\`\${key}[\${encodeURIComponent(prop)}]\`, v),
1377
+ );
1378
+ };
1379
+
971
1380
  private $url = (
972
1381
  path: string,
973
1382
  pathParameters: { [key: string]: any },
974
1383
  queryParameters: { [key: string]: any },
975
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
1384
+ collectionFormats?: {
1385
+ [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' | 'deepObject';
1386
+ },
976
1387
  ): string => {
977
1388
  const baseUrl = this.$config.url.endsWith('/')
978
1389
  ? this.$config.url.slice(0, -1)
@@ -983,15 +1394,24 @@ export class TestApi {
983
1394
  path,
984
1395
  );
985
1396
  const queryString = Object.entries(queryParameters)
986
- .map(([key, value]) => {
1397
+ .flatMap(([key, value]) => {
987
1398
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
988
- return value
989
- .map(
990
- (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
991
- )
992
- .join('&');
1399
+ return value.map(
1400
+ (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
1401
+ );
1402
+ }
1403
+ if (
1404
+ collectionFormats?.[key] === 'deepObject' &&
1405
+ value !== null &&
1406
+ typeof value === 'object'
1407
+ ) {
1408
+ return this.$deepObject(encodeURIComponent(key), value);
993
1409
  }
994
- return \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(',') : String(value))}\`;
1410
+ const delimiter =
1411
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
1412
+ return [
1413
+ \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(delimiter) : String(value))}\`,
1414
+ ];
995
1415
  })
996
1416
  .join('&');
997
1417
  return (
@@ -1001,13 +1421,22 @@ export class TestApi {
1001
1421
 
1002
1422
  private $headers = (
1003
1423
  headerParameters: { [key: string]: any },
1004
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
1424
+ collectionFormats?: { [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' },
1005
1425
  ): [string, string][] => {
1006
1426
  return Object.entries(headerParameters).flatMap(([key, value]) => {
1007
1427
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
1008
1428
  return value.map((v) => [key, String(v)]) as [string, string][];
1009
1429
  }
1010
- return [[key, String(value)]];
1430
+ const delimiter =
1431
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
1432
+ return [
1433
+ [
1434
+ key,
1435
+ Array.isArray(value)
1436
+ ? value.map(String).join(delimiter)
1437
+ : String(value),
1438
+ ],
1439
+ ];
1011
1440
  });
1012
1441
  };
1013
1442
 
@@ -1088,7 +1517,7 @@ exports[`openApiTsClientGenerator - composite schemas > should handle composite
1088
1517
  * Utility for serialisation and deserialisation of API types.
1089
1518
  */
1090
1519
  export class $IO {
1091
- protected static $mapValues = (data: any, fn: (item: any) => any) =>
1520
+ public static $mapValues = (data: any, fn: (item: any) => any) =>
1092
1521
  Object.fromEntries(Object.entries(data).map(([k, v]) => [k, fn(v)]));
1093
1522
 
1094
1523
  public static CompositeRequestContent = {
@@ -1294,11 +1723,31 @@ export class TestApi {
1294
1723
  this.composite = this.composite.bind(this);
1295
1724
  }
1296
1725
 
1726
+ private $collectionDelimiters: { [format: string]: string } = {
1727
+ csv: ',',
1728
+ ssv: ' ',
1729
+ pipes: '|',
1730
+ };
1731
+
1732
+ private $deepObject = (key: string, value: any): string[] => {
1733
+ if (value === undefined || value === null) {
1734
+ return [];
1735
+ }
1736
+ if (typeof value !== 'object') {
1737
+ return [\`\${key}=\${encodeURIComponent(String(value))}\`];
1738
+ }
1739
+ return Object.entries(value).flatMap(([prop, v]) =>
1740
+ this.$deepObject(\`\${key}[\${encodeURIComponent(prop)}]\`, v),
1741
+ );
1742
+ };
1743
+
1297
1744
  private $url = (
1298
1745
  path: string,
1299
1746
  pathParameters: { [key: string]: any },
1300
1747
  queryParameters: { [key: string]: any },
1301
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
1748
+ collectionFormats?: {
1749
+ [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' | 'deepObject';
1750
+ },
1302
1751
  ): string => {
1303
1752
  const baseUrl = this.$config.url.endsWith('/')
1304
1753
  ? this.$config.url.slice(0, -1)
@@ -1309,15 +1758,24 @@ export class TestApi {
1309
1758
  path,
1310
1759
  );
1311
1760
  const queryString = Object.entries(queryParameters)
1312
- .map(([key, value]) => {
1761
+ .flatMap(([key, value]) => {
1313
1762
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
1314
- return value
1315
- .map(
1316
- (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
1317
- )
1318
- .join('&');
1763
+ return value.map(
1764
+ (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
1765
+ );
1766
+ }
1767
+ if (
1768
+ collectionFormats?.[key] === 'deepObject' &&
1769
+ value !== null &&
1770
+ typeof value === 'object'
1771
+ ) {
1772
+ return this.$deepObject(encodeURIComponent(key), value);
1319
1773
  }
1320
- return \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(',') : String(value))}\`;
1774
+ const delimiter =
1775
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
1776
+ return [
1777
+ \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(delimiter) : String(value))}\`,
1778
+ ];
1321
1779
  })
1322
1780
  .join('&');
1323
1781
  return (
@@ -1327,13 +1785,22 @@ export class TestApi {
1327
1785
 
1328
1786
  private $headers = (
1329
1787
  headerParameters: { [key: string]: any },
1330
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
1788
+ collectionFormats?: { [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' },
1331
1789
  ): [string, string][] => {
1332
1790
  return Object.entries(headerParameters).flatMap(([key, value]) => {
1333
1791
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
1334
1792
  return value.map((v) => [key, String(v)]) as [string, string][];
1335
1793
  }
1336
- return [[key, String(value)]];
1794
+ const delimiter =
1795
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
1796
+ return [
1797
+ [
1798
+ key,
1799
+ Array.isArray(value)
1800
+ ? value.map(String).join(delimiter)
1801
+ : String(value),
1802
+ ],
1803
+ ];
1337
1804
  });
1338
1805
  };
1339
1806
 
@@ -1444,7 +1911,7 @@ exports[`openApiTsClientGenerator - composite schemas > should handle inline pri
1444
1911
  * Utility for serialisation and deserialisation of API types.
1445
1912
  */
1446
1913
  export class $IO {
1447
- protected static $mapValues = (data: any, fn: (item: any) => any) =>
1914
+ public static $mapValues = (data: any, fn: (item: any) => any) =>
1448
1915
  Object.fromEntries(Object.entries(data).map(([k, v]) => [k, fn(v)]));
1449
1916
 
1450
1917
  public static TestArrays200Response = {
@@ -1692,11 +2159,31 @@ export class TestApi {
1692
2159
  this.testPrimitiveText = this.testPrimitiveText.bind(this);
1693
2160
  }
1694
2161
 
2162
+ private $collectionDelimiters: { [format: string]: string } = {
2163
+ csv: ',',
2164
+ ssv: ' ',
2165
+ pipes: '|',
2166
+ };
2167
+
2168
+ private $deepObject = (key: string, value: any): string[] => {
2169
+ if (value === undefined || value === null) {
2170
+ return [];
2171
+ }
2172
+ if (typeof value !== 'object') {
2173
+ return [\`\${key}=\${encodeURIComponent(String(value))}\`];
2174
+ }
2175
+ return Object.entries(value).flatMap(([prop, v]) =>
2176
+ this.$deepObject(\`\${key}[\${encodeURIComponent(prop)}]\`, v),
2177
+ );
2178
+ };
2179
+
1695
2180
  private $url = (
1696
2181
  path: string,
1697
2182
  pathParameters: { [key: string]: any },
1698
2183
  queryParameters: { [key: string]: any },
1699
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
2184
+ collectionFormats?: {
2185
+ [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' | 'deepObject';
2186
+ },
1700
2187
  ): string => {
1701
2188
  const baseUrl = this.$config.url.endsWith('/')
1702
2189
  ? this.$config.url.slice(0, -1)
@@ -1707,15 +2194,24 @@ export class TestApi {
1707
2194
  path,
1708
2195
  );
1709
2196
  const queryString = Object.entries(queryParameters)
1710
- .map(([key, value]) => {
2197
+ .flatMap(([key, value]) => {
1711
2198
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
1712
- return value
1713
- .map(
1714
- (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
1715
- )
1716
- .join('&');
2199
+ return value.map(
2200
+ (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
2201
+ );
1717
2202
  }
1718
- return \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(',') : String(value))}\`;
2203
+ if (
2204
+ collectionFormats?.[key] === 'deepObject' &&
2205
+ value !== null &&
2206
+ typeof value === 'object'
2207
+ ) {
2208
+ return this.$deepObject(encodeURIComponent(key), value);
2209
+ }
2210
+ const delimiter =
2211
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
2212
+ return [
2213
+ \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(delimiter) : String(value))}\`,
2214
+ ];
1719
2215
  })
1720
2216
  .join('&');
1721
2217
  return (
@@ -1725,13 +2221,22 @@ export class TestApi {
1725
2221
 
1726
2222
  private $headers = (
1727
2223
  headerParameters: { [key: string]: any },
1728
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
2224
+ collectionFormats?: { [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' },
1729
2225
  ): [string, string][] => {
1730
2226
  return Object.entries(headerParameters).flatMap(([key, value]) => {
1731
2227
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
1732
2228
  return value.map((v) => [key, String(v)]) as [string, string][];
1733
2229
  }
1734
- return [[key, String(value)]];
2230
+ const delimiter =
2231
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
2232
+ return [
2233
+ [
2234
+ key,
2235
+ Array.isArray(value)
2236
+ ? value.map(String).join(delimiter)
2237
+ : String(value),
2238
+ ],
2239
+ ];
1735
2240
  });
1736
2241
  };
1737
2242
 
@@ -1776,7 +2281,7 @@ export class TestApi {
1776
2281
  if (!this.$config.options?.omitContentTypeHeader) {
1777
2282
  headerParameters['Content-Type'] = 'application/json';
1778
2283
  }
1779
- const collectionFormats = {
2284
+ const queryCollectionFormats = {
1780
2285
  someParameter: 'multi',
1781
2286
  } as const;
1782
2287
  const body =
@@ -1792,10 +2297,10 @@ export class TestApi {
1792
2297
  '/arrays-with-other-parameters',
1793
2298
  pathParameters,
1794
2299
  queryParameters,
1795
- collectionFormats,
2300
+ queryCollectionFormats,
1796
2301
  ),
1797
2302
  {
1798
- headers: this.$headers(headerParameters, collectionFormats),
2303
+ headers: this.$headers(headerParameters),
1799
2304
  method: 'POST',
1800
2305
  body,
1801
2306
  },
@@ -1956,7 +2461,7 @@ exports[`openApiTsClientGenerator - composite schemas > should handle not schema
1956
2461
  * Utility for serialisation and deserialisation of API types.
1957
2462
  */
1958
2463
  export class $IO {
1959
- protected static $mapValues = (data: any, fn: (item: any) => any) =>
2464
+ public static $mapValues = (data: any, fn: (item: any) => any) =>
1960
2465
  Object.fromEntries(Object.entries(data).map(([k, v]) => [k, fn(v)]));
1961
2466
 
1962
2467
  public static TestNot200Response = {
@@ -2089,11 +2594,31 @@ export class TestApi {
2089
2594
  this.testNot = this.testNot.bind(this);
2090
2595
  }
2091
2596
 
2597
+ private $collectionDelimiters: { [format: string]: string } = {
2598
+ csv: ',',
2599
+ ssv: ' ',
2600
+ pipes: '|',
2601
+ };
2602
+
2603
+ private $deepObject = (key: string, value: any): string[] => {
2604
+ if (value === undefined || value === null) {
2605
+ return [];
2606
+ }
2607
+ if (typeof value !== 'object') {
2608
+ return [\`\${key}=\${encodeURIComponent(String(value))}\`];
2609
+ }
2610
+ return Object.entries(value).flatMap(([prop, v]) =>
2611
+ this.$deepObject(\`\${key}[\${encodeURIComponent(prop)}]\`, v),
2612
+ );
2613
+ };
2614
+
2092
2615
  private $url = (
2093
2616
  path: string,
2094
2617
  pathParameters: { [key: string]: any },
2095
2618
  queryParameters: { [key: string]: any },
2096
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
2619
+ collectionFormats?: {
2620
+ [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' | 'deepObject';
2621
+ },
2097
2622
  ): string => {
2098
2623
  const baseUrl = this.$config.url.endsWith('/')
2099
2624
  ? this.$config.url.slice(0, -1)
@@ -2104,15 +2629,24 @@ export class TestApi {
2104
2629
  path,
2105
2630
  );
2106
2631
  const queryString = Object.entries(queryParameters)
2107
- .map(([key, value]) => {
2632
+ .flatMap(([key, value]) => {
2108
2633
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
2109
- return value
2110
- .map(
2111
- (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
2112
- )
2113
- .join('&');
2634
+ return value.map(
2635
+ (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
2636
+ );
2637
+ }
2638
+ if (
2639
+ collectionFormats?.[key] === 'deepObject' &&
2640
+ value !== null &&
2641
+ typeof value === 'object'
2642
+ ) {
2643
+ return this.$deepObject(encodeURIComponent(key), value);
2114
2644
  }
2115
- return \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(',') : String(value))}\`;
2645
+ const delimiter =
2646
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
2647
+ return [
2648
+ \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(delimiter) : String(value))}\`,
2649
+ ];
2116
2650
  })
2117
2651
  .join('&');
2118
2652
  return (
@@ -2122,13 +2656,22 @@ export class TestApi {
2122
2656
 
2123
2657
  private $headers = (
2124
2658
  headerParameters: { [key: string]: any },
2125
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
2659
+ collectionFormats?: { [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' },
2126
2660
  ): [string, string][] => {
2127
2661
  return Object.entries(headerParameters).flatMap(([key, value]) => {
2128
2662
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
2129
2663
  return value.map((v) => [key, String(v)]) as [string, string][];
2130
2664
  }
2131
- return [[key, String(value)]];
2665
+ const delimiter =
2666
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
2667
+ return [
2668
+ [
2669
+ key,
2670
+ Array.isArray(value)
2671
+ ? value.map(String).join(delimiter)
2672
+ : String(value),
2673
+ ],
2674
+ ];
2132
2675
  });
2133
2676
  };
2134
2677
 
@@ -2191,7 +2734,7 @@ exports[`openApiTsClientGenerator - composite schemas > should round-trip Date t
2191
2734
  * Utility for serialisation and deserialisation of API types.
2192
2735
  */
2193
2736
  export class $IO {
2194
- protected static $mapValues = (data: any, fn: (item: any) => any) =>
2737
+ public static $mapValues = (data: any, fn: (item: any) => any) =>
2195
2738
  Object.fromEntries(Object.entries(data).map(([k, v]) => [k, fn(v)]));
2196
2739
 
2197
2740
  public static MaybeDate = {
@@ -2281,11 +2824,31 @@ export class TestApi {
2281
2824
  this.postMaybeDate = this.postMaybeDate.bind(this);
2282
2825
  }
2283
2826
 
2827
+ private $collectionDelimiters: { [format: string]: string } = {
2828
+ csv: ',',
2829
+ ssv: ' ',
2830
+ pipes: '|',
2831
+ };
2832
+
2833
+ private $deepObject = (key: string, value: any): string[] => {
2834
+ if (value === undefined || value === null) {
2835
+ return [];
2836
+ }
2837
+ if (typeof value !== 'object') {
2838
+ return [\`\${key}=\${encodeURIComponent(String(value))}\`];
2839
+ }
2840
+ return Object.entries(value).flatMap(([prop, v]) =>
2841
+ this.$deepObject(\`\${key}[\${encodeURIComponent(prop)}]\`, v),
2842
+ );
2843
+ };
2844
+
2284
2845
  private $url = (
2285
2846
  path: string,
2286
2847
  pathParameters: { [key: string]: any },
2287
2848
  queryParameters: { [key: string]: any },
2288
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
2849
+ collectionFormats?: {
2850
+ [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' | 'deepObject';
2851
+ },
2289
2852
  ): string => {
2290
2853
  const baseUrl = this.$config.url.endsWith('/')
2291
2854
  ? this.$config.url.slice(0, -1)
@@ -2296,15 +2859,24 @@ export class TestApi {
2296
2859
  path,
2297
2860
  );
2298
2861
  const queryString = Object.entries(queryParameters)
2299
- .map(([key, value]) => {
2862
+ .flatMap(([key, value]) => {
2300
2863
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
2301
- return value
2302
- .map(
2303
- (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
2304
- )
2305
- .join('&');
2864
+ return value.map(
2865
+ (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
2866
+ );
2867
+ }
2868
+ if (
2869
+ collectionFormats?.[key] === 'deepObject' &&
2870
+ value !== null &&
2871
+ typeof value === 'object'
2872
+ ) {
2873
+ return this.$deepObject(encodeURIComponent(key), value);
2306
2874
  }
2307
- return \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(',') : String(value))}\`;
2875
+ const delimiter =
2876
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
2877
+ return [
2878
+ \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(delimiter) : String(value))}\`,
2879
+ ];
2308
2880
  })
2309
2881
  .join('&');
2310
2882
  return (
@@ -2314,13 +2886,22 @@ export class TestApi {
2314
2886
 
2315
2887
  private $headers = (
2316
2888
  headerParameters: { [key: string]: any },
2317
- collectionFormats?: { [key: string]: 'multi' | 'csv' },
2889
+ collectionFormats?: { [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' },
2318
2890
  ): [string, string][] => {
2319
2891
  return Object.entries(headerParameters).flatMap(([key, value]) => {
2320
2892
  if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
2321
2893
  return value.map((v) => [key, String(v)]) as [string, string][];
2322
2894
  }
2323
- return [[key, String(value)]];
2895
+ const delimiter =
2896
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
2897
+ return [
2898
+ [
2899
+ key,
2900
+ Array.isArray(value)
2901
+ ? value.map(String).join(delimiter)
2902
+ : String(value),
2903
+ ],
2904
+ ];
2324
2905
  });
2325
2906
  };
2326
2907