zod-compiler 1.23.5 → 1.23.7

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 (103) hide show
  1. package/README.md +10 -7
  2. package/dist/core/codegen/build-path.d.ts.map +1 -1
  3. package/dist/core/codegen/build-path.js +69 -10
  4. package/dist/core/codegen/build-path.js.map +1 -1
  5. package/dist/core/codegen/context.d.ts +23 -3
  6. package/dist/core/codegen/context.d.ts.map +1 -1
  7. package/dist/core/codegen/context.js +23 -1
  8. package/dist/core/codegen/context.js.map +1 -1
  9. package/dist/core/codegen/dedupe.js +4 -1
  10. package/dist/core/codegen/dedupe.js.map +1 -1
  11. package/dist/core/codegen/emit-issue.d.ts +27 -2
  12. package/dist/core/codegen/emit-issue.d.ts.map +1 -1
  13. package/dist/core/codegen/emit-issue.js +8 -3
  14. package/dist/core/codegen/emit-issue.js.map +1 -1
  15. package/dist/core/codegen/issue-decls.d.ts +9 -3
  16. package/dist/core/codegen/issue-decls.d.ts.map +1 -1
  17. package/dist/core/codegen/issue-decls.js +10 -4
  18. package/dist/core/codegen/issue-decls.js.map +1 -1
  19. package/dist/core/codegen/schemas/catch.d.ts.map +1 -1
  20. package/dist/core/codegen/schemas/catch.js +1 -1
  21. package/dist/core/codegen/schemas/catch.js.map +1 -1
  22. package/dist/core/codegen/schemas/discriminated-union.d.ts.map +1 -1
  23. package/dist/core/codegen/schemas/discriminated-union.js +11 -3
  24. package/dist/core/codegen/schemas/discriminated-union.js.map +1 -1
  25. package/dist/core/codegen/schemas/effect.d.ts +2 -2
  26. package/dist/core/codegen/schemas/effect.d.ts.map +1 -1
  27. package/dist/core/codegen/schemas/effect.js +15 -2
  28. package/dist/core/codegen/schemas/effect.js.map +1 -1
  29. package/dist/core/codegen/schemas/enum.d.ts.map +1 -1
  30. package/dist/core/codegen/schemas/enum.js +25 -0
  31. package/dist/core/codegen/schemas/enum.js.map +1 -1
  32. package/dist/core/codegen/schemas/literal.d.ts.map +1 -1
  33. package/dist/core/codegen/schemas/literal.js +37 -3
  34. package/dist/core/codegen/schemas/literal.js.map +1 -1
  35. package/dist/core/codegen/schemas/string-bool.d.ts.map +1 -1
  36. package/dist/core/codegen/schemas/string-bool.js +3 -2
  37. package/dist/core/codegen/schemas/string-bool.js.map +1 -1
  38. package/dist/core/codegen/schemas/string.d.ts.map +1 -1
  39. package/dist/core/codegen/schemas/string.js +13 -7
  40. package/dist/core/codegen/schemas/string.js.map +1 -1
  41. package/dist/core/codegen/schemas/template-literal.d.ts.map +1 -1
  42. package/dist/core/codegen/schemas/template-literal.js +2 -2
  43. package/dist/core/codegen/schemas/template-literal.js.map +1 -1
  44. package/dist/core/codegen/schemas/tuple.d.ts +11 -5
  45. package/dist/core/codegen/schemas/tuple.d.ts.map +1 -1
  46. package/dist/core/codegen/schemas/tuple.js +12 -6
  47. package/dist/core/codegen/schemas/tuple.js.map +1 -1
  48. package/dist/core/codegen/schemas/union.d.ts.map +1 -1
  49. package/dist/core/codegen/schemas/union.js +17 -17
  50. package/dist/core/codegen/schemas/union.js.map +1 -1
  51. package/dist/core/extract/checks.d.ts +18 -2
  52. package/dist/core/extract/checks.d.ts.map +1 -1
  53. package/dist/core/extract/checks.js +138 -11
  54. package/dist/core/extract/checks.js.map +1 -1
  55. package/dist/core/extract/effects.d.ts +7 -1
  56. package/dist/core/extract/effects.d.ts.map +1 -1
  57. package/dist/core/extract/effects.js +24 -1
  58. package/dist/core/extract/effects.js.map +1 -1
  59. package/dist/core/extract/extractors/array.d.ts.map +1 -1
  60. package/dist/core/extract/extractors/array.js +2 -2
  61. package/dist/core/extract/extractors/array.js.map +1 -1
  62. package/dist/core/extract/extractors/intersection.js +44 -0
  63. package/dist/core/extract/extractors/intersection.js.map +1 -1
  64. package/dist/core/extract/extractors/lazy.d.ts.map +1 -1
  65. package/dist/core/extract/extractors/lazy.js +2 -13
  66. package/dist/core/extract/extractors/lazy.js.map +1 -1
  67. package/dist/core/extract/extractors/literal.d.ts +14 -0
  68. package/dist/core/extract/extractors/literal.d.ts.map +1 -1
  69. package/dist/core/extract/extractors/literal.js +32 -4
  70. package/dist/core/extract/extractors/literal.js.map +1 -1
  71. package/dist/core/extract/extractors/number.d.ts.map +1 -1
  72. package/dist/core/extract/extractors/number.js +2 -2
  73. package/dist/core/extract/extractors/number.js.map +1 -1
  74. package/dist/core/extract/extractors/object.d.ts.map +1 -1
  75. package/dist/core/extract/extractors/object.js +2 -2
  76. package/dist/core/extract/extractors/object.js.map +1 -1
  77. package/dist/core/extract/extractors/pipe.d.ts.map +1 -1
  78. package/dist/core/extract/extractors/pipe.js +24 -1
  79. package/dist/core/extract/extractors/pipe.js.map +1 -1
  80. package/dist/core/extract/extractors/record.d.ts.map +1 -1
  81. package/dist/core/extract/extractors/record.js +2 -0
  82. package/dist/core/extract/extractors/record.js.map +1 -1
  83. package/dist/core/extract/extractors/string.d.ts.map +1 -1
  84. package/dist/core/extract/extractors/string.js +2 -2
  85. package/dist/core/extract/extractors/string.js.map +1 -1
  86. package/dist/core/extract/extractors/union.js +2 -0
  87. package/dist/core/extract/extractors/union.js.map +1 -1
  88. package/dist/core/extract/recursion.d.ts +26 -0
  89. package/dist/core/extract/recursion.d.ts.map +1 -0
  90. package/dist/core/extract/recursion.js +37 -0
  91. package/dist/core/extract/recursion.js.map +1 -0
  92. package/dist/core/extract/registry.d.ts.map +1 -1
  93. package/dist/core/extract/registry.js +2 -0
  94. package/dist/core/extract/registry.js.map +1 -1
  95. package/dist/core/extract/types.d.ts +21 -6
  96. package/dist/core/extract/types.d.ts.map +1 -1
  97. package/dist/core/iife.d.ts +13 -0
  98. package/dist/core/iife.d.ts.map +1 -1
  99. package/dist/core/iife.js +14 -1
  100. package/dist/core/iife.js.map +1 -1
  101. package/dist/core/types.d.ts +60 -3
  102. package/dist/core/types.d.ts.map +1 -1
  103. package/package.json +1 -1
package/README.md CHANGED
@@ -375,10 +375,10 @@ A schema delegates to Zod when it reaches JavaScript the generated code cannot r
375
375
  | Overlapping or policy-sensitive object intersections | Zod's independent parse-and-merge semantics cannot be safely collapsed |
376
376
  | Dynamic error maps, unresolvable `z.lazy()` | Not knowable at build time |
377
377
 
378
- Everything else compiles, including `transform`/`refine`/`superRefine` whether or not the callback
379
- captures — a zero-capture one is inlined, a capturing one called by reference. Delegation is
380
- per-sub-schema: one uncompilable field goes to Zod, not the whole object. Run `zod-compiler check` to
381
- see what compiled.
378
+ Everything else compiles, including context-free `preprocess` callbacks and
379
+ `transform`/`refine`/`superRefine` whether or not the callback captures — a zero-capture one is inlined,
380
+ a capturing one called by reference. Delegation is per-sub-schema: one uncompilable field goes to Zod,
381
+ not the whole object. Run `zod-compiler check` to see what compiled.
382
382
 
383
383
  ### Behavioral Differences from Zod
384
384
 
@@ -437,6 +437,8 @@ Schema-level `error` and `z.config()` maps are unaffected; for a per-call map us
437
437
  | object with superRefine (cross-field) | 1.6M | 2.3M | **11.6M** | — | — | 5.0x |
438
438
  | coerced query object (valid) | 1.9M | 2.3M | **5.2M** | — | — | 2.2x |
439
439
  | coerced query object (invalid) | 1.1M | 162K | **10.1M** | — | — | **62x** |
440
+ | preprocessed query object (valid) | 426K | 1.6M | **5.3M** | — | — | 3.4x |
441
+ | preprocessed query object (invalid) | 387K | 149K | **12.4M** | — | — | **84x** |
440
442
  | stringbool config object (valid) | — | 1.9M | **6.0M** | — | — | 3.1x |
441
443
  | stringbool config object (invalid) | — | 129K | **13.1M** | — | — | **101x** |
442
444
  | custom/instanceof request (valid) | 894K | 3.0M | **8.6M** | — | — | 2.9x |
@@ -466,9 +468,10 @@ idioms (array size checks, `.refine()`, `.default()`, `.trim()`, `.transform()`)
466
468
  Regexes are pre-compiled with bounded repeats unrolled, checks run cheapest-first, discriminated unions
467
469
  dispatch through a jump table (plain tagged unions are auto-discriminated into it), and oversized check
468
470
  functions are split to stay within V8's optimizer budget. Stripping objects, native coercions,
469
- `stringbool`, defaults, string rewrites and synchronous transforms validate and build their output in
470
- one pass. An intersection of two objects with disjoint keys compiles to that same single pass over the
471
- merged shape, and `z.custom()` / `z.instanceof()` compile to a direct predicate call.
471
+ `stringbool`, defaults, string rewrites, context-free preprocessors and synchronous transforms validate
472
+ and build their output in one pass. An intersection of two objects with disjoint keys compiles to that
473
+ same single pass over the merged shape, and `z.custom()` / `z.instanceof()` compile to a direct predicate
474
+ call.
472
475
 
473
476
  Where success is cheaper to compile than failure, only the verdict and output are compiled: intersections
474
477
  and `custom` keep the original Zod schema to construct issues, so a rejection still reports exactly what
@@ -1 +1 @@
1
- {"version":3,"file":"build-path.d.ts","names":[],"sources":["../../../src/core/codegen/build-path.ts"],"mappings":";;;;iBAmJgB,eAAe,IAAI;;;;;;iBAmGnB,cAAc,IAAI,UAAU,KAAK"}
1
+ {"version":3,"file":"build-path.d.ts","names":[],"sources":["../../../src/core/codegen/build-path.ts"],"mappings":";;;;iBAoJgB,eAAe,IAAI;;;;;;iBAmGnB,cAAc,IAAI,UAAU,KAAK"}
@@ -1,4 +1,4 @@
1
- import { declareFastTemps, emitEffectCallable, emitEffectFn, emitRuntimeHelper, emitTemp, escapeString, keyMembershipTest, outputAlwaysDefined, rejectsUndefined } from "./context.js";
1
+ import { declareFastTemps, emitEffectCallable, emitEffectFn, emitRuntimeHelper, emitTemp, escapeString, keyMembershipTest, literalToJs, outputAlwaysDefined, rejectsUndefined } from "./context.js";
2
2
  import { ZC_HOP_DECL } from "./issue-decls.js";
3
3
  import { defaultValueExpr, needsPostInnerDefault } from "./schemas/default.js";
4
4
  import { estimateFastCost, predictedInlineSize } from "./fast-size.js";
@@ -208,8 +208,8 @@ function buildInline(ir, input, g) {
208
208
  case "effect": return buildEffect(ir, input, g);
209
209
  case "readonly": return build(ir.inner, input, g);
210
210
  case "zodDelegate": return build(ir.inner, input, g);
211
- case "union":
212
- case "discriminatedUnion": return buildUnion(ir, input, g);
211
+ case "union": return buildUnion(ir, input, g);
212
+ case "discriminatedUnion": return buildDiscriminatedUnion(ir, input, g);
213
213
  default: return null;
214
214
  }
215
215
  }
