zod-compiler 1.23.0 → 1.23.2
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/README.md +9 -6
- package/dist/cli/commands/check.d.ts +10 -7
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +125 -148
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/generate.d.ts +22 -19
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +102 -133
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/watch.d.ts +17 -15
- package/dist/cli/commands/watch.d.ts.map +1 -1
- package/dist/cli/commands/watch.js +126 -154
- package/dist/cli/commands/watch.js.map +1 -1
- package/dist/cli/emitter.d.ts +19 -16
- package/dist/cli/emitter.d.ts.map +1 -1
- package/dist/cli/emitter.js +55 -71
- package/dist/cli/emitter.js.map +1 -1
- package/dist/cli/errors.d.ts +4 -1
- package/dist/cli/errors.d.ts.map +1 -1
- package/dist/cli/errors.js +6 -2
- package/dist/cli/errors.js.map +1 -1
- package/dist/cli/index.d.ts +1 -3
- package/dist/cli/index.js +147 -160
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/logger.d.ts +18 -15
- package/dist/cli/logger.d.ts.map +1 -1
- package/dist/cli/logger.js +38 -37
- package/dist/cli/logger.js.map +1 -1
- package/dist/core/codegen/build-path.d.ts +7 -41
- package/dist/core/codegen/build-path.d.ts.map +1 -1
- package/dist/core/codegen/build-path.js +481 -570
- package/dist/core/codegen/build-path.js.map +1 -1
- package/dist/core/codegen/context.d.ts +256 -253
- package/dist/core/codegen/context.d.ts.map +1 -1
- package/dist/core/codegen/context.js +363 -437
- package/dist/core/codegen/context.js.map +1 -1
- package/dist/core/codegen/dedupe.d.ts +22 -56
- package/dist/core/codegen/dedupe.d.ts.map +1 -1
- package/dist/core/codegen/dedupe.js +150 -242
- package/dist/core/codegen/dedupe.js.map +1 -1
- package/dist/core/codegen/emit-issue.d.ts +44 -68
- package/dist/core/codegen/emit-issue.d.ts.map +1 -1
- package/dist/core/codegen/emit-issue.js +76 -108
- package/dist/core/codegen/emit-issue.js.map +1 -1
- package/dist/core/codegen/emit.d.ts +4 -1
- package/dist/core/codegen/emit.d.ts.map +1 -1
- package/dist/core/codegen/emit.js +16 -13
- package/dist/core/codegen/emit.js.map +1 -1
- package/dist/core/codegen/fast-path.d.ts +7 -12
- package/dist/core/codegen/fast-path.d.ts.map +1 -1
- package/dist/core/codegen/fast-path.js +116 -145
- package/dist/core/codegen/fast-path.js.map +1 -1
- package/dist/core/codegen/fast-size.d.ts +12 -26
- package/dist/core/codegen/fast-size.d.ts.map +1 -1
- package/dist/core/codegen/fast-size.js +169 -244
- package/dist/core/codegen/fast-size.js.map +1 -1
- package/dist/core/codegen/index.d.ts +25 -23
- package/dist/core/codegen/index.d.ts.map +1 -1
- package/dist/core/codegen/index.js +239 -405
- package/dist/core/codegen/index.js.map +1 -1
- package/dist/core/codegen/issue-decls.d.ts +15 -12
- package/dist/core/codegen/issue-decls.d.ts.map +1 -1
- package/dist/core/codegen/issue-decls.js +131 -162
- package/dist/core/codegen/issue-decls.js.map +1 -1
- package/dist/core/codegen/regex-unroll.d.ts +4 -1
- package/dist/core/codegen/regex-unroll.d.ts.map +1 -1
- package/dist/core/codegen/regex-unroll.js +173 -197
- package/dist/core/codegen/regex-unroll.js.map +1 -1
- package/dist/core/codegen/schemas/any.d.ts +7 -4
- package/dist/core/codegen/schemas/any.d.ts.map +1 -1
- package/dist/core/codegen/schemas/any.js +8 -4
- package/dist/core/codegen/schemas/any.js.map +1 -1
- package/dist/core/codegen/schemas/array.d.ts +8 -5
- package/dist/core/codegen/schemas/array.d.ts.map +1 -1
- package/dist/core/codegen/schemas/array.js +77 -95
- package/dist/core/codegen/schemas/array.js.map +1 -1
- package/dist/core/codegen/schemas/bigint.d.ts +7 -4
- package/dist/core/codegen/schemas/bigint.d.ts.map +1 -1
- package/dist/core/codegen/schemas/bigint.js +44 -56
- package/dist/core/codegen/schemas/bigint.js.map +1 -1
- package/dist/core/codegen/schemas/boolean.d.ts +7 -4
- package/dist/core/codegen/schemas/boolean.d.ts.map +1 -1
- package/dist/core/codegen/schemas/boolean.js +12 -11
- package/dist/core/codegen/schemas/boolean.js.map +1 -1
- package/dist/core/codegen/schemas/catch.d.ts +8 -5
- package/dist/core/codegen/schemas/catch.d.ts.map +1 -1
- package/dist/core/codegen/schemas/catch.js +23 -23
- package/dist/core/codegen/schemas/catch.js.map +1 -1
- package/dist/core/codegen/schemas/date.d.ts +7 -4
- package/dist/core/codegen/schemas/date.d.ts.map +1 -1
- package/dist/core/codegen/schemas/date.js +49 -68
- package/dist/core/codegen/schemas/date.js.map +1 -1
- package/dist/core/codegen/schemas/default.d.ts +9 -6
- package/dist/core/codegen/schemas/default.d.ts.map +1 -1
- package/dist/core/codegen/schemas/default.js +29 -27
- package/dist/core/codegen/schemas/default.js.map +1 -1
- package/dist/core/codegen/schemas/discriminated-union.d.ts +12 -10
- package/dist/core/codegen/schemas/discriminated-union.d.ts.map +1 -1
- package/dist/core/codegen/schemas/discriminated-union.js +153 -178
- package/dist/core/codegen/schemas/discriminated-union.js.map +1 -1
- package/dist/core/codegen/schemas/effect.d.ts +9 -6
- package/dist/core/codegen/schemas/effect.d.ts.map +1 -1
- package/dist/core/codegen/schemas/effect.js +54 -67
- package/dist/core/codegen/schemas/effect.js.map +1 -1
- package/dist/core/codegen/schemas/enum.d.ts +7 -4
- package/dist/core/codegen/schemas/enum.d.ts.map +1 -1
- package/dist/core/codegen/schemas/enum.js +15 -21
- package/dist/core/codegen/schemas/enum.js.map +1 -1
- package/dist/core/codegen/schemas/fallback.d.ts +6 -3
- package/dist/core/codegen/schemas/fallback.d.ts.map +1 -1
- package/dist/core/codegen/schemas/fallback.js +14 -13
- package/dist/core/codegen/schemas/fallback.js.map +1 -1
- package/dist/core/codegen/schemas/file.d.ts +7 -4
- package/dist/core/codegen/schemas/file.d.ts.map +1 -1
- package/dist/core/codegen/schemas/file.js +51 -57
- package/dist/core/codegen/schemas/file.js.map +1 -1
- package/dist/core/codegen/schemas/intersection.d.ts +8 -5
- package/dist/core/codegen/schemas/intersection.d.ts.map +1 -1
- package/dist/core/codegen/schemas/intersection.js +16 -13
- package/dist/core/codegen/schemas/intersection.js.map +1 -1
- package/dist/core/codegen/schemas/literal.d.ts +7 -4
- package/dist/core/codegen/schemas/literal.d.ts.map +1 -1
- package/dist/core/codegen/schemas/literal.js +20 -23
- package/dist/core/codegen/schemas/literal.js.map +1 -1
- package/dist/core/codegen/schemas/map.d.ts +8 -5
- package/dist/core/codegen/schemas/map.d.ts.map +1 -1
- package/dist/core/codegen/schemas/map.js +61 -67
- package/dist/core/codegen/schemas/map.js.map +1 -1
- package/dist/core/codegen/schemas/nan.d.ts +7 -4
- package/dist/core/codegen/schemas/nan.d.ts.map +1 -1
- package/dist/core/codegen/schemas/nan.js +8 -4
- package/dist/core/codegen/schemas/nan.js.map +1 -1
- package/dist/core/codegen/schemas/never.d.ts +7 -4
- package/dist/core/codegen/schemas/never.d.ts.map +1 -1
- package/dist/core/codegen/schemas/never.js +8 -4
- package/dist/core/codegen/schemas/never.js.map +1 -1
- package/dist/core/codegen/schemas/null.d.ts +7 -4
- package/dist/core/codegen/schemas/null.d.ts.map +1 -1
- package/dist/core/codegen/schemas/null.js +8 -4
- package/dist/core/codegen/schemas/null.js.map +1 -1
- package/dist/core/codegen/schemas/nullable.d.ts +8 -5
- package/dist/core/codegen/schemas/nullable.d.ts.map +1 -1
- package/dist/core/codegen/schemas/nullable.js +8 -5
- package/dist/core/codegen/schemas/nullable.js.map +1 -1
- package/dist/core/codegen/schemas/number.d.ts +7 -4
- package/dist/core/codegen/schemas/number.d.ts.map +1 -1
- package/dist/core/codegen/schemas/number.js +120 -176
- package/dist/core/codegen/schemas/number.js.map +1 -1
- package/dist/core/codegen/schemas/object.d.ts +8 -5
- package/dist/core/codegen/schemas/object.d.ts.map +1 -1
- package/dist/core/codegen/schemas/object.js +144 -231
- package/dist/core/codegen/schemas/object.js.map +1 -1
- package/dist/core/codegen/schemas/optional.d.ts +9 -6
- package/dist/core/codegen/schemas/optional.d.ts.map +1 -1
- package/dist/core/codegen/schemas/optional.js +23 -31
- package/dist/core/codegen/schemas/optional.js.map +1 -1
- package/dist/core/codegen/schemas/pipe.d.ts +8 -5
- package/dist/core/codegen/schemas/pipe.d.ts.map +1 -1
- package/dist/core/codegen/schemas/pipe.js +20 -27
- package/dist/core/codegen/schemas/pipe.js.map +1 -1
- package/dist/core/codegen/schemas/readonly.d.ts +8 -5
- package/dist/core/codegen/schemas/readonly.d.ts.map +1 -1
- package/dist/core/codegen/schemas/readonly.js +8 -5
- package/dist/core/codegen/schemas/readonly.js.map +1 -1
- package/dist/core/codegen/schemas/record.d.ts +8 -5
- package/dist/core/codegen/schemas/record.d.ts.map +1 -1
- package/dist/core/codegen/schemas/record.js +52 -65
- package/dist/core/codegen/schemas/record.js.map +1 -1
- package/dist/core/codegen/schemas/recursive-ref.d.ts +9 -6
- package/dist/core/codegen/schemas/recursive-ref.d.ts.map +1 -1
- package/dist/core/codegen/schemas/recursive-ref.js +44 -44
- package/dist/core/codegen/schemas/recursive-ref.js.map +1 -1
- package/dist/core/codegen/schemas/set.d.ts +8 -5
- package/dist/core/codegen/schemas/set.d.ts.map +1 -1
- package/dist/core/codegen/schemas/set.js +61 -73
- package/dist/core/codegen/schemas/set.js.map +1 -1
- package/dist/core/codegen/schemas/string-bool.d.ts +6 -3
- package/dist/core/codegen/schemas/string-bool.d.ts.map +1 -1
- package/dist/core/codegen/schemas/string-bool.js +22 -23
- package/dist/core/codegen/schemas/string-bool.js.map +1 -1
- package/dist/core/codegen/schemas/string.d.ts +8 -5
- package/dist/core/codegen/schemas/string.d.ts.map +1 -1
- package/dist/core/codegen/schemas/string.js +168 -207
- package/dist/core/codegen/schemas/string.js.map +1 -1
- package/dist/core/codegen/schemas/symbol.d.ts +7 -4
- package/dist/core/codegen/schemas/symbol.d.ts.map +1 -1
- package/dist/core/codegen/schemas/symbol.js +8 -4
- package/dist/core/codegen/schemas/symbol.js.map +1 -1
- package/dist/core/codegen/schemas/template-literal.d.ts +7 -4
- package/dist/core/codegen/schemas/template-literal.d.ts.map +1 -1
- package/dist/core/codegen/schemas/template-literal.js +12 -13
- package/dist/core/codegen/schemas/template-literal.js.map +1 -1
- package/dist/core/codegen/schemas/tuple.d.ts +8 -5
- package/dist/core/codegen/schemas/tuple.d.ts.map +1 -1
- package/dist/core/codegen/schemas/tuple.js +84 -94
- package/dist/core/codegen/schemas/tuple.js.map +1 -1
- package/dist/core/codegen/schemas/undefined.d.ts +7 -4
- package/dist/core/codegen/schemas/undefined.d.ts.map +1 -1
- package/dist/core/codegen/schemas/undefined.js +8 -4
- package/dist/core/codegen/schemas/undefined.js.map +1 -1
- package/dist/core/codegen/schemas/union.d.ts +8 -5
- package/dist/core/codegen/schemas/union.d.ts.map +1 -1
- package/dist/core/codegen/schemas/union.js +49 -69
- package/dist/core/codegen/schemas/union.js.map +1 -1
- package/dist/core/codegen/schemas/unknown.d.ts +7 -4
- package/dist/core/codegen/schemas/unknown.d.ts.map +1 -1
- package/dist/core/codegen/schemas/unknown.js +8 -4
- package/dist/core/codegen/schemas/unknown.js.map +1 -1
- package/dist/core/codegen/schemas/void.d.ts +7 -4
- package/dist/core/codegen/schemas/void.d.ts.map +1 -1
- package/dist/core/codegen/schemas/void.js +8 -4
- package/dist/core/codegen/schemas/void.js.map +1 -1
- package/dist/core/codegen/slow-path.d.ts +7 -4
- package/dist/core/codegen/slow-path.d.ts.map +1 -1
- package/dist/core/codegen/slow-path.js +71 -96
- package/dist/core/codegen/slow-path.js.map +1 -1
- package/dist/core/codegen/well-known-regex.d.ts +22 -19
- package/dist/core/codegen/well-known-regex.d.ts.map +1 -1
- package/dist/core/codegen/well-known-regex.js +127 -96
- package/dist/core/codegen/well-known-regex.js.map +1 -1
- package/dist/core/compile.d.ts +7 -4
- package/dist/core/compile.d.ts.map +1 -1
- package/dist/core/compile.js +48 -48
- package/dist/core/compile.js.map +1 -1
- package/dist/core/diagnostic.d.ts +38 -39
- package/dist/core/diagnostic.d.ts.map +1 -1
- package/dist/core/diagnostic.js +140 -164
- package/dist/core/diagnostic.js.map +1 -1
- package/dist/core/extract/checks.d.ts +18 -15
- package/dist/core/extract/checks.d.ts.map +1 -1
- package/dist/core/extract/checks.js +318 -311
- package/dist/core/extract/checks.js.map +1 -1
- package/dist/core/extract/effects.d.ts +13 -10
- package/dist/core/extract/effects.d.ts.map +1 -1
- package/dist/core/extract/effects.js +153 -222
- package/dist/core/extract/effects.js.map +1 -1
- package/dist/core/extract/extractors/any.d.ts +5 -2
- package/dist/core/extract/extractors/any.d.ts.map +1 -1
- package/dist/core/extract/extractors/any.js +5 -1
- package/dist/core/extract/extractors/any.js.map +1 -1
- package/dist/core/extract/extractors/array.d.ts +6 -3
- package/dist/core/extract/extractors/array.d.ts.map +1 -1
- package/dist/core/extract/extractors/array.js +25 -20
- package/dist/core/extract/extractors/array.js.map +1 -1
- package/dist/core/extract/extractors/bigint.d.ts +6 -3
- package/dist/core/extract/extractors/bigint.d.ts.map +1 -1
- package/dist/core/extract/extractors/bigint.js +66 -64
- package/dist/core/extract/extractors/bigint.js.map +1 -1
- package/dist/core/extract/extractors/boolean.d.ts +5 -2
- package/dist/core/extract/extractors/boolean.d.ts.map +1 -1
- package/dist/core/extract/extractors/boolean.js +7 -3
- package/dist/core/extract/extractors/boolean.js.map +1 -1
- package/dist/core/extract/extractors/catch.d.ts +6 -3
- package/dist/core/extract/extractors/catch.d.ts.map +1 -1
- package/dist/core/extract/extractors/catch.js +26 -17
- package/dist/core/extract/extractors/catch.js.map +1 -1
- package/dist/core/extract/extractors/date.d.ts +6 -3
- package/dist/core/extract/extractors/date.d.ts.map +1 -1
- package/dist/core/extract/extractors/date.js +42 -46
- package/dist/core/extract/extractors/date.js.map +1 -1
- package/dist/core/extract/extractors/default.d.ts +6 -3
- package/dist/core/extract/extractors/default.d.ts.map +1 -1
- package/dist/core/extract/extractors/default.js +20 -14
- package/dist/core/extract/extractors/default.js.map +1 -1
- package/dist/core/extract/extractors/enum.d.ts +5 -2
- package/dist/core/extract/extractors/enum.d.ts.map +1 -1
- package/dist/core/extract/extractors/enum.js +12 -13
- package/dist/core/extract/extractors/enum.js.map +1 -1
- package/dist/core/extract/extractors/file.d.ts +6 -3
- package/dist/core/extract/extractors/file.d.ts.map +1 -1
- package/dist/core/extract/extractors/file.js +34 -28
- package/dist/core/extract/extractors/file.js.map +1 -1
- package/dist/core/extract/extractors/intersection.d.ts +5 -2
- package/dist/core/extract/extractors/intersection.d.ts.map +1 -1
- package/dist/core/extract/extractors/intersection.js +13 -11
- package/dist/core/extract/extractors/intersection.js.map +1 -1
- package/dist/core/extract/extractors/lazy.d.ts +6 -3
- package/dist/core/extract/extractors/lazy.d.ts.map +1 -1
- package/dist/core/extract/extractors/lazy.js +21 -30
- package/dist/core/extract/extractors/lazy.js.map +1 -1
- package/dist/core/extract/extractors/literal.d.ts +5 -2
- package/dist/core/extract/extractors/literal.d.ts.map +1 -1
- package/dist/core/extract/extractors/literal.js +8 -1
- package/dist/core/extract/extractors/literal.js.map +1 -1
- package/dist/core/extract/extractors/map.d.ts +6 -3
- package/dist/core/extract/extractors/map.d.ts.map +1 -1
- package/dist/core/extract/extractors/map.js +10 -4
- package/dist/core/extract/extractors/map.js.map +1 -1
- package/dist/core/extract/extractors/nan.d.ts +5 -2
- package/dist/core/extract/extractors/nan.d.ts.map +1 -1
- package/dist/core/extract/extractors/nan.js +5 -1
- package/dist/core/extract/extractors/nan.js.map +1 -1
- package/dist/core/extract/extractors/never.d.ts +5 -2
- package/dist/core/extract/extractors/never.d.ts.map +1 -1
- package/dist/core/extract/extractors/never.js +5 -1
- package/dist/core/extract/extractors/never.js.map +1 -1
- package/dist/core/extract/extractors/null.d.ts +5 -2
- package/dist/core/extract/extractors/null.d.ts.map +1 -1
- package/dist/core/extract/extractors/null.js +5 -1
- package/dist/core/extract/extractors/null.js.map +1 -1
- package/dist/core/extract/extractors/nullable.d.ts +5 -2
- package/dist/core/extract/extractors/nullable.d.ts.map +1 -1
- package/dist/core/extract/extractors/nullable.js +7 -3
- package/dist/core/extract/extractors/nullable.js.map +1 -1
- package/dist/core/extract/extractors/number.d.ts +6 -3
- package/dist/core/extract/extractors/number.d.ts.map +1 -1
- package/dist/core/extract/extractors/number.js +35 -35
- package/dist/core/extract/extractors/number.js.map +1 -1
- package/dist/core/extract/extractors/object.d.ts +6 -3
- package/dist/core/extract/extractors/object.d.ts.map +1 -1
- package/dist/core/extract/extractors/object.js +49 -76
- package/dist/core/extract/extractors/object.js.map +1 -1
- package/dist/core/extract/extractors/optional.d.ts +5 -2
- package/dist/core/extract/extractors/optional.d.ts.map +1 -1
- package/dist/core/extract/extractors/optional.js +10 -12
- package/dist/core/extract/extractors/optional.js.map +1 -1
- package/dist/core/extract/extractors/pipe.d.ts +6 -3
- package/dist/core/extract/extractors/pipe.d.ts.map +1 -1
- package/dist/core/extract/extractors/pipe.js +40 -41
- package/dist/core/extract/extractors/pipe.js.map +1 -1
- package/dist/core/extract/extractors/readonly.d.ts +5 -2
- package/dist/core/extract/extractors/readonly.d.ts.map +1 -1
- package/dist/core/extract/extractors/readonly.js +10 -6
- package/dist/core/extract/extractors/readonly.js.map +1 -1
- package/dist/core/extract/extractors/record.d.ts +6 -3
- package/dist/core/extract/extractors/record.d.ts.map +1 -1
- package/dist/core/extract/extractors/record.js +24 -35
- package/dist/core/extract/extractors/record.js.map +1 -1
- package/dist/core/extract/extractors/set.d.ts +6 -3
- package/dist/core/extract/extractors/set.d.ts.map +1 -1
- package/dist/core/extract/extractors/set.js +36 -30
- package/dist/core/extract/extractors/set.js.map +1 -1
- package/dist/core/extract/extractors/string-bool.d.ts +7 -4
- package/dist/core/extract/extractors/string-bool.d.ts.map +1 -1
- package/dist/core/extract/extractors/string-bool.js +66 -84
- package/dist/core/extract/extractors/string-bool.js.map +1 -1
- package/dist/core/extract/extractors/string.d.ts +6 -3
- package/dist/core/extract/extractors/string.d.ts.map +1 -1
- package/dist/core/extract/extractors/string.js +34 -37
- package/dist/core/extract/extractors/string.js.map +1 -1
- package/dist/core/extract/extractors/symbol.d.ts +5 -2
- package/dist/core/extract/extractors/symbol.d.ts.map +1 -1
- package/dist/core/extract/extractors/symbol.js +5 -1
- package/dist/core/extract/extractors/symbol.js.map +1 -1
- package/dist/core/extract/extractors/template-literal.d.ts +6 -3
- package/dist/core/extract/extractors/template-literal.d.ts.map +1 -1
- package/dist/core/extract/extractors/template-literal.js +11 -6
- package/dist/core/extract/extractors/template-literal.js.map +1 -1
- package/dist/core/extract/extractors/tuple.d.ts +6 -3
- package/dist/core/extract/extractors/tuple.d.ts.map +1 -1
- package/dist/core/extract/extractors/tuple.js +10 -4
- package/dist/core/extract/extractors/tuple.js.map +1 -1
- package/dist/core/extract/extractors/undefined.d.ts +5 -2
- package/dist/core/extract/extractors/undefined.d.ts.map +1 -1
- package/dist/core/extract/extractors/undefined.js +5 -1
- package/dist/core/extract/extractors/undefined.js.map +1 -1
- package/dist/core/extract/extractors/union.d.ts +6 -3
- package/dist/core/extract/extractors/union.d.ts.map +1 -1
- package/dist/core/extract/extractors/union.js +38 -64
- package/dist/core/extract/extractors/union.js.map +1 -1
- package/dist/core/extract/extractors/unknown.d.ts +5 -2
- package/dist/core/extract/extractors/unknown.d.ts.map +1 -1
- package/dist/core/extract/extractors/unknown.js +5 -1
- package/dist/core/extract/extractors/unknown.js.map +1 -1
- package/dist/core/extract/extractors/void.d.ts +5 -2
- package/dist/core/extract/extractors/void.d.ts.map +1 -1
- package/dist/core/extract/extractors/void.js +5 -1
- package/dist/core/extract/extractors/void.js.map +1 -1
- package/dist/core/extract/fallback.d.ts +6 -3
- package/dist/core/extract/fallback.d.ts.map +1 -1
- package/dist/core/extract/fallback.js +21 -7
- package/dist/core/extract/fallback.js.map +1 -1
- package/dist/core/extract/index.d.ts +6 -4
- package/dist/core/extract/index.d.ts.map +1 -1
- package/dist/core/extract/index.js +15 -15
- package/dist/core/extract/index.js.map +1 -1
- package/dist/core/extract/registry.d.ts +39 -36
- package/dist/core/extract/registry.d.ts.map +1 -1
- package/dist/core/extract/registry.js +96 -123
- package/dist/core/extract/registry.js.map +1 -1
- package/dist/core/extract/types.d.ts +124 -120
- package/dist/core/extract/types.d.ts.map +1 -1
- package/dist/core/extract/types.js +0 -1
- package/dist/core/iife.d.ts +14 -15
- package/dist/core/iife.d.ts.map +1 -1
- package/dist/core/iife.js +182 -206
- package/dist/core/iife.js.map +1 -1
- package/dist/core/pipeline.d.ts +33 -30
- package/dist/core/pipeline.d.ts.map +1 -1
- package/dist/core/pipeline.js +67 -74
- package/dist/core/pipeline.js.map +1 -1
- package/dist/core/types.d.ts +430 -427
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +0 -5
- package/dist/discovery.d.ts +8 -5
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +31 -32
- package/dist/discovery.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -2
- package/dist/jit.d.ts +15 -42
- package/dist/jit.d.ts.map +1 -1
- package/dist/jit.js +187 -216
- package/dist/jit.js.map +1 -1
- package/dist/loader.d.ts +14 -11
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +226 -258
- package/dist/loader.js.map +1 -1
- package/dist/static-filter.d.ts +4 -1
- package/dist/static-filter.d.ts.map +1 -1
- package/dist/static-filter.js +240 -367
- package/dist/static-filter.js.map +1 -1
- package/dist/swc.d.ts +38 -35
- package/dist/swc.d.ts.map +1 -1
- package/dist/swc.js +83 -76
- package/dist/swc.js.map +1 -1
- package/dist/unplugin/bun.d.ts +5 -2
- package/dist/unplugin/bun.d.ts.map +1 -1
- package/dist/unplugin/bun.js +5 -1
- package/dist/unplugin/bun.js.map +1 -1
- package/dist/unplugin/dep-graph.d.ts +10 -7
- package/dist/unplugin/dep-graph.d.ts.map +1 -1
- package/dist/unplugin/dep-graph.js +216 -252
- package/dist/unplugin/dep-graph.js.map +1 -1
- package/dist/unplugin/disk-cache.d.ts +121 -92
- package/dist/unplugin/disk-cache.d.ts.map +1 -1
- package/dist/unplugin/disk-cache.js +425 -444
- package/dist/unplugin/disk-cache.js.map +1 -1
- package/dist/unplugin/edits.d.ts +15 -12
- package/dist/unplugin/edits.d.ts.map +1 -1
- package/dist/unplugin/edits.js +24 -37
- package/dist/unplugin/edits.js.map +1 -1
- package/dist/unplugin/esbuild.d.ts +5 -2
- package/dist/unplugin/esbuild.d.ts.map +1 -1
- package/dist/unplugin/esbuild.js +5 -1
- package/dist/unplugin/esbuild.js.map +1 -1
- package/dist/unplugin/farm.d.ts +5 -2
- package/dist/unplugin/farm.d.ts.map +1 -1
- package/dist/unplugin/farm.js +5 -1
- package/dist/unplugin/farm.js.map +1 -1
- package/dist/unplugin/hoist-compile.d.ts +14 -42
- package/dist/unplugin/hoist-compile.d.ts.map +1 -1
- package/dist/unplugin/hoist-compile.js +67 -112
- package/dist/unplugin/hoist-compile.js.map +1 -1
- package/dist/unplugin/hoist.d.ts +56 -54
- package/dist/unplugin/hoist.d.ts.map +1 -1
- package/dist/unplugin/hoist.js +945 -1170
- package/dist/unplugin/hoist.js.map +1 -1
- package/dist/unplugin/index.d.ts +5 -3
- package/dist/unplugin/index.d.ts.map +1 -1
- package/dist/unplugin/index.js +175 -250
- package/dist/unplugin/index.js.map +1 -1
- package/dist/unplugin/rolldown.d.ts +5 -2
- package/dist/unplugin/rolldown.d.ts.map +1 -1
- package/dist/unplugin/rolldown.js +5 -1
- package/dist/unplugin/rolldown.js.map +1 -1
- package/dist/unplugin/rollup.d.ts +5 -2
- package/dist/unplugin/rollup.d.ts.map +1 -1
- package/dist/unplugin/rollup.js +5 -1
- package/dist/unplugin/rollup.js.map +1 -1
- package/dist/unplugin/rsbuild.d.ts +6 -3
- package/dist/unplugin/rsbuild.d.ts.map +1 -1
- package/dist/unplugin/rsbuild.js +15 -11
- package/dist/unplugin/rsbuild.js.map +1 -1
- package/dist/unplugin/rspack.d.ts +5 -2
- package/dist/unplugin/rspack.d.ts.map +1 -1
- package/dist/unplugin/rspack.js +5 -1
- package/dist/unplugin/rspack.js.map +1 -1
- package/dist/unplugin/transform.d.ts +30 -27
- package/dist/unplugin/transform.d.ts.map +1 -1
- package/dist/unplugin/transform.js +433 -620
- package/dist/unplugin/transform.js.map +1 -1
- package/dist/unplugin/types.d.ts +189 -184
- package/dist/unplugin/types.d.ts.map +1 -1
- package/dist/unplugin/types.js +22 -18
- package/dist/unplugin/types.js.map +1 -1
- package/dist/unplugin/virtual.d.ts +11 -8
- package/dist/unplugin/virtual.d.ts.map +1 -1
- package/dist/unplugin/virtual.js +65 -83
- package/dist/unplugin/virtual.js.map +1 -1
- package/dist/unplugin/vite.d.ts +5 -2
- package/dist/unplugin/vite.d.ts.map +1 -1
- package/dist/unplugin/vite.js +5 -1
- package/dist/unplugin/vite.js.map +1 -1
- package/dist/unplugin/webpack.d.ts +5 -2
- package/dist/unplugin/webpack.d.ts.map +1 -1
- package/dist/unplugin/webpack.js +5 -1
- package/dist/unplugin/webpack.js.map +1 -1
- package/package.json +23 -14
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/core/extract/types.js.map +0 -1
- package/dist/core/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
|
@@ -1,272 +1,180 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File-level schema deduplication.
|
|
3
|
-
*
|
|
4
|
-
* When several schemas in one file share structurally identical sub-trees
|
|
5
|
-
* (a reused `Address` object, a `{ id, name }` row, an exported schema that is
|
|
6
|
-
* also embedded in another), the error-collecting "slow walk" for that shape
|
|
7
|
-
* is generated ONCE as a shared `__zcSw_N(input, path, issues)` function and
|
|
8
|
-
* every occurrence calls it instead of inlining a fresh copy.
|
|
9
|
-
*
|
|
10
|
-
* Two invariants keep this free of runtime cost and footguns:
|
|
11
|
-
*
|
|
12
|
-
* 1. **Slow walk only.** The fast path (the `&&` boolean chain that validates
|
|
13
|
-
* valid input with zero allocations) is NEVER shared — it stays fully
|
|
14
|
-
* inlined so the hot path is byte-for-byte what it was before. Only the
|
|
15
|
-
* cold, bulky error walk (64–77% of generated bytes) is shared.
|
|
16
|
-
*
|
|
17
|
-
* 2. **No per-export references.** A shared body lives at MODULE scope, while
|
|
18
|
-
* `__rf[]` — the array of retained Zod schemas and captured callbacks — is
|
|
19
|
-
* declared inside each export's IIFE. So a shape may be shared only when
|
|
20
|
-
* nothing in it resolves through `__rf`: no `default`, `catch`, `fallback`,
|
|
21
|
-
* captured `transform`, or captured `refine`/`superRefine`. Zero-capture
|
|
22
|
-
* callbacks are fine — they are hosted from source text into the shared
|
|
23
|
-
* block's own preamble.
|
|
24
|
-
*
|
|
25
|
-
* Sharing used to additionally require the whole ROOT to be mutation-free, so
|
|
26
|
-
* that a body which wrote nothing back could not lose an output value. That
|
|
27
|
-
* excluded a genuine `z.object()` — it strips, so its walk PRODUCES a rebuilt
|
|
28
|
-
* object — which, once `z.object()` began always stripping, meant the feature
|
|
29
|
-
* stopped firing for essentially every real schema: a realistic module of four
|
|
30
|
-
* schemas reusing two sub-shapes shared nothing and shipped 29.6 KB where the
|
|
31
|
-
* `strictObject` spelling of the same thing shipped 16.7 KB.
|
|
32
|
-
*
|
|
33
|
-
* The write-back problem is solved directly instead: a shared walk RETURNS its
|
|
34
|
-
* value and call sites assign it (`slot = __zcSw_N(slot, path, issues)`), so a
|
|
35
|
-
* stripping object, a coercion or a `.trim()` delivers its rewritten value
|
|
36
|
-
* through the call exactly as an inlined walk delivers it through `g.output`.
|
|
37
|
-
*/
|
|
38
1
|
import { createSlowGen, generateSlow } from "./slow-path.js";
|
|
2
|
+
//#region src/core/codegen/dedupe.ts
|
|
39
3
|
/**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
4
|
+
* Minimum subtree weight (≈ node count, +1 per check) for a repeated shape to
|
|
5
|
+
* be worth a shared function. Below this the call + dynamic-path overhead
|
|
6
|
+
* outweighs the duplicated inline walk; ~4 admits a 3-field object or an
|
|
7
|
+
* array-of-object while skipping bare primitives and thin wrappers.
|
|
8
|
+
*/
|
|
45
9
|
const MIN_SHARED_WEIGHT = 4;
|
|
46
10
|
/** Leading marker of a shared block; used to skip re-injection on watch/HMR re-runs. */
|
|
47
|
-
|
|
11
|
+
const SHARED_BLOCK_MARKER = "/* zod-compiler shared */";
|
|
48
12
|
const EMPTY_PLAN = {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
13
|
+
refFor: () => void 0,
|
|
14
|
+
code: "",
|
|
15
|
+
usedHelpers: /* @__PURE__ */ new Set(),
|
|
16
|
+
isEmpty: true
|
|
53
17
|
};
|
|
54
18
|
/**
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
const body = generateSlow(c.ir, createSlowGen("input", "input", "path", "_e", ctx));
|
|
101
|
-
// `input` is both the read and the write slot (createSlowGen above passes it
|
|
102
|
-
// as input AND output), so a walk that rewrites — a stripping object, a
|
|
103
|
-
// coercion, an overwrite check — leaves its result there. Returning it is
|
|
104
|
-
// what lets the caller receive that value; a walk that rewrites nothing
|
|
105
|
-
// returns its argument unchanged.
|
|
106
|
-
fns.push(`function ${ref.name}(input,path,_e){\n${body}\nreturn input;\n}`);
|
|
107
|
-
}
|
|
108
|
-
return {
|
|
109
|
-
refFor,
|
|
110
|
-
code: [SHARED_BLOCK_MARKER, ...ctx.preamble, ...fns].join("\n"),
|
|
111
|
-
usedHelpers: ctx.usedHelpers,
|
|
112
|
-
isEmpty: false,
|
|
113
|
-
};
|
|
19
|
+
* Build the shared-schema plan for one file's root schemas. Returns
|
|
20
|
+
* {@link EMPTY_PLAN} (a no-op) when nothing repeats — the common case, so files
|
|
21
|
+
* without internal duplication pay only a single linear analysis pass.
|
|
22
|
+
*/
|
|
23
|
+
function createSharedSchemaPlan(roots, mode) {
|
|
24
|
+
const keyMemo = /* @__PURE__ */ new Map();
|
|
25
|
+
const weightMemo = /* @__PURE__ */ new Map();
|
|
26
|
+
const stats = /* @__PURE__ */ new Map();
|
|
27
|
+
for (const root of roots) collect(root, keyMemo, weightMemo, stats);
|
|
28
|
+
const selected = [...stats.values()].filter((c) => c.count >= 2 && c.weight >= MIN_SHARED_WEIGHT && !containsRecursiveRef(c.ir) && !referencesExportRefs(c.ir)).sort((a, b) => b.weight - a.weight || cmp(keyOf(a.ir, keyMemo), keyOf(b.ir, keyMemo)));
|
|
29
|
+
if (selected.length === 0) return EMPTY_PLAN;
|
|
30
|
+
const refs = /* @__PURE__ */ new Map();
|
|
31
|
+
selected.forEach((c, i) => refs.set(keyOf(c.ir, keyMemo), { name: `__zcSw_${i}` }));
|
|
32
|
+
const refFor = (ir) => refs.get(keyOf(ir, keyMemo));
|
|
33
|
+
const ctx = {
|
|
34
|
+
preamble: [],
|
|
35
|
+
counter: 0,
|
|
36
|
+
fnName: "__zcShared",
|
|
37
|
+
regexCache: /* @__PURE__ */ new Map(),
|
|
38
|
+
mode,
|
|
39
|
+
usedHelpers: /* @__PURE__ */ new Set()
|
|
40
|
+
};
|
|
41
|
+
ctx.sharedSchemas = {
|
|
42
|
+
refFor,
|
|
43
|
+
code: "",
|
|
44
|
+
usedHelpers: ctx.usedHelpers,
|
|
45
|
+
isEmpty: false
|
|
46
|
+
};
|
|
47
|
+
const fns = [];
|
|
48
|
+
for (const c of selected) {
|
|
49
|
+
const ref = refs.get(keyOf(c.ir, keyMemo));
|
|
50
|
+
if (ref === void 0) continue;
|
|
51
|
+
const body = generateSlow(c.ir, createSlowGen("input", "input", "path", "_e", ctx));
|
|
52
|
+
fns.push(`function ${ref.name}(input,path,_e){\n${body}\nreturn input;\n}`);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
refFor,
|
|
56
|
+
code: [
|
|
57
|
+
SHARED_BLOCK_MARKER,
|
|
58
|
+
...ctx.preamble,
|
|
59
|
+
...fns
|
|
60
|
+
].join("\n"),
|
|
61
|
+
usedHelpers: ctx.usedHelpers,
|
|
62
|
+
isEmpty: false
|
|
63
|
+
};
|
|
114
64
|
}
|
|
115
|
-
// A shared sub-schema is called as `slot = __zcSw_N(slot, path, issues)`: the
|
|
116
|
-
// walk pushes directly into the caller's `issues` array (no result object, no
|
|
117
|
-
// per-call issue copy) and returns the parsed value, which the call site assigns
|
|
118
|
-
// back into the slot the inlined walk would have written. Call sites are emitted
|
|
119
|
-
// by slow-path.ts (nested occurrences) and index.ts (a shared root), keyed off
|
|
120
|
-
// `ref.name`.
|
|
121
65
|
/**
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
66
|
+
* Does the subtree resolve anything through the per-export `__rf[]` array —
|
|
67
|
+
* a retained Zod schema (`default`, `catch`, `fallback`) or a captured callback
|
|
68
|
+
* (`transform`, `refine`, `superRefine`)?
|
|
69
|
+
*
|
|
70
|
+
* Those names exist only inside an export's own IIFE, so a module-scope shared
|
|
71
|
+
* body referencing them would be unbound. A zero-capture callback carries
|
|
72
|
+
* `source` instead of `refIndex` and is hosted into the shared block's preamble,
|
|
73
|
+
* so it does not disqualify a shape.
|
|
74
|
+
*/
|
|
131
75
|
function referencesExportRefs(ir) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
break;
|
|
149
|
-
default:
|
|
150
|
-
break;
|
|
151
|
-
}
|
|
152
|
-
return childSchemas(ir).some(referencesExportRefs);
|
|
76
|
+
switch (ir.type) {
|
|
77
|
+
case "default":
|
|
78
|
+
case "catch":
|
|
79
|
+
case "fallback": return true;
|
|
80
|
+
case "effect":
|
|
81
|
+
if (ir.refIndex !== void 0) return true;
|
|
82
|
+
break;
|
|
83
|
+
case "string":
|
|
84
|
+
case "number":
|
|
85
|
+
case "object":
|
|
86
|
+
case "array":
|
|
87
|
+
if (ir.checks?.some((c) => "refIndex" in c && c.refIndex !== void 0)) return true;
|
|
88
|
+
break;
|
|
89
|
+
default: break;
|
|
90
|
+
}
|
|
91
|
+
return childSchemas(ir).some(referencesExportRefs);
|
|
153
92
|
}
|
|
154
|
-
// ─── Candidate collection ────────────────────────────────────────────────────
|
|
155
93
|
function collect(ir, keyMemo, weightMemo, stats) {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
collect(child, keyMemo, weightMemo, stats);
|
|
94
|
+
const key = keyOf(ir, keyMemo);
|
|
95
|
+
const existing = stats.get(key);
|
|
96
|
+
if (existing) existing.count++;
|
|
97
|
+
else stats.set(key, {
|
|
98
|
+
ir,
|
|
99
|
+
count: 1,
|
|
100
|
+
weight: weightOf(ir, weightMemo)
|
|
101
|
+
});
|
|
102
|
+
for (const child of childSchemas(ir)) collect(child, keyMemo, weightMemo, stats);
|
|
166
103
|
}
|
|
167
104
|
/** Direct child SchemaIR nodes (the structural recursion shared by every pass). */
|
|
168
105
|
function childSchemas(ir) {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
case "default":
|
|
190
|
-
case "catch":
|
|
191
|
-
return [ir.inner];
|
|
192
|
-
case "pipe":
|
|
193
|
-
return [ir.in, ir.out];
|
|
194
|
-
case "effect":
|
|
195
|
-
case "recursionTarget":
|
|
196
|
-
return [ir.inner];
|
|
197
|
-
default:
|
|
198
|
-
return [];
|
|
199
|
-
}
|
|
106
|
+
switch (ir.type) {
|
|
107
|
+
case "object": return Object.values(ir.properties);
|
|
108
|
+
case "array": return [ir.element];
|
|
109
|
+
case "tuple": return ir.rest === null ? ir.items : [...ir.items, ir.rest];
|
|
110
|
+
case "record":
|
|
111
|
+
case "map": return [ir.keyType, ir.valueType];
|
|
112
|
+
case "set": return [ir.valueType];
|
|
113
|
+
case "union":
|
|
114
|
+
case "discriminatedUnion": return ir.options;
|
|
115
|
+
case "intersection": return [ir.left, ir.right];
|
|
116
|
+
case "optional":
|
|
117
|
+
case "nullable":
|
|
118
|
+
case "readonly":
|
|
119
|
+
case "default":
|
|
120
|
+
case "catch": return [ir.inner];
|
|
121
|
+
case "pipe": return [ir.in, ir.out];
|
|
122
|
+
case "effect":
|
|
123
|
+
case "recursionTarget": return [ir.inner];
|
|
124
|
+
default: return [];
|
|
125
|
+
}
|
|
200
126
|
}
|
|
201
127
|
/** Subtree weight ≈ node count plus one per check; memoized for O(total) cost. */
|
|
202
128
|
function weightOf(ir, memo) {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
memo.set(ir, weight);
|
|
211
|
-
return weight;
|
|
129
|
+
const hit = memo.get(ir);
|
|
130
|
+
if (hit !== void 0) return hit;
|
|
131
|
+
const checks = ir.checks;
|
|
132
|
+
let weight = 1 + (Array.isArray(checks) ? checks.length : 0);
|
|
133
|
+
for (const child of childSchemas(ir)) weight += weightOf(child, memo);
|
|
134
|
+
memo.set(ir, weight);
|
|
135
|
+
return weight;
|
|
212
136
|
}
|
|
213
137
|
function containsRecursiveRef(ir) {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
return childSchemas(ir).some(containsRecursiveRef);
|
|
138
|
+
if (ir.type === "recursiveRef") return true;
|
|
139
|
+
return childSchemas(ir).some(containsRecursiveRef);
|
|
217
140
|
}
|
|
218
|
-
// ─── Structural keys ─────────────────────────────────────────────────────────
|
|
219
141
|
/**
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
142
|
+
* Stable structural key for an IR node, memoized by node identity so each
|
|
143
|
+
* subtree is serialized exactly once (the whole pass is O(total nodes), not
|
|
144
|
+
* O(nodes × depth)). Two nodes share a key iff they are structurally identical
|
|
145
|
+
* — including every check, literal value, and error message — so deduplicated
|
|
146
|
+
* schemas produce byte-identical validation and issues.
|
|
147
|
+
*/
|
|
226
148
|
function keyOf(ir, memo) {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
.sort()
|
|
234
|
-
.map((k) => `${k}:${encodeValue(obj[k], memo)}`)
|
|
235
|
-
.join(",")}}`;
|
|
236
|
-
memo.set(ir, key);
|
|
237
|
-
return key;
|
|
149
|
+
const hit = memo.get(ir);
|
|
150
|
+
if (hit !== void 0) return hit;
|
|
151
|
+
const obj = ir;
|
|
152
|
+
const key = `{${Object.keys(obj).filter((k) => obj[k] !== void 0).sort().map((k) => `${k}:${encodeValue(obj[k], memo)}`).join(",")}}`;
|
|
153
|
+
memo.set(ir, key);
|
|
154
|
+
return key;
|
|
238
155
|
}
|
|
239
156
|
/**
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
157
|
+
* Encode any IR field value. A nested SchemaIR is detected by a string `type`
|
|
158
|
+
* field (checks carry `kind`, union `cases` carry `value`/`option` — only real
|
|
159
|
+
* schema nodes have `type`) and routed through {@link keyOf} for subtree
|
|
160
|
+
* memoization; everything else is serialized in sorted-key order.
|
|
161
|
+
*/
|
|
245
162
|
function encodeValue(value, memo) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
if (typeof value === "object") {
|
|
257
|
-
if (typeof value.type === "string") {
|
|
258
|
-
return keyOf(value, memo);
|
|
259
|
-
}
|
|
260
|
-
const obj = value;
|
|
261
|
-
return `{${Object.keys(obj)
|
|
262
|
-
.filter((k) => obj[k] !== undefined)
|
|
263
|
-
.sort()
|
|
264
|
-
.map((k) => `${k}:${encodeValue(obj[k], memo)}`)
|
|
265
|
-
.join(",")}}`;
|
|
266
|
-
}
|
|
267
|
-
return JSON.stringify(value) ?? "undefined";
|
|
163
|
+
if (typeof value === "bigint") return `#${value}`;
|
|
164
|
+
if (value === null) return "null";
|
|
165
|
+
if (typeof value === "number" && !Number.isFinite(value)) return `n!${value}`;
|
|
166
|
+
if (Array.isArray(value)) return `[${value.map((v) => encodeValue(v, memo)).join(",")}]`;
|
|
167
|
+
if (typeof value === "object") {
|
|
168
|
+
if (typeof value.type === "string") return keyOf(value, memo);
|
|
169
|
+
const obj = value;
|
|
170
|
+
return `{${Object.keys(obj).filter((k) => obj[k] !== void 0).sort().map((k) => `${k}:${encodeValue(obj[k], memo)}`).join(",")}}`;
|
|
171
|
+
}
|
|
172
|
+
return JSON.stringify(value) ?? "undefined";
|
|
268
173
|
}
|
|
269
174
|
function cmp(a, b) {
|
|
270
|
-
|
|
175
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
271
176
|
}
|
|
177
|
+
//#endregion
|
|
178
|
+
export { SHARED_BLOCK_MARKER, createSharedSchemaPlan };
|
|
179
|
+
|
|
272
180
|
//# sourceMappingURL=dedupe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dedupe.js","sourceRoot":"","sources":["../../../src/core/codegen/dedupe.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dedupe.js","names":[],"sources":["../../../src/core/codegen/dedupe.ts"],"sourcesContent":["/**\n * File-level schema deduplication.\n *\n * When several schemas in one file share structurally identical sub-trees\n * (a reused `Address` object, a `{ id, name }` row, an exported schema that is\n * also embedded in another), the error-collecting \"slow walk\" for that shape\n * is generated ONCE as a shared `__zcSw_N(input, path, issues)` function and\n * every occurrence calls it instead of inlining a fresh copy.\n *\n * Two invariants keep this free of runtime cost and footguns:\n *\n * 1. **Slow walk only.** The fast path (the `&&` boolean chain that validates\n * valid input with zero allocations) is NEVER shared — it stays fully\n * inlined so the hot path is byte-for-byte what it was before. Only the\n * cold, bulky error walk (64–77% of generated bytes) is shared.\n *\n * 2. **No per-export references.** A shared body lives at MODULE scope, while\n * `__rf[]` — the array of retained Zod schemas and captured callbacks — is\n * declared inside each export's IIFE. So a shape may be shared only when\n * nothing in it resolves through `__rf`: no `default`, `catch`, `fallback`,\n * captured `transform`, or captured `refine`/`superRefine`. Zero-capture\n * callbacks are fine — they are hosted from source text into the shared\n * block's own preamble.\n *\n * Sharing used to additionally require the whole ROOT to be mutation-free, so\n * that a body which wrote nothing back could not lose an output value. That\n * excluded a genuine `z.object()` — it strips, so its walk PRODUCES a rebuilt\n * object — which, once `z.object()` began always stripping, meant the feature\n * stopped firing for essentially every real schema: a realistic module of four\n * schemas reusing two sub-shapes shared nothing and shipped 29.6 KB where the\n * `strictObject` spelling of the same thing shipped 16.7 KB.\n *\n * The write-back problem is solved directly instead: a shared walk RETURNS its\n * value and call sites assign it (`slot = __zcSw_N(slot, path, issues)`), so a\n * stripping object, a coercion or a `.trim()` delivers its rewritten value\n * through the call exactly as an inlined walk delivers it through `g.output`.\n */\n\nimport type { SchemaIR } from \"../types.js\";\nimport type { CodeGenContext, CodegenMode } from \"./context.js\";\nimport { createSlowGen, generateSlow } from \"./slow-path.js\";\n\n/** A shared slow-walk validator hosted at module scope. */\nexport interface SharedSchemaRef {\n /** Name of the `function __zcSw_N(input, path, issues)` declaration. */\n readonly name: string;\n}\n\nexport interface SharedSchemaPlan {\n /**\n * Shared ref for an IR node, or undefined when the node is not a shared\n * candidate. Keyed by structural identity (memoized), so repeated lookups\n * during codegen are O(1).\n */\n refFor(ir: SchemaIR): SharedSchemaRef | undefined;\n /** Module-scope declarations (shared preamble + `__zcSw_N` functions). `\"\"` when empty. */\n readonly code: string;\n /** Runtime helper names referenced by the shared block (lean mode). */\n readonly usedHelpers: Set<string>;\n readonly isEmpty: boolean;\n}\n\n/**\n * Minimum subtree weight (≈ node count, +1 per check) for a repeated shape to\n * be worth a shared function. Below this the call + dynamic-path overhead\n * outweighs the duplicated inline walk; ~4 admits a 3-field object or an\n * array-of-object while skipping bare primitives and thin wrappers.\n */\nconst MIN_SHARED_WEIGHT = 4;\n\n/** Leading marker of a shared block; used to skip re-injection on watch/HMR re-runs. */\nexport const SHARED_BLOCK_MARKER = \"/* zod-compiler shared */\";\n\nconst EMPTY_PLAN: SharedSchemaPlan = {\n refFor: () => undefined,\n code: \"\",\n usedHelpers: new Set(),\n isEmpty: true,\n};\n\n/**\n * Build the shared-schema plan for one file's root schemas. Returns\n * {@link EMPTY_PLAN} (a no-op) when nothing repeats — the common case, so files\n * without internal duplication pay only a single linear analysis pass.\n */\nexport function createSharedSchemaPlan(\n roots: readonly SchemaIR[],\n mode: CodegenMode,\n): SharedSchemaPlan {\n const keyMemo = new Map<SchemaIR, string>();\n const weightMemo = new Map<SchemaIR, number>();\n const stats = new Map<string, { ir: SchemaIR; count: number; weight: number }>();\n\n for (const root of roots) {\n collect(root, keyMemo, weightMemo, stats);\n }\n\n const selected = [...stats.values()]\n .filter(\n (c) =>\n c.count >= 2 &&\n c.weight >= MIN_SHARED_WEIGHT &&\n !containsRecursiveRef(c.ir) &&\n !referencesExportRefs(c.ir),\n )\n // Largest shapes first so the biggest wins get the lowest indices; tie-break\n // on the structural key for deterministic, reproducible output.\n .sort((a, b) => b.weight - a.weight || cmp(keyOf(a.ir, keyMemo), keyOf(b.ir, keyMemo)));\n\n if (selected.length === 0) return EMPTY_PLAN;\n\n const refs = new Map<string, SharedSchemaRef>();\n selected.forEach((c, i) => refs.set(keyOf(c.ir, keyMemo), { name: `__zcSw_${i}` }));\n\n const refFor = (ir: SchemaIR): SharedSchemaRef | undefined => refs.get(keyOf(ir, keyMemo));\n\n const ctx: CodeGenContext = {\n preamble: [],\n counter: 0,\n fnName: \"__zcShared\",\n regexCache: new Map(),\n mode,\n usedHelpers: new Set(),\n };\n // Generation consults the plan so a shared candidate nested inside another\n // shared candidate becomes a `__zcSw_*` call rather than a second inline copy.\n // Containment is strictly size-decreasing, so the shared functions form a DAG;\n // hoisted declarations make call order irrelevant.\n ctx.sharedSchemas = { refFor, code: \"\", usedHelpers: ctx.usedHelpers, isEmpty: false };\n\n const fns: string[] = [];\n for (const c of selected) {\n const ref = refs.get(keyOf(c.ir, keyMemo));\n if (ref === undefined) continue;\n // Generate the candidate's body INLINE (the root is passed to generateSlow,\n // not visit(), so it never replaces itself with a call); only its children\n // route through visit() and may resolve to other shared refs.\n const body = generateSlow(c.ir, createSlowGen(\"input\", \"input\", \"path\", \"_e\", ctx));\n // `input` is both the read and the write slot (createSlowGen above passes it\n // as input AND output), so a walk that rewrites — a stripping object, a\n // coercion, an overwrite check — leaves its result there. Returning it is\n // what lets the caller receive that value; a walk that rewrites nothing\n // returns its argument unchanged.\n fns.push(`function ${ref.name}(input,path,_e){\\n${body}\\nreturn input;\\n}`);\n }\n\n return {\n refFor,\n code: [SHARED_BLOCK_MARKER, ...ctx.preamble, ...fns].join(\"\\n\"),\n usedHelpers: ctx.usedHelpers,\n isEmpty: false,\n };\n}\n\n// A shared sub-schema is called as `slot = __zcSw_N(slot, path, issues)`: the\n// walk pushes directly into the caller's `issues` array (no result object, no\n// per-call issue copy) and returns the parsed value, which the call site assigns\n// back into the slot the inlined walk would have written. Call sites are emitted\n// by slow-path.ts (nested occurrences) and index.ts (a shared root), keyed off\n// `ref.name`.\n\n/**\n * Does the subtree resolve anything through the per-export `__rf[]` array —\n * a retained Zod schema (`default`, `catch`, `fallback`) or a captured callback\n * (`transform`, `refine`, `superRefine`)?\n *\n * Those names exist only inside an export's own IIFE, so a module-scope shared\n * body referencing them would be unbound. A zero-capture callback carries\n * `source` instead of `refIndex` and is hosted into the shared block's preamble,\n * so it does not disqualify a shape.\n */\nfunction referencesExportRefs(ir: SchemaIR): boolean {\n switch (ir.type) {\n case \"default\":\n case \"catch\":\n case \"fallback\":\n // `refIndex` is mandatory on these — the value/schema lives on the export.\n return true;\n case \"effect\":\n if (ir.refIndex !== undefined) return true;\n break;\n case \"string\":\n case \"number\":\n case \"object\":\n case \"array\":\n if (ir.checks?.some((c) => \"refIndex\" in c && c.refIndex !== undefined)) return true;\n break;\n default:\n break;\n }\n return childSchemas(ir).some(referencesExportRefs);\n}\n\n// ─── Candidate collection ────────────────────────────────────────────────────\n\nfunction collect(\n ir: SchemaIR,\n keyMemo: Map<SchemaIR, string>,\n weightMemo: Map<SchemaIR, number>,\n stats: Map<string, { ir: SchemaIR; count: number; weight: number }>,\n): void {\n const key = keyOf(ir, keyMemo);\n const existing = stats.get(key);\n if (existing) {\n existing.count++;\n } else {\n stats.set(key, { ir, count: 1, weight: weightOf(ir, weightMemo) });\n }\n for (const child of childSchemas(ir)) collect(child, keyMemo, weightMemo, stats);\n}\n\n/** Direct child SchemaIR nodes (the structural recursion shared by every pass). */\nfunction childSchemas(ir: SchemaIR): SchemaIR[] {\n switch (ir.type) {\n case \"object\":\n return 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 return [ir.inner];\n case \"pipe\":\n return [ir.in, ir.out];\n case \"effect\":\n case \"recursionTarget\":\n return [ir.inner];\n default:\n return [];\n }\n}\n\n/** Subtree weight ≈ node count plus one per check; memoized for O(total) cost. */\nfunction weightOf(ir: SchemaIR, memo: Map<SchemaIR, number>): number {\n const hit = memo.get(ir);\n if (hit !== undefined) return hit;\n const checks = (ir as { checks?: readonly unknown[] }).checks;\n let weight = 1 + (Array.isArray(checks) ? checks.length : 0);\n for (const child of childSchemas(ir)) weight += weightOf(child, memo);\n memo.set(ir, weight);\n return weight;\n}\n\nfunction containsRecursiveRef(ir: SchemaIR): boolean {\n if (ir.type === \"recursiveRef\") return true;\n return childSchemas(ir).some(containsRecursiveRef);\n}\n\n// ─── Structural keys ─────────────────────────────────────────────────────────\n\n/**\n * Stable structural key for an IR node, memoized by node identity so each\n * subtree is serialized exactly once (the whole pass is O(total nodes), not\n * O(nodes × depth)). Two nodes share a key iff they are structurally identical\n * — including every check, literal value, and error message — so deduplicated\n * schemas produce byte-identical validation and issues.\n */\nfunction keyOf(ir: SchemaIR, memo: Map<SchemaIR, string>): string {\n const hit = memo.get(ir);\n if (hit !== undefined) return hit;\n const obj = ir as unknown as Record<string, unknown>;\n const key = `{${Object.keys(obj)\n .filter((k) => obj[k] !== undefined)\n .sort()\n .map((k) => `${k}:${encodeValue(obj[k], memo)}`)\n .join(\",\")}}`;\n memo.set(ir, key);\n return key;\n}\n\n/**\n * Encode any IR field value. A nested SchemaIR is detected by a string `type`\n * field (checks carry `kind`, union `cases` carry `value`/`option` — only real\n * schema nodes have `type`) and routed through {@link keyOf} for subtree\n * memoization; everything else is serialized in sorted-key order.\n */\nfunction encodeValue(value: unknown, memo: Map<SchemaIR, string>): string {\n if (typeof value === \"bigint\") return `#${value}`;\n if (value === null) return \"null\";\n // Non-finite numbers must stay distinct: JSON.stringify maps Infinity, -Infinity\n // and NaN all to \"null\", which would merge e.g. .min(Infinity) with .min(NaN).\n if (typeof value === \"number\" && !Number.isFinite(value)) return `n!${value}`;\n if (Array.isArray(value)) return `[${value.map((v) => encodeValue(v, memo)).join(\",\")}]`;\n if (typeof value === \"object\") {\n if (typeof (value as { type?: unknown }).type === \"string\") {\n return keyOf(value as SchemaIR, memo);\n }\n const obj = value as Record<string, unknown>;\n return `{${Object.keys(obj)\n .filter((k) => obj[k] !== undefined)\n .sort()\n .map((k) => `${k}:${encodeValue(obj[k], memo)}`)\n .join(\",\")}}`;\n }\n return JSON.stringify(value) ?? \"undefined\";\n}\n\nfunction cmp(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n"],"mappings":"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"}
|
|
@@ -1,79 +1,55 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Each helper returns a string of the form `_e.push(...)` (or equivalent on a
|
|
5
|
-
* caller-supplied issues variable). Two emit modes:
|
|
6
|
-
*
|
|
7
|
-
* - inline (CLI .compiled.ts): emits the literal `{code:"too_small",...}` object.
|
|
8
|
-
* - lean (unplugin): emits a call like `__zcTS(min,origin,inclusive,input,path)`
|
|
9
|
-
* and registers the helper in `ctx.usedHelpers` so the transform layer can
|
|
10
|
-
* construct the corresponding `import` from `"virtual:zod-compiler/runtime"`.
|
|
11
|
-
*
|
|
12
|
-
* Centralizing all issue emission here means schema codegen files don't carry
|
|
13
|
-
* the inline/lean branching; they just call `tooSmall(g, ...)` etc.
|
|
14
|
-
*
|
|
15
|
-
* Message resolution mirrors Zod, which consults the error map of the
|
|
16
|
-
* INSTANCE that created the issue:
|
|
17
|
-
* - check-created issues (min/max/format/refine): per-check message only
|
|
18
|
-
* (options.message, extracted from `.min(3, "msg")`)
|
|
19
|
-
* - schema-created issues (invalid_type, enum/literal invalid_value, tuple
|
|
20
|
-
* length, invalid_union, invalid_key): schema-level message (g.typeMsg,
|
|
21
|
-
* from `z.string({ error: "msg" })`)
|
|
22
|
-
* Helpers default per the most common call-site kind; size-issue emitters
|
|
23
|
-
* accept `useTypeMsg: true` for node-level uses (tuple), and invalidValue
|
|
24
|
-
* accepts `useTypeMsg: false` for check-level uses (file mime).
|
|
25
|
-
* When no message lands, the __zcFin finalizer applies the locale default.
|
|
26
|
-
*/
|
|
27
|
-
import type { CodeGenContext } from "./context.js";
|
|
1
|
+
import { CodeGenContext } from "./context.js";
|
|
2
|
+
//#region src/core/codegen/emit-issue.d.ts
|
|
28
3
|
/** Common slim slice of SlowGen + FastGen needed for issue emission. */
|
|
29
4
|
interface IssueGen {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
5
|
+
readonly issues: string;
|
|
6
|
+
readonly input: string;
|
|
7
|
+
readonly path: string;
|
|
8
|
+
readonly ctx: CodeGenContext;
|
|
9
|
+
readonly typeMsg?: string | undefined;
|
|
35
10
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
11
|
+
declare function tooSmall(g: IssueGen, minimum: string | number, origin: string, inclusive: boolean, options?: {
|
|
12
|
+
exact?: boolean;
|
|
13
|
+
input?: string;
|
|
14
|
+
path?: string;
|
|
15
|
+
message?: string | undefined;
|
|
16
|
+
/** Set for node-level issues (tuple length) where schema error applies. */
|
|
17
|
+
useTypeMsg?: boolean;
|
|
43
18
|
}): string;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
19
|
+
declare function tooBig(g: IssueGen, maximum: string | number, origin: string, inclusive: boolean, options?: {
|
|
20
|
+
exact?: boolean;
|
|
21
|
+
input?: string;
|
|
22
|
+
path?: string;
|
|
23
|
+
message?: string | undefined;
|
|
24
|
+
/** Set for node-level issues (tuple length) where schema error applies. */
|
|
25
|
+
useTypeMsg?: boolean;
|
|
51
26
|
}): string;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
27
|
+
declare function invalidType(g: IssueGen, expected: string, options?: {
|
|
28
|
+
input?: string;
|
|
29
|
+
path?: string;
|
|
30
|
+
extra?: string;
|
|
31
|
+
message?: string | undefined;
|
|
57
32
|
}): string;
|
|
58
|
-
|
|
59
|
-
|
|
33
|
+
declare function invalidFormat(g: IssueGen, format: string | {
|
|
34
|
+
expr: string;
|
|
60
35
|
}, options?: {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
36
|
+
input?: string;
|
|
37
|
+
path?: string;
|
|
38
|
+
extra?: string;
|
|
39
|
+
message?: string | undefined;
|
|
65
40
|
}): string;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
41
|
+
declare function unrecognizedKeys(g: IssueGen, keysExpr: string, options?: {
|
|
42
|
+
input?: string;
|
|
43
|
+
path?: string;
|
|
44
|
+
message?: string | undefined;
|
|
70
45
|
}): string;
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
46
|
+
declare function invalidValue(g: IssueGen, valuesExpr: string, options?: {
|
|
47
|
+
input?: string;
|
|
48
|
+
path?: string;
|
|
49
|
+
message?: string | undefined;
|
|
50
|
+
/** Set to false for check-level issues (file mime) where schema error does not apply. */
|
|
51
|
+
useTypeMsg?: boolean;
|
|
77
52
|
}): string;
|
|
78
|
-
|
|
53
|
+
//#endregion
|
|
54
|
+
export { invalidFormat, invalidType, invalidValue, tooBig, tooSmall, unrecognizedKeys };
|
|
79
55
|
//# sourceMappingURL=emit-issue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit-issue.d.ts","
|
|
1
|
+
{"version":3,"file":"emit-issue.d.ts","names":[],"sources":["../../../src/core/codegen/emit-issue.ts"],"mappings":";;;UA+BU;WACC;WACA;WACA;WACA,KAAK;WACL;;iBA0BK,SACd,GAAG,UACH,0BACA,gBACA,oBACA;EACE;EACA;EACA;EACA;;EAEA;;iBAiCY,OACd,GAAG,UACH,0BACA,gBACA,oBACA;EACE;EACA;EACA;EACA;;EAEA;;iBAiCY,YACd,GAAG,UACH,kBACA;EAAY;EAAgB;EAAe;EAAgB;;iBAiB7C,cACd,GAAG,UACH;EAAmB;GACnB;EAAY;EAAgB;EAAe;EAAgB;;iBAmB7C,iBACd,GAAG,UACH,kBACA;EAAY;EAAgB;EAAe;;iBAgB7B,aACd,GAAG,UACH,oBACA;EACE;EACA;EACA;;EAEA"}
|