attaform 0.30.0 → 0.30.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 (67) hide show
  1. package/dist/abstract.d.mts +15 -21
  2. package/dist/abstract.mjs +2 -2
  3. package/dist/dev/abstract.mjs +4 -4
  4. package/dist/dev/chunks/devtools.mjs +2 -2
  5. package/dist/dev/directive.mjs +1 -1
  6. package/dist/dev/history.mjs +1 -1
  7. package/dist/dev/index.mjs +5 -5
  8. package/dist/dev/runtime/plugins/attaform.mjs +1 -1
  9. package/dist/dev/shared/{attaform-dev.BK6Ge2qR.mjs → attaform-dev.BJK1kqHY.mjs} +14 -14
  10. package/dist/dev/shared/{attaform-dev.D6CLvaQT.mjs → attaform-dev.BMQ3GcgD.mjs} +46 -59
  11. package/dist/dev/shared/{attaform-dev.BisFstxh.mjs → attaform-dev.BUIFcTYf.mjs} +6 -6
  12. package/dist/dev/shared/{attaform-dev.DTrHonpc.mjs → attaform-dev.CT7MDjPy.mjs} +27 -36
  13. package/dist/dev/shared/{attaform-dev.BcYT6tFh.mjs → attaform-dev.CZz4GYZ6.mjs} +21 -9
  14. package/dist/dev/shared/{attaform-dev.DUZckyV8.mjs → attaform-dev.Chm4D6SJ.mjs} +2 -2
  15. package/dist/dev/shared/{attaform-dev.BcNtyOmf.mjs → attaform-dev.DuEE4GU1.mjs} +4 -4
  16. package/dist/dev/shared/{attaform-dev.CQ2rJiAX.mjs → attaform-dev.DxHdkkPG.mjs} +126 -115
  17. package/dist/dev/shared/{attaform-dev.BQc5QV3Y.mjs → attaform-dev.zlvDr0WB.mjs} +2 -2
  18. package/dist/dev/zod-v3.mjs +6 -6
  19. package/dist/dev/zod-v4.mjs +6 -6
  20. package/dist/dev/zod.mjs +5 -5
  21. package/dist/directive.d.mts +4 -4
  22. package/dist/directive.mjs +1 -1
  23. package/dist/esbuild.d.mts +11 -0
  24. package/dist/esbuild.mjs +1 -1
  25. package/dist/history.d.mts +3 -32
  26. package/dist/history.mjs +1 -1
  27. package/dist/index.d.mts +67 -70
  28. package/dist/index.mjs +3 -3
  29. package/dist/nuxt.d.mts +4 -3
  30. package/dist/nuxt.mjs +3 -6
  31. package/dist/rollup.d.mts +11 -0
  32. package/dist/rollup.mjs +1 -1
  33. package/dist/rspack.d.mts +19 -11
  34. package/dist/rspack.mjs +1 -1
  35. package/dist/runtime/components/AttaformDevtoolsPanel.vue +12 -12
  36. package/dist/runtime/components/DevtoolsValueTree.vue +2 -2
  37. package/dist/shared/{attaform.Rc9u4Vfw.d.mts → attaform.2FslhB9R.d.mts} +83 -95
  38. package/dist/shared/{attaform.BRDDQeHV.mjs → attaform.8mfKZCwH.mjs} +2 -2
  39. package/dist/shared/{attaform.DRUT703x.d.mts → attaform.B-Tb62qV.d.mts} +12 -12
  40. package/dist/shared/{attaform.v0fQtWyA.mjs → attaform.B1rH9ht6.mjs} +1 -1
  41. package/dist/shared/{attaform.ByWP6kSx.mjs → attaform.B2iebkPA.mjs} +3 -3
  42. package/dist/shared/{attaform.DhnPb6nK.mjs → attaform.BAf3UNn4.mjs} +1 -1
  43. package/dist/shared/{attaform.DNJOWjQw.mjs → attaform.BIWicztt.mjs} +102 -100
  44. package/dist/shared/attaform.BcQwgWaq.d.mts +2153 -0
  45. package/dist/shared/attaform.Br8EBn5B.d.mts +4553 -0
  46. package/dist/shared/{attaform.BXneBxEj.mjs → attaform.CO918TdU.mjs} +13 -13
  47. package/dist/shared/{attaform.CUfrMK7t.mjs → attaform.DRsANMok.mjs} +5 -5
  48. package/dist/shared/{attaform.B3resMQ1.mjs → attaform.D_f1WgYf.mjs} +40 -53
  49. package/dist/shared/{attaform.CJ8DpRGj.mjs → attaform.D_pt1gOj.mjs} +26 -33
  50. package/dist/shared/attaform.L0kUn3vL.d.mts +42 -0
  51. package/dist/shared/{attaform.BK0cgu2K.mjs → attaform.ZYn2ahzJ.mjs} +3 -3
  52. package/dist/transforms.d.mts +153 -26
  53. package/dist/transforms.mjs +1 -1
  54. package/dist/vite.d.mts +29 -52
  55. package/dist/vite.mjs +3 -3
  56. package/dist/webpack.d.mts +20 -12
  57. package/dist/webpack.mjs +1 -1
  58. package/dist/zod-v3.d.mts +90 -96
  59. package/dist/zod-v3.mjs +4 -4
  60. package/dist/zod-v4.d.mts +118 -118
  61. package/dist/zod-v4.mjs +4 -4
  62. package/dist/zod.d.mts +5 -5
  63. package/dist/zod.mjs +3 -3
  64. package/package.json +7 -6
  65. package/dist/shared/attaform.Clz0ArIi.d.mts +0 -44
  66. package/dist/shared/attaform.UGyOK83T.d.mts +0 -2366
  67. package/dist/shared/attaform.bKLzMU0o.d.mts +0 -4761
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { G as GenericForm, l as FlatPath, s as NestedType, F as FormKey, U as UseFormConfiguration, A as AbstractSchema, aq as AcceptableDefaults, ac as ValidateOnConfig, a as UseFormReturnType } from './attaform.bKLzMU0o.mjs';
2
+ import { G as GenericForm, l as FlatPath, s as NestedType, F as FormKey, U as UseFormConfiguration, A as AbstractSchema, aq as AcceptableDefaults, ac as ValidateOnConfig, a as UseFormReturnType } from './attaform.Br8EBn5B.mjs';
3
3
 
