@kubb/plugin-zod 4.7.4 → 4.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{components-CVRd05if.cjs → components-5OPJsyIm.cjs} +172 -33
- package/dist/components-5OPJsyIm.cjs.map +1 -0
- package/dist/{components-CQg0WVV7.js → components-DhgOJ6ja.js} +172 -33
- package/dist/components-DhgOJ6ja.js.map +1 -0
- package/dist/components.cjs +1 -1
- package/dist/components.d.cts +4 -2
- package/dist/components.d.ts +4 -2
- package/dist/components.js +1 -1
- package/dist/{generators-Cx0larO4.js → generators-BUP3Ksen.js} +8 -6
- package/dist/generators-BUP3Ksen.js.map +1 -0
- package/dist/{generators-BrfrSmEP.cjs → generators-DLIvEhSD.cjs} +8 -6
- package/dist/generators-DLIvEhSD.cjs.map +1 -0
- package/dist/generators.cjs +2 -2
- package/dist/generators.d.cts +1 -1
- package/dist/generators.d.ts +1 -1
- package/dist/generators.js +2 -2
- package/dist/index.cjs +4 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/{types-D2GJboSe.d.cts → types-COTxGHzo.d.ts} +10 -2
- package/dist/{types-DVvVPDtF.d.ts → types-DX8evdsR.d.cts} +10 -2
- package/package.json +7 -7
- package/src/components/Zod.tsx +18 -7
- package/src/generators/zodGenerator.tsx +4 -2
- package/src/parser.ts +224 -20
- package/src/plugin.ts +4 -2
- package/src/types.ts +8 -0
- package/dist/components-CQg0WVV7.js.map +0 -1
- package/dist/components-CVRd05if.cjs.map +0 -1
- package/dist/generators-BrfrSmEP.cjs.map +0 -1
- package/dist/generators-Cx0larO4.js.map +0 -1
package/src/parser.ts
CHANGED
|
@@ -6,11 +6,32 @@ import { isKeyword, SchemaGenerator, type SchemaKeywordMapper, type SchemaTree,
|
|
|
6
6
|
//TODO add zodKeywordMapper as function that returns 3 versions: v3, v4 and v4 mini, this can also be used to have the custom mapping(see object type)
|
|
7
7
|
// also include shouldCoerce
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Helper to build string/array length constraint checks for Zod Mini mode
|
|
11
|
+
*/
|
|
12
|
+
function buildLengthChecks(min?: number, max?: number): string[] {
|
|
13
|
+
const checks: string[] = []
|
|
14
|
+
if (min !== undefined) checks.push(`z.minLength(${min})`)
|
|
15
|
+
if (max !== undefined) checks.push(`z.maxLength(${max})`)
|
|
16
|
+
return checks
|
|
17
|
+
}
|
|
18
|
+
|
|
9
19
|
const zodKeywordMapper = {
|
|
10
20
|
any: () => 'z.any()',
|
|
11
21
|
unknown: () => 'z.unknown()',
|
|
12
22
|
void: () => 'z.void()',
|
|
13
|
-
number: (coercion?: boolean, min?: number, max?: number, exclusiveMinimum?: number, exclusiveMaximum?: number) => {
|
|
23
|
+
number: (coercion?: boolean, min?: number, max?: number, exclusiveMinimum?: number, exclusiveMaximum?: number, mini?: boolean) => {
|
|
24
|
+
if (mini) {
|
|
25
|
+
const checks: string[] = []
|
|
26
|
+
if (min !== undefined) checks.push(`z.minimum(${min})`)
|
|
27
|
+
if (max !== undefined) checks.push(`z.maximum(${max})`)
|
|
28
|
+
if (exclusiveMinimum !== undefined) checks.push(`z.minimum(${exclusiveMinimum}, { exclusive: true })`)
|
|
29
|
+
if (exclusiveMaximum !== undefined) checks.push(`z.maximum(${exclusiveMaximum}, { exclusive: true })`)
|
|
30
|
+
if (checks.length > 0) {
|
|
31
|
+
return `z.number().check(${checks.join(', ')})`
|
|
32
|
+
}
|
|
33
|
+
return 'z.number()'
|
|
34
|
+
}
|
|
14
35
|
return [
|
|
15
36
|
coercion ? 'z.coerce.number()' : 'z.number()',
|
|
16
37
|
min !== undefined ? `.min(${min})` : undefined,
|
|
@@ -21,7 +42,18 @@ const zodKeywordMapper = {
|
|
|
21
42
|
.filter(Boolean)
|
|
22
43
|
.join('')
|
|
23
44
|
},
|
|
24
|
-
integer: (coercion?: boolean, min?: number, max?: number, version: '3' | '4' = '3', exclusiveMinimum?: number, exclusiveMaximum?: number) => {
|
|
45
|
+
integer: (coercion?: boolean, min?: number, max?: number, version: '3' | '4' = '3', exclusiveMinimum?: number, exclusiveMaximum?: number, mini?: boolean) => {
|
|
46
|
+
if (mini) {
|
|
47
|
+
const checks: string[] = []
|
|
48
|
+
if (min !== undefined) checks.push(`z.minimum(${min})`)
|
|
49
|
+
if (max !== undefined) checks.push(`z.maximum(${max})`)
|
|
50
|
+
if (exclusiveMinimum !== undefined) checks.push(`z.minimum(${exclusiveMinimum}, { exclusive: true })`)
|
|
51
|
+
if (exclusiveMaximum !== undefined) checks.push(`z.maximum(${exclusiveMaximum}, { exclusive: true })`)
|
|
52
|
+
if (checks.length > 0) {
|
|
53
|
+
return `z.int().check(${checks.join(', ')})`
|
|
54
|
+
}
|
|
55
|
+
return 'z.int()'
|
|
56
|
+
}
|
|
25
57
|
return [
|
|
26
58
|
coercion ? 'z.coerce.number().int()' : version === '4' ? 'z.int()' : 'z.number().int()',
|
|
27
59
|
min !== undefined ? `.min(${min})` : undefined,
|
|
@@ -59,7 +91,14 @@ const zodKeywordMapper = {
|
|
|
59
91
|
${value}
|
|
60
92
|
})`
|
|
61
93
|
},
|
|
62
|
-
string: (coercion?: boolean, min?: number, max?: number) => {
|
|
94
|
+
string: (coercion?: boolean, min?: number, max?: number, mini?: boolean) => {
|
|
95
|
+
if (mini) {
|
|
96
|
+
const checks = buildLengthChecks(min, max)
|
|
97
|
+
if (checks.length > 0) {
|
|
98
|
+
return `z.string().check(${checks.join(', ')})`
|
|
99
|
+
}
|
|
100
|
+
return 'z.string()'
|
|
101
|
+
}
|
|
63
102
|
return [coercion ? 'z.coerce.string()' : 'z.string()', min !== undefined ? `.min(${min})` : undefined, max !== undefined ? `.max(${max})` : undefined]
|
|
64
103
|
.filter(Boolean)
|
|
65
104
|
.join('')
|
|
@@ -80,7 +119,15 @@ const zodKeywordMapper = {
|
|
|
80
119
|
}
|
|
81
120
|
return '.nullish()'
|
|
82
121
|
},
|
|
83
|
-
array: (items: string[] = [], min?: number, max?: number, unique?: boolean) => {
|
|
122
|
+
array: (items: string[] = [], min?: number, max?: number, unique?: boolean, mini?: boolean) => {
|
|
123
|
+
if (mini) {
|
|
124
|
+
const checks = buildLengthChecks(min, max)
|
|
125
|
+
if (unique) checks.push(`z.refine(items => new Set(items).size === items.length, { message: "Array entries must be unique" })`)
|
|
126
|
+
if (checks.length > 0) {
|
|
127
|
+
return `z.array(${items?.join('')}).check(${checks.join(', ')})`
|
|
128
|
+
}
|
|
129
|
+
return `z.array(${items?.join('')})`
|
|
130
|
+
}
|
|
84
131
|
return [
|
|
85
132
|
`z.array(${items?.join('')})`,
|
|
86
133
|
min !== undefined ? `.min(${min})` : undefined,
|
|
@@ -97,7 +144,12 @@ const zodKeywordMapper = {
|
|
|
97
144
|
/**
|
|
98
145
|
* ISO 8601
|
|
99
146
|
*/
|
|
100
|
-
datetime: (offset = false, local = false, version: '3' | '4' = '3') => {
|
|
147
|
+
datetime: (offset = false, local = false, version: '3' | '4' = '3', mini?: boolean) => {
|
|
148
|
+
// Zod Mini doesn't support .datetime() method, use plain string
|
|
149
|
+
if (mini) {
|
|
150
|
+
return 'z.string()'
|
|
151
|
+
}
|
|
152
|
+
|
|
101
153
|
if (offset) {
|
|
102
154
|
return version === '4' ? `z.iso.datetime({ offset: ${offset} })` : `z.string().datetime({ offset: ${offset} })`
|
|
103
155
|
}
|
|
@@ -140,7 +192,14 @@ const zodKeywordMapper = {
|
|
|
140
192
|
|
|
141
193
|
return 'z.date()'
|
|
142
194
|
},
|
|
143
|
-
uuid: (coercion?: boolean, version: '3' | '4' = '3', min?: number, max?: number) => {
|
|
195
|
+
uuid: (coercion?: boolean, version: '3' | '4' = '3', min?: number, max?: number, mini?: boolean) => {
|
|
196
|
+
if (mini) {
|
|
197
|
+
const checks = buildLengthChecks(min, max)
|
|
198
|
+
if (checks.length > 0) {
|
|
199
|
+
return `z.uuid().check(${checks.join(', ')})`
|
|
200
|
+
}
|
|
201
|
+
return 'z.uuid()'
|
|
202
|
+
}
|
|
144
203
|
return [
|
|
145
204
|
coercion ? (version === '4' ? 'z.uuid()' : 'z.coerce.string().uuid()') : version === '4' ? 'z.uuid()' : 'z.string().uuid()',
|
|
146
205
|
min !== undefined ? `.min(${min})` : undefined,
|
|
@@ -149,7 +208,14 @@ const zodKeywordMapper = {
|
|
|
149
208
|
.filter(Boolean)
|
|
150
209
|
.join('')
|
|
151
210
|
},
|
|
152
|
-
url: (coercion?: boolean, version: '3' | '4' = '3', min?: number, max?: number) => {
|
|
211
|
+
url: (coercion?: boolean, version: '3' | '4' = '3', min?: number, max?: number, mini?: boolean) => {
|
|
212
|
+
if (mini) {
|
|
213
|
+
const checks = buildLengthChecks(min, max)
|
|
214
|
+
if (checks.length > 0) {
|
|
215
|
+
return `z.url().check(${checks.join(', ')})`
|
|
216
|
+
}
|
|
217
|
+
return 'z.url()'
|
|
218
|
+
}
|
|
153
219
|
return [
|
|
154
220
|
coercion ? (version === '4' ? 'z.url()' : 'z.coerce.string().url()') : version === '4' ? 'z.url()' : 'z.string().url()',
|
|
155
221
|
min !== undefined ? `.min(${min})` : undefined,
|
|
@@ -158,14 +224,27 @@ const zodKeywordMapper = {
|
|
|
158
224
|
.filter(Boolean)
|
|
159
225
|
.join('')
|
|
160
226
|
},
|
|
161
|
-
default: (value?: string | number | true | object) => {
|
|
227
|
+
default: (value?: string | number | true | object, innerSchema?: string, mini?: boolean) => {
|
|
228
|
+
if (mini && innerSchema) {
|
|
229
|
+
const defaultValue = typeof value === 'object' ? '{}' : (value ?? '')
|
|
230
|
+
return `z._default(${innerSchema}, ${defaultValue})`
|
|
231
|
+
}
|
|
162
232
|
if (typeof value === 'object') {
|
|
163
233
|
return '.default({})'
|
|
164
234
|
}
|
|
165
235
|
return `.default(${value ?? ''})`
|
|
166
236
|
},
|
|
167
237
|
and: (items: string[] = []) => items?.map((item) => `.and(${item})`).join(''),
|
|
168
|
-
describe: (value = '') =>
|
|
238
|
+
describe: (value = '', innerSchema?: string, mini?: boolean) => {
|
|
239
|
+
if (mini) {
|
|
240
|
+
return undefined
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (innerSchema) {
|
|
244
|
+
return `z.describe(${innerSchema}, ${value})`
|
|
245
|
+
}
|
|
246
|
+
return `.describe(${value})`
|
|
247
|
+
},
|
|
169
248
|
max: undefined,
|
|
170
249
|
min: undefined,
|
|
171
250
|
optional: (value?: string) => {
|
|
@@ -174,8 +253,20 @@ const zodKeywordMapper = {
|
|
|
174
253
|
}
|
|
175
254
|
return '.optional()'
|
|
176
255
|
},
|
|
177
|
-
matches: (value = '', coercion?: boolean
|
|
178
|
-
|
|
256
|
+
matches: (value = '', coercion?: boolean, mini?: boolean) => {
|
|
257
|
+
if (mini) {
|
|
258
|
+
return `z.string().check(z.regex(${value}))`
|
|
259
|
+
}
|
|
260
|
+
return coercion ? `z.coerce.string().regex(${value})` : `z.string().regex(${value})`
|
|
261
|
+
},
|
|
262
|
+
email: (coercion?: boolean, version: '3' | '4' = '3', min?: number, max?: number, mini?: boolean) => {
|
|
263
|
+
if (mini) {
|
|
264
|
+
const checks = buildLengthChecks(min, max)
|
|
265
|
+
if (checks.length > 0) {
|
|
266
|
+
return `z.email().check(${checks.join(', ')})`
|
|
267
|
+
}
|
|
268
|
+
return 'z.email()'
|
|
269
|
+
}
|
|
179
270
|
return [
|
|
180
271
|
coercion ? (version === '4' ? 'z.email()' : 'z.coerce.string().email()') : version === '4' ? 'z.email()' : 'z.string().email()',
|
|
181
272
|
min !== undefined ? `.min(${min})` : undefined,
|
|
@@ -201,7 +292,13 @@ const zodKeywordMapper = {
|
|
|
201
292
|
deprecated: undefined,
|
|
202
293
|
example: undefined,
|
|
203
294
|
schema: undefined,
|
|
204
|
-
catchall: (value?: string) =>
|
|
295
|
+
catchall: (value?: string, mini?: boolean) => {
|
|
296
|
+
// Zod Mini doesn't support .catchall() method
|
|
297
|
+
if (mini) {
|
|
298
|
+
return undefined
|
|
299
|
+
}
|
|
300
|
+
return value ? `.catchall(${value})` : undefined
|
|
301
|
+
},
|
|
205
302
|
name: undefined,
|
|
206
303
|
exclusiveMinimum: undefined,
|
|
207
304
|
exclusiveMaximum: undefined,
|
|
@@ -245,6 +342,73 @@ export function sort(items?: Schema[]): Schema[] {
|
|
|
245
342
|
return transformers.orderBy(items, [(v) => order.indexOf(v.keyword)], ['asc'])
|
|
246
343
|
}
|
|
247
344
|
|
|
345
|
+
type MiniModifiers = {
|
|
346
|
+
hasOptional?: boolean
|
|
347
|
+
hasNullable?: boolean
|
|
348
|
+
hasNullish?: boolean
|
|
349
|
+
defaultValue?: string | number | true | object
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Keywords that represent modifiers for mini mode
|
|
354
|
+
* These are separated from the base schema and wrapped around it
|
|
355
|
+
* Note: describe is included to filter it out, but won't be wrapped (Zod Mini doesn't support describe)
|
|
356
|
+
*/
|
|
357
|
+
export const miniModifierKeywords = [schemaKeywords.optional, schemaKeywords.nullable, schemaKeywords.nullish, schemaKeywords.default, schemaKeywords.describe]
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Extracts mini mode modifiers from a schemas array
|
|
361
|
+
* This can be reused by other parsers (e.g., valibot) that need similar functionality
|
|
362
|
+
* Note: describe is not included as Zod Mini doesn't support it
|
|
363
|
+
*/
|
|
364
|
+
export function extractMiniModifiers(schemas: Schema[]): MiniModifiers {
|
|
365
|
+
const defaultSchema = schemas.find((item) => isKeyword(item, schemaKeywords.default)) as { keyword: string; args: unknown } | undefined
|
|
366
|
+
|
|
367
|
+
return {
|
|
368
|
+
hasOptional: schemas.some((item) => isKeyword(item, schemaKeywords.optional)),
|
|
369
|
+
hasNullable: schemas.some((item) => isKeyword(item, schemaKeywords.nullable)),
|
|
370
|
+
hasNullish: schemas.some((item) => isKeyword(item, schemaKeywords.nullish)),
|
|
371
|
+
defaultValue: defaultSchema?.args as string | number | true | object | undefined,
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Filters out modifier keywords from schemas for mini mode base schema parsing
|
|
377
|
+
* This can be reused by other parsers (e.g., valibot) that need similar functionality
|
|
378
|
+
*/
|
|
379
|
+
export function filterMiniModifiers(schemas: Schema[]): Schema[] {
|
|
380
|
+
return schemas.filter((item) => !miniModifierKeywords.some((keyword) => isKeyword(item, keyword)))
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Wraps an output string with Zod Mini functional modifiers
|
|
385
|
+
* Order: default (innermost) -> nullable -> optional (outermost)
|
|
386
|
+
* OR: default -> nullish
|
|
387
|
+
* Note: describe is not supported in Zod Mini and is skipped
|
|
388
|
+
*/
|
|
389
|
+
export function wrapWithMiniModifiers(output: string, modifiers: MiniModifiers): string {
|
|
390
|
+
let result = output
|
|
391
|
+
|
|
392
|
+
// Apply default first (innermost wrapper)
|
|
393
|
+
if (modifiers.defaultValue !== undefined) {
|
|
394
|
+
result = zodKeywordMapper.default(modifiers.defaultValue, result, true)!
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// Apply nullish, nullable, or optional (outer wrappers for optionality)
|
|
398
|
+
if (modifiers.hasNullish) {
|
|
399
|
+
result = zodKeywordMapper.nullish(result)!
|
|
400
|
+
} else {
|
|
401
|
+
if (modifiers.hasNullable) {
|
|
402
|
+
result = zodKeywordMapper.nullable(result)!
|
|
403
|
+
}
|
|
404
|
+
if (modifiers.hasOptional) {
|
|
405
|
+
result = zodKeywordMapper.optional(result)!
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
return result
|
|
410
|
+
}
|
|
411
|
+
|
|
248
412
|
const shouldCoerce = (coercion: ParserOptions['coercion'] | undefined, type: 'dates' | 'strings' | 'numbers'): boolean => {
|
|
249
413
|
if (coercion === undefined) {
|
|
250
414
|
return false
|
|
@@ -262,6 +426,7 @@ type ParserOptions = {
|
|
|
262
426
|
wrapOutput?: (opts: { output: string; schema: any }) => string | undefined
|
|
263
427
|
version: '3' | '4'
|
|
264
428
|
skipLazyForRefs?: boolean
|
|
429
|
+
mini?: boolean
|
|
265
430
|
}
|
|
266
431
|
|
|
267
432
|
export function parse({ schema, parent, current, name, siblings }: SchemaTree, options: ParserOptions): string | undefined {
|
|
@@ -316,6 +481,7 @@ export function parse({ schema, parent, current, name, siblings }: SchemaTree, o
|
|
|
316
481
|
current.args.min,
|
|
317
482
|
current.args.max,
|
|
318
483
|
current.args.unique,
|
|
484
|
+
options.mini,
|
|
319
485
|
)
|
|
320
486
|
}
|
|
321
487
|
|
|
@@ -402,6 +568,35 @@ export function parse({ schema, parent, current, name, siblings }: SchemaTree, o
|
|
|
402
568
|
: baseSchemaOutput
|
|
403
569
|
|
|
404
570
|
if (options.version === '4' && hasRef) {
|
|
571
|
+
// In mini mode, use functional wrappers instead of chainable methods
|
|
572
|
+
if (options.mini) {
|
|
573
|
+
// both optional and nullable
|
|
574
|
+
if (isNullish) {
|
|
575
|
+
return `get "${propertyName}"(){
|
|
576
|
+
return ${zodKeywordMapper.nullish(objectValue)}
|
|
577
|
+
}`
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
// undefined
|
|
581
|
+
if (isOptional) {
|
|
582
|
+
return `get "${propertyName}"(){
|
|
583
|
+
return ${zodKeywordMapper.optional(objectValue)}
|
|
584
|
+
}`
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
// null
|
|
588
|
+
if (isNullable) {
|
|
589
|
+
return `get "${propertyName}"(){
|
|
590
|
+
return ${zodKeywordMapper.nullable(objectValue)}
|
|
591
|
+
}`
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
return `get "${propertyName}"(){
|
|
595
|
+
return ${objectValue}
|
|
596
|
+
}`
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
// Non-mini mode uses chainable methods
|
|
405
600
|
// both optional and nullable
|
|
406
601
|
if (isNullish) {
|
|
407
602
|
return `get "${propertyName}"(){
|
|
@@ -456,7 +651,7 @@ export function parse({ schema, parent, current, name, siblings }: SchemaTree, o
|
|
|
456
651
|
|
|
457
652
|
const text = [
|
|
458
653
|
zodKeywordMapper.object(properties, current.args?.strict, options.version),
|
|
459
|
-
additionalProperties ? zodKeywordMapper.catchall(additionalProperties) : undefined,
|
|
654
|
+
additionalProperties ? zodKeywordMapper.catchall(additionalProperties, options.mini) : undefined,
|
|
460
655
|
].filter(Boolean)
|
|
461
656
|
|
|
462
657
|
return text.join('')
|
|
@@ -481,11 +676,15 @@ export function parse({ schema, parent, current, name, siblings }: SchemaTree, o
|
|
|
481
676
|
|
|
482
677
|
if (isKeyword(current, schemaKeywords.matches)) {
|
|
483
678
|
if (current.args) {
|
|
484
|
-
return zodKeywordMapper.matches(transformers.toRegExpString(current.args, null), shouldCoerce(options.coercion, 'strings'))
|
|
679
|
+
return zodKeywordMapper.matches(transformers.toRegExpString(current.args, null), shouldCoerce(options.coercion, 'strings'), options.mini)
|
|
485
680
|
}
|
|
486
681
|
}
|
|
487
682
|
|
|
488
683
|
if (isKeyword(current, schemaKeywords.default)) {
|
|
684
|
+
// In mini mode, default is handled by wrapWithMiniModifiers
|
|
685
|
+
if (options.mini) {
|
|
686
|
+
return undefined
|
|
687
|
+
}
|
|
489
688
|
if (current.args) {
|
|
490
689
|
return zodKeywordMapper.default(current.args)
|
|
491
690
|
}
|
|
@@ -493,7 +692,7 @@ export function parse({ schema, parent, current, name, siblings }: SchemaTree, o
|
|
|
493
692
|
|
|
494
693
|
if (isKeyword(current, schemaKeywords.describe)) {
|
|
495
694
|
if (current.args) {
|
|
496
|
-
return zodKeywordMapper.describe(transformers.stringify(current.args.toString()))
|
|
695
|
+
return zodKeywordMapper.describe(transformers.stringify(current.args.toString()), undefined, options.mini)
|
|
497
696
|
}
|
|
498
697
|
}
|
|
499
698
|
|
|
@@ -501,25 +700,28 @@ export function parse({ schema, parent, current, name, siblings }: SchemaTree, o
|
|
|
501
700
|
const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min)
|
|
502
701
|
const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max)
|
|
503
702
|
|
|
504
|
-
return zodKeywordMapper.string(shouldCoerce(options.coercion, 'strings'), minSchema?.args, maxSchema?.args)
|
|
703
|
+
return zodKeywordMapper.string(shouldCoerce(options.coercion, 'strings'), minSchema?.args, maxSchema?.args, options.mini)
|
|
505
704
|
}
|
|
506
705
|
|
|
507
706
|
if (isKeyword(current, schemaKeywords.uuid)) {
|
|
508
|
-
|
|
707
|
+
const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min)
|
|
708
|
+
const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max)
|
|
709
|
+
|
|
710
|
+
return zodKeywordMapper.uuid(shouldCoerce(options.coercion, 'strings'), options.version, minSchema?.args, maxSchema?.args, options.mini)
|
|
509
711
|
}
|
|
510
712
|
|
|
511
713
|
if (isKeyword(current, schemaKeywords.email)) {
|
|
512
714
|
const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min)
|
|
513
715
|
const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max)
|
|
514
716
|
|
|
515
|
-
return zodKeywordMapper.email(shouldCoerce(options.coercion, 'strings'), options.version, minSchema?.args, maxSchema?.args)
|
|
717
|
+
return zodKeywordMapper.email(shouldCoerce(options.coercion, 'strings'), options.version, minSchema?.args, maxSchema?.args, options.mini)
|
|
516
718
|
}
|
|
517
719
|
|
|
518
720
|
if (isKeyword(current, schemaKeywords.url)) {
|
|
519
721
|
const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min)
|
|
520
722
|
const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max)
|
|
521
723
|
|
|
522
|
-
return zodKeywordMapper.url(shouldCoerce(options.coercion, 'strings'), options.version, minSchema?.args, maxSchema?.args)
|
|
724
|
+
return zodKeywordMapper.url(shouldCoerce(options.coercion, 'strings'), options.version, minSchema?.args, maxSchema?.args, options.mini)
|
|
523
725
|
}
|
|
524
726
|
|
|
525
727
|
if (isKeyword(current, schemaKeywords.number)) {
|
|
@@ -534,6 +736,7 @@ export function parse({ schema, parent, current, name, siblings }: SchemaTree, o
|
|
|
534
736
|
maxSchema?.args,
|
|
535
737
|
exclusiveMinimumSchema?.args,
|
|
536
738
|
exclusiveMaximumSchema?.args,
|
|
739
|
+
options.mini,
|
|
537
740
|
)
|
|
538
741
|
}
|
|
539
742
|
|
|
@@ -550,11 +753,12 @@ export function parse({ schema, parent, current, name, siblings }: SchemaTree, o
|
|
|
550
753
|
options.version,
|
|
551
754
|
exclusiveMinimumSchema?.args,
|
|
552
755
|
exclusiveMaximumSchema?.args,
|
|
756
|
+
options.mini,
|
|
553
757
|
)
|
|
554
758
|
}
|
|
555
759
|
|
|
556
760
|
if (isKeyword(current, schemaKeywords.datetime)) {
|
|
557
|
-
return zodKeywordMapper.datetime(current.args.offset, current.args.local, options.version)
|
|
761
|
+
return zodKeywordMapper.datetime(current.args.offset, current.args.local, options.version, options.mini)
|
|
558
762
|
}
|
|
559
763
|
|
|
560
764
|
if (isKeyword(current, schemaKeywords.date)) {
|
package/src/plugin.ts
CHANGED
|
@@ -24,8 +24,9 @@ export const pluginZod = definePlugin<PluginZod>((options) => {
|
|
|
24
24
|
typed = false,
|
|
25
25
|
mapper = {},
|
|
26
26
|
operations = false,
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
mini = false,
|
|
28
|
+
version = mini ? '4' : new PackageManager().isValidSync('zod', '>=4') ? '4' : '3',
|
|
29
|
+
importPath = mini ? 'zod/mini' : version === '4' ? 'zod/v4' : 'zod',
|
|
29
30
|
coercion = false,
|
|
30
31
|
inferred = false,
|
|
31
32
|
generators = [zodGenerator, operations ? operationsGenerator : undefined].filter(Boolean),
|
|
@@ -55,6 +56,7 @@ export const pluginZod = definePlugin<PluginZod>((options) => {
|
|
|
55
56
|
group,
|
|
56
57
|
wrapOutput,
|
|
57
58
|
version,
|
|
59
|
+
mini,
|
|
58
60
|
usedEnumNames,
|
|
59
61
|
},
|
|
60
62
|
pre: [pluginOasName, typed ? pluginTsName : undefined].filter(Boolean),
|
package/src/types.ts
CHANGED
|
@@ -99,6 +99,13 @@ export type Options = {
|
|
|
99
99
|
* @default '3
|
|
100
100
|
*/
|
|
101
101
|
version?: '3' | '4'
|
|
102
|
+
/**
|
|
103
|
+
* Use Zod Mini's functional API for better tree-shaking support.
|
|
104
|
+
* When enabled, generates functional syntax (e.g., `z.optional(z.string())`) instead of chainable methods (e.g., `z.string().optional()`).
|
|
105
|
+
* Requires Zod v4 or later. When `mini: true`, `version` will be set to '4' and `importPath` will default to 'zod/mini'.
|
|
106
|
+
* @default false
|
|
107
|
+
*/
|
|
108
|
+
mini?: boolean
|
|
102
109
|
/**
|
|
103
110
|
* Callback function to wrap the output of the generated zod schema
|
|
104
111
|
*
|
|
@@ -129,6 +136,7 @@ type ResolvedOptions = {
|
|
|
129
136
|
operations: NonNullable<Options['operations']>
|
|
130
137
|
wrapOutput: Options['wrapOutput']
|
|
131
138
|
version: NonNullable<Options['version']>
|
|
139
|
+
mini: NonNullable<Options['mini']>
|
|
132
140
|
}
|
|
133
141
|
|
|
134
142
|
export type PluginZod = PluginFactoryOptions<'plugin-zod', Options, ResolvedOptions, never, ResolvePathOptions>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"components-CQg0WVV7.js","names":["order: string[]","schema","hasRef","value","parserZod.sort","parserZod.parse","schema"],"sources":["../src/components/Operations.tsx","../src/parser.ts","../src/components/Zod.tsx"],"sourcesContent":["import transformers from '@kubb/core/transformers'\nimport type { HttpMethod, Operation } from '@kubb/oas'\nimport type { SchemaNames } from '@kubb/plugin-oas/hooks'\nimport { Const, File, Type } from '@kubb/react-fabric'\nimport type { KubbNode } from '@kubb/react-fabric/types'\n\ntype Props = {\n name: string\n operations: Array<{ operation: Operation; data: SchemaNames }>\n}\n\nexport function Operations({ name, operations }: Props): KubbNode {\n const operationsJSON = operations.reduce(\n (prev, acc) => {\n prev[`\"${acc.operation.getOperationId()}\"`] = acc.data\n\n return prev\n },\n {} as Record<string, unknown>,\n )\n\n const pathsJSON = operations.reduce(\n (prev, acc) => {\n prev[`\"${acc.operation.path}\"`] = {\n ...(prev[`\"${acc.operation.path}\"`] || ({} as Record<HttpMethod, string>)),\n [acc.operation.method]: `operations[\"${acc.operation.getOperationId()}\"]`,\n }\n\n return prev\n },\n {} as Record<string, Record<HttpMethod, string>>,\n )\n\n return (\n <>\n <File.Source name=\"OperationSchema\" isExportable isIndexable>\n <Type name=\"OperationSchema\" export>{`{\n readonly request: z.ZodTypeAny | undefined;\n readonly parameters: {\n readonly path: z.ZodTypeAny | undefined;\n readonly query: z.ZodTypeAny | undefined;\n readonly header: z.ZodTypeAny | undefined;\n };\n readonly responses: {\n readonly [status: number]: z.ZodTypeAny;\n readonly default: z.ZodTypeAny;\n };\n readonly errors: {\n readonly [status: number]: z.ZodTypeAny;\n };\n}`}</Type>\n </File.Source>\n <File.Source name=\"OperationsMap\" isExportable isIndexable>\n <Type name=\"OperationsMap\" export>\n {'Record<string, OperationSchema>'}\n </Type>\n </File.Source>\n <File.Source name={name} isExportable isIndexable>\n <Const export name={name} asConst>\n {`{${transformers.stringifyObject(operationsJSON)}}`}\n </Const>\n </File.Source>\n <File.Source name={'paths'} isExportable isIndexable>\n <Const export name={'paths'} asConst>\n {`{${transformers.stringifyObject(pathsJSON)}}`}\n </Const>\n </File.Source>\n </>\n )\n}\n","import transformers from '@kubb/core/transformers'\n\nimport type { Schema, SchemaKeywordBase, SchemaMapper } from '@kubb/plugin-oas'\nimport { isKeyword, SchemaGenerator, type SchemaKeywordMapper, type SchemaTree, schemaKeywords } from '@kubb/plugin-oas'\n\n//TODO add zodKeywordMapper as function that returns 3 versions: v3, v4 and v4 mini, this can also be used to have the custom mapping(see object type)\n// also include shouldCoerce\n\nconst zodKeywordMapper = {\n any: () => 'z.any()',\n unknown: () => 'z.unknown()',\n void: () => 'z.void()',\n number: (coercion?: boolean, min?: number, max?: number, exclusiveMinimum?: number, exclusiveMaximum?: number) => {\n return [\n coercion ? 'z.coerce.number()' : 'z.number()',\n min !== undefined ? `.min(${min})` : undefined,\n max !== undefined ? `.max(${max})` : undefined,\n exclusiveMinimum !== undefined ? `.gt(${exclusiveMinimum})` : undefined,\n exclusiveMaximum !== undefined ? `.lt(${exclusiveMaximum})` : undefined,\n ]\n .filter(Boolean)\n .join('')\n },\n integer: (coercion?: boolean, min?: number, max?: number, version: '3' | '4' = '3', exclusiveMinimum?: number, exclusiveMaximum?: number) => {\n return [\n coercion ? 'z.coerce.number().int()' : version === '4' ? 'z.int()' : 'z.number().int()',\n min !== undefined ? `.min(${min})` : undefined,\n max !== undefined ? `.max(${max})` : undefined,\n exclusiveMinimum !== undefined ? `.gt(${exclusiveMinimum})` : undefined,\n exclusiveMaximum !== undefined ? `.lt(${exclusiveMaximum})` : undefined,\n ]\n .filter(Boolean)\n .join('')\n },\n interface: (value?: string, strict?: boolean) => {\n if (strict) {\n return `z.strictInterface({\n ${value}\n })`\n }\n return `z.interface({\n ${value}\n })`\n },\n object: (value?: string, strict?: boolean, version: '3' | '4' = '3') => {\n if (version === '4' && strict) {\n return `z.strictObject({\n ${value}\n })`\n }\n\n if (strict) {\n return `z.object({\n ${value}\n }).strict()`\n }\n\n return `z.object({\n ${value}\n })`\n },\n string: (coercion?: boolean, min?: number, max?: number) => {\n return [coercion ? 'z.coerce.string()' : 'z.string()', min !== undefined ? `.min(${min})` : undefined, max !== undefined ? `.max(${max})` : undefined]\n .filter(Boolean)\n .join('')\n },\n //support for discriminatedUnion\n boolean: () => 'z.boolean()',\n undefined: () => 'z.undefined()',\n nullable: (value?: string) => {\n if (value) {\n return `z.nullable(${value})`\n }\n return '.nullable()'\n },\n null: () => 'z.null()',\n nullish: (value?: string) => {\n if (value) {\n return `z.nullish(${value})`\n }\n return '.nullish()'\n },\n array: (items: string[] = [], min?: number, max?: number, unique?: boolean) => {\n return [\n `z.array(${items?.join('')})`,\n min !== undefined ? `.min(${min})` : undefined,\n max !== undefined ? `.max(${max})` : undefined,\n unique ? `.refine(items => new Set(items).size === items.length, { message: \"Array entries must be unique\" })` : undefined,\n ]\n .filter(Boolean)\n .join('')\n },\n tuple: (items: string[] = []) => `z.tuple([${items?.join(', ')}])`,\n enum: (items: string[] = []) => `z.enum([${items?.join(', ')}])`,\n union: (items: string[] = []) => `z.union([${items?.join(', ')}])`,\n const: (value?: string | number | boolean) => `z.literal(${value ?? ''})`,\n /**\n * ISO 8601\n */\n datetime: (offset = false, local = false, version: '3' | '4' = '3') => {\n if (offset) {\n return version === '4' ? `z.iso.datetime({ offset: ${offset} })` : `z.string().datetime({ offset: ${offset} })`\n }\n\n if (local) {\n return version === '4' ? `z.iso.datetime({ local: ${local} })` : `z.string().datetime({ local: ${local} })`\n }\n\n return 'z.string().datetime()'\n },\n /**\n * Type `'date'` Date\n * Type `'string'` ISO date format (YYYY-MM-DD)\n * @default ISO date format (YYYY-MM-DD)\n */\n date: (type: 'date' | 'string' = 'string', coercion?: boolean, version: '3' | '4' = '3') => {\n if (type === 'string') {\n return version === '4' ? 'z.iso.date()' : 'z.string().date()'\n }\n\n if (coercion) {\n return 'z.coerce.date()'\n }\n\n return 'z.date()'\n },\n /**\n * Type `'date'` Date\n * Type `'string'` ISO time format (HH:mm:ss[.SSSSSS])\n * @default ISO time format (HH:mm:ss[.SSSSSS])\n */\n time: (type: 'date' | 'string' = 'string', coercion?: boolean, version: '3' | '4' = '3') => {\n if (type === 'string') {\n return version === '4' ? 'z.iso.time()' : 'z.string().time()'\n }\n\n if (coercion) {\n return 'z.coerce.date()'\n }\n\n return 'z.date()'\n },\n uuid: (coercion?: boolean, version: '3' | '4' = '3', min?: number, max?: number) => {\n return [\n coercion ? (version === '4' ? 'z.uuid()' : 'z.coerce.string().uuid()') : version === '4' ? 'z.uuid()' : 'z.string().uuid()',\n min !== undefined ? `.min(${min})` : undefined,\n max !== undefined ? `.max(${max})` : undefined,\n ]\n .filter(Boolean)\n .join('')\n },\n url: (coercion?: boolean, version: '3' | '4' = '3', min?: number, max?: number) => {\n return [\n coercion ? (version === '4' ? 'z.url()' : 'z.coerce.string().url()') : version === '4' ? 'z.url()' : 'z.string().url()',\n min !== undefined ? `.min(${min})` : undefined,\n max !== undefined ? `.max(${max})` : undefined,\n ]\n .filter(Boolean)\n .join('')\n },\n default: (value?: string | number | true | object) => {\n if (typeof value === 'object') {\n return '.default({})'\n }\n return `.default(${value ?? ''})`\n },\n and: (items: string[] = []) => items?.map((item) => `.and(${item})`).join(''),\n describe: (value = '') => `.describe(${value})`,\n max: undefined,\n min: undefined,\n optional: (value?: string) => {\n if (value) {\n return `z.optional(${value})`\n }\n return '.optional()'\n },\n matches: (value = '', coercion?: boolean) => (coercion ? `z.coerce.string().regex(${value})` : `z.string().regex(${value})`),\n email: (coercion?: boolean, version: '3' | '4' = '3', min?: number, max?: number) => {\n return [\n coercion ? (version === '4' ? 'z.email()' : 'z.coerce.string().email()') : version === '4' ? 'z.email()' : 'z.string().email()',\n min !== undefined ? `.min(${min})` : undefined,\n max !== undefined ? `.max(${max})` : undefined,\n ]\n .filter(Boolean)\n .join('')\n },\n firstName: undefined,\n lastName: undefined,\n password: undefined,\n phone: undefined,\n readOnly: undefined,\n writeOnly: undefined,\n ref: (value?: string) => {\n if (!value) {\n return undefined\n }\n\n return `z.lazy(() => ${value})`\n },\n blob: () => 'z.instanceof(File)',\n deprecated: undefined,\n example: undefined,\n schema: undefined,\n catchall: (value?: string) => (value ? `.catchall(${value})` : undefined),\n name: undefined,\n exclusiveMinimum: undefined,\n exclusiveMaximum: undefined,\n} satisfies SchemaMapper<string | null | undefined>\n\n/**\n * @link based on https://github.com/cellular/oazapfts/blob/7ba226ebb15374e8483cc53e7532f1663179a22c/src/codegen/generate.ts#L398\n */\n\nexport function sort(items?: Schema[]): Schema[] {\n const order: string[] = [\n schemaKeywords.string,\n schemaKeywords.datetime,\n schemaKeywords.date,\n schemaKeywords.time,\n schemaKeywords.tuple,\n schemaKeywords.number,\n schemaKeywords.object,\n schemaKeywords.enum,\n schemaKeywords.url,\n schemaKeywords.email,\n schemaKeywords.firstName,\n schemaKeywords.lastName,\n schemaKeywords.password,\n schemaKeywords.matches,\n schemaKeywords.uuid,\n schemaKeywords.null,\n schemaKeywords.min,\n schemaKeywords.max,\n schemaKeywords.default,\n schemaKeywords.describe,\n schemaKeywords.optional,\n schemaKeywords.nullable,\n schemaKeywords.nullish,\n ]\n\n if (!items) {\n return []\n }\n\n return transformers.orderBy(items, [(v) => order.indexOf(v.keyword)], ['asc'])\n}\n\nconst shouldCoerce = (coercion: ParserOptions['coercion'] | undefined, type: 'dates' | 'strings' | 'numbers'): boolean => {\n if (coercion === undefined) {\n return false\n }\n if (typeof coercion === 'boolean') {\n return coercion\n }\n\n return !!coercion[type]\n}\n\ntype ParserOptions = {\n mapper?: Record<string, string>\n coercion?: boolean | { dates?: boolean; strings?: boolean; numbers?: boolean }\n wrapOutput?: (opts: { output: string; schema: any }) => string | undefined\n version: '3' | '4'\n skipLazyForRefs?: boolean\n}\n\nexport function parse({ schema, parent, current, name, siblings }: SchemaTree, options: ParserOptions): string | undefined {\n const value = zodKeywordMapper[current.keyword as keyof typeof zodKeywordMapper]\n\n // Early exit: if siblings contain both matches and ref → skip matches entirely\n const hasMatches = siblings.some((it) => isKeyword(it, schemaKeywords.matches))\n const hasRef = siblings.some((it) => isKeyword(it, schemaKeywords.ref))\n\n if (hasMatches && hasRef && isKeyword(current, schemaKeywords.matches)) {\n return undefined // strip matches\n }\n\n if (!value) {\n return undefined\n }\n\n if (isKeyword(current, schemaKeywords.union)) {\n // zod union type needs at least 2 items\n if (Array.isArray(current.args) && current.args.length === 1) {\n return parse({ schema, parent, name, current: current.args[0] as Schema, siblings }, options)\n }\n if (Array.isArray(current.args) && !current.args.length) {\n return ''\n }\n\n return zodKeywordMapper.union(\n sort(current.args)\n .map((it, _index, siblings) => parse({ schema, parent: current, name, current: it, siblings }, options))\n .filter(Boolean),\n )\n }\n\n if (isKeyword(current, schemaKeywords.and)) {\n const items = sort(current.args)\n .filter((schema: Schema) => {\n return ![schemaKeywords.optional, schemaKeywords.describe].includes(schema.keyword as typeof schemaKeywords.describe)\n })\n .map((it: Schema, _index, siblings) => parse({ schema, parent: current, name, current: it, siblings }, options))\n .filter(Boolean)\n\n return `${items.slice(0, 1)}${zodKeywordMapper.and(items.slice(1))}`\n }\n\n if (isKeyword(current, schemaKeywords.array)) {\n return zodKeywordMapper.array(\n sort(current.args.items)\n .map((it, _index, siblings) => {\n return parse({ schema, parent: current, name, current: it, siblings }, options)\n })\n .filter(Boolean),\n current.args.min,\n current.args.max,\n current.args.unique,\n )\n }\n\n if (isKeyword(current, schemaKeywords.enum)) {\n if (current.args.asConst) {\n if (current.args.items.length === 1) {\n const child = {\n keyword: schemaKeywords.const,\n args: current.args.items[0],\n }\n return parse({ schema, parent: current, name, current: child, siblings: [child] }, options)\n }\n\n return zodKeywordMapper.union(\n current.args.items\n .map((schema) => ({\n keyword: schemaKeywords.const,\n args: schema,\n }))\n .map((it, _index, siblings) => {\n return parse({ schema, parent: current, name, current: it, siblings }, options)\n })\n .filter(Boolean),\n )\n }\n\n return zodKeywordMapper.enum(\n current.args.items.map((schema) => {\n if (schema.format === 'boolean') {\n return transformers.stringify(schema.value)\n }\n\n if (schema.format === 'number') {\n return transformers.stringify(schema.value)\n }\n return transformers.stringify(schema.value)\n }),\n )\n }\n\n if (isKeyword(current, schemaKeywords.ref)) {\n // Skip z.lazy wrapper if skipLazyForRefs is true (e.g., inside v4 getters)\n if (options.skipLazyForRefs) {\n return current.args?.name\n }\n return zodKeywordMapper.ref(current.args?.name)\n }\n\n if (isKeyword(current, schemaKeywords.object)) {\n const propertyEntries = Object.entries(current.args?.properties || {}).filter((item) => {\n const schema = item[1]\n return schema && typeof schema.map === 'function'\n })\n\n const properties = propertyEntries\n .map(([propertyName, schemas]) => {\n const nameSchema = schemas.find((it) => it.keyword === schemaKeywords.name) as SchemaKeywordMapper['name']\n const isNullable = schemas.some((it) => isKeyword(it, schemaKeywords.nullable))\n const isNullish = schemas.some((it) => isKeyword(it, schemaKeywords.nullish))\n const isOptional = schemas.some((it) => isKeyword(it, schemaKeywords.optional))\n const hasRef = !!SchemaGenerator.find(schemas, schemaKeywords.ref)\n\n const mappedName = nameSchema?.args || propertyName\n\n // custom mapper(pluginOptions)\n if (options.mapper?.[mappedName]) {\n return `\"${propertyName}\": ${options.mapper?.[mappedName]}`\n }\n\n const baseSchemaOutput = sort(schemas)\n .filter((schema) => {\n return !isKeyword(schema, schemaKeywords.optional) && !isKeyword(schema, schemaKeywords.nullable) && !isKeyword(schema, schemaKeywords.nullish)\n })\n .map((it) => {\n // For v4 with refs, skip z.lazy wrapper since the getter provides lazy evaluation\n const skipLazyForRefs = options.version === '4' && hasRef\n return parse({ schema, parent: current, name, current: it, siblings: schemas }, { ...options, skipLazyForRefs })\n })\n .filter(Boolean)\n .join('')\n\n const objectValue = options.wrapOutput\n ? options.wrapOutput({ output: baseSchemaOutput, schema: schema?.properties?.[propertyName] }) || baseSchemaOutput\n : baseSchemaOutput\n\n if (options.version === '4' && hasRef) {\n // both optional and nullable\n if (isNullish) {\n return `get \"${propertyName}\"(){\n return ${objectValue}${zodKeywordMapper.nullish()}\n }`\n }\n\n // undefined\n if (isOptional) {\n return `get \"${propertyName}\"(){\n return ${objectValue}${zodKeywordMapper.optional()}\n }`\n }\n\n // null\n if (isNullable) {\n return `get \"${propertyName}\"(){\n return ${objectValue}${zodKeywordMapper.nullable()}\n }`\n }\n\n return `get \"${propertyName}\"(){\n return ${objectValue}\n }`\n }\n\n // both optional and nullable\n if (isNullish) {\n return `\"${propertyName}\": ${objectValue}${zodKeywordMapper.nullish()}`\n }\n\n // undefined\n if (isOptional) {\n return `\"${propertyName}\": ${zodKeywordMapper.optional(objectValue)}`\n }\n\n // null\n if (isNullable) {\n return `\"${propertyName}\": ${zodKeywordMapper.nullable(objectValue)}`\n }\n\n return `\"${propertyName}\": ${objectValue}`\n })\n .join(',\\n')\n\n const additionalProperties = current.args?.additionalProperties?.length\n ? current.args.additionalProperties\n .map((it, _index, siblings) => parse({ schema, parent: current, name, current: it, siblings }, options))\n .filter(Boolean)\n .join('')\n : undefined\n\n const text = [\n zodKeywordMapper.object(properties, current.args?.strict, options.version),\n additionalProperties ? zodKeywordMapper.catchall(additionalProperties) : undefined,\n ].filter(Boolean)\n\n return text.join('')\n }\n\n if (isKeyword(current, schemaKeywords.tuple)) {\n return zodKeywordMapper.tuple(\n current.args.items.map((it, _index, siblings) => parse({ schema, parent: current, name, current: it, siblings }, options)).filter(Boolean),\n )\n }\n\n if (isKeyword(current, schemaKeywords.const)) {\n if (current.args.format === 'number' && current.args.value !== undefined) {\n return zodKeywordMapper.const(Number(current.args.value))\n }\n\n if (current.args.format === 'boolean' && current.args.value !== undefined) {\n return zodKeywordMapper.const(current.args.value)\n }\n return zodKeywordMapper.const(transformers.stringify(current.args.value))\n }\n\n if (isKeyword(current, schemaKeywords.matches)) {\n if (current.args) {\n return zodKeywordMapper.matches(transformers.toRegExpString(current.args, null), shouldCoerce(options.coercion, 'strings'))\n }\n }\n\n if (isKeyword(current, schemaKeywords.default)) {\n if (current.args) {\n return zodKeywordMapper.default(current.args)\n }\n }\n\n if (isKeyword(current, schemaKeywords.describe)) {\n if (current.args) {\n return zodKeywordMapper.describe(transformers.stringify(current.args.toString()))\n }\n }\n\n if (isKeyword(current, schemaKeywords.string)) {\n const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min)\n const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max)\n\n return zodKeywordMapper.string(shouldCoerce(options.coercion, 'strings'), minSchema?.args, maxSchema?.args)\n }\n\n if (isKeyword(current, schemaKeywords.uuid)) {\n return zodKeywordMapper.uuid(shouldCoerce(options.coercion, 'strings'), options.version)\n }\n\n if (isKeyword(current, schemaKeywords.email)) {\n const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min)\n const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max)\n\n return zodKeywordMapper.email(shouldCoerce(options.coercion, 'strings'), options.version, minSchema?.args, maxSchema?.args)\n }\n\n if (isKeyword(current, schemaKeywords.url)) {\n const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min)\n const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max)\n\n return zodKeywordMapper.url(shouldCoerce(options.coercion, 'strings'), options.version, minSchema?.args, maxSchema?.args)\n }\n\n if (isKeyword(current, schemaKeywords.number)) {\n const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min)\n const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max)\n\n const exclusiveMinimumSchema = SchemaGenerator.find(siblings, schemaKeywords.exclusiveMinimum)\n const exclusiveMaximumSchema = SchemaGenerator.find(siblings, schemaKeywords.exclusiveMaximum)\n return zodKeywordMapper.number(\n shouldCoerce(options.coercion, 'numbers'),\n minSchema?.args,\n maxSchema?.args,\n exclusiveMinimumSchema?.args,\n exclusiveMaximumSchema?.args,\n )\n }\n\n if (isKeyword(current, schemaKeywords.integer)) {\n const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min)\n const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max)\n\n const exclusiveMinimumSchema = SchemaGenerator.find(siblings, schemaKeywords.exclusiveMinimum)\n const exclusiveMaximumSchema = SchemaGenerator.find(siblings, schemaKeywords.exclusiveMaximum)\n return zodKeywordMapper.integer(\n shouldCoerce(options.coercion, 'numbers'),\n minSchema?.args,\n maxSchema?.args,\n options.version,\n exclusiveMinimumSchema?.args,\n exclusiveMaximumSchema?.args,\n )\n }\n\n if (isKeyword(current, schemaKeywords.datetime)) {\n return zodKeywordMapper.datetime(current.args.offset, current.args.local, options.version)\n }\n\n if (isKeyword(current, schemaKeywords.date)) {\n return zodKeywordMapper.date(current.args.type, shouldCoerce(options.coercion, 'dates'), options.version)\n }\n\n if (isKeyword(current, schemaKeywords.time)) {\n return zodKeywordMapper.time(current.args.type, shouldCoerce(options.coercion, 'dates'), options.version)\n }\n\n if (current.keyword in zodKeywordMapper && 'args' in current) {\n const value = zodKeywordMapper[current.keyword as keyof typeof zodKeywordMapper] as (typeof zodKeywordMapper)['const']\n\n return value((current as SchemaKeywordBase<unknown>).args as any)\n }\n\n if (current.keyword in zodKeywordMapper) {\n return value()\n }\n\n return undefined\n}\n","import transformers from '@kubb/core/transformers'\nimport type { SchemaObject } from '@kubb/oas'\nimport { isKeyword, type Schema, SchemaGenerator, schemaKeywords } from '@kubb/plugin-oas'\nimport { Const, File, Type } from '@kubb/react-fabric'\nimport type { KubbNode } from '@kubb/react-fabric/types'\nimport * as parserZod from '../parser.ts'\nimport type { PluginZod } from '../types.ts'\n\ntype Props = {\n name: string\n typeName?: string\n inferTypeName?: string\n tree: Array<Schema>\n schema: SchemaObject\n description?: string\n coercion: PluginZod['resolvedOptions']['coercion']\n mapper: PluginZod['resolvedOptions']['mapper']\n keysToOmit?: string[]\n wrapOutput?: PluginZod['resolvedOptions']['wrapOutput']\n version: '3' | '4'\n emptySchemaType: PluginZod['resolvedOptions']['emptySchemaType']\n}\n\nexport function Zod({\n name,\n typeName,\n tree,\n schema,\n inferTypeName,\n mapper,\n coercion,\n keysToOmit,\n description,\n wrapOutput,\n version,\n emptySchemaType,\n}: Props): KubbNode {\n const hasTuple = !!SchemaGenerator.find(tree, schemaKeywords.tuple)\n\n const schemas = parserZod.sort(tree).filter((item) => {\n if (hasTuple && (isKeyword(item, schemaKeywords.min) || isKeyword(item, schemaKeywords.max))) {\n return false\n }\n\n return true\n })\n\n const output = schemas\n .map((schema, index) => {\n const siblings = schemas.filter((_, i) => i !== index)\n\n return parserZod.parse({ schema, parent: undefined, current: schema, siblings, name }, { mapper, coercion, wrapOutput, version })\n })\n .filter(Boolean)\n .join('')\n\n let suffix = ''\n const firstSchema = schemas.at(0)\n const lastSchema = schemas.at(-1)\n\n if (lastSchema && isKeyword(lastSchema, schemaKeywords.nullable)) {\n if (firstSchema && isKeyword(firstSchema, schemaKeywords.ref)) {\n if (version === '3') {\n suffix = '.unwrap().schema.unwrap()'\n } else {\n suffix = '.unwrap().unwrap()'\n }\n } else {\n suffix = '.unwrap()'\n }\n } else {\n if (firstSchema && isKeyword(firstSchema, schemaKeywords.ref)) {\n if (version === '3') {\n suffix = '.schema'\n } else {\n suffix = '.unwrap()'\n }\n }\n }\n\n const emptyValue = parserZod.parse(\n {\n schema,\n parent: undefined,\n current: {\n keyword: schemaKeywords[emptySchemaType],\n },\n siblings: [],\n },\n { mapper, coercion, wrapOutput, version },\n )\n\n const baseSchemaOutput =\n [output, keysToOmit?.length ? `${suffix}.omit({ ${keysToOmit.map((key) => `'${key}': true`).join(',')} })` : undefined].filter(Boolean).join('') ||\n emptyValue ||\n ''\n const wrappedSchemaOutput = wrapOutput ? wrapOutput({ output: baseSchemaOutput, schema }) || baseSchemaOutput : baseSchemaOutput\n const finalOutput = typeName ? `${wrappedSchemaOutput} as unknown as ${version === '4' ? 'z.ZodType' : 'ToZod'}<${typeName}>` : wrappedSchemaOutput\n\n return (\n <>\n <File.Source name={name} isExportable isIndexable>\n <Const\n export\n name={name}\n JSDoc={{\n comments: [description ? `@description ${transformers.jsStringEscape(description)}` : undefined].filter(Boolean),\n }}\n >\n {finalOutput}\n </Const>\n </File.Source>\n {inferTypeName && (\n <File.Source name={inferTypeName} isExportable isIndexable isTypeOnly>\n {typeName && (\n <Type export name={inferTypeName}>\n {typeName}\n </Type>\n )}\n {!typeName && (\n <Type export name={inferTypeName}>\n {`z.infer<typeof ${name}>`}\n </Type>\n )}\n </File.Source>\n )}\n </>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"components-CVRd05if.cjs","names":["File","Type","Const","transformers","order: string[]","schemaKeywords","transformers","schema","hasRef","SchemaGenerator","value","SchemaGenerator","schemaKeywords","parserZod.sort","parserZod.parse","schema","File","Const","transformers","Type"],"sources":["../src/components/Operations.tsx","../src/parser.ts","../src/components/Zod.tsx"],"sourcesContent":["import transformers from '@kubb/core/transformers'\nimport type { HttpMethod, Operation } from '@kubb/oas'\nimport type { SchemaNames } from '@kubb/plugin-oas/hooks'\nimport { Const, File, Type } from '@kubb/react-fabric'\nimport type { KubbNode } from '@kubb/react-fabric/types'\n\ntype Props = {\n name: string\n operations: Array<{ operation: Operation; data: SchemaNames }>\n}\n\nexport function Operations({ name, operations }: Props): KubbNode {\n const operationsJSON = operations.reduce(\n (prev, acc) => {\n prev[`\"${acc.operation.getOperationId()}\"`] = acc.data\n\n return prev\n },\n {} as Record<string, unknown>,\n )\n\n const pathsJSON = operations.reduce(\n (prev, acc) => {\n prev[`\"${acc.operation.path}\"`] = {\n ...(prev[`\"${acc.operation.path}\"`] || ({} as Record<HttpMethod, string>)),\n [acc.operation.method]: `operations[\"${acc.operation.getOperationId()}\"]`,\n }\n\n return prev\n },\n {} as Record<string, Record<HttpMethod, string>>,\n )\n\n return (\n <>\n <File.Source name=\"OperationSchema\" isExportable isIndexable>\n <Type name=\"OperationSchema\" export>{`{\n readonly request: z.ZodTypeAny | undefined;\n readonly parameters: {\n readonly path: z.ZodTypeAny | undefined;\n readonly query: z.ZodTypeAny | undefined;\n readonly header: z.ZodTypeAny | undefined;\n };\n readonly responses: {\n readonly [status: number]: z.ZodTypeAny;\n readonly default: z.ZodTypeAny;\n };\n readonly errors: {\n readonly [status: number]: z.ZodTypeAny;\n };\n}`}</Type>\n </File.Source>\n <File.Source name=\"OperationsMap\" isExportable isIndexable>\n <Type name=\"OperationsMap\" export>\n {'Record<string, OperationSchema>'}\n </Type>\n </File.Source>\n <File.Source name={name} isExportable isIndexable>\n <Const export name={name} asConst>\n {`{${transformers.stringifyObject(operationsJSON)}}`}\n </Const>\n </File.Source>\n <File.Source name={'paths'} isExportable isIndexable>\n <Const export name={'paths'} asConst>\n {`{${transformers.stringifyObject(pathsJSON)}}`}\n </Const>\n </File.Source>\n </>\n )\n}\n","import transformers from '@kubb/core/transformers'\n\nimport type { Schema, SchemaKeywordBase, SchemaMapper } from '@kubb/plugin-oas'\nimport { isKeyword, SchemaGenerator, type SchemaKeywordMapper, type SchemaTree, schemaKeywords } from '@kubb/plugin-oas'\n\n//TODO add zodKeywordMapper as function that returns 3 versions: v3, v4 and v4 mini, this can also be used to have the custom mapping(see object type)\n// also include shouldCoerce\n\nconst zodKeywordMapper = {\n any: () => 'z.any()',\n unknown: () => 'z.unknown()',\n void: () => 'z.void()',\n number: (coercion?: boolean, min?: number, max?: number, exclusiveMinimum?: number, exclusiveMaximum?: number) => {\n return [\n coercion ? 'z.coerce.number()' : 'z.number()',\n min !== undefined ? `.min(${min})` : undefined,\n max !== undefined ? `.max(${max})` : undefined,\n exclusiveMinimum !== undefined ? `.gt(${exclusiveMinimum})` : undefined,\n exclusiveMaximum !== undefined ? `.lt(${exclusiveMaximum})` : undefined,\n ]\n .filter(Boolean)\n .join('')\n },\n integer: (coercion?: boolean, min?: number, max?: number, version: '3' | '4' = '3', exclusiveMinimum?: number, exclusiveMaximum?: number) => {\n return [\n coercion ? 'z.coerce.number().int()' : version === '4' ? 'z.int()' : 'z.number().int()',\n min !== undefined ? `.min(${min})` : undefined,\n max !== undefined ? `.max(${max})` : undefined,\n exclusiveMinimum !== undefined ? `.gt(${exclusiveMinimum})` : undefined,\n exclusiveMaximum !== undefined ? `.lt(${exclusiveMaximum})` : undefined,\n ]\n .filter(Boolean)\n .join('')\n },\n interface: (value?: string, strict?: boolean) => {\n if (strict) {\n return `z.strictInterface({\n ${value}\n })`\n }\n return `z.interface({\n ${value}\n })`\n },\n object: (value?: string, strict?: boolean, version: '3' | '4' = '3') => {\n if (version === '4' && strict) {\n return `z.strictObject({\n ${value}\n })`\n }\n\n if (strict) {\n return `z.object({\n ${value}\n }).strict()`\n }\n\n return `z.object({\n ${value}\n })`\n },\n string: (coercion?: boolean, min?: number, max?: number) => {\n return [coercion ? 'z.coerce.string()' : 'z.string()', min !== undefined ? `.min(${min})` : undefined, max !== undefined ? `.max(${max})` : undefined]\n .filter(Boolean)\n .join('')\n },\n //support for discriminatedUnion\n boolean: () => 'z.boolean()',\n undefined: () => 'z.undefined()',\n nullable: (value?: string) => {\n if (value) {\n return `z.nullable(${value})`\n }\n return '.nullable()'\n },\n null: () => 'z.null()',\n nullish: (value?: string) => {\n if (value) {\n return `z.nullish(${value})`\n }\n return '.nullish()'\n },\n array: (items: string[] = [], min?: number, max?: number, unique?: boolean) => {\n return [\n `z.array(${items?.join('')})`,\n min !== undefined ? `.min(${min})` : undefined,\n max !== undefined ? `.max(${max})` : undefined,\n unique ? `.refine(items => new Set(items).size === items.length, { message: \"Array entries must be unique\" })` : undefined,\n ]\n .filter(Boolean)\n .join('')\n },\n tuple: (items: string[] = []) => `z.tuple([${items?.join(', ')}])`,\n enum: (items: string[] = []) => `z.enum([${items?.join(', ')}])`,\n union: (items: string[] = []) => `z.union([${items?.join(', ')}])`,\n const: (value?: string | number | boolean) => `z.literal(${value ?? ''})`,\n /**\n * ISO 8601\n */\n datetime: (offset = false, local = false, version: '3' | '4' = '3') => {\n if (offset) {\n return version === '4' ? `z.iso.datetime({ offset: ${offset} })` : `z.string().datetime({ offset: ${offset} })`\n }\n\n if (local) {\n return version === '4' ? `z.iso.datetime({ local: ${local} })` : `z.string().datetime({ local: ${local} })`\n }\n\n return 'z.string().datetime()'\n },\n /**\n * Type `'date'` Date\n * Type `'string'` ISO date format (YYYY-MM-DD)\n * @default ISO date format (YYYY-MM-DD)\n */\n date: (type: 'date' | 'string' = 'string', coercion?: boolean, version: '3' | '4' = '3') => {\n if (type === 'string') {\n return version === '4' ? 'z.iso.date()' : 'z.string().date()'\n }\n\n if (coercion) {\n return 'z.coerce.date()'\n }\n\n return 'z.date()'\n },\n /**\n * Type `'date'` Date\n * Type `'string'` ISO time format (HH:mm:ss[.SSSSSS])\n * @default ISO time format (HH:mm:ss[.SSSSSS])\n */\n time: (type: 'date' | 'string' = 'string', coercion?: boolean, version: '3' | '4' = '3') => {\n if (type === 'string') {\n return version === '4' ? 'z.iso.time()' : 'z.string().time()'\n }\n\n if (coercion) {\n return 'z.coerce.date()'\n }\n\n return 'z.date()'\n },\n uuid: (coercion?: boolean, version: '3' | '4' = '3', min?: number, max?: number) => {\n return [\n coercion ? (version === '4' ? 'z.uuid()' : 'z.coerce.string().uuid()') : version === '4' ? 'z.uuid()' : 'z.string().uuid()',\n min !== undefined ? `.min(${min})` : undefined,\n max !== undefined ? `.max(${max})` : undefined,\n ]\n .filter(Boolean)\n .join('')\n },\n url: (coercion?: boolean, version: '3' | '4' = '3', min?: number, max?: number) => {\n return [\n coercion ? (version === '4' ? 'z.url()' : 'z.coerce.string().url()') : version === '4' ? 'z.url()' : 'z.string().url()',\n min !== undefined ? `.min(${min})` : undefined,\n max !== undefined ? `.max(${max})` : undefined,\n ]\n .filter(Boolean)\n .join('')\n },\n default: (value?: string | number | true | object) => {\n if (typeof value === 'object') {\n return '.default({})'\n }\n return `.default(${value ?? ''})`\n },\n and: (items: string[] = []) => items?.map((item) => `.and(${item})`).join(''),\n describe: (value = '') => `.describe(${value})`,\n max: undefined,\n min: undefined,\n optional: (value?: string) => {\n if (value) {\n return `z.optional(${value})`\n }\n return '.optional()'\n },\n matches: (value = '', coercion?: boolean) => (coercion ? `z.coerce.string().regex(${value})` : `z.string().regex(${value})`),\n email: (coercion?: boolean, version: '3' | '4' = '3', min?: number, max?: number) => {\n return [\n coercion ? (version === '4' ? 'z.email()' : 'z.coerce.string().email()') : version === '4' ? 'z.email()' : 'z.string().email()',\n min !== undefined ? `.min(${min})` : undefined,\n max !== undefined ? `.max(${max})` : undefined,\n ]\n .filter(Boolean)\n .join('')\n },\n firstName: undefined,\n lastName: undefined,\n password: undefined,\n phone: undefined,\n readOnly: undefined,\n writeOnly: undefined,\n ref: (value?: string) => {\n if (!value) {\n return undefined\n }\n\n return `z.lazy(() => ${value})`\n },\n blob: () => 'z.instanceof(File)',\n deprecated: undefined,\n example: undefined,\n schema: undefined,\n catchall: (value?: string) => (value ? `.catchall(${value})` : undefined),\n name: undefined,\n exclusiveMinimum: undefined,\n exclusiveMaximum: undefined,\n} satisfies SchemaMapper<string | null | undefined>\n\n/**\n * @link based on https://github.com/cellular/oazapfts/blob/7ba226ebb15374e8483cc53e7532f1663179a22c/src/codegen/generate.ts#L398\n */\n\nexport function sort(items?: Schema[]): Schema[] {\n const order: string[] = [\n schemaKeywords.string,\n schemaKeywords.datetime,\n schemaKeywords.date,\n schemaKeywords.time,\n schemaKeywords.tuple,\n schemaKeywords.number,\n schemaKeywords.object,\n schemaKeywords.enum,\n schemaKeywords.url,\n schemaKeywords.email,\n schemaKeywords.firstName,\n schemaKeywords.lastName,\n schemaKeywords.password,\n schemaKeywords.matches,\n schemaKeywords.uuid,\n schemaKeywords.null,\n schemaKeywords.min,\n schemaKeywords.max,\n schemaKeywords.default,\n schemaKeywords.describe,\n schemaKeywords.optional,\n schemaKeywords.nullable,\n schemaKeywords.nullish,\n ]\n\n if (!items) {\n return []\n }\n\n return transformers.orderBy(items, [(v) => order.indexOf(v.keyword)], ['asc'])\n}\n\nconst shouldCoerce = (coercion: ParserOptions['coercion'] | undefined, type: 'dates' | 'strings' | 'numbers'): boolean => {\n if (coercion === undefined) {\n return false\n }\n if (typeof coercion === 'boolean') {\n return coercion\n }\n\n return !!coercion[type]\n}\n\ntype ParserOptions = {\n mapper?: Record<string, string>\n coercion?: boolean | { dates?: boolean; strings?: boolean; numbers?: boolean }\n wrapOutput?: (opts: { output: string; schema: any }) => string | undefined\n version: '3' | '4'\n skipLazyForRefs?: boolean\n}\n\nexport function parse({ schema, parent, current, name, siblings }: SchemaTree, options: ParserOptions): string | undefined {\n const value = zodKeywordMapper[current.keyword as keyof typeof zodKeywordMapper]\n\n // Early exit: if siblings contain both matches and ref → skip matches entirely\n const hasMatches = siblings.some((it) => isKeyword(it, schemaKeywords.matches))\n const hasRef = siblings.some((it) => isKeyword(it, schemaKeywords.ref))\n\n if (hasMatches && hasRef && isKeyword(current, schemaKeywords.matches)) {\n return undefined // strip matches\n }\n\n if (!value) {\n return undefined\n }\n\n if (isKeyword(current, schemaKeywords.union)) {\n // zod union type needs at least 2 items\n if (Array.isArray(current.args) && current.args.length === 1) {\n return parse({ schema, parent, name, current: current.args[0] as Schema, siblings }, options)\n }\n if (Array.isArray(current.args) && !current.args.length) {\n return ''\n }\n\n return zodKeywordMapper.union(\n sort(current.args)\n .map((it, _index, siblings) => parse({ schema, parent: current, name, current: it, siblings }, options))\n .filter(Boolean),\n )\n }\n\n if (isKeyword(current, schemaKeywords.and)) {\n const items = sort(current.args)\n .filter((schema: Schema) => {\n return ![schemaKeywords.optional, schemaKeywords.describe].includes(schema.keyword as typeof schemaKeywords.describe)\n })\n .map((it: Schema, _index, siblings) => parse({ schema, parent: current, name, current: it, siblings }, options))\n .filter(Boolean)\n\n return `${items.slice(0, 1)}${zodKeywordMapper.and(items.slice(1))}`\n }\n\n if (isKeyword(current, schemaKeywords.array)) {\n return zodKeywordMapper.array(\n sort(current.args.items)\n .map((it, _index, siblings) => {\n return parse({ schema, parent: current, name, current: it, siblings }, options)\n })\n .filter(Boolean),\n current.args.min,\n current.args.max,\n current.args.unique,\n )\n }\n\n if (isKeyword(current, schemaKeywords.enum)) {\n if (current.args.asConst) {\n if (current.args.items.length === 1) {\n const child = {\n keyword: schemaKeywords.const,\n args: current.args.items[0],\n }\n return parse({ schema, parent: current, name, current: child, siblings: [child] }, options)\n }\n\n return zodKeywordMapper.union(\n current.args.items\n .map((schema) => ({\n keyword: schemaKeywords.const,\n args: schema,\n }))\n .map((it, _index, siblings) => {\n return parse({ schema, parent: current, name, current: it, siblings }, options)\n })\n .filter(Boolean),\n )\n }\n\n return zodKeywordMapper.enum(\n current.args.items.map((schema) => {\n if (schema.format === 'boolean') {\n return transformers.stringify(schema.value)\n }\n\n if (schema.format === 'number') {\n return transformers.stringify(schema.value)\n }\n return transformers.stringify(schema.value)\n }),\n )\n }\n\n if (isKeyword(current, schemaKeywords.ref)) {\n // Skip z.lazy wrapper if skipLazyForRefs is true (e.g., inside v4 getters)\n if (options.skipLazyForRefs) {\n return current.args?.name\n }\n return zodKeywordMapper.ref(current.args?.name)\n }\n\n if (isKeyword(current, schemaKeywords.object)) {\n const propertyEntries = Object.entries(current.args?.properties || {}).filter((item) => {\n const schema = item[1]\n return schema && typeof schema.map === 'function'\n })\n\n const properties = propertyEntries\n .map(([propertyName, schemas]) => {\n const nameSchema = schemas.find((it) => it.keyword === schemaKeywords.name) as SchemaKeywordMapper['name']\n const isNullable = schemas.some((it) => isKeyword(it, schemaKeywords.nullable))\n const isNullish = schemas.some((it) => isKeyword(it, schemaKeywords.nullish))\n const isOptional = schemas.some((it) => isKeyword(it, schemaKeywords.optional))\n const hasRef = !!SchemaGenerator.find(schemas, schemaKeywords.ref)\n\n const mappedName = nameSchema?.args || propertyName\n\n // custom mapper(pluginOptions)\n if (options.mapper?.[mappedName]) {\n return `\"${propertyName}\": ${options.mapper?.[mappedName]}`\n }\n\n const baseSchemaOutput = sort(schemas)\n .filter((schema) => {\n return !isKeyword(schema, schemaKeywords.optional) && !isKeyword(schema, schemaKeywords.nullable) && !isKeyword(schema, schemaKeywords.nullish)\n })\n .map((it) => {\n // For v4 with refs, skip z.lazy wrapper since the getter provides lazy evaluation\n const skipLazyForRefs = options.version === '4' && hasRef\n return parse({ schema, parent: current, name, current: it, siblings: schemas }, { ...options, skipLazyForRefs })\n })\n .filter(Boolean)\n .join('')\n\n const objectValue = options.wrapOutput\n ? options.wrapOutput({ output: baseSchemaOutput, schema: schema?.properties?.[propertyName] }) || baseSchemaOutput\n : baseSchemaOutput\n\n if (options.version === '4' && hasRef) {\n // both optional and nullable\n if (isNullish) {\n return `get \"${propertyName}\"(){\n return ${objectValue}${zodKeywordMapper.nullish()}\n }`\n }\n\n // undefined\n if (isOptional) {\n return `get \"${propertyName}\"(){\n return ${objectValue}${zodKeywordMapper.optional()}\n }`\n }\n\n // null\n if (isNullable) {\n return `get \"${propertyName}\"(){\n return ${objectValue}${zodKeywordMapper.nullable()}\n }`\n }\n\n return `get \"${propertyName}\"(){\n return ${objectValue}\n }`\n }\n\n // both optional and nullable\n if (isNullish) {\n return `\"${propertyName}\": ${objectValue}${zodKeywordMapper.nullish()}`\n }\n\n // undefined\n if (isOptional) {\n return `\"${propertyName}\": ${zodKeywordMapper.optional(objectValue)}`\n }\n\n // null\n if (isNullable) {\n return `\"${propertyName}\": ${zodKeywordMapper.nullable(objectValue)}`\n }\n\n return `\"${propertyName}\": ${objectValue}`\n })\n .join(',\\n')\n\n const additionalProperties = current.args?.additionalProperties?.length\n ? current.args.additionalProperties\n .map((it, _index, siblings) => parse({ schema, parent: current, name, current: it, siblings }, options))\n .filter(Boolean)\n .join('')\n : undefined\n\n const text = [\n zodKeywordMapper.object(properties, current.args?.strict, options.version),\n additionalProperties ? zodKeywordMapper.catchall(additionalProperties) : undefined,\n ].filter(Boolean)\n\n return text.join('')\n }\n\n if (isKeyword(current, schemaKeywords.tuple)) {\n return zodKeywordMapper.tuple(\n current.args.items.map((it, _index, siblings) => parse({ schema, parent: current, name, current: it, siblings }, options)).filter(Boolean),\n )\n }\n\n if (isKeyword(current, schemaKeywords.const)) {\n if (current.args.format === 'number' && current.args.value !== undefined) {\n return zodKeywordMapper.const(Number(current.args.value))\n }\n\n if (current.args.format === 'boolean' && current.args.value !== undefined) {\n return zodKeywordMapper.const(current.args.value)\n }\n return zodKeywordMapper.const(transformers.stringify(current.args.value))\n }\n\n if (isKeyword(current, schemaKeywords.matches)) {\n if (current.args) {\n return zodKeywordMapper.matches(transformers.toRegExpString(current.args, null), shouldCoerce(options.coercion, 'strings'))\n }\n }\n\n if (isKeyword(current, schemaKeywords.default)) {\n if (current.args) {\n return zodKeywordMapper.default(current.args)\n }\n }\n\n if (isKeyword(current, schemaKeywords.describe)) {\n if (current.args) {\n return zodKeywordMapper.describe(transformers.stringify(current.args.toString()))\n }\n }\n\n if (isKeyword(current, schemaKeywords.string)) {\n const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min)\n const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max)\n\n return zodKeywordMapper.string(shouldCoerce(options.coercion, 'strings'), minSchema?.args, maxSchema?.args)\n }\n\n if (isKeyword(current, schemaKeywords.uuid)) {\n return zodKeywordMapper.uuid(shouldCoerce(options.coercion, 'strings'), options.version)\n }\n\n if (isKeyword(current, schemaKeywords.email)) {\n const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min)\n const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max)\n\n return zodKeywordMapper.email(shouldCoerce(options.coercion, 'strings'), options.version, minSchema?.args, maxSchema?.args)\n }\n\n if (isKeyword(current, schemaKeywords.url)) {\n const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min)\n const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max)\n\n return zodKeywordMapper.url(shouldCoerce(options.coercion, 'strings'), options.version, minSchema?.args, maxSchema?.args)\n }\n\n if (isKeyword(current, schemaKeywords.number)) {\n const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min)\n const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max)\n\n const exclusiveMinimumSchema = SchemaGenerator.find(siblings, schemaKeywords.exclusiveMinimum)\n const exclusiveMaximumSchema = SchemaGenerator.find(siblings, schemaKeywords.exclusiveMaximum)\n return zodKeywordMapper.number(\n shouldCoerce(options.coercion, 'numbers'),\n minSchema?.args,\n maxSchema?.args,\n exclusiveMinimumSchema?.args,\n exclusiveMaximumSchema?.args,\n )\n }\n\n if (isKeyword(current, schemaKeywords.integer)) {\n const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min)\n const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max)\n\n const exclusiveMinimumSchema = SchemaGenerator.find(siblings, schemaKeywords.exclusiveMinimum)\n const exclusiveMaximumSchema = SchemaGenerator.find(siblings, schemaKeywords.exclusiveMaximum)\n return zodKeywordMapper.integer(\n shouldCoerce(options.coercion, 'numbers'),\n minSchema?.args,\n maxSchema?.args,\n options.version,\n exclusiveMinimumSchema?.args,\n exclusiveMaximumSchema?.args,\n )\n }\n\n if (isKeyword(current, schemaKeywords.datetime)) {\n return zodKeywordMapper.datetime(current.args.offset, current.args.local, options.version)\n }\n\n if (isKeyword(current, schemaKeywords.date)) {\n return zodKeywordMapper.date(current.args.type, shouldCoerce(options.coercion, 'dates'), options.version)\n }\n\n if (isKeyword(current, schemaKeywords.time)) {\n return zodKeywordMapper.time(current.args.type, shouldCoerce(options.coercion, 'dates'), options.version)\n }\n\n if (current.keyword in zodKeywordMapper && 'args' in current) {\n const value = zodKeywordMapper[current.keyword as keyof typeof zodKeywordMapper] as (typeof zodKeywordMapper)['const']\n\n return value((current as SchemaKeywordBase<unknown>).args as any)\n }\n\n if (current.keyword in zodKeywordMapper) {\n return value()\n }\n\n return undefined\n}\n","import transformers from '@kubb/core/transformers'\nimport type { SchemaObject } from '@kubb/oas'\nimport { isKeyword, type Schema, SchemaGenerator, schemaKeywords } from '@kubb/plugin-oas'\nimport { Const, File, Type } from '@kubb/react-fabric'\nimport type { KubbNode } from '@kubb/react-fabric/types'\nimport * as parserZod from '../parser.ts'\nimport type { PluginZod } from '../types.ts'\n\ntype Props = {\n name: string\n typeName?: string\n inferTypeName?: string\n tree: Array<Schema>\n schema: SchemaObject\n description?: string\n coercion: PluginZod['resolvedOptions']['coercion']\n mapper: PluginZod['resolvedOptions']['mapper']\n keysToOmit?: string[]\n wrapOutput?: PluginZod['resolvedOptions']['wrapOutput']\n version: '3' | '4'\n emptySchemaType: PluginZod['resolvedOptions']['emptySchemaType']\n}\n\nexport function Zod({\n name,\n typeName,\n tree,\n schema,\n inferTypeName,\n mapper,\n coercion,\n keysToOmit,\n description,\n wrapOutput,\n version,\n emptySchemaType,\n}: Props): KubbNode {\n const hasTuple = !!SchemaGenerator.find(tree, schemaKeywords.tuple)\n\n const schemas = parserZod.sort(tree).filter((item) => {\n if (hasTuple && (isKeyword(item, schemaKeywords.min) || isKeyword(item, schemaKeywords.max))) {\n return false\n }\n\n return true\n })\n\n const output = schemas\n .map((schema, index) => {\n const siblings = schemas.filter((_, i) => i !== index)\n\n return parserZod.parse({ schema, parent: undefined, current: schema, siblings, name }, { mapper, coercion, wrapOutput, version })\n })\n .filter(Boolean)\n .join('')\n\n let suffix = ''\n const firstSchema = schemas.at(0)\n const lastSchema = schemas.at(-1)\n\n if (lastSchema && isKeyword(lastSchema, schemaKeywords.nullable)) {\n if (firstSchema && isKeyword(firstSchema, schemaKeywords.ref)) {\n if (version === '3') {\n suffix = '.unwrap().schema.unwrap()'\n } else {\n suffix = '.unwrap().unwrap()'\n }\n } else {\n suffix = '.unwrap()'\n }\n } else {\n if (firstSchema && isKeyword(firstSchema, schemaKeywords.ref)) {\n if (version === '3') {\n suffix = '.schema'\n } else {\n suffix = '.unwrap()'\n }\n }\n }\n\n const emptyValue = parserZod.parse(\n {\n schema,\n parent: undefined,\n current: {\n keyword: schemaKeywords[emptySchemaType],\n },\n siblings: [],\n },\n { mapper, coercion, wrapOutput, version },\n )\n\n const baseSchemaOutput =\n [output, keysToOmit?.length ? `${suffix}.omit({ ${keysToOmit.map((key) => `'${key}': true`).join(',')} })` : undefined].filter(Boolean).join('') ||\n emptyValue ||\n ''\n const wrappedSchemaOutput = wrapOutput ? wrapOutput({ output: baseSchemaOutput, schema }) || baseSchemaOutput : baseSchemaOutput\n const finalOutput = typeName ? `${wrappedSchemaOutput} as unknown as ${version === '4' ? 'z.ZodType' : 'ToZod'}<${typeName}>` : wrappedSchemaOutput\n\n return (\n <>\n <File.Source name={name} isExportable isIndexable>\n <Const\n export\n name={name}\n JSDoc={{\n comments: [description ? `@description ${transformers.jsStringEscape(description)}` : undefined].filter(Boolean),\n }}\n >\n {finalOutput}\n </Const>\n </File.Source>\n {inferTypeName && (\n <File.Source name={inferTypeName} isExportable isIndexable isTypeOnly>\n {typeName && (\n <Type export name={inferTypeName}>\n {typeName}\n </Type>\n )}\n {!typeName && (\n <Type export name={inferTypeName}>\n {`z.infer<typeof ${name}>`}\n </Type>\n )}\n </File.Source>\n )}\n </>\n )\n}\n"],"mappings":"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"}
|