zod-codegen 1.6.2 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/.github/workflows/ci.yml +50 -48
  2. package/.github/workflows/release.yml +13 -3
  3. package/.husky/commit-msg +1 -1
  4. package/.husky/pre-commit +1 -1
  5. package/.lintstagedrc.json +5 -1
  6. package/.nvmrc +1 -1
  7. package/.prettierrc.json +12 -5
  8. package/CHANGELOG.md +15 -0
  9. package/CONTRIBUTING.md +12 -12
  10. package/EXAMPLES.md +135 -57
  11. package/PERFORMANCE.md +4 -4
  12. package/README.md +87 -64
  13. package/SECURITY.md +1 -1
  14. package/dist/src/cli.js +11 -18
  15. package/dist/src/generator.d.ts +2 -2
  16. package/dist/src/generator.d.ts.map +1 -1
  17. package/dist/src/generator.js +5 -3
  18. package/dist/src/interfaces/code-generator.d.ts.map +1 -1
  19. package/dist/src/services/code-generator.service.d.ts +24 -1
  20. package/dist/src/services/code-generator.service.d.ts.map +1 -1
  21. package/dist/src/services/code-generator.service.js +385 -216
  22. package/dist/src/services/file-reader.service.d.ts.map +1 -1
  23. package/dist/src/services/file-reader.service.js +1 -1
  24. package/dist/src/services/file-writer.service.d.ts.map +1 -1
  25. package/dist/src/services/file-writer.service.js +2 -2
  26. package/dist/src/services/import-builder.service.d.ts.map +1 -1
  27. package/dist/src/services/import-builder.service.js +3 -3
  28. package/dist/src/services/type-builder.service.d.ts.map +1 -1
  29. package/dist/src/types/generator-options.d.ts.map +1 -1
  30. package/dist/src/types/openapi.d.ts.map +1 -1
  31. package/dist/src/types/openapi.js +20 -20
  32. package/dist/src/utils/error-handler.d.ts.map +1 -1
  33. package/dist/src/utils/naming-convention.d.ts.map +1 -1
  34. package/dist/src/utils/naming-convention.js +6 -3
  35. package/dist/src/utils/signal-handler.d.ts.map +1 -1
  36. package/dist/tests/integration/cli-comprehensive.test.d.ts +2 -0
  37. package/dist/tests/integration/cli-comprehensive.test.d.ts.map +1 -0
  38. package/dist/tests/integration/cli-comprehensive.test.js +110 -0
  39. package/dist/tests/integration/cli.test.d.ts +2 -0
  40. package/dist/tests/integration/cli.test.d.ts.map +1 -0
  41. package/dist/tests/integration/cli.test.js +25 -0
  42. package/dist/tests/integration/error-scenarios.test.d.ts +2 -0
  43. package/dist/tests/integration/error-scenarios.test.d.ts.map +1 -0
  44. package/dist/tests/integration/error-scenarios.test.js +169 -0
  45. package/dist/tests/integration/snapshots.test.d.ts +2 -0
  46. package/dist/tests/integration/snapshots.test.d.ts.map +1 -0
  47. package/dist/tests/integration/snapshots.test.js +100 -0
  48. package/dist/tests/unit/code-generator-edge-cases.test.d.ts +2 -0
  49. package/dist/tests/unit/code-generator-edge-cases.test.d.ts.map +1 -0
  50. package/dist/tests/unit/code-generator-edge-cases.test.js +506 -0
  51. package/dist/tests/unit/code-generator.test.d.ts +2 -0
  52. package/dist/tests/unit/code-generator.test.d.ts.map +1 -0
  53. package/dist/tests/unit/code-generator.test.js +1364 -0
  54. package/dist/tests/unit/file-reader.test.d.ts +2 -0
  55. package/dist/tests/unit/file-reader.test.d.ts.map +1 -0
  56. package/dist/tests/unit/file-reader.test.js +125 -0
  57. package/dist/tests/unit/generator.test.d.ts +2 -0
  58. package/dist/tests/unit/generator.test.d.ts.map +1 -0
  59. package/dist/tests/unit/generator.test.js +119 -0
  60. package/dist/tests/unit/naming-convention.test.d.ts +2 -0
  61. package/dist/tests/unit/naming-convention.test.d.ts.map +1 -0
  62. package/dist/tests/unit/naming-convention.test.js +256 -0
  63. package/dist/tests/unit/reporter.test.d.ts +2 -0
  64. package/dist/tests/unit/reporter.test.d.ts.map +1 -0
  65. package/dist/tests/unit/reporter.test.js +44 -0
  66. package/dist/tests/unit/type-builder.test.d.ts +2 -0
  67. package/dist/tests/unit/type-builder.test.d.ts.map +1 -0
  68. package/dist/tests/unit/type-builder.test.js +108 -0
  69. package/dist/vitest.config.d.ts.map +1 -1
  70. package/dist/vitest.config.js +10 -20
  71. package/eslint.config.mjs +38 -28
  72. package/examples/.gitkeep +1 -1
  73. package/examples/README.md +4 -2
  74. package/examples/petstore/README.md +18 -17
  75. package/examples/petstore/{type.ts → api.ts} +158 -74
  76. package/examples/petstore/authenticated-usage.ts +6 -4
  77. package/examples/petstore/basic-usage.ts +4 -3
  78. package/examples/petstore/error-handling-usage.ts +84 -0
  79. package/examples/petstore/retry-handler-usage.ts +11 -18
  80. package/examples/petstore/server-variables-usage.ts +10 -10
  81. package/examples/pokeapi/README.md +8 -8
  82. package/examples/pokeapi/api.ts +218 -0
  83. package/examples/pokeapi/basic-usage.ts +3 -2
  84. package/examples/pokeapi/custom-client.ts +5 -4
  85. package/package.json +17 -21
  86. package/src/cli.ts +20 -25
  87. package/src/generator.ts +13 -11
  88. package/src/interfaces/code-generator.ts +1 -1
  89. package/src/services/code-generator.service.ts +989 -1099
  90. package/src/services/file-reader.service.ts +6 -5
  91. package/src/services/file-writer.service.ts +7 -7
  92. package/src/services/import-builder.service.ts +9 -13
  93. package/src/services/type-builder.service.ts +8 -19
  94. package/src/types/generator-options.ts +1 -1
  95. package/src/types/openapi.ts +22 -22
  96. package/src/utils/error-handler.ts +2 -2
  97. package/src/utils/naming-convention.ts +13 -10
  98. package/src/utils/reporter.ts +2 -2
  99. package/src/utils/signal-handler.ts +7 -8
  100. package/tests/integration/cli-comprehensive.test.ts +38 -32
  101. package/tests/integration/cli.test.ts +5 -5
  102. package/tests/integration/error-scenarios.test.ts +20 -26
  103. package/tests/integration/snapshots.test.ts +19 -23
  104. package/tests/unit/code-generator-edge-cases.test.ts +133 -133
  105. package/tests/unit/code-generator.test.ts +674 -268
  106. package/tests/unit/file-reader.test.ts +14 -14
  107. package/tests/unit/generator.test.ts +30 -18
  108. package/tests/unit/naming-convention.test.ts +27 -27
  109. package/tests/unit/type-builder.test.ts +2 -2
  110. package/tsconfig.json +5 -3
  111. package/vitest.config.ts +11 -21
  112. package/dist/scripts/update-manifest.d.ts +0 -14
  113. package/dist/scripts/update-manifest.d.ts.map +0 -1
  114. package/dist/scripts/update-manifest.js +0 -33
  115. package/dist/src/assets/manifest.json +0 -5
  116. package/examples/pokeapi/type.ts +0 -109
  117. package/generated/type.ts +0 -326
  118. package/scripts/update-manifest.ts +0 -49
  119. package/src/assets/manifest.json +0 -5