4
4
  /**
5
5
  * The Zod v4 schema roots `useForm` accepts. A fixed-shape
@@ -34,60 +34,54 @@ import { G as GenericForm, l as FlatPath, s as NestedType, F as FormKey, U as Us
34
34
  type SupportedRootSchema = z.ZodObject<z.ZodRawShape> | z.ZodRecord | z.ZodDiscriminatedUnion<readonly z.ZodObject<z.ZodRawShape>[], string>;
35
35
 
36
36
  /**
37
- * The shape `form.values.<key>` returns at runtime.
38
- *
39
- * Per leaf:
40
- *
41
- * 1. Schema-side input normalizers — `z.preprocess(fn, inner)` AND
42
- * `z.coerce.X()`. Zod v4 represents these differently
43
- * (`ZodPipe<ZodTransform, inner>` for preprocess; a primitive
44
- * with `def.coerce === true` for coerce), but they share the
45
- * same type-level marker: `_zod.input` is `unknown`. The
46
- * normalizer runs at parse time, NOT at the write boundary, so
47
- * storage holds the consumer's raw input and the type collapses
48
- * to `unknown` to match. Reach the typed value via
49
- * `handleSubmit`, `validate`, or `parse` — they re-parse
50
- * storage through the wrapper.
51
- *
52
- * 2. `inner.transform(fn)` — compiles to `ZodPipe<inner, ZodTransform>`.
53
- * Transforms fire at submit / validate, NOT at the write boundary,
54
- * so storage holds whatever `inner` stores. Recurse `StorageShape`
55
- * on `inner` so a defaulted leaf inside `inner` still reads `T`
56
- * (not `T | undefined`).
57
- *
58
- * A bare top-level `ZodTransform` (no `in` schema) reads
59
- * `_zod.input` directly — there's no inner to recurse into.
60
- *
61
- * 3. Codec / generic pipe — neither side is a transform. Read
62
- * `_zod.output`. Codecs aren't write-boundary-synthesized, so the
37
+ * The shape `form.values.<key>` returns at runtime. Four cases per leaf:
38
+ *
39
+ * 1. A schema-side input normalizer, meaning `z.preprocess(fn, inner)`
40
+ * or `z.coerce.X()`. v4 represents the two differently, a
41
+ * `ZodPipe<ZodTransform, inner>` against a primitive with
42
+ * `def.coerce === true`, but they share one type-level marker:
43
+ * `_zod.input` is `unknown`. The normalizer runs at PARSE time, not
44
+ * at the write boundary, so storage holds the consumer's raw input
45
+ * and the type collapses to `unknown` to match. `handleSubmit`,
46
+ * `validate` and `parse` re-parse storage through the wrapper, so
47
+ * the typed value is reachable there.
48
+ *
49
+ * 2. `inner.transform(fn)`, which compiles to `ZodPipe<inner,
50
+ * ZodTransform>`. A transform fires at submit or validate, not at the
51
+ * write boundary, so storage holds whatever `inner` stores.
52
+ * `StorageShape` recurses on `inner`, so a defaulted leaf inside it
53
+ * still reads `T` rather than `T | undefined`. A bare top-level
54
+ * `ZodTransform`, with no `in` schema, reads `_zod.input` directly,
55
+ * having no inner to recurse into.
56
+ *
57
+ * 3. A codec or generic pipe, where neither side is a transform: read
58
+ * `_zod.output`. A codec is not write-boundary-synthesized, so the
63
59
  * post-parse view is the only honest storage type.
64
60
  *
65
- * 4. Everything else (defaults, catch, readonly, optional, primitives,
66
- * nested objects) — read `_zod.output`. Defaults and catches fire
67
- * at parse time, so the post-init view is what storage holds.
68
- * Nested objects delegate to Zod's own recursion on `_zod.output`,
61
+ * 4. Everything else, defaults, catch, readonly, optional, primitives
62
+ * and nested objects: read `_zod.output`. Defaults and catches fire
63
+ * at parse time, so the post-init view is what storage holds, and a
64
+ * nested object delegates to Zod's own recursion on `_zod.output`,
69
65
  * which peels nested defaults inside structural containers.
70
66
  *
71
- * Detection order: case 1 wins via the `_zod.input` IsUnknown check
72
- * before the pipe/transform cascade fires, so wrapped variants like
73
- * `z.coerce.number().optional()` (input = `unknown | undefined` →
74
- * collapses to `unknown`) and `z.preprocess(fn, z.object(...))` (input
75
- * = `unknown`) both land on `unknown` without descending. The IsAny
76
- * filter keeps `z.any()` from being mistaken for coerce.
77
- *
78
- * Implementation note: direct `_zod` property access mirrors Zod's
79
- * own `$InferObjectOutput` / `$InferObjectInput`, which read
80
- * `T[k]['_zod']['output']` / `T[k]['_zod']['input']` directly rather
81
- * than wrapping in the top-level `output<T>` / `input<T>` conditional.
82
- * Wrapping per key spawns a fresh conditional instantiation for every
83
- * key; Volar's web-worker checker collapses that per-key walk to
84
- * `any` once the schema is non-trivial. Property access has no
85
- * conditional and resolves cleanly under the same budget.
86
- *
87
- * Shape access also goes through `_zod.def.shape` rather than
88
- * `infer Shape from z.ZodObject<Shape>` — the latter collapses to the
89
- * `$ZodShape` upper bound in the same worker because of
90
- * `z.ZodObject`'s `out Shape` covariance markers.
67
+ * Case 1 wins first, on the `_zod.input` IsUnknown check, before the
68
+ * pipe and transform cascade can fire. So `z.coerce.number().optional()`
69
+ * (input `unknown | undefined`, collapsing to `unknown`) and
70
+ * `z.preprocess(fn, z.object(...))` (input `unknown`) both land on
71
+ * `unknown` without descending, while the IsAny filter keeps `z.any()`
72
+ * from being read as coerce.
73
+ *
74
+ * The direct `_zod` property access is deliberate, and matches Zod's own
75
+ * `$InferObjectOutput` / `$InferObjectInput`, which read
76
+ * `T[k]['_zod']['output']` rather than wrapping in the top-level
77
+ * `output<T>` conditional. Wrapping per key spawns a fresh conditional
78
+ * instantiation for every key, and Volar's web-worker checker collapses
79
+ * that per-key walk to `any` once the schema is non-trivial. Property
80
+ * access has no conditional and resolves cleanly on the same budget.
81
+ * Shape access goes through `_zod.def.shape` for the same reason: `infer
82
+ * Shape from z.ZodObject<Shape>` collapses to the `$ZodShape` upper
83
+ * bound in that worker, because of `z.ZodObject`'s `out Shape`
84
+ * covariance markers.
91
85
  */
