zod-compiler 1.22.0 → 1.22.1

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 (111) hide show
  1. package/README.md +150 -588
  2. package/dist/cli/commands/generate.d.ts +0 -2
  3. package/dist/cli/commands/generate.d.ts.map +1 -1
  4. package/dist/cli/commands/generate.js +0 -2
  5. package/dist/cli/commands/generate.js.map +1 -1
  6. package/dist/cli/commands/watch.d.ts +0 -1
  7. package/dist/cli/commands/watch.d.ts.map +1 -1
  8. package/dist/cli/commands/watch.js +0 -2
  9. package/dist/cli/commands/watch.js.map +1 -1
  10. package/dist/cli/index.js +0 -7
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/core/codegen/build-path.d.ts +40 -0
  13. package/dist/core/codegen/build-path.d.ts.map +1 -0
  14. package/dist/core/codegen/build-path.js +473 -0
  15. package/dist/core/codegen/build-path.js.map +1 -0
  16. package/dist/core/codegen/context.d.ts +77 -3
  17. package/dist/core/codegen/context.d.ts.map +1 -1
  18. package/dist/core/codegen/context.js +68 -33
  19. package/dist/core/codegen/context.js.map +1 -1
  20. package/dist/core/codegen/dedupe.d.ts +7 -0
  21. package/dist/core/codegen/dedupe.d.ts.map +1 -1
  22. package/dist/core/codegen/dedupe.js +7 -0
  23. package/dist/core/codegen/dedupe.js.map +1 -1
  24. package/dist/core/codegen/fast-path.d.ts.map +1 -1
  25. package/dist/core/codegen/fast-path.js +11 -5
  26. package/dist/core/codegen/fast-path.js.map +1 -1
  27. package/dist/core/codegen/index.d.ts.map +1 -1
  28. package/dist/core/codegen/index.js +89 -5
  29. package/dist/core/codegen/index.js.map +1 -1
  30. package/dist/core/codegen/regex-unroll.d.ts +36 -0
  31. package/dist/core/codegen/regex-unroll.d.ts.map +1 -0
  32. package/dist/core/codegen/regex-unroll.js +231 -0
  33. package/dist/core/codegen/regex-unroll.js.map +1 -0
  34. package/dist/core/codegen/schemas/array.d.ts.map +1 -1
  35. package/dist/core/codegen/schemas/array.js +4 -3
  36. package/dist/core/codegen/schemas/array.js.map +1 -1
  37. package/dist/core/codegen/schemas/default.d.ts.map +1 -1
  38. package/dist/core/codegen/schemas/default.js +2 -4
  39. package/dist/core/codegen/schemas/default.js.map +1 -1
  40. package/dist/core/codegen/schemas/discriminated-union.d.ts.map +1 -1
  41. package/dist/core/codegen/schemas/discriminated-union.js +3 -3
  42. package/dist/core/codegen/schemas/discriminated-union.js.map +1 -1
  43. package/dist/core/codegen/schemas/map.js +2 -2
  44. package/dist/core/codegen/schemas/map.js.map +1 -1
  45. package/dist/core/codegen/schemas/nullable.d.ts.map +1 -1
  46. package/dist/core/codegen/schemas/nullable.js +2 -4
  47. package/dist/core/codegen/schemas/nullable.js.map +1 -1
  48. package/dist/core/codegen/schemas/object.d.ts.map +1 -1
  49. package/dist/core/codegen/schemas/object.js +10 -9
  50. package/dist/core/codegen/schemas/object.js.map +1 -1
  51. package/dist/core/codegen/schemas/optional.d.ts.map +1 -1
  52. package/dist/core/codegen/schemas/optional.js +3 -5
  53. package/dist/core/codegen/schemas/optional.js.map +1 -1
  54. package/dist/core/codegen/schemas/record.js +2 -2
  55. package/dist/core/codegen/schemas/record.js.map +1 -1
  56. package/dist/core/codegen/schemas/set.d.ts.map +1 -1
  57. package/dist/core/codegen/schemas/set.js +4 -3
  58. package/dist/core/codegen/schemas/set.js.map +1 -1
  59. package/dist/core/codegen/schemas/string.d.ts.map +1 -1
  60. package/dist/core/codegen/schemas/string.js +2 -2
  61. package/dist/core/codegen/schemas/string.js.map +1 -1
  62. package/dist/core/codegen/schemas/template-literal.d.ts.map +1 -1
  63. package/dist/core/codegen/schemas/template-literal.js +9 -1
  64. package/dist/core/codegen/schemas/template-literal.js.map +1 -1
  65. package/dist/core/codegen/schemas/tuple.d.ts.map +1 -1
  66. package/dist/core/codegen/schemas/tuple.js +4 -3
  67. package/dist/core/codegen/schemas/tuple.js.map +1 -1
  68. package/dist/core/codegen/well-known-regex.d.ts +22 -4
  69. package/dist/core/codegen/well-known-regex.d.ts.map +1 -1
  70. package/dist/core/codegen/well-known-regex.js +27 -5
  71. package/dist/core/codegen/well-known-regex.js.map +1 -1
  72. package/dist/core/extract/extractors/object.d.ts.map +1 -1
  73. package/dist/core/extract/extractors/object.js +11 -5
  74. package/dist/core/extract/extractors/object.js.map +1 -1
  75. package/dist/core/extract/index.d.ts +3 -3
  76. package/dist/core/extract/index.d.ts.map +1 -1
  77. package/dist/core/extract/index.js +2 -2
  78. package/dist/core/extract/index.js.map +1 -1
  79. package/dist/core/extract/registry.d.ts +2 -2
  80. package/dist/core/extract/registry.d.ts.map +1 -1
  81. package/dist/core/extract/registry.js +4 -5
  82. package/dist/core/extract/registry.js.map +1 -1
  83. package/dist/core/extract/types.d.ts +0 -11
  84. package/dist/core/extract/types.d.ts.map +1 -1
  85. package/dist/core/iife.d.ts.map +1 -1
  86. package/dist/core/iife.js +3 -2
  87. package/dist/core/iife.js.map +1 -1
  88. package/dist/core/pipeline.d.ts +0 -2
  89. package/dist/core/pipeline.d.ts.map +1 -1
  90. package/dist/core/pipeline.js +1 -3
  91. package/dist/core/pipeline.js.map +1 -1
  92. package/dist/swc.d.ts.map +1 -1
  93. package/dist/swc.js +0 -1
  94. package/dist/swc.js.map +1 -1
  95. package/dist/unplugin/hoist-compile.d.ts +1 -1
  96. package/dist/unplugin/hoist-compile.d.ts.map +1 -1
  97. package/dist/unplugin/hoist-compile.js +4 -4
  98. package/dist/unplugin/hoist-compile.js.map +1 -1
  99. package/dist/unplugin/index.d.ts.map +1 -1
  100. package/dist/unplugin/index.js +0 -3
  101. package/dist/unplugin/index.js.map +1 -1
  102. package/dist/unplugin/transform.d.ts.map +1 -1
  103. package/dist/unplugin/transform.js +1 -2
  104. package/dist/unplugin/transform.js.map +1 -1
  105. package/dist/unplugin/types.d.ts +0 -23
  106. package/dist/unplugin/types.d.ts.map +1 -1
  107. package/dist/unplugin/types.js.map +1 -1
  108. package/dist/unplugin/virtual.d.ts.map +1 -1
  109. package/dist/unplugin/virtual.js +11 -7
  110. package/dist/unplugin/virtual.js.map +1 -1
  111. package/package.json +1 -1