@@ -1,6 +1,6 @@
1
- import {beforeEach, describe, expect, it} from 'vitest';
2
- import {TypeScriptCodeGeneratorService} from '../../src/services/code-generator.service';
3
- import type {OpenApiSpecType} from '../../src/types/openapi';
1
+ import { beforeEach, describe, expect, it } from 'vitest';
2
+ import { TypeScriptCodeGeneratorService } from '../../src/services/code-generator.service';
3
+ import type { OpenApiSpecType } from '../../src/types/openapi';
4
4
 
5
5
  describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
6
6
  let generator: TypeScriptCodeGeneratorService;
@@ -15,16 +15,16 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
15
15
  openapi: '3.0.0',
16
16
  info: {
17
17
  title: 'Test API',
18
- version: '1.0.0',
18
+ version: '1.0.0'
19
19
  },
20
20
  paths: {},
21
21
  components: {
22
22
  schemas: {
23
23
  UnknownType: {
24
- anyOf: [{type: 'custom' as any}],
25
- },
26
- },
27
- },
24
+ anyOf: [{ type: 'custom' as any }]
25
+ }
26
+ }
27
+ }
28
28
  };
29
29
 
30
30
  const code = generator.generate(spec);
@@ -36,16 +36,16 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
36
36
  openapi: '3.0.0',
