|
1 | 1 | import { z } from 'zod' |
2 | 2 | import type { Showable } from '@traversable/registry' |
3 | | -import { has, Number_isNatural, Object_entries, parseKey } from '@traversable/registry' |
| 3 | +import { has, Number_isNatural, Object_entries, parseKey, escape } from '@traversable/registry' |
4 | 4 | import type { Options as v4_Options } from '@traversable/zod-types' |
5 | | -import { defaults as v4_defaults, tagged, serializeShort, Ctx, F, Z, Warn } from '@traversable/zod-types' |
| 5 | +import { defaults as v4_defaults, tagged, serializeShort, Ctx, F, Z } from '@traversable/zod-types' |
6 | 6 |
|
7 | 7 | export interface Options extends v4_Options {} |
8 | 8 | export interface Config extends Required<Options> {} |
@@ -140,7 +140,9 @@ export function toString(schema: z.ZodType | z.core.$ZodType, options?: toString |
140 | 140 | case tagged('array')(x): return `${z}.array(${x._zod.def.element})${applyArrayConstraints(x)}` |
141 | 141 | case tagged('record')(x): return `${z}.record(${x._zod.def.keyType}, ${x._zod.def.valueType})` |
142 | 142 | case tagged('intersection')(x): return `${z}.intersection(${x._zod.def.left}, ${x._zod.def.right})` |
143 | | - case tagged('union')(x): return `${z}.union([${x._zod.def.options.join(',')}])` |
| 143 | + case tagged('union')(x): return x._zod.def.discriminator === undefined |
| 144 | + ? `${z}.union([${x._zod.def.options.join(',')}])` |
| 145 | + : `${z}.discriminatedUnion(["${escape(x._zod.def.discriminator)}", ${x._zod.def.options.join(',')}])` |
144 | 146 | case tagged('lazy')(x): return `${z}.lazy(() => ${x._zod.def.getter()})` |
145 | 147 | case tagged('pipe')(x): return `${x._zod.def.in}.pipe(${x._zod.def.out})` |
146 | 148 | case tagged('default')(x): return `${x._zod.def.innerType}.default(${serializeShort(x._zod.def.defaultValue!)})` |
|
0 commit comments