@@ -0,0 +1,473 @@
1
+ /**
2
+ * Build Path: one uninstrumented pass that VALIDATES and BUILDS the stripped
3
+ * output together, abandoning the whole parse at the first failing check.
4
+ *
5
+ * `z.object()` strips unknown keys, so a successful parse cannot return the
6
+ * input by reference — it must produce a fresh object. That rules out the Fast
7
+ * Path (whose contract is `data === input`), and before this the only remaining
8
+ * option was the eager slow walk: a fully instrumented traversal that collects
9
+ * issues on every parse, valid or not.
10
+ *
11
+ * Two passes are wasteful in either direction. Validating first and building
12
+ * afterwards reads every property twice (measured 29.7 ns vs 21.6 for the slow
13
+ * walk on a 6-field object). Building with issue collection pays the
14
+ * instrumentation even when nothing fails. Doing both in ONE pass, with a
15
+ * sentinel instead of an issues array, beats both — and a failure costs only
16
+ * the checks up to the first bad one, because the issue-producing walk is
17
+ * deferred into `.error` exactly as `__zcFinD` does for mutation-free schemas:
18
+ *
19
+ * object clean object invalid array(8) invalid
20
+ * slow walk 21.6 ns 30.4 ns 197.5 ns
21
+ * build path 18.1 ns 7.7 ns 9.8 ns
22
+ *
23
+ * The generator is deliberately partial. A subtree that rebuilds nothing is
24
+ * validated with its existing Fast Path expression and passed through by
25
+ * reference, so only genuinely rebuilding containers need code here; anything
26
+ * else returns null and keeps the eager walk. Callers must also confirm
27
+ * {@link mutatesBeyondStrip} is false — coerce/default/transform/superRefine
28
+ * rewrite values, which this pass does not model.
29
+ */
30
+ import { declareFastTemps, emitRuntimeHelper, emitTemp, escapeString, keyMembershipTest, rejectsUndefined, } from "./context.js";
31
+ import { createFastGen, generateFast } from "./fast-path.js";
32
+ import { EXTRACT_CAP, estimateFastCost, MIN_EXTRACT, predictedInlineSize } from "./fast-size.js";
33
+ import { ZC_HOP_DECL } from "./issue-decls.js";
34
+ /**
35
+ * Which nodes of `root` produce a value that is not their input — i.e. are, or
36
+ * contain, a stripping object. Everything else can be validated in place and
37
+ * passed through, which is what keeps this generator small.
38
+ *
39
+ * Computed as a fixpoint rather than a plain walk because of recursion: a
40
+ * `recursiveRef` is a back-edge with no children, so a local walk reads false
41
+ * for it and would pass the whole recursive subtree through by reference —
42
+ * leaving every nested value unstripped while the outermost one was rebuilt.
43
+ * Resolving the ref against its target closes the cycle, and iterating to a
44
+ * fixpoint settles the mutual dependency between the two.
45
+ */
46
+ function rebuildSet(root) {
47
+ const targets = new Map([[0, root]]);
48
+ const nodes = [];
49
+ const seen = new Set();
50
+ const collect = (node) => {
51
+ if (seen.has(node))
52
+ return;
53
+ seen.add(node);
54
+ nodes.push(node);
55
+ if (node.type === "recursionTarget")
56
+ targets.set(node.refId, node.inner);
57
+ for (const child of children(node))
58
+ collect(child);
59
+ };
60
+ collect(root);
61
+ const rebuilds = new Set();
62
+ for (let changed = true; changed;) {
63
+ changed = false;
64
+ for (const node of nodes) {
65
+ if (rebuilds.has(node))
66
+ continue;
67
+ const target = node.type === "recursiveRef" ? targets.get(node.refId ?? 0) : undefined;
68
+ const rebuild = (node.type === "object" && node.stripUnknownKeys === true) ||
69
+ (target !== undefined && rebuilds.has(target)) ||
70
+ children(node).some((child) => rebuilds.has(child));
71
+ if (rebuild) {
72
+ rebuilds.add(node);
73
+ changed = true;
74
+ }
75
+ }
76
+ }
77
+ return rebuilds;
78
+ }
79
+ /** Does `ir`, taken as a whole schema, produce a value that is not its input? */
80
+ export function rebuildsOutput(ir) {
81
+ return rebuildSet(ir).has(ir);
82
+ }
83
+ /**
84
+ * True when the subtree mutates for any reason OTHER than stripping — coerce,
85
+ * `.default()`, `.catch()`, `.transform()`, `.trim()`, `superRefine`. Those
86
+ * rewrite values rather than merely reshaping objects, so the build pass (which
87
+ * only ever copies validated values) cannot reproduce them and the schema keeps
88
+ * the eager walk.
89
+ */
90
+ function mutatesBeyondStrip(ir) {
91
+ return mutatesHere(ir) || children(ir).some(mutatesBeyondStrip);
92
+ }
93
+ /**
94
+ * Does this node rewrite values on its own account (ignoring its children, and
95
+ * ignoring the reshaping a strip object does)? Mirrors the node-local half of
96
+ * `hasMutation`; the recursion above supplies the other half.
97
+ */
98
+ function mutatesHere(ir) {
99
+ switch (ir.type) {
100
+ case "string":
101
+ return (ir.coerce === true ||
102
+ superRefines(ir.checks) ||
103
+ ir.checks.some((c) => c.kind === "overwrite_effect" || (c.kind === "string_format" && c.format === "url")));
104
+ case "number":
105
+ return ir.coerce === true || superRefines(ir.checks);
106
+ case "boolean":
107
+ case "bigint":
108
+ case "date":
109
+ return ir.coerce === true;
110
+ case "default":
111
+ case "catch":
112
+ case "effect":
113
+ case "fallback":
114
+ case "stringBool":
115
+ return true;
116
+ case "object":
117
+ case "array":
118
+ return superRefines(ir.checks);
119
+ default:
120
+ return false;
121
+ }
122
+ }
123
+ function superRefines(checks) {
124
+ return checks !== undefined && checks.some((c) => c.kind === "super_refine_effect");
125
+ }
126
+ function children(ir) {
127
+ switch (ir.type) {
128
+ case "object":
129
+ return ir.catchall
130
+ ? [...Object.values(ir.properties), ir.catchall]
131
+ : Object.values(ir.properties);
132
+ case "array":
133
+ return [ir.element];
134
+ case "tuple":
135
+ return ir.rest === null ? ir.items : [...ir.items, ir.rest];
136
+ case "record":
137
+ case "map":
138
+ return [ir.keyType, ir.valueType];
139
+ case "set":
140
+ return [ir.valueType];
141
+ case "union":
142
+ case "discriminatedUnion":
143
+ return ir.options;
144
+ case "intersection":
145
+ return [ir.left, ir.right];
146
+ case "optional":
147
+ case "nullable":
148
+ case "readonly":
149
+ case "default":
150
+ case "catch":
151
+ case "effect":
152
+ case "recursionTarget":
153
+ return [ir.inner];
154
+ case "pipe":
155
+ return [ir.in, ir.out];
156
+ default:
157
+ return [];
158
+ }
159
+ }
160
+ /**
161
+ * Host the whole schema as `function NAME(input){…}` returning the built value
162
+ * or the FAIL sentinel. Returns the function name, or null when the schema is
163
+ * not expressible as a single build pass.
164
+ */
165
+ export function generateBuild(ir, ctx) {
166
+ const rebuilds = rebuildSet(ir);
167
+ if (!rebuilds.has(ir) || mutatesBeyondStrip(ir))
168
+ return null;
169
+ const fail = emitFailSentinel(ctx);
170
+ const scope = { temps: [], used: 0 };
171
+ const built = build(ir, "input", { ctx, extractable: false, fail, rebuilds, scope });
172
+ if (built === null)
173
+ return null;
174
+ const name = emitTemp(ctx, "vb");
175
+ ctx.preamble.push(`function ${name}(input){${declareFastTemps(scope)}${built.code}return ${built.value};}`);
176
+ return name;
177
+ }
178
+ /** One `{}` per validator, compared by identity — no parse output can equal it. */
179
+ function emitFailSentinel(ctx) {
180
+ if (ctx.buildFailName === undefined) {
181
+ ctx.buildFailName = `__bf_${ctx.counter++}`;
182
+ ctx.preamble.push(`var ${ctx.buildFailName}={};`);
183
+ }
184
+ return ctx.buildFailName;
185
+ }
186
+ /**
187
+ * Statements producing the built value of `ir` read from `input`, or null.
188
+ *
189
+ * Size-gated exactly like the fast path: once inlining `ir` would push the
190
+ * function being assembled past EXTRACT_CAP, the sub-build is hosted as its own
191
+ * `__vb_N(p)` returning value-or-FAIL and replaced by a call. Without this a
192
+ * deeply nested schema emits one enormous build function — measured at 113 KB
193
+ * and 354 KB on the deep fixtures — far past the bytecode size where V8 stops
194
+ * running TurboFan on it, which would forfeit the speed this path exists for.
195
+ */
196
+ function build(ir, input, g) {
197
+ // Resolved before the passthrough shortcut below. A back-edge carries no
198
+ // children, so `rebuildsOutput` reads false for it — and passing it through by
199
+ // reference would leave every nested recursive value unstripped while the
200
+ // outermost one was rebuilt.
201
+ if (ir.type === "recursiveRef")
202
+ return buildRecursiveCall(ir.refId ?? 0, input, g);
203
+ if (ir.type === "recursionTarget")
204
+ return buildRecursionTarget(ir, input, g);
205
+ if (!g.rebuilds.has(ir))
206
+ return passthrough(ir, input, g);
207
+ const cache = (g.ctx.fastSizeCache ??= new WeakMap());
208
+ if (g.extractable &&
209
+ g.scope.used + predictedInlineSize(ir, input.length, cache) > EXTRACT_CAP &&
210
+ (g.scope.used > EXTRACT_CAP || estimateFastCost(ir, cache) >= MIN_EXTRACT)) {
211
+ const hosted = hostBuild(ir, g);
212
+ if (hosted !== null) {
213
+ const slot = local(g, "bh");
214
+ const code = `${slot}=${hosted}(${input});if(${slot}===${g.fail})return ${g.fail};`;
215
+ g.scope.used += code.length;
216
+ return { code, value: slot };
217
+ }
218
+ }
219
+ // This node's extraction decision is made; its descendants get to make their
220
+ // own, so an oversized hosted helper keeps splitting.
221
+ const before = g.scope.used;
222
+ const out = buildInline(ir, input, { ...g, extractable: true });
223
+ if (out !== null)
224
+ g.scope.used = before + out.code.length;
225
+ return out;
226
+ }
227
+ /** Host `ir`'s build in its own function over a fresh parameter; returns its name. */
228
+ function hostBuild(ir, g) {
229
+ const param = emitTemp(g.ctx, "bp");
230
+ const scope = { temps: [], used: 0 };
231
+ const inner = build(ir, param, { ...g, extractable: false, scope });
232
+ if (inner === null)
233
+ return null;
234
+ const name = emitTemp(g.ctx, "vb");
235
+ g.ctx.preamble.push(`function ${name}(${param}){${declareFastTemps(scope)}${inner.code}return ${inner.value};}`);
236
+ return name;
237
+ }
238
+ function buildInline(ir, input, g) {
239
+ switch (ir.type) {
240
+ case "object":
241
+ return buildObject(ir, input, g);
242
+ case "array":
243
+ return buildArray(ir, input, g);
244
+ case "tuple":
245
+ return buildTuple(ir, input, g);
246
+ case "record":
247
+ return buildRecord(ir, input, g);
248
+ case "optional":
249
+ return buildSentinel(ir.inner, input, g, "===undefined", "undefined");
250
+ case "nullable":
251
+ return buildSentinel(ir.inner, input, g, "===null", "null");
252
+ case "readonly":
253
+ return build(ir.inner, input, g);
254
+ case "union":
255
+ case "discriminatedUnion":
256
+ return buildUnion(ir, input, g);
257
+ default:
258
+ // A rebuilding intersection, map or set: expressible in principle, but
259
+ // each needs its own output-shaping rules, so they keep the eager walk
260
+ // until there is a measured reason to add them.
261
+ return null;
262
+ }
263
+ }
264
+ /**
265
+ * Host the target's build once under a name registered BEFORE its body is
266
+ * generated, so the back-edges inside that body resolve to it.
267
+ */
268
+ function buildRecursionTarget(ir, input, g) {
269
+ const table = (g.ctx.buildRecNames ??= new Map());
270
+ if (!table.has(ir.refId)) {
271
+ const name = emitTemp(g.ctx, "vbr");
272
+ table.set(ir.refId, name);
273
+ const param = emitTemp(g.ctx, "bp");
274
+ const scope = { temps: [], used: 0 };
275
+ const inner = build(ir.inner, param, { ...g, extractable: false, scope });
276
+ if (inner === null) {
277
+ table.delete(ir.refId);
278
+ return null;
279
+ }
280
+ g.ctx.preamble.push(`function ${name}(${param}){${declareFastTemps(scope)}${inner.code}return ${inner.value};}`);
281
+ }
282
+ return buildRecursiveCall(ir.refId, input, g);
283
+ }
284
+ /** Call the hosted build for a recursion target, propagating its FAIL. */
285
+ function buildRecursiveCall(refId, input, g) {
286
+ const name = g.ctx.buildRecNames?.get(refId);
287
+ if (name === undefined)
288
+ return null;
289
+ const slot = local(g, "bh");
290
+ return {
291
+ code: `${slot}=${name}(${input});if(${slot}===${g.fail})return ${g.fail};`,
292
+ value: slot,
293
+ };
294
+ }
295
+ /**
296
+ * Try each option in declaration order and take the first that builds — which
297
+ * is what zod's union does with the first option that parses.
298
+ *
299
+ * Every option is HOSTED rather than inlined, and that is load-bearing: a
300
+ * failing build signals with `return FAIL`, which inside the enclosing function
301
+ * would abandon the whole parse instead of moving on to the next option. Behind
302
+ * a call, the same signal is just a value to test.
303
+ *
304
+ * A discriminated union gets the same treatment rather than a switch: the
305
+ * options still have to be probed by call, and its dispatch advantage is
306
+ * already spent by the enclosing container's own work.
307
+ */
308
+ function buildUnion(ir, input, g) {
309
+ const hosted = [];
310
+ for (const option of ir.options) {
311
+ const fn = g.rebuilds.has(option) ? hostBuild(option, g) : hostPassthrough(option, g);
312
+ if (fn === null)
313
+ return null;
314
+ hosted.push(fn);
315
+ }
316
+ if (hosted.length === 0)
317
+ return null;
318
+ const out = local(g, "bu");
319
+ let code = `${out}=${hosted[0]}(${input});`;
320
+ for (const fn of hosted.slice(1)) {
321
+ code += `if(${out}===${g.fail}){${out}=${fn}(${input});}`;
322
+ }
323
+ code += `if(${out}===${g.fail})return ${g.fail};`;
324
+ return { code, value: out };
325
+ }
326
+ /**
327
+ * Host a non-rebuilding option as `value-or-FAIL`, so a union can probe it with
328
+ * the same protocol as a rebuilding one.
329
+ */
330
+ function hostPassthrough(ir, g) {
331
+ const param = emitTemp(g.ctx, "bp");
332
+ const scope = { temps: [], used: 0 };
333
+ const expr = generateFast(ir, createFastGen(param, g.ctx, true, scope));
334
+ if (expr === null)
335
+ return null;
336
+ const name = emitTemp(g.ctx, "vp");
337
+ g.ctx.preamble.push(`function ${name}(${param}){${declareFastTemps(scope)}return ${expr === "true" ? param : `(${expr})?${param}:${g.fail}`};}`);
338
+ return name;
339
+ }
340
+ /** Validate in place with the Fast Path and hand the input straight back. */
341
+ function passthrough(ir, input, g) {
342
+ const scoped = createFastGen(input, g.ctx, true, g.scope);
343
+ const expr = generateFast(ir, scoped);
344
+ if (expr === null)
345
+ return null;
346
+ return { code: expr === "true" ? "" : `if(!(${expr}))return ${g.fail};`, value: input };
347
+ }
348
+ /**
349
+ * Rebuild from the declared keys. Sound for a stripping object (that IS the
350
+ * output) and for a strict one (unknown keys are rejected, so the declared keys
351
+ * are the whole key set). A loose object or one with a `.catchall()` keeps keys
352
+ * this pass does not enumerate, so those bail.
353
+ */
354
+ function buildObject(ir, input, g) {
355
+ if (ir.catchall !== undefined)
356
+ return null;
357
+ if (ir.stripUnknownKeys !== true && ir.strict !== true)
358
+ return null;
359
+ if (ir.checks !== undefined && ir.checks.length > 0)
360
+ return null;
361
+ if (ir.suppressAbsentKeys !== undefined && ir.suppressAbsentKeys.length > 0)
362
+ return null;
363
+ let code = `if(typeof ${input}!=="object"||${input}===null||Array.isArray(${input}))return ${g.fail};`;
364
+ if (ir.strict === true) {
365
+ const keyVar = local(g, "bk");
366
+ code += `for(${keyVar} in ${input}){if(!(${keyMembershipTest(g.ctx, Object.keys(ir.properties), keyVar)}))return ${g.fail};}`;
367
+ }
368
+ const slots = [];
369
+ for (const [key, propIR] of Object.entries(ir.properties)) {
370
+ const keyStr = escapeString(key);
371
+ const slot = local(g, "bv");
372
+ code += `${slot}=${input}[${keyStr}];`;
373
+ const propBuilt = build(propIR, slot, g);
374
+ if (propBuilt === null)
375
+ return null;
376
+ code += propBuilt.code;
377
+ slots.push({ always: rejectsUndefined(propIR), keyStr, value: propBuilt.value });
378
+ }
379
+ // Same assembly the eager strip walk uses: the longest LEADING run of
380
+ // always-present keys goes into one object literal (V8 stamps it from a
381
+ // cached boilerplate map in a single allocation), and everything after the
382
+ // first conditional key is appended so insertion order still matches zod.
383
+ // The per-key test is zod's own — keep the key when the parsed value is
384
+ // defined, or when it was present on the input at all.
385
+ const out = local(g, "bo");
386
+ const literal = [];
387
+ let appends = "";
388
+ let leading = true;
389
+ for (const slot of slots) {
390
+ if (leading && slot.always) {
391
+ literal.push(`${slot.keyStr}:${slot.value}`);
392
+ continue;
393
+ }
394
+ leading = false;
395
+ appends += slot.always
396
+ ? `${out}[${slot.keyStr}]=${slot.value};`
397
+ : `if(${slot.value}!==undefined||(${slot.keyStr} in ${input})){${out}[${slot.keyStr}]=${slot.value};}`;
398
+ }
399
+ code += `${out}={${literal.join(",")}};${appends}`;
400
+ return { code, value: out };
401
+ }
402
+ function buildArray(ir, input, g) {
403
+ if (ir.checks.length > 0)
404
+ return null;
405
+ const out = local(g, "ba");
406
+ const index = local(g, "bi");
407
+ const elem = local(g, "be");
408
+ const inner = build(ir.element, elem, g);
409
+ if (inner === null)
410
+ return null;
411
+ const code = `if(!Array.isArray(${input}))return ${g.fail};` +
412
+ `${out}=new Array(${input}.length);` +
413
+ `for(${index}=0;${index}<${input}.length;${index}++){` +
414
+ `${elem}=${input}[${index}];${inner.code}${out}[${index}]=${inner.value};}`;
415
+ return { code, value: out };
416
+ }
417
+ function buildTuple(ir, input, g) {
418
+ // Trailing-optional and rest handling shape the output length; keep those on
419
+ // the eager walk rather than restating the rules here.
420
+ if (ir.rest !== null)
421
+ return null;
422
+ if (ir.items.some((item) => !rejectsUndefined(item)))
423
+ return null;
424
+ let code = `if(!Array.isArray(${input})||${input}.length!==${ir.items.length})return ${g.fail};`;
425
+ const values = [];
426
+ for (const [index, itemIR] of ir.items.entries()) {
427
+ const slot = local(g, "bt");
428
+ code += `${slot}=${input}[${index}];`;
429
+ const inner = build(itemIR, slot, g);
430
+ if (inner === null)
431
+ return null;
432
+ code += inner.code;
433
+ values.push(inner.value);
434
+ }
435
+ const out = local(g, "bl");
436
+ code += `${out}=[${values.join(",")}];`;
437
+ return { code, value: out };
438
+ }
439
+ function buildRecord(ir, input, g) {
440
+ const plainStringKey = ir.keyType.type === "string" && ir.keyType.checks.length === 0 && ir.keyType.coerce !== true;
441
+ if (!plainStringKey)
442
+ return null;
443
+ const out = local(g, "br");
444
+ const keyVar = local(g, "brk");
445
+ const valVar = local(g, "brv");
446
+ const inner = build(ir.valueType, valVar, g);
447
+ if (inner === null)
448
+ return null;
449
+ const hop = emitRuntimeHelper(g.ctx, "__zcHop", ZC_HOP_DECL);
450
+ const code = `if(typeof ${input}!=="object"||${input}===null||Array.isArray(${input}))return ${g.fail};` +
451
+ `${out}={};` +
452
+ `for(${keyVar} in ${input}){if(${hop}.call(${input},${keyVar})){` +
453
+ `${valVar}=${input}[${keyVar}];${inner.code}${out}[${keyVar}]=${inner.value};}}`;
454
+ return { code, value: out };
455
+ }
456
+ /** `optional` / `nullable` around a rebuilding inner: pass the sentinel through. */
457
+ function buildSentinel(innerIR, input, g, test, sentinel) {
458
+ const inner = build(innerIR, input, g);
459
+ if (inner === null)
460
+ return null;
461
+ const out = local(g, "bw");
462
+ return {
463
+ code: `if(${input}${test}){${out}=${sentinel};}else{${inner.code}${out}=${inner.value};}`,
464
+ value: out,
465
+ };
466
+ }
467
+ /** Allocate a `var` the hosted build function declares. */
468
+ function local(g, prefix) {
469
+ const name = emitTemp(g.ctx, prefix);
470
+ g.scope.temps.push(name);
471
+ return name;
472
+ }
473
+ //# sourceMappingURL=build-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-path.js","sourceRoot":"","sources":["../../../src/core/codegen/build-path.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,13 @@ export interface CodeGenResult {
30
30
  * `.is()` then derives from `safeParse(input).success`.