37
37
  info: {
38
38
  title: 'Test API',
39
- version: '1.0.0',
39
+ version: '1.0.0'
40
40
  },
41
41
  paths: {},
42
42
  components: {
43
43
  schemas: {
44
44
  DirectUnknownType: {
45
- type: 'custom' as any,
46
- },
47
- },
48
- },
45
+ type: 'custom' as any
46
+ }
47
+ }
48
+ }
49
49
  };
50
50
 
51
51
  const code = generator.generate(spec);
@@ -63,7 +63,7 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
63
63
  openapi: '3.0.0',
64
64
  info: {
65
65
  title: 'Test API',
66
- version: '1.0.0',
66
+ version: '1.0.0'
67
67
  },
68
68
  paths: {},
69
69
  components: {
@@ -75,7 +75,7 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
75
75
  // by having invalid nested structure that causes parse to fail
76
76
  // but still has the type property accessible
77
77
  (() => {
78
- const obj: any = {type: 'object', properties: {name: {type: 'string'}}};
78
+ const obj: any = { type: 'object', properties: { name: { type: 'string' } } };
79
79
  // Make it fail parse by adding circular reference or invalid structure
80
80
  // Actually, let's try making properties invalid in a way that causes top-level parse to fail
81
81
  obj.properties = new Proxy(
@@ -83,15 +83,15 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
83
83
  {
84
84
  get() {
85
85
  throw new Error('Proxy error');
86
- },
87
- },
86
+ }
87
+ }
88
88
  );
89
89
  return obj;
90
- })(),
91
- ],
92
- },
93
- },
94
- },
90
+ })()
91
+ ]
92
+ }
93
+ }
94
+ }
95
95
  };
96
96
 
97
97
  // This might throw, but let's see
@@ -108,16 +108,16 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
108
108
  openapi: '3.0.0',
109
109
  info: {
110
110
  title: 'Test API',
111
- version: '1.0.0',
111
+ version: '1.0.0'
112
112
  },
113
113
  paths: {},
114
114
  components: {
115
115
  schemas: {
116
116
  NoType: {
117
- anyOf: [{} as any],
118
- },
119
- },
120
- },
117
+ anyOf: [{} as any]
118
+ }
119
+ }
120
+ }
121
121
  };
122
122
 
123
123
  const code = generator.generate(spec);
@@ -129,16 +129,16 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
129
129
  openapi: '3.0.0',
130
130
  info: {
131
131
  title: 'Test API',
132
- version: '1.0.0',
132
+ version: '1.0.0'
133
133
  },
134
134
  paths: {},
135
135
  components: {
136
136
  schemas: {
137
137
  NullSchema: {
138
- anyOf: [null as any],
139
- },
140
- },
141
- },
138
+ anyOf: [null as any]
139
+ }
140
+ }
141
+ }
142
142
  };
143
143
 
144
144
  const code = generator.generate(spec);
@@ -153,16 +153,16 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
153
153
  openapi: '3.0.0',
154
154
  info: {
155
155
  title: 'Test API',
156
- version: '1.0.0',
156
+ version: '1.0.0'
157
157
  },
158
158
  paths: {},
159
159
  components: {
160
160
  schemas: {
161
161
  EmptyObject: {
162
- anyOf: [{type: 'object', properties: {}}],
163
- },
164
- },
165
- },
162
+ anyOf: [{ type: 'object', properties: {} }]
163
+ }
164
+ }
165
+ }
166
166
  };
167
167
 
168
168
  const code = generator.generate(spec);
@@ -175,7 +175,7 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
175
175
  openapi: '3.0.0',
176
176
  info: {
177
177
  title: 'Test API',
178
- version: '1.0.0',
178
+ version: '1.0.0'
179
179
  },
180
180
  paths: {},
181
181
  components: {
@@ -185,14 +185,14 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
185
185
  {
186
186
  type: 'object',
187
187
  properties: {
188
- name: {type: 'string'},
189
- age: {type: 'number'},
190
- },
191
- },
192
- ],
193
- },
194
- },
195
- },
188
+ name: { type: 'string' },
189
+ age: { type: 'number' }
190
+ }
191
+ }
192
+ ]
193
+ }
194
+ }
195
+ }
196
196
  };
197
197
 
198
198
  const code = generator.generate(spec);
@@ -205,7 +205,7 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
205
205
  openapi: '3.0.0',
