zod-aot 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +31 -23
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +108 -5
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/fallback.d.ts.map +1 -1
- package/dist/cli/fallback.js +4 -1
- package/dist/cli/fallback.js.map +1 -1
- package/dist/core/codegen/context.d.ts +8 -1
- package/dist/core/codegen/context.d.ts.map +1 -1
- package/dist/core/codegen/context.js +33 -0
- package/dist/core/codegen/context.js.map +1 -1
- package/dist/core/codegen/fast-check.d.ts +16 -0
- package/dist/core/codegen/fast-check.d.ts.map +1 -0
- package/dist/core/codegen/fast-check.js +406 -0
- package/dist/core/codegen/fast-check.js.map +1 -0
- package/dist/core/codegen/generators/bigint.d.ts.map +1 -1
- package/dist/core/codegen/generators/bigint.js +7 -3
- package/dist/core/codegen/generators/bigint.js.map +1 -1
- package/dist/core/codegen/generators/boolean.d.ts +4 -1
- package/dist/core/codegen/generators/boolean.d.ts.map +1 -1
- package/dist/core/codegen/generators/boolean.js +8 -3
- package/dist/core/codegen/generators/boolean.js.map +1 -1
- package/dist/core/codegen/generators/catch.d.ts +6 -0
- package/dist/core/codegen/generators/catch.d.ts.map +1 -0
- package/dist/core/codegen/generators/catch.js +11 -0
- package/dist/core/codegen/generators/catch.js.map +1 -0
- package/dist/core/codegen/generators/date.d.ts.map +1 -1
- package/dist/core/codegen/generators/date.js +5 -1
- package/dist/core/codegen/generators/date.js.map +1 -1
- package/dist/core/codegen/generators/enum.d.ts.map +1 -1
- package/dist/core/codegen/generators/enum.js +10 -1
- package/dist/core/codegen/generators/enum.js.map +1 -1
- package/dist/core/codegen/generators/index.d.ts +2 -0
- package/dist/core/codegen/generators/index.d.ts.map +1 -1
- package/dist/core/codegen/generators/index.js +2 -0
- package/dist/core/codegen/generators/index.js.map +1 -1
- package/dist/core/codegen/generators/number.d.ts.map +1 -1
- package/dist/core/codegen/generators/number.js +7 -3
- package/dist/core/codegen/generators/number.js.map +1 -1
- package/dist/core/codegen/generators/string.d.ts.map +1 -1
- package/dist/core/codegen/generators/string.js +7 -3
- package/dist/core/codegen/generators/string.js.map +1 -1
- package/dist/core/codegen/generators/template-literal.d.ts +6 -0
- package/dist/core/codegen/generators/template-literal.d.ts.map +1 -0
- package/dist/core/codegen/generators/template-literal.js +12 -0
- package/dist/core/codegen/generators/template-literal.js.map +1 -0
- package/dist/core/codegen/index.d.ts +1 -0
- package/dist/core/codegen/index.d.ts.map +1 -1
- package/dist/core/codegen/index.js +30 -17
- package/dist/core/codegen/index.js.map +1 -1
- package/dist/core/extract/extractors/bigint.js +1 -1
- package/dist/core/extract/extractors/bigint.js.map +1 -1
- package/dist/core/extract/extractors/catch.d.ts +4 -0
- package/dist/core/extract/extractors/catch.d.ts.map +1 -0
- package/dist/core/extract/extractors/catch.js +28 -0
- package/dist/core/extract/extractors/catch.js.map +1 -0
- package/dist/core/extract/extractors/date.js +1 -1
- package/dist/core/extract/extractors/date.js.map +1 -1
- package/dist/core/extract/extractors/index.d.ts +2 -0
- package/dist/core/extract/extractors/index.d.ts.map +1 -1
- package/dist/core/extract/extractors/index.js +2 -0
- package/dist/core/extract/extractors/index.js.map +1 -1
- package/dist/core/extract/extractors/number.d.ts.map +1 -1
- package/dist/core/extract/extractors/number.js +4 -2
- package/dist/core/extract/extractors/number.js.map +1 -1
- package/dist/core/extract/extractors/string.d.ts.map +1 -1
- package/dist/core/extract/extractors/string.js +4 -2
- package/dist/core/extract/extractors/string.js.map +1 -1
- package/dist/core/extract/extractors/template-literal.d.ts +4 -0
- package/dist/core/extract/extractors/template-literal.d.ts.map +1 -0
- package/dist/core/extract/extractors/template-literal.js +8 -0
- package/dist/core/extract/extractors/template-literal.js.map +1 -0
- package/dist/core/extract/index.d.ts.map +1 -1
- package/dist/core/extract/index.js +6 -2
- package/dist/core/extract/index.js.map +1 -1
- package/dist/core/extract/types.d.ts +4 -0
- package/dist/core/extract/types.d.ts.map +1 -1
- package/dist/core/iife.d.ts.map +1 -1
- package/dist/core/iife.js +1 -0
- package/dist/core/iife.js.map +1 -1
- package/dist/core/types.d.ts +15 -1
- package/dist/core/types.d.ts.map +1 -1
- package/package.json +2 -2
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
[](https://www.npmjs.com/package/zod-aot)
|
|
8
8
|
[](LICENSE)
|
|
9
9
|
|
|
10
|
-
No code changes required — keep your existing Zod schemas and get **2-
|
|
10
|
+
No code changes required — keep your existing Zod schemas and get **2-64x faster** validation.
|
|
11
11
|
|
|
12
12
|
## Why
|
|
13
13
|
|
|
@@ -32,27 +32,35 @@ pnpm bench
|
|
|
32
32
|
|
|
33
33
|
### safeParse
|
|
34
34
|
|
|
35
|
-
| Scenario | Zod v3 | Zod v4 | Zod AOT
|
|
36
|
-
|
|
37
|
-
| simple string | 8.
|
|
38
|
-
| string (min/max) |
|
|
39
|
-
| number (int+positive) |
|
|
40
|
-
| enum |
|
|
41
|
-
|
|
|
42
|
-
|
|
|
43
|
-
|
|
|
44
|
-
|
|
|
45
|
-
|
|
|
46
|
-
|
|
|
47
|
-
|
|
|
48
|
-
|
|
|
49
|
-
|
|
|
50
|
-
|
|
|
51
|
-
|
|
|
52
|
-
|
|
|
53
|
-
|
|
|
54
|
-
|
|
55
|
-
|
|
35
|
+
| Scenario | Zod v3 | Zod v4 | **Zod AOT** | Typia | AJV | vs Zod v4 |
|
|
36
|
+
|---|---|---|---|---|---|---|
|
|
37
|
+
| simple string | 8.7M | 10.0M | **11.0M** | 11.0M | 11.1M | 1.1x |
|
|
38
|
+
| string (min/max) | 8.3M | 6.0M | **11.1M** | 11.3M | 9.5M | 1.8x |
|
|
39
|
+
| number (int+positive) | 8.2M | 5.8M | **10.9M** | 10.7M | 10.9M | 1.9x |
|
|
40
|
+
| enum | 8.0M | 9.5M | **10.6M** | 10.6M | 10.5M | 1.1x |
|
|
41
|
+
| bigint (min/max) | 8.0M | 6.0M | **10.9M** | — | — | 1.8x |
|
|
42
|
+
| tuple [string, int, bool] | 4.0M | 4.4M | **10.5M** | 10.8M | 10.5M | 2.4x |
|
|
43
|
+
| record\<string, number\> | 2.3M | 1.9M | **5.4M** | 7.5M | 9.4M | 2.8x |
|
|
44
|
+
| set\<string\> (5 items) | 2.7M | 1.6M | **9.8M** | — | — | 6.3x |
|
|
45
|
+
| set\<string\> (20 items) | 1.0M | 475K | **7.7M** | — | — | **16x** |
|
|
46
|
+
| map\<string, number\> (5 entries) | 1.5M | 946K | **8.5M** | — | — | 9.0x |
|
|
47
|
+
| map\<string, number\> (20 entries) | 490K | 238K | **5.2M** | — | — | **22x** |
|
|
48
|
+
| pipe (non-transform) | 6.3M | 3.8M | **10.8M** | — | — | 2.8x |
|
|
49
|
+
| discriminatedUnion (3 variants) | 2.3M | 2.9M | **9.8M** | 10.4M | 5.6M | 3.4x |
|
|
50
|
+
| medium object (valid) | 1.3M | 1.7M | **5.4M** | 7.3M | 5.0M | 3.1x |
|
|
51
|
+
| medium object (invalid) | 351K | 65K | **471K** | 2.1M | 5.6M | 7.3x |
|
|
52
|
+
| large object (10 items) | 82K | 111K | **4.0M** | 4.1M | 834K | **36x** |
|
|
53
|
+
| large object (100 items) | 9.0K | 11.6K | **676K** | 808K | 89K | **58x** |
|
|
54
|
+
| recursive tree (7 nodes) | 424K | 1.5M | **6.4M** | 8.1M | 3.1M | 4.1x |
|
|
55
|
+
| recursive tree (121 nodes) | 24K | 101K | **741K** | 1.4M | 250K | 7.4x |
|
|
56
|
+
| event log (combined) | 260K | 479K | **4.5M** | — | — | 9.4x |
|
|
57
|
+
| partial fallback obj (transform) | 817K | 1.4M | **3.3M** | — | — | 2.3x |
|
|
58
|
+
| partial fallback arr 10 (transform) | 88K | 139K | **841K** | — | — | 6.1x |
|
|
59
|
+
| partial fallback arr 50 (transform) | 18K | 28K | **175K** | — | — | 6.3x |
|
|
60
|
+
|
|
61
|
+
*ops/s, higher is better. "—" = not supported by the library. Measured with `vitest bench` on Apple M-series.*
|
|
62
|
+
|
|
63
|
+
Performance gains scale with schema complexity. The `discriminatedUnion` optimization uses an O(1) `switch` dispatch instead of Zod's sequential trial approach. Partial fallback schemas (containing `transform`/`refine`) still show 2-6x speedups by compiling the optimizable portions. Set/Map/BigInt are only benchmarked among Zod variants as AJV and Typia lack native support for these types.
|
|
56
64
|
|
|
57
65
|
## Runtime Support
|
|
58
66
|
|
|
@@ -303,7 +311,7 @@ interface CompiledSchema<T> {
|
|
|
303
311
|
| Type | Supported Checks |
|
|
304
312
|
|---|---|
|
|
305
313
|
| `string` | `min`, `max`, `length`, `email`, `url`, `uuid`, `regex`, `includes`, `startsWith`, `endsWith` |
|
|
306
|
-
| `number` | `int`, `positive`, `negative`, `nonnegative`, `nonpositive`, `min`, `max`, `multipleOf` |
|
|
314
|
+
| `number` | `int`, `positive`, `negative`, `nonnegative`, `nonpositive`, `min`, `max`, `multipleOf`, `int32`, `uint32`, `float32`, `float64` |
|
|
307
315
|
| `bigint` | `min`, `max`, `positive`, `negative`, `nonnegative`, `nonpositive`, `multipleOf` |
|
|
308
316
|
| `boolean` | — |
|
|
309
317
|
| `null` | — |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"AAmIA,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDnE"}
|
|
@@ -4,8 +4,109 @@ import process from "node:process";
|
|
|
4
4
|
import { extractSchema } from "#src/core/extract/index.js";
|
|
5
5
|
import { discoverSchemas } from "#src/discovery.js";
|
|
6
6
|
import { getErrorMessage } from "../errors.js";
|
|
7
|
-
import { hasFallback } from "../fallback.js";
|
|
8
7
|
import { logger } from "../logger.js";
|
|
8
|
+
function countNodes(ir, currentPath = "") {
|
|
9
|
+
if (ir.type === "fallback") {
|
|
10
|
+
return {
|
|
11
|
+
total: 1,
|
|
12
|
+
compilable: 0,
|
|
13
|
+
fallbacks: [{ reason: ir.reason, path: currentPath || "." }],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
if (ir.type === "object") {
|
|
17
|
+
let total = 0;
|
|
18
|
+
let compilable = 0;
|
|
19
|
+
const fallbacks = [];
|
|
20
|
+
for (const [key, prop] of Object.entries(ir.properties)) {
|
|
21
|
+
const r = countNodes(prop, `${currentPath}.${key}`);
|
|
22
|
+
total += r.total;
|
|
23
|
+
compilable += r.compilable;
|
|
24
|
+
fallbacks.push(...r.fallbacks);
|
|
25
|
+
}
|
|
26
|
+
return { total, compilable, fallbacks };
|
|
27
|
+
}
|
|
28
|
+
if (ir.type === "array") {
|
|
29
|
+
return countNodes(ir.element, `${currentPath}[]`);
|
|
30
|
+
}
|
|
31
|
+
if (ir.type === "optional" || ir.type === "nullable" || ir.type === "readonly") {
|
|
32
|
+
return countNodes(ir.inner, currentPath);
|
|
33
|
+
}
|
|
34
|
+
if (ir.type === "default" || ir.type === "catch") {
|
|
35
|
+
return countNodes(ir.inner, currentPath);
|
|
36
|
+
}
|
|
37
|
+
if (ir.type === "union" || ir.type === "discriminatedUnion") {
|
|
38
|
+
let total = 0;
|
|
39
|
+
let compilable = 0;
|
|
40
|
+
const fallbacks = [];
|
|
41
|
+
for (const [i, opt] of ir.options.entries()) {
|
|
42
|
+
const r = countNodes(opt, `${currentPath}[${i}]`);
|
|
43
|
+
total += r.total;
|
|
44
|
+
compilable += r.compilable;
|
|
45
|
+
fallbacks.push(...r.fallbacks);
|
|
46
|
+
}
|
|
47
|
+
return { total, compilable, fallbacks };
|
|
48
|
+
}
|
|
49
|
+
if (ir.type === "tuple") {
|
|
50
|
+
let total = 0;
|
|
51
|
+
let compilable = 0;
|
|
52
|
+
const fallbacks = [];
|
|
53
|
+
for (const [i, item] of ir.items.entries()) {
|
|
54
|
+
const r = countNodes(item, `${currentPath}[${i}]`);
|
|
55
|
+
total += r.total;
|
|
56
|
+
compilable += r.compilable;
|
|
57
|
+
fallbacks.push(...r.fallbacks);
|
|
58
|
+
}
|
|
59
|
+
if (ir.rest) {
|
|
60
|
+
const r = countNodes(ir.rest, `${currentPath}[...rest]`);
|
|
61
|
+
total += r.total;
|
|
62
|
+
compilable += r.compilable;
|
|
63
|
+
fallbacks.push(...r.fallbacks);
|
|
64
|
+
}
|
|
65
|
+
return { total, compilable, fallbacks };
|
|
66
|
+
}
|
|
67
|
+
if (ir.type === "record") {
|
|
68
|
+
const kr = countNodes(ir.keyType, `${currentPath}[key]`);
|
|
69
|
+
const vr = countNodes(ir.valueType, `${currentPath}[value]`);
|
|
70
|
+
return {
|
|
71
|
+
total: kr.total + vr.total,
|
|
72
|
+
compilable: kr.compilable + vr.compilable,
|
|
73
|
+
fallbacks: [...kr.fallbacks, ...vr.fallbacks],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if (ir.type === "intersection") {
|
|
77
|
+
const lr = countNodes(ir.left, `${currentPath}[left]`);
|
|
78
|
+
const rr = countNodes(ir.right, `${currentPath}[right]`);
|
|
79
|
+
return {
|
|
80
|
+
total: lr.total + rr.total,
|
|
81
|
+
compilable: lr.compilable + rr.compilable,
|
|
82
|
+
fallbacks: [...lr.fallbacks, ...rr.fallbacks],
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
if (ir.type === "set") {
|
|
86
|
+
return countNodes(ir.valueType, `${currentPath}[element]`);
|
|
87
|
+
}
|
|
88
|
+
if (ir.type === "map") {
|
|
89
|
+
const kr = countNodes(ir.keyType, `${currentPath}[key]`);
|
|
90
|
+
const vr = countNodes(ir.valueType, `${currentPath}[value]`);
|
|
91
|
+
return {
|
|
92
|
+
total: kr.total + vr.total,
|
|
93
|
+
compilable: kr.compilable + vr.compilable,
|
|
94
|
+
fallbacks: [...kr.fallbacks, ...vr.fallbacks],
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (ir.type === "pipe") {
|
|
98
|
+
const ir2 = countNodes(ir.in, `${currentPath}[in]`);
|
|
99
|
+
const or2 = countNodes(ir.out, `${currentPath}[out]`);
|
|
100
|
+
return {
|
|
101
|
+
total: ir2.total + or2.total,
|
|
102
|
+
compilable: ir2.compilable + or2.compilable,
|
|
103
|
+
fallbacks: [...ir2.fallbacks, ...or2.fallbacks],
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// Leaf node (string, number, boolean, bigint, date, literal, enum,
|
|
107
|
+
// symbol, null, undefined, void, nan, never, any, unknown, recursiveRef, templateLiteral)
|
|
108
|
+
return { total: 1, compilable: 1, fallbacks: [] };
|
|
109
|
+
}
|
|
9
110
|
export async function runCheck(options) {
|
|
10
111
|
const files = [];
|
|
11
112
|
for (const input of options.inputs) {
|
|
@@ -38,12 +139,14 @@ export async function runCheck(options) {
|
|
|
38
139
|
}
|
|
39
140
|
for (const s of schemas) {
|
|
40
141
|
const ir = extractSchema(s.schema);
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
142
|
+
const coverage = countNodes(ir);
|
|
143
|
+
const pct = coverage.total > 0 ? Math.round((coverage.compilable / coverage.total) * 100) : 100;
|
|
144
|
+
if (coverage.fallbacks.length > 0) {
|
|
145
|
+
const reasons = coverage.fallbacks.map((f) => `${f.reason} at ${f.path}`).join(", ");
|
|
146
|
+
logger.warn(`${s.exportName} — ${pct}% compiled (fallback: ${reasons})`);
|
|
44
147
|
}
|
|
45
148
|
else {
|
|
46
|
-
logger.success(`${s.exportName} —
|
|
149
|
+
logger.success(`${s.exportName} — ${pct}% compiled`);
|
|
47
150
|
hasCompilable = true;
|
|
48
151
|
}
|
|
49
152
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../src/cli/fallback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../src/cli/fallback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CA0CvD"}
|
package/dist/cli/fallback.js
CHANGED
|
@@ -19,9 +19,12 @@ export function hasFallback(ir) {
|
|
|
19
19
|
if (ir.type === "optional" || ir.type === "nullable" || ir.type === "readonly") {
|
|
20
20
|
return hasFallback(ir.inner);
|
|
21
21
|
}
|
|
22
|
-
if (ir.type === "default") {
|
|
22
|
+
if (ir.type === "default" || ir.type === "catch") {
|
|
23
23
|
return hasFallback(ir.inner);
|
|
24
24
|
}
|
|
25
|
+
if (ir.type === "templateLiteral") {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
25
28
|
if (ir.type === "union" || ir.type === "discriminatedUnion") {
|
|
26
29
|
for (const opt of ir.options) {
|
|
27
30
|
const reason = hasFallback(opt);
|
package/dist/cli/fallback.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fallback.js","sourceRoot":"","sources":["../../src/cli/fallback.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,EAAY;IACtC,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC,MAAM,CAAC;IACnB,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,MAAM;gBAAE,OAAO,GAAG,MAAM,QAAQ,GAAG,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/E,OAAO,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"fallback.js","sourceRoot":"","sources":["../../src/cli/fallback.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,EAAY;IACtC,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC,MAAM,CAAC;IACnB,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,MAAM;gBAAE,OAAO,GAAG,MAAM,QAAQ,GAAG,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/E,OAAO,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACjD,OAAO,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,IAAI,EAAE,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;QAC5D,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;QAC5B,CAAC;QACD,IAAI,EAAE,CAAC,IAAI;YAAE,OAAO,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAC/B,OAAO,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import type { SchemaIR } from "../types.js";
|
|
1
|
+
import type { BigIntCheckIR, CheckIR, DateCheckIR, SchemaIR } from "../types.js";
|
|
2
2
|
export interface CodeGenResult {
|
|
3
3
|
code: string;
|
|
4
4
|
functionDef: string;
|
|
5
5
|
/** Number of fallback schemas referenced by __fb[N] in the generated code. 0 = no fallbacks. */
|
|
6
6
|
fallbackCount: number;
|
|
7
|
+
/** Auxiliary function definitions (e.g. __fastCheck_* for recursiveRef). Emitted before the main function. */
|
|
8
|
+
auxiliaryFunctions?: string[];
|
|
7
9
|
}
|
|
8
10
|
export interface CodeGenContext {
|
|
9
11
|
preamble: string[];
|
|
@@ -25,4 +27,9 @@ export declare function escapeString(s: string): string;
|
|
|
25
27
|
* e.g. "function safeParse_User(input){..." -> "safeParse_User"
|
|
26
28
|
*/
|
|
27
29
|
export declare function extractFunctionName(functionDef: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Sort comparator for CheckIR: cheapest/most-discriminating checks first.
|
|
32
|
+
* Used as `[...ir.checks].sort(checkPriority)`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function checkPriority(a: CheckIR | BigIntCheckIR | DateCheckIR, b: CheckIR | BigIntCheckIR | DateCheckIR): number;
|
|
28
35
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/core/codegen/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/core/codegen/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEjF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,gGAAgG;IAChG,aAAa,EAAE,MAAM,CAAC;IACtB,8GAA8G;IAC9G,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,oBAAoB,GAAG,CACjC,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,cAAc,KAChB,MAAM,CAAC;AAGZ,eAAO,MAAM,kBAAkB,QAA+G,CAAC;AAE/I,kGAAkG;AAClG,eAAO,MAAM,iBAAiB,2KAC4I,CAAC;AAE3K;;;GAGG;AACH,wBAAgB,IAAI,CAClB,OAAO,EAAE,oBAAoB,EAC7B,GAAG,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EAAE,GAChD,MAAM,CAOR;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAM/D;AA6BD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,CAAC,EAAE,OAAO,GAAG,aAAa,GAAG,WAAW,EACxC,CAAC,EAAE,OAAO,GAAG,aAAa,GAAG,WAAW,GACvC,MAAM,CAER"}
|
|
@@ -29,4 +29,37 @@ export function extractFunctionName(functionDef) {
|
|
|
29
29
|
}
|
|
30
30
|
return match[1];
|
|
31
31
|
}
|
|
32
|
+
const CHECK_PRIORITY = {
|
|
33
|
+
// Cheapest: length/size comparisons (O(1))
|
|
34
|
+
min_length: 10,
|
|
35
|
+
max_length: 11,
|
|
36
|
+
length_equals: 12,
|
|
37
|
+
min_size: 13,
|
|
38
|
+
max_size: 14,
|
|
39
|
+
// Number format checks (comparison + bitwise)
|
|
40
|
+
number_format: 15,
|
|
41
|
+
// Range comparisons
|
|
42
|
+
greater_than: 20,
|
|
43
|
+
less_than: 21,
|
|
44
|
+
bigint_greater_than: 20,
|
|
45
|
+
bigint_less_than: 21,
|
|
46
|
+
date_greater_than: 22,
|
|
47
|
+
date_less_than: 23,
|
|
48
|
+
// Modulo
|
|
49
|
+
multiple_of: 30,
|
|
50
|
+
bigint_multiple_of: 30,
|
|
51
|
+
// String search (O(n))
|
|
52
|
+
includes: 40,
|
|
53
|
+
starts_with: 41,
|
|
54
|
+
ends_with: 42,
|
|
55
|
+
// Regex (most expensive)
|
|
56
|
+
string_format: 50,
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Sort comparator for CheckIR: cheapest/most-discriminating checks first.
|
|
60
|
+
* Used as `[...ir.checks].sort(checkPriority)`.
|
|
61
|
+
*/
|
|
62
|
+
export function checkPriority(a, b) {
|
|
63
|
+
return (CHECK_PRIORITY[a.kind] ?? 99) - (CHECK_PRIORITY[b.kind] ?? 99);
|
|
64
|
+
}
|
|
32
65
|
//# sourceMappingURL=context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/core/codegen/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/core/codegen/context.ts"],"names":[],"mappings":"AAyBA,qEAAqE;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAA,kGAAkG,CAAC;AAE/I,kGAAkG;AAClG,MAAM,CAAC,MAAM,iBAAiB,GAC5B,wKAAwK,CAAC;AAE3K;;;GAGG;AACH,MAAM,UAAU,IAAI,CAClB,OAA6B,EAC7B,GAAG,MAA8C;IAEjD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM;YAAE,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,cAAc,GAA2B;IAC7C,2CAA2C;IAC3C,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;IACd,aAAa,EAAE,EAAE;IACjB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,8CAA8C;IAC9C,aAAa,EAAE,EAAE;IACjB,oBAAoB;IACpB,YAAY,EAAE,EAAE;IAChB,SAAS,EAAE,EAAE;IACb,mBAAmB,EAAE,EAAE;IACvB,gBAAgB,EAAE,EAAE;IACpB,iBAAiB,EAAE,EAAE;IACrB,cAAc,EAAE,EAAE;IAClB,SAAS;IACT,WAAW,EAAE,EAAE;IACf,kBAAkB,EAAE,EAAE;IACtB,uBAAuB;IACvB,QAAQ,EAAE,EAAE;IACZ,WAAW,EAAE,EAAE;IACf,SAAS,EAAE,EAAE;IACb,yBAAyB;IACzB,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,CAAwC,EACxC,CAAwC;IAExC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fast Path generator: produces a boolean expression string for eligible schemas.
|
|
3
|
+
* When the expression evaluates to `true` at runtime, the input is valid and
|
|
4
|
+
* safeParse can return success immediately without allocating an issues array.
|
|
5
|
+
*
|
|
6
|
+
* Returns `null` if the schema is not eligible for Fast Path (contains coerce,
|
|
7
|
+
* default, catch, date, set/map, transform, refine, or other non-pure constructs).
|
|
8
|
+
*/
|
|
9
|
+
import type { SchemaIR } from "../types.js";
|
|
10
|
+
import type { CodeGenContext } from "./context.js";
|
|
11
|
+
/**
|
|
12
|
+
* Generate a boolean expression string that validates `inputExpr` against the schema.
|
|
13
|
+
* Returns `null` if the schema (or any nested part) is not eligible for fast checking.
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateFastCheck(ir: SchemaIR, inputExpr: string, ctx: CodeGenContext): string | null;
|
|
16
|
+
//# sourceMappingURL=fast-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fast-check.d.ts","sourceRoot":"","sources":["../../../src/core/codegen/fast-check.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAaV,QAAQ,EAIT,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,cAAc,GAClB,MAAM,GAAG,IAAI,CA6Ff"}
|