31
31
  */
32
32
  fastTotal: boolean;
33
+ /**
34
+ * Hosted predicate installed as `.is()`, when it differs from `fastFnName`.
35
+ * A schema that rebuilds its output has no by-reference shortcut (so
36
+ * `fastFnName` is null) yet still has an exact acceptance predicate, because
37
+ * stripping reshapes the payload and never the verdict.
38
+ */
39
+ isFnName?: string | null;
33
40
  /**
34
41
  * Compact mode only: the `__rf[N]` index this validator delegates its cold
35
42
  * error path to (the schema itself, captured as a fresh root RefEntry). When
@@ -89,6 +96,10 @@ export interface CodeGenContext {
89
96
  effectFnCache?: Map<string, string>;
90
97
  /** Dedup cache for constant preamble declarations: initializer text → preamble var. */
91
98
  valueCache?: Map<string, string>;
99
+ /** Name of the build path's FAIL sentinel, declared once per validator. */
100
+ buildFailName?: string;
101
+ /** Hosted build-function name per recursion target refId, so back-edges resolve. */
102
+ buildRecNames?: Map<number, string>;
92
103
  /** Memo for estimateFastCost (size-gated fast-check extraction). Lazily created. */
93
104
  fastSizeCache?: WeakMap<SchemaIR, number>;