206
206
  info: {
207
207
  title: 'Test API',
208
- version: '1.0.0',
208
+ version: '1.0.0'
209
209
  },
210
210
  paths: {},
211
211
  components: {
@@ -213,12 +213,12 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
213
213
  DirectObject: {
214
214
  type: 'object',
215
215
  properties: {
216
- name: {type: 'string'},
217
- age: {type: 'number'},
218
- },
219
- },
220
- },
221
- },
216
+ name: { type: 'string' },
217
+ age: { type: 'number' }
218
+ }
219
+ }
220
+ }
221
+ }
222
222
  };
223
223
 
224
224
  const code = generator.generate(spec);
@@ -232,17 +232,17 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
232
232
  openapi: '3.0.0',
233
233
  info: {
234
234
  title: 'Test API',
235
- version: '1.0.0',
235
+ version: '1.0.0'
236
236
  },
237
237
  paths: {},
238
238
  components: {
239
239
  schemas: {
240
240
  EmptyDirectObject: {
241
241
  type: 'object',
242
- properties: {},
243
- },
244
- },
245
- },
242
+ properties: {}
243
+ }
244
+ }
245
+ }
246
246
  };
247
247
 
248
248
  const code = generator.generate(spec);
@@ -257,16 +257,16 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
257
257
  openapi: '3.0.0',
258
258
  info: {
259
259
  title: 'Test API',
260
- version: '1.0.0',
260
+ version: '1.0.0'
261
261
  },
262
262
  paths: {},
263
263
  components: {
264
264
  schemas: {
265
265
  ArrayNoItems: {
266
- anyOf: [{type: 'array'}],
267
- },
268
- },
269
- },
266
+ anyOf: [{ type: 'array' }]
267
+ }
268
+ }
269
+ }
270
270
  };
271
271
 
272
272
  const code = generator.generate(spec);
@@ -279,7 +279,7 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
279
279
  openapi: '3.0.0',
280
280
  info: {
281
281
  title: 'Test API',
282
- version: '1.0.0',
282
+ version: '1.0.0'
283
283
  },
284
284
  paths: {},
285
285
  components: {
@@ -288,12 +288,12 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
288
288
  anyOf: [
289
289
  {
290
290
  type: 'array',
291
- items: {type: 'string'},
292
- },
293
- ],
294
- },
295
- },
296
- },
291
+ items: { type: 'string' }
292
+ }
293
+ ]
294
+ }
295
+ }
296
+ }
297
297
  };
298
298
 
299
299
  const code = generator.generate(spec);
@@ -306,17 +306,17 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
306
306
  openapi: '3.0.0',
307
307
  info: {
308
308
  title: 'Test API',
309
- version: '1.0.0',
309
+ version: '1.0.0'
310
310
  },
311
311
  paths: {},
312
312
  components: {
313
313
  schemas: {
314
314
  DirectArray: {
315
315
  type: 'array',
316
- items: {type: 'string'},
317
- },
318
- },
319
- },
316
+ items: { type: 'string' }
317
+ }
318
+ }
319
+ }
320
320
  };
321
321
 
322
322
  const code = generator.generate(spec);
@@ -330,16 +330,16 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
330
330
  openapi: '3.0.0',
331
331
  info: {
332
332
  title: 'Test API',
333
- version: '1.0.0',
333
+ version: '1.0.0'
334
334
  },
335
335
  paths: {},
336
336
  components: {
337
337
  schemas: {
338
338
  DirectArrayNoItems: {
339
- type: 'array',
340
- },
341
- },
342
- },
339
+ type: 'array'
340
+ }
341
+ }
342
+ }
343
343
  };
344
344
 
345
345
  const code = generator.generate(spec);
@@ -354,7 +354,7 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
354
354
  openapi: '3.0.0',
355
355
  info: {
356
356
  title: 'Test API',
357
- version: '1.0.0',
357
+ version: '1.0.0'
358
358
  },
359
359
  paths: {},
360
360
  components: {
@@ -362,18 +362,18 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
362
362
  NestedLogical: {
363
363
  allOf: [
364
364
  {
365
- anyOf: [{type: 'string'}, {type: 'number'}],
365
+ anyOf: [{ type: 'string' }, { type: 'number' }]
366
366
  },
367
367
  {
368
368
  type: 'object',
369
369
  properties: {
370
- id: {type: 'string'},
371
- },
372
- },
373
- ],
374
- },
375
- },
376
- },
370
+ id: { type: 'string' }
371
+ }
372
+ }
373
+ ]
374
+ }
375
+ }
376
+ }
377
377
  };