@@ -259,9 +259,9 @@ function buildRecursiveCall(refId, input, g) {
259
259
  * would abandon the whole parse instead of moving on to the next option. Behind
260
260
  * a call, the same signal is just a value to test.
261
261
  *
262
- * A discriminated union gets the same treatment rather than a switch: the
263
- * options still have to be probed by call, and its dispatch advantage is
264
- * already spent by the enclosing container's own work.
262
+ * PLAIN unions only. A discriminated union must not reach here: zod resolves it
263
+ * by dispatch, not by probing, and the two disagree — see
264
+ * {@link buildDiscriminatedUnion}.
265
265
  */
266
266
  function buildUnion(ir, input, g) {
267
267
  const hosted = [];
@@ -281,6 +281,57 @@ function buildUnion(ir, input, g) {
281
281
  };
282
282
  }
283
283
  /**
284
+ * Dispatch on the discriminator and build ONLY the option that value selects,
285
+ * failing outright when it selects none — mirroring zod, which resolves the
286
+ * option through a `discriminator value → option` map built from each option's
287
+ * `propValues` and pushes `invalid_union` ("No matching discriminator") without
288
+ * ever running an option's parse when the lookup misses.
289
+ *
290
+ * Probing the options in order like {@link buildUnion} does is NOT equivalent,
291
+ * because an option can accept more than its own dispatch values. A wrapper that
292
+ * substitutes a value contributes only the value it wraps to `propValues` while
293
+ * its parse also accepts the input it substitutes FOR:
294
+ * `z.literal("a").default("a")` dispatches on `"a"` alone yet parses a MISSING
295
+ * discriminator, so sequential probing accepted `{v:"x"}` — output `{t:"a",v:"x"}`
296
+ * — where zod rejects it. `.prefault()` and `.catch()` have the same shape, and
297
+ * only escape it because neither reaches this pass today (a prefaulted schema
298
+ * delegates to zod wholesale, and `.catch()` is refused by
299
+ * {@link mutatesBeyondStrip}); a `.default()` is exactly what pulls the build
300
+ * path in. The switch cannot drift that way: the dispatch table IS zod's, so an
301
+ * unlisted discriminator reaches `default:` and fails, whatever the options
302
+ * would have accepted on their own.
303
+ *
304
+ * The reverse — rejecting what zod accepts — is why `.optional()`/`.nullable()`
305
+ * discriminators stay compiled rather than being refused here: their
306
+ * `undefined`/`null` are in `propValues`, so they arrive as ordinary cases.
307
+ *
308
+ * Object-ness is proved BEFORE the discriminator is read, both because zod
309
+ * rejects a non-object with its own `invalid_type` ahead of the lookup and
310
+ * because the property read would throw on `null`/`undefined`.
311
+ */
312
+ function buildDiscriminatedUnion(ir, input, g) {
313
+ const out = local(g, "bd");
314
+ const hostedByOption = /* @__PURE__ */ new Map();
315
+ let arms = "";
316
+ for (const { value, option: index } of ir.cases) {
317
+ let fn = hostedByOption.get(index);
318
+ if (fn === void 0) {
319
+ const option = ir.options[index];
320
+ if (option === void 0) return null;
321
+ const hosted = g.rebuilds.has(option) ? hostBuild(option, g) : hostPassthrough(option, g);
322
+ if (hosted === null) return null;
323
+ fn = hosted;
324
+ hostedByOption.set(index, fn);
325
+ }
326
+ arms += `case ${literalToJs(value)}:${out}=${fn}(${input});break;`;
327
+ }
328
+ if (arms === "") return null;
329
+ return {
330
+ code: `if(typeof ${input}!=="object"||${input}===null||Array.isArray(${input}))return ${g.fail};switch(${input}[${escapeString(ir.discriminator)}]){${arms}default:return ${g.fail};}if(${out}===${g.fail})return ${g.fail};`,
331
+ value: out
332
+ };
333
+ }
334
+ /**
284
335
  * Host a non-rebuilding option as `value-or-FAIL`, so a union can probe it with
285
336
  * the same protocol as a rebuilding one.
286
337
  */
@@ -420,16 +471,24 @@ function buildRecord(ir, input, g) {
420
471
  }
421
472
  /**
422
473
  * `.transform(fn)`: validate the inner schema, then hand its parsed value to the
423
- * callback. Zod's transform is a pipe whose `in` failing aborts the whole thing,
424
- * which is exactly what returning FAIL from the inner build does — so the
425
- * callback runs only on a clean parse, as `slowEffect` guarantees with its issue
426
- * count.
474
+ * callback. `z.preprocess(fn, schema)` reverses those two steps: call first,
475
+ * then validate the callback's output. Returning FAIL from the inner build
476
+ * preserves the corresponding pipe short-circuit in either direction.
427
477
  *
428
478
  * The IR reaches here only for a synchronous single-argument callback: a
429
479
  * `ctx`-taking or async transform is extracted as a `fallback` instead
430
480
  * (see extractPipe), so there is no parse context to reproduce.
431
481
  */
432
482
  function buildEffect(ir, input, g) {
483
+ if (ir.effectKind === "preprocess") {
484
+ const value = local(g, "bpv");
485
+ const inner = build(ir.inner, value, g);
486
+ if (inner === null) return null;
487
+ return {
488
+ code: `${value}=${emitEffectCallable(g.ctx, ir)}(${input});${inner.code}`,
489
+ value: inner.value
490
+ };
491
+ }
433
492
  const inner = build(ir.inner, input, g);
434
493
  if (inner === null) return null;
435
494
  const out = local(g, "bx");
@@ -1 +1 @@
1
- {"version":3,"file":"build-path.js","names":[],"sources":["../../../src/core/codegen/build-path.ts"],"sourcesContent":["/**\n * Build Path: one uninstrumented pass that VALIDATES and BUILDS rewritten\n * output together, abandoning the whole parse at the first failing check.\n *\n * `z.object()` strips unknown keys, so a successful parse cannot return the\n * input by reference — it must produce a fresh object. That rules out the Fast\n * Path (whose contract is `data === input`), and before this the only remaining\n * option was the eager slow walk: a fully instrumented traversal that collects\n * issues on every parse, valid or not.\n *\n * Two passes are wasteful in either direction. Validating first and building\n * afterwards reads every property twice (measured 29.7 ns vs 21.6 for the slow\n * walk on a 6-field object). Building with issue collection pays the\n * instrumentation even when nothing fails. Doing both in ONE pass, with a\n * sentinel instead of an issues array, beats both — and a failure costs only\n * the checks up to the first bad one, because the issue-producing walk is\n * deferred into `.error` exactly as `__zcFinD` does for mutation-free schemas:\n *\n * object clean object invalid array(8) invalid\n * slow walk 21.6 ns 30.4 ns 197.5 ns\n * build path 18.1 ns 7.7 ns 9.8 ns\n *\n * A subtree that rebuilds nothing is validated with its existing Fast Path\n * expression and passed through by reference, so only nodes that genuinely\n * produce a new value need code here; anything else returns null and keeps the\n * eager walk.\n *\n * Coverage is what decides whether this pass is reached at all, because it is\n * all-or-nothing per schema: ONE unmodelled node anywhere in the tree costs the\n * whole schema its single-pass parse. Modelled, beyond the stripping containers\n * this started with: array size checks and `.refine()`, object-level `.refine()`,\n * `.default()` substitution, ordered string rewrites (`.trim()`,\n * `.toLowerCase()`), sync `.transform()`, `z.stringbool()`, and the five native\n * coercions (`string`, `number`, `boolean`, `bigint`, `date`). Still declined, via\n * {@link mutatesBeyondStrip} — `.catch()` (its callback wants the inner schema's\n * issue list, which this pass never builds), `z.url()`, and `superRefine`.\n */\n\nimport type { ObjectIR, RefineEffectCheckIR, SchemaIR, StringBoolIR } from \"../types.js\";\nimport type { CodeGenContext, FastScope } from \"./context.js\";\nimport {\n declareFastTemps,\n emitEffectCallable,\n emitEffectFn,\n emitRuntimeHelper,\n emitTemp,\n escapeString,\n keyMembershipTest,\n outputAlwaysDefined,\n rejectsUndefined,\n} from \"./context.js\";\nimport { createFastGen, generateFast } from \"./fast-path.js\";\nimport { EXTRACT_CAP, estimateFastCost, MIN_EXTRACT, predictedInlineSize } from \"./fast-size.js\";\nimport { ZC_HOP_DECL } from \"./issue-decls.js\";\nimport { defaultValueExpr, needsPostInnerDefault } from \"./schemas/default.js\";\nimport { innerAppliesDefaultOnUndefined } from \"./schemas/optional.js\";\nimport { fastStringCheck } from \"./schemas/string.js\";\nimport { emitStringBoolMap, stringBoolUsesInline } from \"./schemas/string-bool.js\";\n\n/** Statements that leave the built value in `value`, or `return <FAIL>` on failure. */\ninterface Built {\n code: string;\n value: string;\n}\n\ninterface BuildGen {\n ctx: CodeGenContext;\n /** Identifier of the per-validator FAIL sentinel. */\n fail: string;\n /** `var` temps and running emitted size of the function being assembled. */\n scope: FastScope;\n /**\n * May THIS node be hosted in its own function? False for the node a hosted\n * build was created for — it already IS that function, so re-hosting it would\n * recurse forever. Children are always extractable, letting an oversized\n * helper split further.\n */\n extractable: boolean;\n /** Nodes of the root schema that rebuild (see rebuildSet). */\n rebuilds: ReadonlySet<SchemaIR>;\n}\n\n/**\n * Which nodes of `root` produce a value that is not their input — a stripping\n * object, coercion, codec, default, overwrite or transform, including\n * containers that contain one. Everything else can be validated in place and\n * passed through, which is what keeps this generator small.\n *\n * Computed as a fixpoint rather than a plain walk because of recursion: a\n * `recursiveRef` is a back-edge with no children, so a local walk reads false\n * for it and would pass the whole recursive subtree through by reference —\n * leaving every nested value unstripped while the outermost one was rebuilt.\n * Resolving the ref against its target closes the cycle, and iterating to a\n * fixpoint settles the mutual dependency between the two.\n */\nfunction rebuildSet(root: SchemaIR): ReadonlySet<SchemaIR> {\n const targets = new Map<number, SchemaIR>([[0, root]]);\n const nodes: SchemaIR[] = [];\n const seen = new Set<SchemaIR>();\n const collect = (node: SchemaIR): void => {\n if (seen.has(node)) return;\n seen.add(node);\n nodes.push(node);\n if (node.type === \"recursionTarget\") targets.set(node.refId, node.inner);\n for (const child of children(node)) collect(child);\n };\n collect(root);\n\n const rebuilds = new Set<SchemaIR>();\n for (let changed = true; changed;) {\n changed = false;\n for (const node of nodes) {\n if (rebuilds.has(node)) continue;\n const target = node.type === \"recursiveRef\" ? targets.get(node.refId ?? 0) : undefined;\n const rebuild =\n (node.type === \"object\" && node.stripUnknownKeys === true) ||\n // `.default()` substitutes its own value for `undefined`, so its output\n // is not its input even when the inner schema passes through — it must\n // never be handed to `passthrough`, whose fast check would reject the\n // absent value outright.\n node.type === \"default\" ||\n // `z.stringbool()` replaces its accepted string with a boolean.\n node.type === \"stringBool\" ||\n // An overwrite effect (`.trim()`, `.toLowerCase()`) rewrites the string,\n // so the node's output is a new value: it has to be BUILT rather than\n // validated in place (see buildString).\n (node.type === \"string\" &&\n (node.coerce === true || node.checks.some((c) => c.kind === \"overwrite_effect\"))) ||\n ((node.type === \"number\" ||\n node.type === \"boolean\" ||\n node.type === \"bigint\" ||\n node.type === \"date\") &&\n node.coerce === true) ||\n // `.transform(fn)` replaces the value with the callback's result.\n node.type === \"effect\" ||\n (target !== undefined && rebuilds.has(target)) ||\n children(node).some((child) => rebuilds.has(child));\n if (rebuild) {\n rebuilds.add(node);\n changed = true;\n }\n }\n }\n return rebuilds;\n}\n\n/** Does `ir`, taken as a whole schema, produce a value that is not its input? */\nexport function rebuildsOutput(ir: SchemaIR): boolean {\n return rebuildSet(ir).has(ir);\n}\n\n/**\n * True when the subtree mutates for any reason the build pass cannot reproduce —\n * `.catch()`, `z.url()`, `superRefine`. Those rewrite values in ways this pass\n * (which validates, coerces, decodes string booleans, substitutes declared\n * defaults, applies ordered string rewrites and copies) does not model, so the\n * schema keeps the eager walk.\n */\nfunction mutatesBeyondStrip(ir: SchemaIR): boolean {\n return mutatesHere(ir) || children(ir).some(mutatesBeyondStrip);\n}\n\n/**\n * Does this node rewrite values on its own account (ignoring its children, and\n * ignoring the reshaping a strip object does)? Mirrors the node-local half of\n * `hasMutation`; the recursion above supplies the other half.\n */\nfunction mutatesHere(ir: SchemaIR): boolean {\n switch (ir.type) {\n case \"string\":\n // Coercion and overwrite effects are absent: `buildString` applies them\n // in order. A `z.url()` check still is not — it trims, normalizes and\n // needs its own normalization/error semantics.\n return (\n superRefines(ir.checks) ||\n ir.checks.some((c) => c.kind === \"string_format\" && c.format === \"url\")\n );\n case \"number\":\n return superRefines(ir.checks);\n case \"boolean\":\n case \"bigint\":\n case \"date\":\n return false;\n // `default` and `effect` are absent: substituting a constant for `undefined`\n // and applying a sync transform are both modelled (see buildDefault /\n // buildEffect), and their inners are reached through `children`.\n //\n // `catch` is NOT: its catchValue callback receives a ctx carrying the inner\n // schema's collected issues, and this pass produces a sentinel instead of an\n // issue list — there is nothing to hand it.\n case \"catch\":\n case \"fallback\":\n return true;\n case \"object\":\n case \"array\":\n return superRefines(ir.checks);\n default:\n return false;\n }\n}\n\nfunction superRefines(checks: readonly { kind: string }[] | undefined): boolean {\n return checks !== undefined && checks.some((c) => c.kind === \"super_refine_effect\");\n}\n\nfunction children(ir: SchemaIR): readonly SchemaIR[] {\n switch (ir.type) {\n case \"object\":\n return ir.catchall\n ? [...Object.values(ir.properties), ir.catchall]\n : Object.values(ir.properties);\n case \"array\":\n return [ir.element];\n case \"tuple\":\n return ir.rest === null ? ir.items : [...ir.items, ir.rest];\n case \"record\":\n case \"map\":\n return [ir.keyType, ir.valueType];\n case \"set\":\n return [ir.valueType];\n case \"union\":\n case \"discriminatedUnion\":\n return ir.options;\n case \"intersection\":\n return [ir.left, ir.right];\n case \"optional\":\n case \"nullable\":\n case \"readonly\":\n case \"default\":\n case \"catch\":\n case \"effect\":\n case \"recursionTarget\":\n case \"zodDelegate\":\n return [ir.inner];\n case \"pipe\":\n return [ir.in, ir.out];\n default:\n return [];\n }\n}\n\n/**\n * Host the whole schema as `function NAME(input){…}` returning the built value\n * or the FAIL sentinel. Returns the function name, or null when the schema is\n * not expressible as a single build pass.\n */\nexport function generateBuild(ir: SchemaIR, ctx: CodeGenContext): string | null {\n const rebuilds = rebuildSet(ir);\n if (!rebuilds.has(ir) || mutatesBeyondStrip(ir)) return null;\n const fail = emitFailSentinel(ctx);\n const scope: FastScope = { temps: [], used: 0 };\n const built = build(ir, \"input\", { ctx, extractable: false, fail, rebuilds, scope });\n if (built === null) return null;\n const name = emitTemp(ctx, \"vb\");\n ctx.preamble.push(\n `function ${name}(input){${declareFastTemps(scope)}${built.code}return ${built.value};}`,\n );\n return name;\n}\n\n/** One `{}` per validator, compared by identity — no parse output can equal it. */\nfunction emitFailSentinel(ctx: CodeGenContext): string {\n if (ctx.buildFailName === undefined) {\n ctx.buildFailName = `__bf_${ctx.counter++}`;\n ctx.preamble.push(`var ${ctx.buildFailName}={};`);\n }\n return ctx.buildFailName;\n}\n\n/**\n * Statements producing the built value of `ir` read from `input`, or null.\n *\n * Size-gated exactly like the fast path: once inlining `ir` would push the\n * function being assembled past EXTRACT_CAP, the sub-build is hosted as its own\n * `__vb_N(p)` returning value-or-FAIL and replaced by a call. Without this a\n * deeply nested schema emits one enormous build function — measured at 113 KB\n * and 354 KB on the deep fixtures — far past the bytecode size where V8 stops\n * running TurboFan on it, which would forfeit the speed this path exists for.\n */\nfunction build(ir: SchemaIR, input: string, g: BuildGen): Built | null {\n // Resolved before the passthrough shortcut below. A back-edge carries no\n // children, so `rebuildsOutput` reads false for it — and passing it through by\n // reference would leave every nested recursive value unstripped while the\n // outermost one was rebuilt.\n if (ir.type === \"recursiveRef\") return buildRecursiveCall(ir.refId ?? 0, input, g);\n if (ir.type === \"recursionTarget\") return buildRecursionTarget(ir, input, g);\n if (!g.rebuilds.has(ir)) return passthrough(ir, input, g);\n\n const cache = (g.ctx.fastSizeCache ??= new WeakMap<SchemaIR, number>());\n if (\n g.extractable &&\n g.scope.used + predictedInlineSize(ir, input.length, cache) > EXTRACT_CAP &&\n (g.scope.used > EXTRACT_CAP || estimateFastCost(ir, cache) >= MIN_EXTRACT)\n ) {\n const hosted = hostBuild(ir, g);\n if (hosted !== null) {\n const slot = local(g, \"bh\");\n const code = `${slot}=${hosted}(${input});if(${slot}===${g.fail})return ${g.fail};`;\n g.scope.used += code.length;\n return { code, value: slot };\n }\n }\n\n // This node's extraction decision is made; its descendants get to make their\n // own, so an oversized hosted helper keeps splitting.\n const before = g.scope.used;\n const out = buildInline(ir, input, { ...g, extractable: true });\n if (out !== null) g.scope.used = before + out.code.length;\n return out;\n}\n\n/** Host `ir`'s build in its own function over a fresh parameter; returns its name. */\nfunction hostBuild(ir: SchemaIR, g: BuildGen): string | null {\n const param = emitTemp(g.ctx, \"bp\");\n const scope: FastScope = { temps: [], used: 0 };\n const inner = build(ir, param, { ...g, extractable: false, scope });\n if (inner === null) return null;\n const name = emitTemp(g.ctx, \"vb\");\n g.ctx.preamble.push(\n `function ${name}(${param}){${declareFastTemps(scope)}${inner.code}return ${inner.value};}`,\n );\n return name;\n}\n\nfunction buildInline(ir: SchemaIR, input: string, g: BuildGen): Built | null {\n switch (ir.type) {\n case \"object\":\n return buildObject(ir, input, g);\n case \"array\":\n return buildArray(ir, input, g);\n case \"tuple\":\n return buildTuple(ir, input, g);\n case \"record\":\n return buildRecord(ir, input, g);\n case \"optional\":\n // A default further down the chain consumes undefined into a value, so\n // the `undefined → undefined` shortcut must not fire — same rule (and\n // same helper) the slow and fast paths already apply.\n return innerAppliesDefaultOnUndefined(ir.inner)\n ? build(ir.inner, input, g)\n : buildSentinel(ir.inner, input, g, \"===undefined\", \"undefined\");\n case \"nullable\":\n // `null` short-circuits unconditionally in zod, whatever the inner is;\n // undefined flows through, so an inner default still fires.\n return buildSentinel(ir.inner, input, g, \"===null\", \"null\");\n case \"default\":\n return buildDefault(ir, input, g);\n case \"string\":\n return buildString(ir, input, g);\n case \"stringBool\":\n return buildStringBool(ir, input, g);\n case \"number\":\n case \"boolean\":\n case \"bigint\":\n case \"date\":\n return buildCoercedPrimitive(ir, input, g);\n case \"effect\":\n return buildEffect(ir, input, g);\n case \"readonly\":\n return build(ir.inner, input, g);\n case \"zodDelegate\":\n return build(ir.inner, input, g);\n case \"union\":\n case \"discriminatedUnion\":\n return buildUnion(ir, input, g);\n default:\n // A rebuilding intersection, map or set: expressible in principle, but\n // each needs its own output-shaping rules, so they keep the eager walk\n // until there is a measured reason to add them.\n return null;\n }\n}\n\n/**\n * Host the target's build once under a name registered BEFORE its body is\n * generated, so the back-edges inside that body resolve to it.\n */\nfunction buildRecursionTarget(\n ir: SchemaIR & { type: \"recursionTarget\" },\n input: string,\n g: BuildGen,\n): Built | null {\n const table = (g.ctx.buildRecNames ??= new Map<number, string>());\n if (!table.has(ir.refId)) {\n const name = emitTemp(g.ctx, \"vbr\");\n table.set(ir.refId, name);\n const param = emitTemp(g.ctx, \"bp\");\n const scope: FastScope = { temps: [], used: 0 };\n const inner = build(ir.inner, param, { ...g, extractable: false, scope });\n if (inner === null) {\n table.delete(ir.refId);\n return null;\n }\n g.ctx.preamble.push(\n `function ${name}(${param}){${declareFastTemps(scope)}${inner.code}return ${inner.value};}`,\n );\n }\n return buildRecursiveCall(ir.refId, input, g);\n}\n\n/** Call the hosted build for a recursion target, propagating its FAIL. */\nfunction buildRecursiveCall(refId: number, input: string, g: BuildGen): Built | null {\n const name = g.ctx.buildRecNames?.get(refId);\n if (name === undefined) return null;\n const slot = local(g, \"bh\");\n return {\n code: `${slot}=${name}(${input});if(${slot}===${g.fail})return ${g.fail};`,\n value: slot,\n };\n}\n\n/**\n * Try each option in declaration order and take the first that builds — which\n * is what zod's union does with the first option that parses.\n *\n * Every option is HOSTED rather than inlined, and that is load-bearing: a\n * failing build signals with `return FAIL`, which inside the enclosing function\n * would abandon the whole parse instead of moving on to the next option. Behind\n * a call, the same signal is just a value to test.\n *\n * A discriminated union gets the same treatment rather than a switch: the\n * options still have to be probed by call, and its dispatch advantage is\n * already spent by the enclosing container's own work.\n */\nfunction buildUnion(\n ir: SchemaIR & { type: \"discriminatedUnion\" | \"union\" },\n input: string,\n g: BuildGen,\n): Built | null {\n const hosted: string[] = [];\n for (const option of ir.options) {\n const fn = g.rebuilds.has(option) ? hostBuild(option, g) : hostPassthrough(option, g);\n if (fn === null) return null;\n hosted.push(fn);\n }\n if (hosted.length === 0) return null;\n\n const out = local(g, \"bu\");\n let code = `${out}=${hosted[0] as string}(${input});`;\n for (const fn of hosted.slice(1)) {\n code += `if(${out}===${g.fail}){${out}=${fn}(${input});}`;\n }\n code += `if(${out}===${g.fail})return ${g.fail};`;\n return { code, value: out };\n}\n\n/**\n * Host a non-rebuilding option as `value-or-FAIL`, so a union can probe it with\n * the same protocol as a rebuilding one.\n */\nfunction hostPassthrough(ir: SchemaIR, g: BuildGen): string | null {\n const param = emitTemp(g.ctx, \"bp\");\n const scope: FastScope = { temps: [], used: 0 };\n const expr = generateFast(ir, createFastGen(param, g.ctx, true, scope));\n if (expr === null) return null;\n const name = emitTemp(g.ctx, \"vp\");\n g.ctx.preamble.push(\n `function ${name}(${param}){${declareFastTemps(scope)}return ${expr === \"true\" ? param : `(${expr})?${param}:${g.fail}`};}`,\n );\n return name;\n}\n\n/** Validate in place with the Fast Path and hand the input straight back. */\nfunction passthrough(ir: SchemaIR, input: string, g: BuildGen): Built | null {\n const scoped = createFastGen(input, g.ctx, true, g.scope);\n const expr = generateFast(ir, scoped);\n if (expr === null) return null;\n return { code: expr === \"true\" ? \"\" : `if(!(${expr}))return ${g.fail};`, value: input };\n}\n\n/**\n * Rebuild from the declared keys. Sound for a stripping object (that IS the\n * output) and for a strict one (unknown keys are rejected, so the declared keys\n * are the whole key set). A loose object or one with a `.catchall()` keeps keys\n * this pass does not enumerate, so those bail.\n */\nfunction buildObject(ir: ObjectIR, input: string, g: BuildGen): Built | null {\n if (ir.catchall !== undefined) return null;\n if (ir.stripUnknownKeys !== true && ir.strict !== true) return null;\n if (ir.suppressAbsentKeys !== undefined && ir.suppressAbsentKeys.length > 0) return null;\n // Object-level `.refine()` runs on the assembled output (below). superRefine\n // rewrites the payload, which this pass does not model — mutatesBeyondStrip\n // already rejects it, so this is a belt-and-braces narrowing of the type.\n const refines = ir.checks ?? [];\n if (refines.some((check) => check.kind !== \"refine_effect\")) return null;\n\n let code = `if(typeof ${input}!==\"object\"||${input}===null||Array.isArray(${input}))return ${g.fail};`;\n\n if (ir.strict === true) {\n const keyVar = local(g, \"bk\");\n code += `for(${keyVar} in ${input}){if(!(${keyMembershipTest(g.ctx, Object.keys(ir.properties), keyVar)}))return ${g.fail};}`;\n }\n\n const slots: { always: boolean; keyStr: string; value: string }[] = [];\n for (const [key, propIR] of Object.entries(ir.properties)) {\n const keyStr = escapeString(key);\n const slot = local(g, \"bv\");\n code += `${slot}=${input}[${keyStr}];`;\n const propBuilt = build(propIR, slot, g);\n if (propBuilt === null) return null;\n code += propBuilt.code;\n slots.push({ always: outputAlwaysDefined(propIR), keyStr, value: propBuilt.value });\n }\n\n // Same assembly the eager strip walk uses: the longest LEADING run of\n // always-present keys goes into one object literal (V8 stamps it from a\n // cached boilerplate map in a single allocation), and everything after the\n // first conditional key is appended so insertion order still matches zod.\n // The per-key test is zod's own — keep the key when the parsed value is\n // defined, or when it was present on the input at all.\n const out = local(g, \"bo\");\n const literal: string[] = [];\n let appends = \"\";\n let leading = true;\n for (const slot of slots) {\n if (leading && slot.always) {\n literal.push(`${slot.keyStr}:${slot.value}`);\n continue;\n }\n leading = false;\n appends += slot.always\n ? `${out}[${slot.keyStr}]=${slot.value};`\n : `if(${slot.value}!==undefined||(${slot.keyStr} in ${input})){${out}[${slot.keyStr}]=${slot.value};}`;\n }\n code += `${out}={${literal.join(\",\")}};${appends}`;\n // Zod parses the properties into the payload first and skips the check chain\n // when that produced issues, so a bad property suppresses the refine — which\n // this pass gets for free, having already returned FAIL at that property.\n for (const check of refines) {\n code += `if(!${emitEffectCallable(g.ctx, check as RefineEffectCheckIR)}(${out}))return ${g.fail};`;\n }\n return { code, value: out };\n}\n\nfunction buildArray(ir: SchemaIR & { type: \"array\" }, input: string, g: BuildGen): Built | null {\n // Length checks are pure predicates over `input.length`, so they hoist ahead\n // of the element loop: a size mismatch bails before a single element is\n // validated. Zod reports the per-element issue first when both fail, but the\n // build pass produces no issues — only the sentinel — and the deferred walk\n // that does produce them keeps zod's order.\n let sizes = \"\";\n const refines: RefineEffectCheckIR[] = [];\n for (const check of ir.checks) {\n switch (check.kind) {\n case \"min_length\":\n sizes += `if(${input}.length<${check.minimum})return ${g.fail};`;\n break;\n case \"max_length\":\n sizes += `if(${input}.length>${check.maximum})return ${g.fail};`;\n break;\n case \"length_equals\":\n sizes += `if(${input}.length!==${check.length})return ${g.fail};`;\n break;\n case \"refine_effect\":\n refines.push(check);\n break;\n default:\n // super_refine (rewrites the value) or a check kind not modelled here.\n return null;\n }\n }\n\n const out = local(g, \"ba\");\n const index = local(g, \"bi\");\n const elem = local(g, \"be\");\n const inner = build(ir.element, elem, g);\n if (inner === null) return null;\n let code =\n `if(!Array.isArray(${input}))return ${g.fail};` +\n sizes +\n `${out}=new Array(${input}.length);` +\n `for(${index}=0;${index}<${input}.length;${index}++){` +\n `${elem}=${input}[${index}];${inner.code}${out}[${index}]=${inner.value};}`;\n // `.refine()` sees the parsed payload, which for a rebuilding element is the\n // freshly assembled array — the same value zod hands its checks.\n for (const check of refines) {\n code += `if(!${emitEffectCallable(g.ctx, check)}(${out}))return ${g.fail};`;\n }\n return { code, value: out };\n}\n\nfunction buildTuple(ir: SchemaIR & { type: \"tuple\" }, input: string, g: BuildGen): Built | null {\n // Trailing-optional and rest handling shape the output length; keep those on\n // the eager walk rather than restating the rules here.\n if (ir.rest !== null) return null;\n if (ir.items.some((item) => !rejectsUndefined(item))) return null;\n\n let code = `if(!Array.isArray(${input})||${input}.length!==${ir.items.length})return ${g.fail};`;\n const values: string[] = [];\n for (const [index, itemIR] of ir.items.entries()) {\n const slot = local(g, \"bt\");\n code += `${slot}=${input}[${index}];`;\n const inner = build(itemIR as SchemaIR, slot, g);\n if (inner === null) return null;\n code += inner.code;\n values.push(inner.value);\n }\n const out = local(g, \"bl\");\n code += `${out}=[${values.join(\",\")}];`;\n return { code, value: out };\n}\n\nfunction buildRecord(ir: SchemaIR & { type: \"record\" }, input: string, g: BuildGen): Built | null {\n const plainStringKey =\n ir.keyType.type === \"string\" && ir.keyType.checks.length === 0 && ir.keyType.coerce !== true;\n if (!plainStringKey) return null;\n\n const out = local(g, \"br\");\n const keyVar = local(g, \"brk\");\n const valVar = local(g, \"brv\");\n const inner = build(ir.valueType, valVar, g);\n if (inner === null) return null;\n const hop = emitRuntimeHelper(g.ctx, \"__zcHop\", ZC_HOP_DECL);\n const code =\n `if(typeof ${input}!==\"object\"||${input}===null||Array.isArray(${input}))return ${g.fail};` +\n `${out}={};` +\n `for(${keyVar} in ${input}){if(${hop}.call(${input},${keyVar})){` +\n `${valVar}=${input}[${keyVar}];${inner.code}${out}[${keyVar}]=${inner.value};}}`;\n return { code, value: out };\n}\n\n/**\n * `.transform(fn)`: validate the inner schema, then hand its parsed value to the\n * callback. Zod's transform is a pipe whose `in` failing aborts the whole thing,\n * which is exactly what returning FAIL from the inner build does — so the\n * callback runs only on a clean parse, as `slowEffect` guarantees with its issue\n * count.\n *\n * The IR reaches here only for a synchronous single-argument callback: a\n * `ctx`-taking or async transform is extracted as a `fallback` instead\n * (see extractPipe), so there is no parse context to reproduce.\n */\nfunction buildEffect(ir: SchemaIR & { type: \"effect\" }, input: string, g: BuildGen): Built | null {\n const inner = build(ir.inner, input, g);\n if (inner === null) return null;\n const out = local(g, \"bx\");\n return {\n code: `${inner.code}${out}=${emitEffectCallable(g.ctx, ir)}(${inner.value});`,\n value: out,\n };\n}\n\n/**\n * A coercing and/or overwrite string (`z.coerce.string()`, `.trim()`,\n * `.toLowerCase()`, ...): coerce first, then emit checks one statement at a time\n * in DECLARATION order, interleaved with rewrites, because a rewrite is visible\n * to every check after it — `z.string().trim().min(1)` rejects `\" \"` where\n * `z.string().min(1).trim()` accepts it. That ordering is exactly why the fast\n * path, which sorts checks cheapest-first and returns the input unchanged, has\n * to decline these.\n *\n * Only reached for a rewriting string; a non-coercing, check-only one never\n * enters the rebuild set and is validated in place by `passthrough`.\n */\nfunction buildString(ir: SchemaIR & { type: \"string\" }, input: string, g: BuildGen): Built | null {\n const value = local(g, \"bs\");\n let code =\n ir.coerce === true\n ? `try{${value}=String(${input});}catch(_){return ${g.fail};}`\n : `if(typeof ${input}!==\"string\")return ${g.fail};${value}=${input};`;\n for (const check of ir.checks) {\n switch (check.kind) {\n case \"overwrite_effect\":\n code += `${value}=${emitEffectFn(g.ctx, check.source)}(${value});`;\n break;\n case \"refine_effect\":\n code += `if(!${emitEffectCallable(g.ctx, check)}(${value}))return ${g.fail};`;\n break;\n case \"super_refine_effect\":\n // Rewrites through zod's payload; mutatesBeyondStrip already rejects it.\n return null;\n default: {\n const expr = fastStringCheck(check, value, g.ctx);\n if (expr === null) return null; // z.url(), unknown format\n code += `if(!(${expr}))return ${g.fail};`;\n }\n }\n }\n return { code, value };\n}\n\n/**\n * `z.stringbool()`: normalize once, select the declared truthy/falsy side, and\n * return the boolean directly. The ordinary Fast Path cannot host this codec\n * because its contract returns the original input by reference; the build path\n * is designed for exactly this kind of small output rewrite.\n */\nfunction buildStringBool(ir: StringBoolIR, input: string, g: BuildGen): Built {\n let code = `if(typeof ${input}!==\"string\")return ${g.fail};`;\n let normalized = input;\n if (!ir.caseSensitive) {\n normalized = local(g, \"bn\");\n code += `${normalized}=${input}.toLowerCase();`;\n }\n\n const out = local(g, \"bb\");\n if (stringBoolUsesInline(ir)) {\n const membership = (values: readonly string[]): string =>\n values.map((value) => `${normalized}===${escapeString(value)}`).join(\"||\");\n code +=\n `if(${membership(ir.truthy)}){${out}=true;}` +\n `else if(${membership(ir.falsy)}){${out}=false;}` +\n `else{return ${g.fail};}`;\n } else {\n const lookup = emitStringBoolMap(ir, g.ctx);\n code += `${out}=${lookup}.get(${normalized});if(${out}===undefined)return ${g.fail};`;\n }\n return { code, value: out };\n}\n\n/** Primitive nodes whose `coerce` flag rewrites their output before checks run. */\ntype CoercedPrimitiveIR = Extract<SchemaIR, { type: \"number\" | \"boolean\" | \"bigint\" | \"date\" }>;\n\n/**\n * Coerce once into a local, then reuse the ordinary Fast Path as the acceptance\n * predicate over the converted value. The build path only needs a verdict on\n * its hot pass; if it fails, the existing deferred slow walk reruns the original\n * coercing schema and produces Zod-identical issues.\n *\n * Number/BigInt/Date conversion can invoke user hooks and throw. Zod catches\n * those throws and reports invalid_type, so the sentinel branch does the same\n * without allocating an issue. Boolean never invokes conversion hooks.\n */\nfunction buildCoercedPrimitive(ir: CoercedPrimitiveIR, input: string, g: BuildGen): Built | null {\n if (ir.coerce !== true) return null;\n const value = local(g, \"bc\");\n let conversion: string;\n switch (ir.type) {\n case \"number\":\n conversion = `Number(${input})`;\n break;\n case \"boolean\":\n conversion = `Boolean(${input})`;\n break;\n case \"bigint\":\n conversion = `BigInt(${input})`;\n break;\n case \"date\":\n conversion = `new Date(${input})`;\n break;\n }\n\n // A fresh shallow node is intentional: only the coerce flag changes. The\n // existing primitive generator remains the single source of truth for every\n // range, format, refine and finite/valid-date check.\n const predicate = generateFast(\n { ...ir, coerce: false },\n createFastGen(value, g.ctx, true, g.scope),\n );\n if (predicate === null) return null;\n\n const assign = `${value}=${conversion};`;\n const code = ir.type === \"boolean\" ? assign : `try{${assign}}catch(_){return ${g.fail};}`;\n return {\n code: code + (predicate === \"true\" ? \"\" : `if(!(${predicate}))return ${g.fail};`),\n value,\n };\n}\n\n/**\n * `.default(v)`: `undefined` yields the declared value without running the\n * inner schema, anything else parses normally — the same two branches\n * `slowDefault` emits, reading the value off the retained schema so a\n * reference-typed default keeps zod's identity (one shared object, not a copy).\n *\n * The substituted value is not validated, so it makes the fast path a PARTIAL\n * predicate (`fc(undefined)` is false where the schema accepts) — which is why\n * this records {@link CodeGenContext.buildSubstitutesValue}, on which\n * `generateValidator` withholds `.is()`.\n */\nfunction buildDefault(\n ir: SchemaIR & { type: \"default\" },\n input: string,\n g: BuildGen,\n): Built | null {\n const inner = build(ir.inner, input, g);\n if (inner === null) return null;\n // Every `default` node is in the rebuild set, so it is always BUILT and never\n // passed through — which makes this flag an exact record of whether the\n // finished pass substitutes a value.\n g.ctx.buildSubstitutesValue = true;\n const out = local(g, \"bq\");\n const value = defaultValueExpr(ir);\n // Zod re-applies the default when the inner returns undefined for a defined\n // input; only emitted when the inner can actually do that.\n const reapply = needsPostInnerDefault(ir) ? `if(${out}===undefined){${out}=${value};}` : \"\";\n return {\n code:\n `if(${input}===undefined){${out}=${value};}` +\n `else{${inner.code}${out}=${inner.value};${reapply}}`,\n value: out,\n };\n}\n\n/** `optional` / `nullable` around a rebuilding inner: pass the sentinel through. */\nfunction buildSentinel(\n innerIR: SchemaIR,\n input: string,\n g: BuildGen,\n test: string,\n sentinel: string,\n): Built | null {\n const inner = build(innerIR, input, g);\n if (inner === null) return null;\n const out = local(g, \"bw\");\n return {\n code: `if(${input}${test}){${out}=${sentinel};}else{${inner.code}${out}=${inner.value};}`,\n value: out,\n };\n}\n\n/** Allocate a `var` the hosted build function declares. */\nfunction local(g: BuildGen, prefix: string): string {\n const name = emitTemp(g.ctx, prefix);\n g.scope.temps.push(name);\n return name;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"build-path.js","names":[],"sources":["../../../src/core/codegen/build-path.ts"],"sourcesContent":["/**\n * Build Path: one uninstrumented pass that VALIDATES and BUILDS rewritten\n * output together, abandoning the whole parse at the first failing check.\n *\n * `z.object()` strips unknown keys, so a successful parse cannot return the\n * input by reference — it must produce a fresh object. That rules out the Fast\n * Path (whose contract is `data === input`), and before this the only remaining\n * option was the eager slow walk: a fully instrumented traversal that collects\n * issues on every parse, valid or not.\n *\n * Two passes are wasteful in either direction. Validating first and building\n * afterwards reads every property twice (measured 29.7 ns vs 21.6 for the slow\n * walk on a 6-field object). Building with issue collection pays the\n * instrumentation even when nothing fails. Doing both in ONE pass, with a\n * sentinel instead of an issues array, beats both — and a failure costs only\n * the checks up to the first bad one, because the issue-producing walk is\n * deferred into `.error` exactly as `__zcFinD` does for mutation-free schemas:\n *\n * object clean object invalid array(8) invalid\n * slow walk 21.6 ns 30.4 ns 197.5 ns\n * build path 18.1 ns 7.7 ns 9.8 ns\n *\n * A subtree that rebuilds nothing is validated with its existing Fast Path\n * expression and passed through by reference, so only nodes that genuinely\n * produce a new value need code here; anything else returns null and keeps the\n * eager walk.\n *\n * Coverage is what decides whether this pass is reached at all, because it is\n * all-or-nothing per schema: ONE unmodelled node anywhere in the tree costs the\n * whole schema its single-pass parse. Modelled, beyond the stripping containers\n * this started with: array size checks and `.refine()`, object-level `.refine()`,\n * `.default()` substitution, ordered string rewrites (`.trim()`,\n * `.toLowerCase()`), sync `.transform()`, `z.stringbool()`, and the five native\n * coercions (`string`, `number`, `boolean`, `bigint`, `date`). Still declined, via\n * {@link mutatesBeyondStrip} — `.catch()` (its callback wants the inner schema's\n * issue list, which this pass never builds), `z.url()`, and `superRefine`.\n */\n\nimport type { ObjectIR, RefineEffectCheckIR, SchemaIR, StringBoolIR } from \"../types.js\";\nimport type { CodeGenContext, FastScope } from \"./context.js\";\nimport {\n declareFastTemps,\n emitEffectCallable,\n emitEffectFn,\n emitRuntimeHelper,\n emitTemp,\n escapeString,\n keyMembershipTest,\n literalToJs,\n outputAlwaysDefined,\n rejectsUndefined,\n} from \"./context.js\";\nimport { createFastGen, generateFast } from \"./fast-path.js\";\nimport { EXTRACT_CAP, estimateFastCost, MIN_EXTRACT, predictedInlineSize } from \"./fast-size.js\";\nimport { ZC_HOP_DECL } from \"./issue-decls.js\";\nimport { defaultValueExpr, needsPostInnerDefault } from \"./schemas/default.js\";\nimport { innerAppliesDefaultOnUndefined } from \"./schemas/optional.js\";\nimport { fastStringCheck } from \"./schemas/string.js\";\nimport { emitStringBoolMap, stringBoolUsesInline } from \"./schemas/string-bool.js\";\n\n/** Statements that leave the built value in `value`, or `return <FAIL>` on failure. */\ninterface Built {\n code: string;\n value: string;\n}\n\ninterface BuildGen {\n ctx: CodeGenContext;\n /** Identifier of the per-validator FAIL sentinel. */\n fail: string;\n /** `var` temps and running emitted size of the function being assembled. */\n scope: FastScope;\n /**\n * May THIS node be hosted in its own function? False for the node a hosted\n * build was created for — it already IS that function, so re-hosting it would\n * recurse forever. Children are always extractable, letting an oversized\n * helper split further.\n */\n extractable: boolean;\n /** Nodes of the root schema that rebuild (see rebuildSet). */\n rebuilds: ReadonlySet<SchemaIR>;\n}\n\n/**\n * Which nodes of `root` produce a value that is not their input — a stripping\n * object, coercion, codec, default, overwrite or transform, including\n * containers that contain one. Everything else can be validated in place and\n * passed through, which is what keeps this generator small.\n *\n * Computed as a fixpoint rather than a plain walk because of recursion: a\n * `recursiveRef` is a back-edge with no children, so a local walk reads false\n * for it and would pass the whole recursive subtree through by reference —\n * leaving every nested value unstripped while the outermost one was rebuilt.\n * Resolving the ref against its target closes the cycle, and iterating to a\n * fixpoint settles the mutual dependency between the two.\n */\nfunction rebuildSet(root: SchemaIR): ReadonlySet<SchemaIR> {\n const targets = new Map<number, SchemaIR>([[0, root]]);\n const nodes: SchemaIR[] = [];\n const seen = new Set<SchemaIR>();\n const collect = (node: SchemaIR): void => {\n if (seen.has(node)) return;\n seen.add(node);\n nodes.push(node);\n if (node.type === \"recursionTarget\") targets.set(node.refId, node.inner);\n for (const child of children(node)) collect(child);\n };\n collect(root);\n\n const rebuilds = new Set<SchemaIR>();\n for (let changed = true; changed;) {\n changed = false;\n for (const node of nodes) {\n if (rebuilds.has(node)) continue;\n const target = node.type === \"recursiveRef\" ? targets.get(node.refId ?? 0) : undefined;\n const rebuild =\n (node.type === \"object\" && node.stripUnknownKeys === true) ||\n // `.default()` substitutes its own value for `undefined`, so its output\n // is not its input even when the inner schema passes through — it must\n // never be handed to `passthrough`, whose fast check would reject the\n // absent value outright.\n node.type === \"default\" ||\n // `z.stringbool()` replaces its accepted string with a boolean.\n node.type === \"stringBool\" ||\n // An overwrite effect (`.trim()`, `.toLowerCase()`) rewrites the string,\n // so the node's output is a new value: it has to be BUILT rather than\n // validated in place (see buildString).\n (node.type === \"string\" &&\n (node.coerce === true || node.checks.some((c) => c.kind === \"overwrite_effect\"))) ||\n ((node.type === \"number\" ||\n node.type === \"boolean\" ||\n node.type === \"bigint\" ||\n node.type === \"date\") &&\n node.coerce === true) ||\n // `.transform(fn)` replaces the value with the callback's result.\n node.type === \"effect\" ||\n (target !== undefined && rebuilds.has(target)) ||\n children(node).some((child) => rebuilds.has(child));\n if (rebuild) {\n rebuilds.add(node);\n changed = true;\n }\n }\n }\n return rebuilds;\n}\n\n/** Does `ir`, taken as a whole schema, produce a value that is not its input? */\nexport function rebuildsOutput(ir: SchemaIR): boolean {\n return rebuildSet(ir).has(ir);\n}\n\n/**\n * True when the subtree mutates for any reason the build pass cannot reproduce —\n * `.catch()`, `z.url()`, `superRefine`. Those rewrite values in ways this pass\n * (which validates, coerces, decodes string booleans, substitutes declared\n * defaults, applies ordered string rewrites and copies) does not model, so the\n * schema keeps the eager walk.\n */\nfunction mutatesBeyondStrip(ir: SchemaIR): boolean {\n return mutatesHere(ir) || children(ir).some(mutatesBeyondStrip);\n}\n\n/**\n * Does this node rewrite values on its own account (ignoring its children, and\n * ignoring the reshaping a strip object does)? Mirrors the node-local half of\n * `hasMutation`; the recursion above supplies the other half.\n */\nfunction mutatesHere(ir: SchemaIR): boolean {\n switch (ir.type) {\n case \"string\":\n // Coercion and overwrite effects are absent: `buildString` applies them\n // in order. A `z.url()` check still is not — it trims, normalizes and\n // needs its own normalization/error semantics.\n return (\n superRefines(ir.checks) ||\n ir.checks.some((c) => c.kind === \"string_format\" && c.format === \"url\")\n );\n case \"number\":\n return superRefines(ir.checks);\n case \"boolean\":\n case \"bigint\":\n case \"date\":\n return false;\n // `default` and `effect` are absent: substituting a constant for `undefined`\n // and applying a sync transform are both modelled (see buildDefault /\n // buildEffect), and their inners are reached through `children`.\n //\n // `catch` is NOT: its catchValue callback receives a ctx carrying the inner\n // schema's collected issues, and this pass produces a sentinel instead of an\n // issue list — there is nothing to hand it.\n case \"catch\":\n case \"fallback\":\n return true;\n case \"object\":\n case \"array\":\n return superRefines(ir.checks);\n default:\n return false;\n }\n}\n\nfunction superRefines(checks: readonly { kind: string }[] | undefined): boolean {\n return checks !== undefined && checks.some((c) => c.kind === \"super_refine_effect\");\n}\n\nfunction children(ir: SchemaIR): readonly SchemaIR[] {\n switch (ir.type) {\n case \"object\":\n return ir.catchall\n ? [...Object.values(ir.properties), ir.catchall]\n : Object.values(ir.properties);\n case \"array\":\n return [ir.element];\n case \"tuple\":\n return ir.rest === null ? ir.items : [...ir.items, ir.rest];\n case \"record\":\n case \"map\":\n return [ir.keyType, ir.valueType];\n case \"set\":\n return [ir.valueType];\n case \"union\":\n case \"discriminatedUnion\":\n return ir.options;\n case \"intersection\":\n return [ir.left, ir.right];\n case \"optional\":\n case \"nullable\":\n case \"readonly\":\n case \"default\":\n case \"catch\":\n case \"effect\":\n case \"recursionTarget\":\n case \"zodDelegate\":\n return [ir.inner];\n case \"pipe\":\n return [ir.in, ir.out];\n default:\n return [];\n }\n}\n\n/**\n * Host the whole schema as `function NAME(input){…}` returning the built value\n * or the FAIL sentinel. Returns the function name, or null when the schema is\n * not expressible as a single build pass.\n */\nexport function generateBuild(ir: SchemaIR, ctx: CodeGenContext): string | null {\n const rebuilds = rebuildSet(ir);\n if (!rebuilds.has(ir) || mutatesBeyondStrip(ir)) return null;\n const fail = emitFailSentinel(ctx);\n const scope: FastScope = { temps: [], used: 0 };\n const built = build(ir, \"input\", { ctx, extractable: false, fail, rebuilds, scope });\n if (built === null) return null;\n const name = emitTemp(ctx, \"vb\");\n ctx.preamble.push(\n `function ${name}(input){${declareFastTemps(scope)}${built.code}return ${built.value};}`,\n );\n return name;\n}\n\n/** One `{}` per validator, compared by identity — no parse output can equal it. */\nfunction emitFailSentinel(ctx: CodeGenContext): string {\n if (ctx.buildFailName === undefined) {\n ctx.buildFailName = `__bf_${ctx.counter++}`;\n ctx.preamble.push(`var ${ctx.buildFailName}={};`);\n }\n return ctx.buildFailName;\n}\n\n/**\n * Statements producing the built value of `ir` read from `input`, or null.\n *\n * Size-gated exactly like the fast path: once inlining `ir` would push the\n * function being assembled past EXTRACT_CAP, the sub-build is hosted as its own\n * `__vb_N(p)` returning value-or-FAIL and replaced by a call. Without this a\n * deeply nested schema emits one enormous build function — measured at 113 KB\n * and 354 KB on the deep fixtures — far past the bytecode size where V8 stops\n * running TurboFan on it, which would forfeit the speed this path exists for.\n */\nfunction build(ir: SchemaIR, input: string, g: BuildGen): Built | null {\n // Resolved before the passthrough shortcut below. A back-edge carries no\n // children, so `rebuildsOutput` reads false for it — and passing it through by\n // reference would leave every nested recursive value unstripped while the\n // outermost one was rebuilt.\n if (ir.type === \"recursiveRef\") return buildRecursiveCall(ir.refId ?? 0, input, g);\n if (ir.type === \"recursionTarget\") return buildRecursionTarget(ir, input, g);\n if (!g.rebuilds.has(ir)) return passthrough(ir, input, g);\n\n const cache = (g.ctx.fastSizeCache ??= new WeakMap<SchemaIR, number>());\n if (\n g.extractable &&\n g.scope.used + predictedInlineSize(ir, input.length, cache) > EXTRACT_CAP &&\n (g.scope.used > EXTRACT_CAP || estimateFastCost(ir, cache) >= MIN_EXTRACT)\n ) {\n const hosted = hostBuild(ir, g);\n if (hosted !== null) {\n const slot = local(g, \"bh\");\n const code = `${slot}=${hosted}(${input});if(${slot}===${g.fail})return ${g.fail};`;\n g.scope.used += code.length;\n return { code, value: slot };\n }\n }\n\n // This node's extraction decision is made; its descendants get to make their\n // own, so an oversized hosted helper keeps splitting.\n const before = g.scope.used;\n const out = buildInline(ir, input, { ...g, extractable: true });\n if (out !== null) g.scope.used = before + out.code.length;\n return out;\n}\n\n/** Host `ir`'s build in its own function over a fresh parameter; returns its name. */\nfunction hostBuild(ir: SchemaIR, g: BuildGen): string | null {\n const param = emitTemp(g.ctx, \"bp\");\n const scope: FastScope = { temps: [], used: 0 };\n const inner = build(ir, param, { ...g, extractable: false, scope });\n if (inner === null) return null;\n const name = emitTemp(g.ctx, \"vb\");\n g.ctx.preamble.push(\n `function ${name}(${param}){${declareFastTemps(scope)}${inner.code}return ${inner.value};}`,\n );\n return name;\n}\n\nfunction buildInline(ir: SchemaIR, input: string, g: BuildGen): Built | null {\n switch (ir.type) {\n case \"object\":\n return buildObject(ir, input, g);\n case \"array\":\n return buildArray(ir, input, g);\n case \"tuple\":\n return buildTuple(ir, input, g);\n case \"record\":\n return buildRecord(ir, input, g);\n case \"optional\":\n // A default further down the chain consumes undefined into a value, so\n // the `undefined → undefined` shortcut must not fire — same rule (and\n // same helper) the slow and fast paths already apply.\n return innerAppliesDefaultOnUndefined(ir.inner)\n ? build(ir.inner, input, g)\n : buildSentinel(ir.inner, input, g, \"===undefined\", \"undefined\");\n case \"nullable\":\n // `null` short-circuits unconditionally in zod, whatever the inner is;\n // undefined flows through, so an inner default still fires.\n return buildSentinel(ir.inner, input, g, \"===null\", \"null\");\n case \"default\":\n return buildDefault(ir, input, g);\n case \"string\":\n return buildString(ir, input, g);\n case \"stringBool\":\n return buildStringBool(ir, input, g);\n case \"number\":\n case \"boolean\":\n case \"bigint\":\n case \"date\":\n return buildCoercedPrimitive(ir, input, g);\n case \"effect\":\n return buildEffect(ir, input, g);\n case \"readonly\":\n return build(ir.inner, input, g);\n case \"zodDelegate\":\n return build(ir.inner, input, g);\n case \"union\":\n return buildUnion(ir, input, g);\n case \"discriminatedUnion\":\n return buildDiscriminatedUnion(ir, input, g);\n default:\n // A rebuilding intersection, map or set: expressible in principle, but\n // each needs its own output-shaping rules, so they keep the eager walk\n // until there is a measured reason to add them.\n return null;\n }\n}\n\n/**\n * Host the target's build once under a name registered BEFORE its body is\n * generated, so the back-edges inside that body resolve to it.\n */\nfunction buildRecursionTarget(\n ir: SchemaIR & { type: \"recursionTarget\" },\n input: string,\n g: BuildGen,\n): Built | null {\n const table = (g.ctx.buildRecNames ??= new Map<number, string>());\n if (!table.has(ir.refId)) {\n const name = emitTemp(g.ctx, \"vbr\");\n table.set(ir.refId, name);\n const param = emitTemp(g.ctx, \"bp\");\n const scope: FastScope = { temps: [], used: 0 };\n const inner = build(ir.inner, param, { ...g, extractable: false, scope });\n if (inner === null) {\n table.delete(ir.refId);\n return null;\n }\n g.ctx.preamble.push(\n `function ${name}(${param}){${declareFastTemps(scope)}${inner.code}return ${inner.value};}`,\n );\n }\n return buildRecursiveCall(ir.refId, input, g);\n}\n\n/** Call the hosted build for a recursion target, propagating its FAIL. */\nfunction buildRecursiveCall(refId: number, input: string, g: BuildGen): Built | null {\n const name = g.ctx.buildRecNames?.get(refId);\n if (name === undefined) return null;\n const slot = local(g, \"bh\");\n return {\n code: `${slot}=${name}(${input});if(${slot}===${g.fail})return ${g.fail};`,\n value: slot,\n };\n}\n\n/**\n * Try each option in declaration order and take the first that builds — which\n * is what zod's union does with the first option that parses.\n *\n * Every option is HOSTED rather than inlined, and that is load-bearing: a\n * failing build signals with `return FAIL`, which inside the enclosing function\n * would abandon the whole parse instead of moving on to the next option. Behind\n * a call, the same signal is just a value to test.\n *\n * PLAIN unions only. A discriminated union must not reach here: zod resolves it\n * by dispatch, not by probing, and the two disagree — see\n * {@link buildDiscriminatedUnion}.\n */\nfunction buildUnion(ir: SchemaIR & { type: \"union\" }, input: string, g: BuildGen): Built | null {\n const hosted: string[] = [];\n for (const option of ir.options) {\n const fn = g.rebuilds.has(option) ? hostBuild(option, g) : hostPassthrough(option, g);\n if (fn === null) return null;\n hosted.push(fn);\n }\n if (hosted.length === 0) return null;\n\n const out = local(g, \"bu\");\n let code = `${out}=${hosted[0] as string}(${input});`;\n for (const fn of hosted.slice(1)) {\n code += `if(${out}===${g.fail}){${out}=${fn}(${input});}`;\n }\n code += `if(${out}===${g.fail})return ${g.fail};`;\n return { code, value: out };\n}\n\n/**\n * Dispatch on the discriminator and build ONLY the option that value selects,\n * failing outright when it selects none — mirroring zod, which resolves the\n * option through a `discriminator value → option` map built from each option's\n * `propValues` and pushes `invalid_union` (\"No matching discriminator\") without\n * ever running an option's parse when the lookup misses.\n *\n * Probing the options in order like {@link buildUnion} does is NOT equivalent,\n * because an option can accept more than its own dispatch values. A wrapper that\n * substitutes a value contributes only the value it wraps to `propValues` while\n * its parse also accepts the input it substitutes FOR:\n * `z.literal(\"a\").default(\"a\")` dispatches on `\"a\"` alone yet parses a MISSING\n * discriminator, so sequential probing accepted `{v:\"x\"}` — output `{t:\"a\",v:\"x\"}`\n * — where zod rejects it. `.prefault()` and `.catch()` have the same shape, and\n * only escape it because neither reaches this pass today (a prefaulted schema\n * delegates to zod wholesale, and `.catch()` is refused by\n * {@link mutatesBeyondStrip}); a `.default()` is exactly what pulls the build\n * path in. The switch cannot drift that way: the dispatch table IS zod's, so an\n * unlisted discriminator reaches `default:` and fails, whatever the options\n * would have accepted on their own.\n *\n * The reverse — rejecting what zod accepts — is why `.optional()`/`.nullable()`\n * discriminators stay compiled rather than being refused here: their\n * `undefined`/`null` are in `propValues`, so they arrive as ordinary cases.\n *\n * Object-ness is proved BEFORE the discriminator is read, both because zod\n * rejects a non-object with its own `invalid_type` ahead of the lookup and\n * because the property read would throw on `null`/`undefined`.\n */\nfunction buildDiscriminatedUnion(\n ir: SchemaIR & { type: \"discriminatedUnion\" },\n input: string,\n g: BuildGen,\n): Built | null {\n const out = local(g, \"bd\");\n // One hosted build per REACHABLE option, keyed by option index: a multi-value\n // literal (`z.literal([\"a\",\"c\"])`) contributes several cases selecting the\n // same option, and they share the one function rather than emitting it twice.\n const hostedByOption = new Map<number, string>();\n let arms = \"\";\n for (const { value, option: index } of ir.cases) {\n let fn = hostedByOption.get(index);\n if (fn === undefined) {\n const option = ir.options[index];\n if (option === undefined) return null;\n const hosted = g.rebuilds.has(option) ? hostBuild(option, g) : hostPassthrough(option, g);\n if (hosted === null) return null;\n fn = hosted;\n hostedByOption.set(index, fn);\n }\n arms += `case ${literalToJs(value)}:${out}=${fn}(${input});break;`;\n }\n if (arms === \"\") return null;\n\n return {\n code:\n `if(typeof ${input}!==\"object\"||${input}===null||Array.isArray(${input}))return ${g.fail};` +\n `switch(${input}[${escapeString(ir.discriminator)}]){${arms}default:return ${g.fail};}` +\n `if(${out}===${g.fail})return ${g.fail};`,\n value: out,\n };\n}\n\n/**\n * Host a non-rebuilding option as `value-or-FAIL`, so a union can probe it with\n * the same protocol as a rebuilding one.\n */\nfunction hostPassthrough(ir: SchemaIR, g: BuildGen): string | null {\n const param = emitTemp(g.ctx, \"bp\");\n const scope: FastScope = { temps: [], used: 0 };\n const expr = generateFast(ir, createFastGen(param, g.ctx, true, scope));\n if (expr === null) return null;\n const name = emitTemp(g.ctx, \"vp\");\n g.ctx.preamble.push(\n `function ${name}(${param}){${declareFastTemps(scope)}return ${expr === \"true\" ? param : `(${expr})?${param}:${g.fail}`};}`,\n );\n return name;\n}\n\n/** Validate in place with the Fast Path and hand the input straight back. */\nfunction passthrough(ir: SchemaIR, input: string, g: BuildGen): Built | null {\n const scoped = createFastGen(input, g.ctx, true, g.scope);\n const expr = generateFast(ir, scoped);\n if (expr === null) return null;\n return { code: expr === \"true\" ? \"\" : `if(!(${expr}))return ${g.fail};`, value: input };\n}\n\n/**\n * Rebuild from the declared keys. Sound for a stripping object (that IS the\n * output) and for a strict one (unknown keys are rejected, so the declared keys\n * are the whole key set). A loose object or one with a `.catchall()` keeps keys\n * this pass does not enumerate, so those bail.\n */\nfunction buildObject(ir: ObjectIR, input: string, g: BuildGen): Built | null {\n if (ir.catchall !== undefined) return null;\n if (ir.stripUnknownKeys !== true && ir.strict !== true) return null;\n if (ir.suppressAbsentKeys !== undefined && ir.suppressAbsentKeys.length > 0) return null;\n // Object-level `.refine()` runs on the assembled output (below). superRefine\n // rewrites the payload, which this pass does not model — mutatesBeyondStrip\n // already rejects it, so this is a belt-and-braces narrowing of the type.\n const refines = ir.checks ?? [];\n if (refines.some((check) => check.kind !== \"refine_effect\")) return null;\n\n let code = `if(typeof ${input}!==\"object\"||${input}===null||Array.isArray(${input}))return ${g.fail};`;\n\n if (ir.strict === true) {\n const keyVar = local(g, \"bk\");\n code += `for(${keyVar} in ${input}){if(!(${keyMembershipTest(g.ctx, Object.keys(ir.properties), keyVar)}))return ${g.fail};}`;\n }\n\n const slots: { always: boolean; keyStr: string; value: string }[] = [];\n for (const [key, propIR] of Object.entries(ir.properties)) {\n const keyStr = escapeString(key);\n const slot = local(g, \"bv\");\n code += `${slot}=${input}[${keyStr}];`;\n const propBuilt = build(propIR, slot, g);\n if (propBuilt === null) return null;\n code += propBuilt.code;\n slots.push({ always: outputAlwaysDefined(propIR), keyStr, value: propBuilt.value });\n }\n\n // Same assembly the eager strip walk uses: the longest LEADING run of\n // always-present keys goes into one object literal (V8 stamps it from a\n // cached boilerplate map in a single allocation), and everything after the\n // first conditional key is appended so insertion order still matches zod.\n // The per-key test is zod's own — keep the key when the parsed value is\n // defined, or when it was present on the input at all.\n const out = local(g, \"bo\");\n const literal: string[] = [];\n let appends = \"\";\n let leading = true;\n for (const slot of slots) {\n if (leading && slot.always) {\n literal.push(`${slot.keyStr}:${slot.value}`);\n continue;\n }\n leading = false;\n appends += slot.always\n ? `${out}[${slot.keyStr}]=${slot.value};`\n : `if(${slot.value}!==undefined||(${slot.keyStr} in ${input})){${out}[${slot.keyStr}]=${slot.value};}`;\n }\n code += `${out}={${literal.join(\",\")}};${appends}`;\n // Zod parses the properties into the payload first and skips the check chain\n // when that produced issues, so a bad property suppresses the refine — which\n // this pass gets for free, having already returned FAIL at that property.\n for (const check of refines) {\n code += `if(!${emitEffectCallable(g.ctx, check as RefineEffectCheckIR)}(${out}))return ${g.fail};`;\n }\n return { code, value: out };\n}\n\nfunction buildArray(ir: SchemaIR & { type: \"array\" }, input: string, g: BuildGen): Built | null {\n // Length checks are pure predicates over `input.length`, so they hoist ahead\n // of the element loop: a size mismatch bails before a single element is\n // validated. Zod reports the per-element issue first when both fail, but the\n // build pass produces no issues — only the sentinel — and the deferred walk\n // that does produce them keeps zod's order.\n let sizes = \"\";\n const refines: RefineEffectCheckIR[] = [];\n for (const check of ir.checks) {\n switch (check.kind) {\n case \"min_length\":\n sizes += `if(${input}.length<${check.minimum})return ${g.fail};`;\n break;\n case \"max_length\":\n sizes += `if(${input}.length>${check.maximum})return ${g.fail};`;\n break;\n case \"length_equals\":\n sizes += `if(${input}.length!==${check.length})return ${g.fail};`;\n break;\n case \"refine_effect\":\n refines.push(check);\n break;\n default:\n // super_refine (rewrites the value) or a check kind not modelled here.\n return null;\n }\n }\n\n const out = local(g, \"ba\");\n const index = local(g, \"bi\");\n const elem = local(g, \"be\");\n const inner = build(ir.element, elem, g);\n if (inner === null) return null;\n let code =\n `if(!Array.isArray(${input}))return ${g.fail};` +\n sizes +\n `${out}=new Array(${input}.length);` +\n `for(${index}=0;${index}<${input}.length;${index}++){` +\n `${elem}=${input}[${index}];${inner.code}${out}[${index}]=${inner.value};}`;\n // `.refine()` sees the parsed payload, which for a rebuilding element is the\n // freshly assembled array — the same value zod hands its checks.\n for (const check of refines) {\n code += `if(!${emitEffectCallable(g.ctx, check)}(${out}))return ${g.fail};`;\n }\n return { code, value: out };\n}\n\nfunction buildTuple(ir: SchemaIR & { type: \"tuple\" }, input: string, g: BuildGen): Built | null {\n // Trailing-optional and rest handling shape the output length; keep those on\n // the eager walk rather than restating the rules here.\n if (ir.rest !== null) return null;\n if (ir.items.some((item) => !rejectsUndefined(item))) return null;\n\n let code = `if(!Array.isArray(${input})||${input}.length!==${ir.items.length})return ${g.fail};`;\n const values: string[] = [];\n for (const [index, itemIR] of ir.items.entries()) {\n const slot = local(g, \"bt\");\n code += `${slot}=${input}[${index}];`;\n const inner = build(itemIR as SchemaIR, slot, g);\n if (inner === null) return null;\n code += inner.code;\n values.push(inner.value);\n }\n const out = local(g, \"bl\");\n code += `${out}=[${values.join(\",\")}];`;\n return { code, value: out };\n}\n\nfunction buildRecord(ir: SchemaIR & { type: \"record\" }, input: string, g: BuildGen): Built | null {\n const plainStringKey =\n ir.keyType.type === \"string\" && ir.keyType.checks.length === 0 && ir.keyType.coerce !== true;\n if (!plainStringKey) return null;\n\n const out = local(g, \"br\");\n const keyVar = local(g, \"brk\");\n const valVar = local(g, \"brv\");\n const inner = build(ir.valueType, valVar, g);\n if (inner === null) return null;\n const hop = emitRuntimeHelper(g.ctx, \"__zcHop\", ZC_HOP_DECL);\n const code =\n `if(typeof ${input}!==\"object\"||${input}===null||Array.isArray(${input}))return ${g.fail};` +\n `${out}={};` +\n `for(${keyVar} in ${input}){if(${hop}.call(${input},${keyVar})){` +\n `${valVar}=${input}[${keyVar}];${inner.code}${out}[${keyVar}]=${inner.value};}}`;\n return { code, value: out };\n}\n\n/**\n * `.transform(fn)`: validate the inner schema, then hand its parsed value to the\n * callback. `z.preprocess(fn, schema)` reverses those two steps: call first,\n * then validate the callback's output. Returning FAIL from the inner build\n * preserves the corresponding pipe short-circuit in either direction.\n *\n * The IR reaches here only for a synchronous single-argument callback: a\n * `ctx`-taking or async transform is extracted as a `fallback` instead\n * (see extractPipe), so there is no parse context to reproduce.\n */\nfunction buildEffect(ir: SchemaIR & { type: \"effect\" }, input: string, g: BuildGen): Built | null {\n if (ir.effectKind === \"preprocess\") {\n const value = local(g, \"bpv\");\n const inner = build(ir.inner, value, g);\n if (inner === null) return null;\n return {\n code: `${value}=${emitEffectCallable(g.ctx, ir)}(${input});${inner.code}`,\n value: inner.value,\n };\n }\n\n const inner = build(ir.inner, input, g);\n if (inner === null) return null;\n const out = local(g, \"bx\");\n return {\n code: `${inner.code}${out}=${emitEffectCallable(g.ctx, ir)}(${inner.value});`,\n value: out,\n };\n}\n\n/**\n * A coercing and/or overwrite string (`z.coerce.string()`, `.trim()`,\n * `.toLowerCase()`, ...): coerce first, then emit checks one statement at a time\n * in DECLARATION order, interleaved with rewrites, because a rewrite is visible\n * to every check after it — `z.string().trim().min(1)` rejects `\" \"` where\n * `z.string().min(1).trim()` accepts it. That ordering is exactly why the fast\n * path, which sorts checks cheapest-first and returns the input unchanged, has\n * to decline these.\n *\n * Only reached for a rewriting string; a non-coercing, check-only one never\n * enters the rebuild set and is validated in place by `passthrough`.\n */\nfunction buildString(ir: SchemaIR & { type: \"string\" }, input: string, g: BuildGen): Built | null {\n const value = local(g, \"bs\");\n let code =\n ir.coerce === true\n ? `try{${value}=String(${input});}catch(_){return ${g.fail};}`\n : `if(typeof ${input}!==\"string\")return ${g.fail};${value}=${input};`;\n for (const check of ir.checks) {\n switch (check.kind) {\n case \"overwrite_effect\":\n code += `${value}=${emitEffectFn(g.ctx, check.source)}(${value});`;\n break;\n case \"refine_effect\":\n code += `if(!${emitEffectCallable(g.ctx, check)}(${value}))return ${g.fail};`;\n break;\n case \"super_refine_effect\":\n // Rewrites through zod's payload; mutatesBeyondStrip already rejects it.\n return null;\n default: {\n const expr = fastStringCheck(check, value, g.ctx);\n if (expr === null) return null; // z.url(), unknown format\n code += `if(!(${expr}))return ${g.fail};`;\n }\n }\n }\n return { code, value };\n}\n\n/**\n * `z.stringbool()`: normalize once, select the declared truthy/falsy side, and\n * return the boolean directly. The ordinary Fast Path cannot host this codec\n * because its contract returns the original input by reference; the build path\n * is designed for exactly this kind of small output rewrite.\n */\nfunction buildStringBool(ir: StringBoolIR, input: string, g: BuildGen): Built {\n let code = `if(typeof ${input}!==\"string\")return ${g.fail};`;\n let normalized = input;\n if (!ir.caseSensitive) {\n normalized = local(g, \"bn\");\n code += `${normalized}=${input}.toLowerCase();`;\n }\n\n const out = local(g, \"bb\");\n if (stringBoolUsesInline(ir)) {\n const membership = (values: readonly string[]): string =>\n values.map((value) => `${normalized}===${escapeString(value)}`).join(\"||\");\n code +=\n `if(${membership(ir.truthy)}){${out}=true;}` +\n `else if(${membership(ir.falsy)}){${out}=false;}` +\n `else{return ${g.fail};}`;\n } else {\n const lookup = emitStringBoolMap(ir, g.ctx);\n code += `${out}=${lookup}.get(${normalized});if(${out}===undefined)return ${g.fail};`;\n }\n return { code, value: out };\n}\n\n/** Primitive nodes whose `coerce` flag rewrites their output before checks run. */\ntype CoercedPrimitiveIR = Extract<SchemaIR, { type: \"number\" | \"boolean\" | \"bigint\" | \"date\" }>;\n\n/**\n * Coerce once into a local, then reuse the ordinary Fast Path as the acceptance\n * predicate over the converted value. The build path only needs a verdict on\n * its hot pass; if it fails, the existing deferred slow walk reruns the original\n * coercing schema and produces Zod-identical issues.\n *\n * Number/BigInt/Date conversion can invoke user hooks and throw. Zod catches\n * those throws and reports invalid_type, so the sentinel branch does the same\n * without allocating an issue. Boolean never invokes conversion hooks.\n */\nfunction buildCoercedPrimitive(ir: CoercedPrimitiveIR, input: string, g: BuildGen): Built | null {\n if (ir.coerce !== true) return null;\n const value = local(g, \"bc\");\n let conversion: string;\n switch (ir.type) {\n case \"number\":\n conversion = `Number(${input})`;\n break;\n case \"boolean\":\n conversion = `Boolean(${input})`;\n break;\n case \"bigint\":\n conversion = `BigInt(${input})`;\n break;\n case \"date\":\n conversion = `new Date(${input})`;\n break;\n }\n\n // A fresh shallow node is intentional: only the coerce flag changes. The\n // existing primitive generator remains the single source of truth for every\n // range, format, refine and finite/valid-date check.\n const predicate = generateFast(\n { ...ir, coerce: false },\n createFastGen(value, g.ctx, true, g.scope),\n );\n if (predicate === null) return null;\n\n const assign = `${value}=${conversion};`;\n const code = ir.type === \"boolean\" ? assign : `try{${assign}}catch(_){return ${g.fail};}`;\n return {\n code: code + (predicate === \"true\" ? \"\" : `if(!(${predicate}))return ${g.fail};`),\n value,\n };\n}\n\n/**\n * `.default(v)`: `undefined` yields the declared value without running the\n * inner schema, anything else parses normally — the same two branches\n * `slowDefault` emits, reading the value off the retained schema so a\n * reference-typed default keeps zod's identity (one shared object, not a copy).\n *\n * The substituted value is not validated, so it makes the fast path a PARTIAL\n * predicate (`fc(undefined)` is false where the schema accepts) — which is why\n * this records {@link CodeGenContext.buildSubstitutesValue}, on which\n * `generateValidator` withholds `.is()`.\n */\nfunction buildDefault(\n ir: SchemaIR & { type: \"default\" },\n input: string,\n g: BuildGen,\n): Built | null {\n const inner = build(ir.inner, input, g);\n if (inner === null) return null;\n // Every `default` node is in the rebuild set, so it is always BUILT and never\n // passed through — which makes this flag an exact record of whether the\n // finished pass substitutes a value.\n g.ctx.buildSubstitutesValue = true;\n const out = local(g, \"bq\");\n const value = defaultValueExpr(ir);\n // Zod re-applies the default when the inner returns undefined for a defined\n // input; only emitted when the inner can actually do that.\n const reapply = needsPostInnerDefault(ir) ? `if(${out}===undefined){${out}=${value};}` : \"\";\n return {\n code:\n `if(${input}===undefined){${out}=${value};}` +\n `else{${inner.code}${out}=${inner.value};${reapply}}`,\n value: out,\n };\n}\n\n/** `optional` / `nullable` around a rebuilding inner: pass the sentinel through. */\nfunction buildSentinel(\n innerIR: SchemaIR,\n input: string,\n g: BuildGen,\n test: string,\n sentinel: string,\n): Built | null {\n const inner = build(innerIR, input, g);\n if (inner === null) return null;\n const out = local(g, \"bw\");\n return {\n code: `if(${input}${test}){${out}=${sentinel};}else{${inner.code}${out}=${inner.value};}`,\n value: out,\n };\n}\n\n/** Allocate a `var` the hosted build function declares. */\nfunction local(g: BuildGen, prefix: string): string {\n const name = emitTemp(g.ctx, prefix);\n g.scope.temps.push(name);\n return name;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { BigIntCheckIR, CheckIR, DateCheckIR, SchemaIR, SetCheckIR } from "../types.js";
1
+ import { BigIntCheckIR, CheckIR, DateCheckIR, LiteralValue, SchemaIR, SetCheckIR } from "../types.js";
2
2
  import { SharedSchemaPlan } from "./dedupe.js";
3
3
  //#region src/core/codegen/context.d.ts
4
4
  /** Codegen output mode. "inline" emits self-contained code (CLI .compiled.ts). "lean" emits references to imports from "virtual:zod-compiler/runtime" (unplugin). */
@@ -382,13 +382,33 @@ declare function keyMembershipTest(ctx: CodeGenContext, keys: readonly string[],
382
382
  */
383
383
  declare const ENUM_INLINE_THRESHOLD = 5;
384
384
  declare function escapeString(s: string | number): string;
385
+ /** The {@link LiteralValue}s that {@link literalToJs} can spell. */
386
+ type SourceFormLiteral = string | number | boolean | null | bigint | undefined;
387
+ /**
388
+ * Can {@link literalToJs} render this value as JS source that strict-equals it?
389
+ *
390
+ * Total by construction — it NAMES the value kinds that have a source form
391
+ * rather than excluding the ones that don't, so every reference value falls out
392
+ * on the false side. That matters because `literalToJs` used to end in a bare
393
+ * `JSON.stringify`, which does not fail loudly on the values it cannot spell:
394
+ * for a symbol it RETURNS `undefined` (the value, not a string), so
395
+ * `z.literal(sym)` compiled to the comparison `x===undefined` — rejecting the
396
+ * symbol it was built from and accepting `undefined`. An object is mis-rendered
397
+ * the other way: `{}` stringifies to `"{}"`, and `x==={}` is never true, so the
398
+ * very object the schema was built from was rejected. Both take the runtime
399
+ * membership path instead (see the literal generator).
400
+ */
401
+ declare function hasSourceForm(v: LiteralValue): v is SourceFormLiteral;
385
402
  /**
386
403
  * JS source for a primitive literal value (literal schemas, discriminator
387
404
  * case labels). JSON.stringify covers string/number/boolean/null; bigint
388
405
  * needs the `n` suffix (JSON.stringify throws and String(5n) renders a
389
406
  * number literal that never strict-equals a bigint); undefined isn't JSON.
407
+ *
408
+ * The parameter type is deliberately NARROWER than {@link LiteralValue}: every
409
+ * caller must first prove its value is spellable with {@link hasSourceForm}.
390
410
  */
391
- declare function literalToJs(v: string | number | boolean | null | bigint | undefined): string;
411
+ declare function literalToJs(v: SourceFormLiteral): string;
392
412
  /**
393
413
  * Reference a shared runtime helper (e.g. __zcFsr) from generated code.
394
414
  * Lean mode: registers it for the `virtual:zod-compiler/runtime` import.
@@ -450,5 +470,5 @@ declare function rejectsUndefined(ir: SchemaIR): boolean;
450
470
  */
451
471
  declare function checkPriority(a: CheckIR | BigIntCheckIR | DateCheckIR | SetCheckIR, b: CheckIR | BigIntCheckIR | DateCheckIR | SetCheckIR): number;
452
472
  //#endregion
453
- export { CodeGenContext, CodeGenResult, CodegenMode, ENUM_INLINE_THRESHOLD, FastGen, FastGenerator, FastScope, KEY_MEMBERSHIP_INLINE_THRESHOLD, RecTargetGen, SlowGen, SlowGenerator, checkPriority, declareFastTemps, emitConstant, emitEffectCallable, emitEffectFn, emitRegex, emitRegexSourceString, emitRfDelegate, emitRuntimeHelper, emitSet, emitTemp, escapeString, extendPath, extendStaticPath, extendStaticPathIndex, fastSentinelWrapper, hasMutation, keyMembershipTest, literalToJs, outputAlwaysDefined, rejectsUndefined };
473
+ export { CodeGenContext, CodeGenResult, CodegenMode, ENUM_INLINE_THRESHOLD, FastGen, FastGenerator, FastScope, KEY_MEMBERSHIP_INLINE_THRESHOLD, RecTargetGen, SlowGen, SlowGenerator, SourceFormLiteral, checkPriority, declareFastTemps, emitConstant, emitEffectCallable, emitEffectFn, emitRegex, emitRegexSourceString, emitRfDelegate, emitRuntimeHelper, emitSet, emitTemp, escapeString, extendPath, extendStaticPath, extendStaticPathIndex, fastSentinelWrapper, hasMutation, hasSourceForm, keyMembershipTest, literalToJs, outputAlwaysDefined, rejectsUndefined };
454
474
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","names":[],"sources":["../../../src/core/codegen/context.ts"],"mappings":";;;;KASY;UAEK;EACf;EACA;;EAEA;;;;;;EAMA,aAAa;;;;;;;EAOb;;;;;;;;;;EAUA;;;;;;;EAOA;;;;;;;;EAQA;;;UAIe;;EAEf;;;;;EAKA;;;;;;EAMA;;EAEA,QAAQ;;;UAIO;EACf;EACA;EACA;;EAEA,YAAY;;EAEZ,MAAM;;EAEN,aAAa;;;;;;;;EAQb;;;;;;;;;EASA,aAAa,YAAY;;EAEzB,gBAAgB;;EAEhB,aAAa;;EAEb;;EAEA,gBAAgB;;;;;;;;;;EAUhB;;EAEA,gBAAgB,QAAQ;;EAExB,uBAAuB,QAAQ;;;;;;EAM/B,gBAAgB;;;UAMD;WACN;WACA;WACA;WACA;WACA,KAAK;;;;;;;WAOL;;;;;;;;;;;;;;;;WAiBA;;;;;;;;;EAUT,MACE,IAAI,UACJ;IACE;IACA;IACA;IACA;IAGA;;;EAKJ,KAAK;;EAGL,MAAM,gBAAgB,iBAAiB;;EAGvC,IAAI,gBAAgB;;;KAIV,cAAc,UAAU,WAAW,aAAa,IAAI,GAAG,GAAG;;;;;;UASrD;EACf;;;;;;;;;;;EAWA;;;iBAIc,iBAAiB,OAAO;;;;;;;;;;;;;;;;;;;;iBAuBxB,oBACd,GAAG,SACH,SAAS,UACT,kBACA;;UAkBe;WACN;WACA,KAAK;;;;;;;WAQL;;WAGA,OAAO;;;;;;;WAQP;;;;;EAMT,MAAM,IAAI,UAAU;IAAc;IAAgB;;;;;;;;;EASlD,OAAO,gBAAgB;;EAGvB,KAAK;;;;;;;EAQL,MAAM;;EAGN,MAAM,gBAAgB,iBAAiB;;;KAI7B,cAAc,UAAU,WAAW,aAAa,IAAI,GAAG,GAAG;;iBAKtD,SAAS,KAAK,gBAAgB;;;;;;;;;;;;;iBAgB9B,aAAa,KAAK,gBAAgB;;;;;;;;;;;iBAoBlC,mBACd,KAAK,gBACL;EAAU;EAA+B;;;;;;;;;;;;;;;;;;;iBA0B3B,eAAe,KAAK,gBAAgB;;;;;;;iBAepC,UACd,KAAK,gBACL,gBACA,iBACA;;;;;;;;iBA8Bc,sBAAsB,KAAK,gBAAgB;;;;;;;;;;;;iBA4B3C,aAAa,KAAK,gBAAgB,gBAAgB;;iBAWlD,QAAQ,KAAK,gBAAgB,gBAAgB;;;;;;;;;;;;;;;;;;;;cAuBhD;;;;;;;;;;iBAWG,kBACd,KAAK,gBACL,yBACA;;;;;;;;cAgBW;iBA8BG,aAAa;;;;;;;iBAUb,YAAY;;;;;;iBA+BZ,kBAAkB,KAAK,gBAAgB,cAAc;;;;;;;;;;;;iBAqBrD,WAAW,oBAAoB;;iBAS/B,iBAAiB,oBAAoB;;iBAKrC,sBAAsB,oBAAoB;;;;;;;;;;iBAyB1C,YAAY,IAAI;;;;;;;;;;;;;;iBAgFhB,oBAAoB,IAAI;;;;;;;;;iBAYxB,iBAAiB,IAAI;;;;;iBAiDrB,cACd,GAAG,UAAU,gBAAgB,cAAc,YAC3C,GAAG,UAAU,gBAAgB,cAAc"}
1
+ {"version":3,"file":"context.d.ts","names":[],"sources":["../../../src/core/codegen/context.ts"],"mappings":";;;;KAgBY;UAEK;EACf;EACA;;EAEA;;;;;;EAMA,aAAa;;;;;;;EAOb;;;;;;;;;;EAUA;;;;;;;EAOA;;;;;;;;EAQA;;;UAIe;;EAEf;;;;;EAKA;;;;;;EAMA;;EAEA,QAAQ;;;UAIO;EACf;EACA;EACA;;EAEA,YAAY;;EAEZ,MAAM;;EAEN,aAAa;;;;;;;;EAQb;;;;;;;;;EASA,aAAa,YAAY;;EAEzB,gBAAgB;;EAEhB,aAAa;;EAEb;;EAEA,gBAAgB;;;;;;;;;;EAUhB;;EAEA,gBAAgB,QAAQ;;EAExB,uBAAuB,QAAQ;;;;;;EAM/B,gBAAgB;;;UAMD;WACN;WACA;WACA;WACA;WACA,KAAK;;;;;;;WAOL;;;;;;;;;;;;;;;;WAiBA;;;;;;;;;EAUT,MACE,IAAI,UACJ;IACE;IACA;IACA;IACA;IAGA;;;EAKJ,KAAK;;EAGL,MAAM,gBAAgB,iBAAiB;;EAGvC,IAAI,gBAAgB;;;KAIV,cAAc,UAAU,WAAW,aAAa,IAAI,GAAG,GAAG;;;;;;UASrD;EACf;;;;;;;;;;;EAWA;;;iBAIc,iBAAiB,OAAO;;;;;;;;;;;;;;;;;;;;iBAuBxB,oBACd,GAAG,SACH,SAAS,UACT,kBACA;;UAkBe;WACN;WACA,KAAK;;;;;;;WAQL;;WAGA,OAAO;;;;;;;WAQP;;;;;EAMT,MAAM,IAAI,UAAU;IAAc;IAAgB;;;;;;;;;EASlD,OAAO,gBAAgB;;EAGvB,KAAK;;;;;;;EAQL,MAAM;;EAGN,MAAM,gBAAgB,iBAAiB;;;KAI7B,cAAc,UAAU,WAAW,aAAa,IAAI,GAAG,GAAG;;iBAKtD,SAAS,KAAK,gBAAgB;;;;;;;;;;;;;iBAgB9B,aAAa,KAAK,gBAAgB;;;;;;;;;;;iBAoBlC,mBACd,KAAK,gBACL;EAAU;EAA+B;;;;;;;;;;;;;;;;;;;iBA0B3B,eAAe,KAAK,gBAAgB;;;;;;;iBAepC,UACd,KAAK,gBACL,gBACA,iBACA;;;;;;;;iBA8Bc,sBAAsB,KAAK,gBAAgB;;;;;;;;;;;;iBA4B3C,aAAa,KAAK,gBAAgB,gBAAgB;;iBAWlD,QAAQ,KAAK,gBAAgB,gBAAgB;;;;;;;;;;;;;;;;;;;;cAuBhD;;;;;;;;;;iBAWG,kBACd,KAAK,gBACL,yBACA;;;;;;;;cAgBW;iBA8BG,aAAa;;KAKjB;;;;;;;;;;;;;;;iBAgBI,cAAc,GAAG,eAAe,KAAK;;;;;;;;;;iBAerC,YAAY,GAAG;;;;;;iBA+Bf,kBAAkB,KAAK,gBAAgB,cAAc;;;;;;;;;;;;iBAqBrD,WAAW,oBAAoB;;iBAS/B,iBAAiB,oBAAoB;;iBAKrC,sBAAsB,oBAAoB;;;;;;;;;;iBAyB1C,YAAY,IAAI;;;;;;;;;;;;;;iBAgFhB,oBAAoB,IAAI;;;;;;;;;iBAYxB,iBAAiB,IAAI;;;;;iBAiDrB,cACd,GAAG,UAAU,gBAAgB,cAAc,YAC3C,GAAG,UAAU,gBAAgB,cAAc"}
@@ -237,10 +237,32 @@ function escapeString(s) {
237
237
  return JSON.stringify(s);
238
238
  }
239
239
  /**
240
+ * Can {@link literalToJs} render this value as JS source that strict-equals it?
241
+ *
242
+ * Total by construction — it NAMES the value kinds that have a source form
243
+ * rather than excluding the ones that don't, so every reference value falls out
244
+ * on the false side. That matters because `literalToJs` used to end in a bare
245
+ * `JSON.stringify`, which does not fail loudly on the values it cannot spell:
246
+ * for a symbol it RETURNS `undefined` (the value, not a string), so
247
+ * `z.literal(sym)` compiled to the comparison `x===undefined` — rejecting the
248
+ * symbol it was built from and accepting `undefined`. An object is mis-rendered
249
+ * the other way: `{}` stringifies to `"{}"`, and `x==={}` is never true, so the
250
+ * very object the schema was built from was rejected. Both take the runtime
251
+ * membership path instead (see the literal generator).
252
+ */
253
+ function hasSourceForm(v) {
254
+ if (v === null) return true;
255
+ const t = typeof v;
256
+ return t === "string" || t === "number" || t === "boolean" || t === "bigint" || t === "undefined";
257
+ }
258
+ /**
240
259
  * JS source for a primitive literal value (literal schemas, discriminator
241
260
  * case labels). JSON.stringify covers string/number/boolean/null; bigint
242
261
  * needs the `n` suffix (JSON.stringify throws and String(5n) renders a
243
262
  * number literal that never strict-equals a bigint); undefined isn't JSON.
263
+ *
264
+ * The parameter type is deliberately NARROWER than {@link LiteralValue}: every
265
+ * caller must first prove its value is spellable with {@link hasSourceForm}.
244
266
  */
245
267
  function literalToJs(v) {
246
268
  if (typeof v === "bigint") return `${v}n`;
@@ -413,6 +435,6 @@ function checkPriority(a, b) {
413
435
  return (CHECK_PRIORITY[a.kind] ?? 99) - (CHECK_PRIORITY[b.kind] ?? 99);
414
436
  }
415
437
  //#endregion
416
- export { ENUM_INLINE_THRESHOLD, KEY_MEMBERSHIP_INLINE_THRESHOLD, checkPriority, declareFastTemps, emitConstant, emitEffectCallable, emitEffectFn, emitRegex, emitRegexSourceString, emitRfDelegate, emitRuntimeHelper, emitSet, emitTemp, escapeString, extendPath, extendStaticPath, extendStaticPathIndex, fastSentinelWrapper, hasMutation, keyMembershipTest, literalToJs, outputAlwaysDefined, rejectsUndefined };
438
+ export { ENUM_INLINE_THRESHOLD, KEY_MEMBERSHIP_INLINE_THRESHOLD, checkPriority, declareFastTemps, emitConstant, emitEffectCallable, emitEffectFn, emitRegex, emitRegexSourceString, emitRfDelegate, emitRuntimeHelper, emitSet, emitTemp, escapeString, extendPath, extendStaticPath, extendStaticPathIndex, fastSentinelWrapper, hasMutation, hasSourceForm, keyMembershipTest, literalToJs, outputAlwaysDefined, rejectsUndefined };
417
439
 
418
440
  //# sourceMappingURL=context.js.map