94
105
  /** Memo for estimateRuntimeCost (cheapest-first check ordering). Lazily created. */
@@ -161,7 +172,40 @@ export type SlowGenerator<T extends SchemaIR = SchemaIR> = (ir: T, g: SlowGen) =
161
172
  */
162
173
  export interface FastScope {
163
174
  used: number;
175
+ /**
176
+ * `var` temps that the function this scope is assembling must declare, in
177
+ * allocation order. Populated by {@link FastGen.local}; every site that
178
+ * materializes a function body from a fresh scope emits
179
+ * {@link declareFastTemps} at the top of that body.
180
+ *
181
+ * Function-scoped (never module-scoped) is load-bearing: a recursive
182
+ * validator re-enters itself while an outer frame still holds a live temp,
183
+ * and each invocation needs its own binding.
184
+ */
185
+ temps: string[];
164
186
  }
187
+ /** `var a,b;` declaration for a scope's temps, or "" when it allocated none. */
188
+ export declare function declareFastTemps(scope: FastScope): string;
189
+ /**
190
+ * Fast check for a wrapper that compares its input against a sentinel and
191
+ * otherwise delegates to an inner schema — `optional` (`===undefined`),
192
+ * `nullable` (`===null`) and `default` (`!==undefined`).
193
+ *
194
+ * Written naively these read the input TWICE: once for the sentinel test and
195
+ * again inside the inner check (which may itself read it several more times —
196
+ * `typeof x==="string"&&x.length>=3&&x.length<=20`). V8's load elimination
197
+ * removes the repeats only while the access is monomorphic; on the polymorphic
198
+ * and megamorphic call sites real payloads produce (an array of objects with
199
+ * differing key order, anything out of `JSON.parse`) every repeat is a fresh
200
+ * megamorphic lookup. Binding the value to a local once is worth 1.1-1.7x on
201
+ * the whole object check when the optional key is present, and is neutral when
202
+ * it is absent.
203
+ *
204
+ * Only hoisted when the input is a property access; a bare local (an array
205
+ * element variable, a record value) is already a single load, so it keeps the
206
+ * shorter form and byte-identical output.
207
+ */
208
+ export declare function fastSentinelWrapper(g: FastGen, innerIR: SchemaIR, sentinel: string, joiner: "&&" | "||"): string | null;
165
209
  /** Context object for fast-path (boolean expression) generator functions. */