378
378
 
379
379
  const code = generator.generate(spec);
@@ -386,7 +386,7 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
386
386
  openapi: '3.0.0',
387
387
  info: {
388
388
  title: 'Test API',
389
- version: '1.0.0',
389
+ version: '1.0.0'
390
390
  },
391
391
  paths: {},
392
392
  components: {
@@ -395,12 +395,12 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
395
395
  not: {
396
396
  type: 'object',
397
397
  properties: {
398
- forbidden: {type: 'string'},
399
- },
400
- },
401
- },
402
- },
403
- },
398
+ forbidden: { type: 'string' }
399
+ }
400
+ }
401
+ }
402
+ }
403
+ }
404
404
  };
405
405
 
406
406
  const code = generator.generate(spec);
@@ -417,7 +417,7 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
417
417
  openapi: '3.0.0',
418
418
  info: {
419
419
  title: 'Test API',
420
- version: '1.0.0',
420
+ version: '1.0.0'
421
421
  },
422
422
  paths: {},
423
423
  components: {
@@ -425,12 +425,12 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
425
425
  UnknownTypeInLogical: {
426
426
  anyOf: [
427
427
  {
428
- type: 'custom' as any, // Unknown type that hits default case
429
- },
430
- ],
431
- },
432
- },
433
- },
428
+ type: 'custom' as any // Unknown type that hits default case
429
+ }
430
+ ]
431
+ }
432
+ }
433
+ }
434
434
  };
435
435
 
436
436
  const code = generator.generate(spec);
@@ -442,7 +442,7 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
442
442
  openapi: '3.0.0',
443
443
  info: {
444
444
  title: 'Test API',
445
- version: '1.0.0',
445
+ version: '1.0.0'
446
446
  },
447
447
  paths: {},
448
448
  components: {
@@ -451,12 +451,12 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
451
451
  anyOf: [
452
452
  {
453
453
  type: 'object',
454
- properties: {},
455
- },
456
- ],
457
- },
458
- },
459
- },
454
+ properties: {}
455
+ }
456
+ ]
457
+ }
458
+ }
459
+ }
460
460
  };
461
461
 
462
462
  const code = generator.generate(spec);
@@ -469,7 +469,7 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
469
469
  openapi: '3.0.0',
470
470
  info: {
471
471
  title: 'Test API',
472
- version: '1.0.0',
472
+ version: '1.0.0'
473
473
  },
474
474
  paths: {},
475
475
  components: {
@@ -479,14 +479,14 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
479
479
  {
480
480
  type: 'object',
481
481
  properties: {
482
- name: {type: 'string'},
483
- value: {type: 'number'},
484
- },
485
- },
486
- ],
487
- },
488
- },
489
- },
482
+ name: { type: 'string' },
483
+ value: { type: 'number' }
484
+ }
485
+ }
486
+ ]
487
+ }
488
+ }
489
+ }
490
490
  };
491
491
 
492
492
  const code = generator.generate(spec);
@@ -500,7 +500,7 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
500
500
  openapi: '3.0.0',
501
501
  info: {
502
502
  title: 'Test API',
503
- version: '1.0.0',
503
+ version: '1.0.0'
504
504
  },
505
505
  paths: {},
506
506
  components: {
@@ -508,13 +508,13 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
508
508
  ArrayNoItemsInLogical: {
509
509
  anyOf: [
510
510
  {
511
- type: 'array',
511
+ type: 'array'
512
512
  // No items property
513
- },
514
- ],
515
- },
516
- },
517
- },
513
+ }
514
+ ]
515
+ }
516
+ }
517
+ }
518
518
  };
519
519
 
520
520
  const code = generator.generate(spec);
@@ -526,7 +526,7 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
526
526
  openapi: '3.0.0',
527
527
  info: {
528
528
  title: 'Test API',
529
- version: '1.0.0',
529
+ version: '1.0.0'
530
530
  },
531
531
  paths: {},
532
532
  components: {
@@ -535,12 +535,12 @@ describe('TypeScriptCodeGeneratorService - Edge Cases', () => {
535
535
  anyOf: [
536
536
  {
537
537
  type: 'array',
538
- items: {type: 'string'},
539
- },
540
- ],
541
- },
542
- },
543
- },
538
+ items: { type: 'string' }
539
+ }
540
+ ]
541
+ }
542
+ }
543
+ }
544
544
  };
545
545
 
546
546
  const code = generator.generate(spec);