92
86
  type StorageShape<S> = S extends {
93
87
  _zod: {
@@ -100,10 +94,10 @@ type StorageShape<S> = S extends {
100
94
  [K in keyof Shape]-?: StorageLeaf<Shape[K]>;
101
95
  } : StorageLeaf<S>;
102
96
  /**
103
- * Detects a schema whose `_zod.input` is `unknown` — the marker both
104
- * `z.preprocess(fn, _)` and `z.coerce.X()` share in Zod v4. Excludes
105
- * `any` via the canonical `0 extends 1 & T` test so `z.any()` leaves
106
- * fall through to the cascade below and keep their `any` typing.
97
+ * Detect a schema whose `_zod.input` is `unknown`, the marker
98
+ * `z.preprocess(fn, _)` and `z.coerce.X()` share in v4. `any` is
99
+ * excluded through the canonical `0 extends 1 & T` test, so a `z.any()`
100
+ * leaf falls through to the cascade below and keeps its `any`.
107
101
  */
108
102
  type InputIsUnknown<L> = L extends {
109
103
  _zod: {
@@ -111,12 +105,11 @@ type InputIsUnknown<L> = L extends {
111
105
  };
112
106
  } ? 0 extends 1 & In ? false : unknown extends In ? true : false : false;
113
107
  /**
114
- * Implementation-detail per-leaf branching for `StorageShape`.
115
- * Exported so the bundled `.d.ts` carries a single alias body —
116
- * every leaf of a Zod object schema otherwise re-emits the full
117
- * pipe / transform / default conditional ladder, which compounds
118
- * badly with multiple complex schemas in the same scope. Consumers
119
- * should reach for `StorageShape` instead.
108
+ * The per-leaf branching behind `StorageShape`. It is exported so the
109
+ * bundled `.d.ts` carries ONE alias body: otherwise every leaf of a Zod
110
+ * object re-emits the full pipe / transform / default conditional
111
+ * ladder, which compounds badly once several complex schemas share a
112
+ * scope. Reach for `StorageShape` instead.
120
113
  */
121
114
  type StorageLeaf<L> = InputIsUnknown<L> extends true ? unknown : L extends {
122
115
  _zod: {
@@ -159,10 +152,10 @@ type StorageLeaf<L> = InputIsUnknown<L> extends true ? unknown : L extends {
159
152
  */
160
153
 
161
154
  /**
162
- * Type of the value accepted at `Path` for `setValue` / `defaultValues`
163
- * — the schema's `z.input<Schema>` shape at that path. Matches what
164
- * `form.values.X` returns at runtime (the honest input view storage
165
- * holds before transforms run).
155
+ * What `setValue` and `defaultValues` accept at `Path`: the schema's
156
+ * `z.input<Schema>` shape there. It matches what `form.values.X` returns
157
+ * at runtime, storage holding the honest input view until transforms
158
+ * run.
166
159
  *
167
160
  * ```ts
168
161
  * const schema = z.object({
@@ -173,9 +166,9 @@ type StorageLeaf<L> = InputIsUnknown<L> extends true ? unknown : L extends {
173
166
  */
174
167
  type PathInput<Schema extends z.ZodType, Path extends string> = z.input<Schema> extends GenericForm ? Path extends FlatPath<z.input<Schema>> ? NestedType<z.input<Schema>, Path> : never : never;
175
168
  /**
176
- * Type produced at `Path` after the full parse pipeline — the schema's
177
- * `z.output<Schema>` shape at that path. Matches the `data` payload of
178
- * `form.parse()` and the value handed to `handleSubmit`'s callback.
169
+ * What `Path` holds after the full parse pipeline: the schema's
170
+ * `z.output<Schema>` shape there. It matches `form.parse()`'s `data` and
171
+ * the value `handleSubmit`'s callback receives.
179
172
  *
180
173
  * ```ts
181
174
  * const schema = z.object({
@@ -185,6 +178,19 @@ type PathInput<Schema extends z.ZodType, Path extends string> = z.input<Schema>
185
178
  * ```
186
179
  */
187
180
  type PathOutput<Schema extends z.ZodType, Path extends string> = z.output<Schema> extends GenericForm ? Path extends FlatPath<z.output<Schema>> ? NestedType<z.output<Schema>, Path> : never : never;
181
+ /**
182
+ * Factor the three identical-shape conditionals out of `useForm`'s public
183
+ * signature, so the bundled `.d.ts` carries one alias per shape instead
184
+ * of re-inlining `z.input<Schema> extends GenericForm ? z.input<Schema>
185
+ * : never` four times. That inlining is what produces TS2589 ("Type
186
+ * instantiation is excessively deep") at a consumer call site holding a
187
+ * discriminated union, a transform pipe, or a deep `.register()` chain.
188
+ * Each alias computes once per `Schema` instantiation, and downstream
189
+ * generics ride it rather than re-evaluating the conditional.
190
+ */
191
+ type FormOf<Schema extends SupportedRootSchema> = z.input<Schema> extends GenericForm ? z.input<Schema> : never;
192
+ type OutOf<Schema extends SupportedRootSchema> = z.output<Schema> extends GenericForm ? z.output<Schema> : never;
193
+ type ReadOf<Schema extends SupportedRootSchema> = StorageShape<Schema> extends GenericForm ? StorageShape<Schema> : never;
188
194
  /**
189
195
  * Create a form bound to a Zod v4 schema.
190
196
  *
@@ -192,37 +198,19 @@ type PathOutput<Schema extends z.ZodType, Path extends string> = z.output<Schema
192
198
  * import { useForm } from 'attaform/zod'
193
199
  * import { z } from 'zod'
194
200
  *
195
- * const form = useForm({
196
- * schema: z.object({
197
- * email: z.email(),
198
- * password: z.string().min(8),
199
- * }),
200
- * defaultValues: { email: '' },
201
+ * const schema = z.object({
202
+ * email: z.email(),
203
+ * password: z.string().min(8),
201
204
  * })
202
- * ```
203
205
  *
204
- * Returns a form API exposing `register`, `values`, `errors`,
205
- * `fields`, `setValue`, `handleSubmit`, `meta`, field-array
206
- * helpers, and more. See `UseFormReturnType` for the full
207
- * surface.
206
+ * const form = useForm({ schema, defaultValues: { email: '' } })
207
+ * ```
208
208
  *
209
- * For Zod v3, import from `attaform/zod-v3` instead.
209
+ * The returned form carries `register`, `values`, `errors`, `fields`,
210
+ * `setValue`, `handleSubmit`, `meta` and the field-array helpers; see
211
+ * `UseFormReturnType` for the whole surface. For Zod v3, import from
212
+ * `attaform/zod-v3`.
210
213
  */
211
- /**
212
- * `FormOf` / `OutOf` / `ReadOf` factor the three identical-shape
213
- * conditionals out of `useForm`'s public signature. The bundled
214
- * `.d.ts` then carries one alias per shape rather than re-inlining
215
- * `z.input<Schema> extends GenericForm ? z.input<Schema> : never`
216
- * four times — which is what produces TS2589 ("Type instantiation
217
- * is excessively deep") on consumer call sites with complex schemas
218
- * (discriminated unions, transform pipes, deep `.register()` chains).
219
- * Each alias is computed once per `Schema` instantiation; downstream
220
- * generics ride on the alias rather than re-evaluating the
221
- * conditional from scratch.
222
- */
223
- type FormOf<Schema extends SupportedRootSchema> = z.input<Schema> extends GenericForm ? z.input<Schema> : never;
224
- type OutOf<Schema extends SupportedRootSchema> = z.output<Schema> extends GenericForm ? z.output<Schema> : never;
225
- type ReadOf<Schema extends SupportedRootSchema> = StorageShape<Schema> extends GenericForm ? StorageShape<Schema> : never;
226
214
  declare function useForm<Schema extends SupportedRootSchema, K extends FormKey = FormKey>(configuration: Omit<UseFormConfiguration<FormOf<Schema>, OutOf<Schema>, AbstractSchema<FormOf<Schema>, OutOf<Schema>>, never, K>, 'schema' | 'validateOn' | 'debounceMs' | 'defaultValues'> & {
227
215
  schema: Schema;
228
216
  defaultValues?: AcceptableDefaults<FormOf<Schema>, z.input<Schema>>;
@@ -21,7 +21,7 @@ function pickDefined(bag) {
21
21
  return out;
22
22
  }
23
23
 
24
- function callConsumerSchemaFn(fn, fallback, site) {
24
+ function callConsumerFn(fn, fallback, site, detail) {
25
25
  try {
26
26
  return fn();
27
27
  } catch (err) {
@@ -355,4 +355,4 @@ function structuralSnapshot(value) {
355
355
  return out;
356
356
  }
357
357
 
358
- export { ANONYMOUS_FORM_KEY_PREFIX as A, DEFAULT_HISTORY_MAX_SNAPSHOTS as D, RESERVED_KEY_PREFIX as R, safeOwnRead as a, safeAssign as b, callConsumerSchemaFn as c, safeOwnHas as d, consumerHas as e, spreadConsumerRecord as f, copyConsumerArray as g, consumerKeys as h, isShadowedKey as i, readConsumerProp as j, diffAndApply as k, DEFAULT_FIELD_VALIDATION_DEBOUNCE_MS as l, consumerSymbolKeys as m, normalizeNumericOption as n, applyChangedKeys as o, pickDefined as p, DEFAULT_MAX_RECURSION_DEPTH as q, readConsumerIndex as r, structuralSnapshot as s, ANONYMOUS_WIZARD_KEY_PREFIX as t };
358
+ export { ANONYMOUS_FORM_KEY_PREFIX as A, DEFAULT_HISTORY_MAX_SNAPSHOTS as D, RESERVED_KEY_PREFIX as R, safeOwnRead as a, safeAssign as b, callConsumerFn as c, safeOwnHas as d, consumerHas as e, spreadConsumerRecord as f, copyConsumerArray as g, consumerKeys as h, isShadowedKey as i, readConsumerProp as j, diffAndApply as k, DEFAULT_FIELD_VALIDATION_DEBOUNCE_MS as l, consumerSymbolKeys as m, normalizeNumericOption as n, applyChangedKeys as o, pickDefined as p, DEFAULT_MAX_RECURSION_DEPTH as q, readConsumerIndex as r, structuralSnapshot as s, ANONYMOUS_WIZARD_KEY_PREFIX as t };
@@ -18,19 +18,19 @@ import { z } from 'zod';
18
18
  type SupportedRootSchema = z.ZodObject<z.ZodRawShape> | z.ZodRecord<z.ZodTypeAny, z.ZodTypeAny> | z.ZodDiscriminatedUnion<string, readonly z.ZodDiscriminatedUnionOption<string>[]>;
19
19
 
20
20
  /**
21
- * v3 mirror of the Zod v4 `StorageShape`. Per top-level key, default
22
- * to `z.output<Shape[K]>` (the post-init view — defaults have fired,
23
- * Zod's own recursion peels nested defaults inside structural
24
- * containers); fall back to `z.input<Shape[K]>` for transform / pipe
25
- * carriers (`ZodEffects`, `ZodPipeline`) where storage holds the
26
- * pre-transform input — transforms only run at submission /
27
- * validation, not at the write boundary.
21
+ * The v3 mirror of Zod v4's `StorageShape`. Each top-level key defaults
22
+ * to `z.output<Shape[K]>`, the post-init view, where defaults have fired
23
+ * and Zod's own recursion has peeled nested defaults inside structural
24
+ * containers. A transform or pipe carrier (`ZodEffects`, `ZodPipeline`)
25
+ * falls back to `z.input<Shape[K]>`, storage there holding the
26
+ * pre-transform input: a transform runs at submission or validation, not
27
+ * at the write boundary.
28
28
  *
29
- * v3 quirk: `ZodEffects` covers BOTH `.transform()` and
30
- * `z.preprocess()` at the TS level — v3 doesn't carry a separate
31
- * preprocess class the way v4 does. Deferring to `z.input` for
32
- * `ZodEffects` means a top-level `z.preprocess(fn, T)` leaf reads as
33
- * the preprocess input (commonly `unknown`); reach for the
29
+ * A v3 quirk sharpens this: `ZodEffects` covers BOTH `.transform()` and
30
+ * `z.preprocess()` at the TS level, v3 carrying no separate preprocess
31
+ * class. So deferring to `z.input` there makes a top-level
32
+ * `z.preprocess(fn, T)` leaf read as the preprocess input, commonly
33
+ * `unknown`; reach for the
34
34
  * `AbstractSchema` escape hatch if a stronger type is needed.
35
35
  * Transforms preserve their pre-transform input shape, which matches
36
36
  * storage.
@@ -1,4 +1,4 @@
1
- import { r as resolveZodAliasTarget, i as isRewritableZodSpecifier } from './attaform.DhnPb6nK.mjs';
1
+ import { r as resolveZodAliasTarget, i as isRewritableZodSpecifier } from './attaform.BAf3UNn4.mjs';
2
2
 
3
3
  const TAP_NAME = "attaform";
4
4
  function createWebpackFamilyPlugin(tag, options) {
@@ -1,7 +1,7 @@
1
1
  import { a as InvalidUseFormConfigError } from './attaform.CdZIEf7_.mjs';
2
- import { u as useForm$2 } from './attaform.CJ8DpRGj.mjs';
3
- import { u as useForm$1 } from './attaform.BXneBxEj.mjs';
4
- import { i as installingFieldMetaStore, g as getFieldMetaForSchema } from './attaform.CUfrMK7t.mjs';
2
+ import { u as useForm$2 } from './attaform.D_pt1gOj.mjs';
3
+ import { u as useForm$1 } from './attaform.CO918TdU.mjs';
4
+ import { i as installingFieldMetaStore, g as getFieldMetaForSchema } from './attaform.DRsANMok.mjs';
5
5
 
6
6
  function isZodV4SchemaShape(value) {
7
7
  if (typeof value !== "object" || value === null) return false;
@@ -32,7 +32,7 @@ function missingZodError(tag) {
32
32
  return `[${tag}] zod is not installed. attaform requires zod as a peer dependency. Install \`zod@^3\` or \`zod@^4\`, OR pass \`attaform({ resolveZodAlias: false })\` to keep the runtime-dispatch unified entry (and silence this check).`;
33
33
  }
34
34
  function unclassifiableZodWarning(tag) {
35
- return `[${tag}] Could not classify the installed Zod major (corrupted package.json, monorepo edge case, or an unexpected version string). Falling through to runtime dispatch \u2014 both Zod adapters will ship in the bundle. Pass \`attaform({ resolveZodAlias: false })\` to silence this warning.`;
35
+ return `[${tag}] Could not classify the installed Zod major (corrupted package.json, monorepo edge case, or an unexpected version string). Falling through to runtime dispatch, so both Zod adapters will ship in the bundle. Pass \`attaform({ resolveZodAlias: false })\` to silence this warning.`;
36
36
  }
37
37
  function resolveZodAliasTarget(consumerRootDir, tag, resolveZodAlias, warnState) {
38
38
  if (!resolveZodAlias) return null;