166
210
  export interface FastGen {
167
211
  readonly input: string;
@@ -200,6 +244,13 @@ export interface FastGen {
200
244
  scoped(input: string): FastGen;
201
245
  /** Generate a unique temp variable name. */
202
246
  temp(prefix: string): string;
247
+ /**
248
+ * Allocate a unique name AND record it on this scope so the enclosing
249
+ * emitted function declares it as a `var` (see {@link FastScope.temps}).
250
+ * Use for a value bound inside an expression — `(t=x["k"])===undefined` —
251
+ * where `temp()` alone would leave the name undeclared.
252
+ */
253
+ local(prefix: string): string;
203
254
  /** Add a regex to preamble and return the variable name. */
204
255
  regex(prefix: string, pattern: string, flags?: string): string;
205
256
  }
@@ -281,11 +332,34 @@ export declare function emitRegexSourceString(ctx: CodeGenContext, pattern: stri
281
332
  export declare function emitConstant(ctx: CodeGenContext, prefix: string, initializer: string): string;
282
333
  /** Declare a `new Set([...])` in the preamble and return its variable name. */
283
334
  export declare function emitSet(ctx: CodeGenContext, prefix: string, values: readonly unknown[]): string;
335
+ /**
336
+ * Shape-key count at or below which the unknown-key pass compares with an
337
+ * inline `===` chain rather than a hashed lookup.
338
+ *
339
+ * This is deliberately NOT {@link ENUM_INLINE_THRESHOLD}: the two look alike but
340
+ * are different workloads. An enum compares schema literals against arbitrary
341
+ * INPUT strings, which may be long, share prefixes, and are not necessarily
342
+ * internalized — so a hashed set earns its keep quickly. A shape-key test
343
+ * compares them against keys arriving from `for-in`, i.e. the object's own
344
+ * internalized key strings, so every arm of the chain is a pointer compare that
345
+ * V8 predicts perfectly, while `table[k]` / `set.has(k)` pays a string hash and
346
+ * probe per key.
347
+ *
348
+ * Measured over a strict object's for-in pass (JSON-parsed input, 8 rotated
349
+ * shapes), `===` chain vs the previous `{k:1}` table: 3.7x at 6 keys, 3.8x at
350
+ * 10, 3.1x at 20, 3.1x at 48 — the chain still leads at 64 (283 ns vs 690) and
351
+ * only loses past ~96, where `Set.has` (not the table, which never wins at any
352
+ * size) takes over. 64 sits below that crossover and above any realistic shape.
353
+ */
354
+ export declare const KEY_MEMBERSHIP_INLINE_THRESHOLD = 64;
284
355
  /**
285
356
  * Boolean membership test for one key variable against a fixed key list.
286
- * Short lists inline an `===` chain (keys arriving from for-in are
287
- * internalized, so each arm is a pointer compare); longer ones consult a
288
- * preamble membership table. Empty list recognizes nothing.
357
+ * Empty list recognizes nothing.
358
+ *
359
+ * `Set.has` is the large-shape fallback rather than a `{key:1}` object table:
360
+ * the table is also `__proto__`-hostile (an own `__proto__` key cannot be set
361
+ * by an object literal, so that key would silently read as unknown), which the
362
+ * Set has no trouble with.
289
363
  */
290
364
  export declare function keyMembershipTest(ctx: CodeGenContext, keys: readonly string[], keyVar: string): string;
291
365
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/core/codegen/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/core/codegen/context.ts"],"names":[],"mappings":"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"}