attaform 0.27.6 → 0.29.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.
Files changed (192) hide show
  1. package/dist/abstract.d.mts +5 -4
  2. package/dist/abstract.mjs +4 -3
  3. package/dist/chunks/fingerprint.mjs +1 -2
  4. package/dist/chunks/fingerprint2.mjs +2 -3
  5. package/dist/dev/abstract.mjs +4 -0
  6. package/dist/{chunks → dev/chunks}/dev-key-collision-warnings.mjs +0 -1
  7. package/dist/{chunks → dev/chunks}/devtools.mjs +5 -6
  8. package/dist/{chunks/fingerprint.cjs → dev/chunks/fingerprint.mjs} +7 -10
  9. package/dist/{chunks/fingerprint2.cjs → dev/chunks/fingerprint2.mjs} +32 -35
  10. package/dist/dev/directive.mjs +1 -0
  11. package/dist/dev/history.mjs +89 -0
  12. package/dist/dev/index.mjs +5 -0
  13. package/dist/dev/runtime/plugins/attaform.mjs +40 -0
  14. package/dist/dev/shared/attaform-dev.A-TpJW0B.mjs +207 -0
  15. package/dist/dev/shared/attaform-dev.BO-71R54.mjs +820 -0
  16. package/dist/{shared/attaform.D6tk90Rc.cjs → dev/shared/attaform-dev.BgM6FdtA.mjs} +324 -73
  17. package/dist/dev/shared/attaform-dev.ButTkwHd.mjs +375 -0
  18. package/dist/{shared/attaform.BJGA_UOS.mjs → dev/shared/attaform-dev.BxfsuwBR.mjs} +8 -1
  19. package/dist/{shared/attaform.nMaz2C5P.mjs → dev/shared/attaform-dev.D8aoKb89.mjs} +190 -400
  20. package/dist/dev/shared/attaform-dev.DD5m2W51.mjs +220 -0
  21. package/dist/{shared/attaform.CKH2lGdL.mjs → dev/shared/attaform-dev.DHuydLAC.mjs} +3867 -4731
  22. package/dist/{shared/attaform.DYEr28Pt.mjs → dev/shared/attaform-dev.DrzObAZo.mjs} +6 -7
  23. package/dist/{shared/attaform.B1ZYt2Li.mjs → dev/shared/attaform-dev.q6UutkCx.mjs} +274 -672
  24. package/dist/dev/zod-v3.mjs +17 -0
  25. package/dist/dev/zod-v4.mjs +16 -0
  26. package/dist/dev/zod.mjs +5 -0
  27. package/dist/directive.d.mts +20 -0
  28. package/dist/directive.mjs +1 -0
  29. package/dist/esbuild.mjs +0 -1
  30. package/dist/history.d.mts +59 -0
  31. package/dist/history.mjs +89 -0
  32. package/dist/index.d.mts +14 -6
  33. package/dist/index.mjs +5 -4
  34. package/dist/nuxt.d.mts +10 -10
  35. package/dist/nuxt.mjs +5 -2
  36. package/dist/rollup.mjs +0 -1
  37. package/dist/rspack.d.mts +6 -1
  38. package/dist/rspack.mjs +0 -1
  39. package/dist/runtime/components/AttaformDevtoolsPanel.vue +9 -8
  40. package/dist/runtime/plugins/attaform.mjs +1 -2
  41. package/dist/shared/{attaform.CoR4mWfv.mjs → attaform.B0dKL8ST.mjs} +309 -46
  42. package/dist/shared/{attaform.Cs2Rbdlo.mjs → attaform.BK0cgu2K.mjs} +123 -140
  43. package/dist/shared/{attaform.B9Wyhfro.cjs → attaform.BndjUUYX.mjs} +11 -16
  44. package/dist/shared/{attaform.CQN9R62B.cjs → attaform.BxfsuwBR.mjs} +9 -4
  45. package/dist/shared/attaform.C2MVyuxC.mjs +811 -0
  46. package/dist/shared/{attaform.Fp3sCrVs.d.ts → attaform.CIWLMY-R.d.mts} +2 -2
  47. package/dist/shared/attaform.CZMAYwSK.mjs +6383 -0
  48. package/dist/shared/attaform.CZYt_5N_.mjs +207 -0
  49. package/dist/shared/{attaform.DniawQLP.d.cts → attaform.CsoeRi3P.d.mts} +490 -98
  50. package/dist/shared/attaform.Cvao8bW5.mjs +358 -0
  51. package/dist/shared/attaform.D0x-qSXm.mjs +197 -0
  52. package/dist/shared/{attaform.D8kliaKw.cjs → attaform.D1fnTifF.mjs} +279 -692
  53. package/dist/shared/{attaform.CHlJLAiv.d.mts → attaform.DDtqHYv1.d.mts} +155 -184
  54. package/dist/shared/{attaform.Biytrv0-.cjs → attaform.DffRL5pP.mjs} +215 -547
  55. package/dist/shared/attaform.DhnPb6nK.mjs +0 -1
  56. package/dist/shared/attaform.KvlEedlF.mjs +0 -1
  57. package/dist/shared/attaform.axHXVQO7.d.mts +44 -0
  58. package/dist/shared/attaform.v0fQtWyA.mjs +0 -1
  59. package/dist/transforms.d.mts +0 -22
  60. package/dist/transforms.mjs +1 -2
  61. package/dist/vite.d.mts +30 -9
  62. package/dist/vite.mjs +27 -4
  63. package/dist/webpack.d.mts +6 -1
  64. package/dist/webpack.mjs +0 -1
  65. package/dist/zod-v3.d.mts +13 -6
  66. package/dist/zod-v3.mjs +17 -4
  67. package/dist/zod-v4.d.mts +19 -26
  68. package/dist/zod-v4.mjs +16 -4
  69. package/dist/zod.d.mts +4 -3
  70. package/dist/zod.mjs +5 -4
  71. package/package.json +38 -20
  72. package/skills/attaform/SKILL.md +6 -2
  73. package/skills/attaform/references/custom-components.md +7 -2
  74. package/skills/attaform/references/errors.md +8 -3
  75. package/skills/attaform/references/saving.md +77 -0
  76. package/skills/attaform/references/wizards.md +10 -8
  77. package/dist/abstract.cjs +0 -48
  78. package/dist/abstract.cjs.map +0 -1
  79. package/dist/abstract.d.cts +0 -42
  80. package/dist/abstract.d.ts +0 -42
  81. package/dist/abstract.mjs.map +0 -1
  82. package/dist/chunks/dev-key-collision-warnings.cjs +0 -25
  83. package/dist/chunks/dev-key-collision-warnings.cjs.map +0 -1
  84. package/dist/chunks/dev-key-collision-warnings.mjs.map +0 -1
  85. package/dist/chunks/devtools.cjs +0 -157
  86. package/dist/chunks/devtools.cjs.map +0 -1
  87. package/dist/chunks/devtools.mjs.map +0 -1
  88. package/dist/chunks/fingerprint.cjs.map +0 -1
  89. package/dist/chunks/fingerprint.mjs.map +0 -1
  90. package/dist/chunks/fingerprint2.cjs.map +0 -1
  91. package/dist/chunks/fingerprint2.mjs.map +0 -1
  92. package/dist/esbuild.cjs +0 -28
  93. package/dist/esbuild.cjs.map +0 -1
  94. package/dist/esbuild.d.cts +0 -56
  95. package/dist/esbuild.d.ts +0 -56
  96. package/dist/esbuild.mjs.map +0 -1
  97. package/dist/index.cjs +0 -51
  98. package/dist/index.cjs.map +0 -1
  99. package/dist/index.d.cts +0 -249
  100. package/dist/index.d.ts +0 -249
  101. package/dist/index.mjs.map +0 -1
  102. package/dist/nuxt.cjs +0 -84
  103. package/dist/nuxt.cjs.map +0 -1
  104. package/dist/nuxt.d.cts +0 -66
  105. package/dist/nuxt.d.ts +0 -66
  106. package/dist/nuxt.mjs.map +0 -1
  107. package/dist/rollup.cjs +0 -24
  108. package/dist/rollup.cjs.map +0 -1
  109. package/dist/rollup.d.cts +0 -35
  110. package/dist/rollup.d.ts +0 -35
  111. package/dist/rollup.mjs.map +0 -1
  112. package/dist/rspack.cjs +0 -10
  113. package/dist/rspack.cjs.map +0 -1
  114. package/dist/rspack.d.cts +0 -40
  115. package/dist/rspack.d.ts +0 -40
  116. package/dist/rspack.mjs.map +0 -1
  117. package/dist/runtime/components/AttaformDevtoolsPanel.vue.d.ts +0 -7
  118. package/dist/runtime/components/DevtoolsValueTree.vue.d.ts +0 -35
  119. package/dist/runtime/plugins/attaform.cjs +0 -43
  120. package/dist/runtime/plugins/attaform.cjs.map +0 -1
  121. package/dist/runtime/plugins/attaform.d.cts +0 -5
  122. package/dist/runtime/plugins/attaform.d.ts +0 -5
  123. package/dist/runtime/plugins/attaform.mjs.map +0 -1
  124. package/dist/shared/attaform.B1ZYt2Li.mjs.map +0 -1
  125. package/dist/shared/attaform.B9Wyhfro.cjs.map +0 -1
  126. package/dist/shared/attaform.BGDV42hI.d.cts +0 -232
  127. package/dist/shared/attaform.BJGA_UOS.mjs.map +0 -1
  128. package/dist/shared/attaform.Biytrv0-.cjs.map +0 -1
  129. package/dist/shared/attaform.Bn0IzhD_.cjs +0 -800
  130. package/dist/shared/attaform.Bn0IzhD_.cjs.map +0 -1
  131. package/dist/shared/attaform.C9fPTxjB.d.cts +0 -41
  132. package/dist/shared/attaform.C9fPTxjB.d.ts +0 -41
  133. package/dist/shared/attaform.CKH2lGdL.mjs.map +0 -1
  134. package/dist/shared/attaform.CQN9R62B.cjs.map +0 -1
  135. package/dist/shared/attaform.CoR4mWfv.mjs.map +0 -1
  136. package/dist/shared/attaform.Cs2Rbdlo.mjs.map +0 -1
  137. package/dist/shared/attaform.D6tk90Rc.cjs.map +0 -1
  138. package/dist/shared/attaform.D8kliaKw.cjs.map +0 -1
  139. package/dist/shared/attaform.DLknk9nF.d.mts +0 -232
  140. package/dist/shared/attaform.DMxM2kol.mjs +0 -1275
  141. package/dist/shared/attaform.DMxM2kol.mjs.map +0 -1
  142. package/dist/shared/attaform.DRUT703x.d.cts +0 -56
  143. package/dist/shared/attaform.DRUT703x.d.ts +0 -56
  144. package/dist/shared/attaform.DYEr28Pt.mjs.map +0 -1
  145. package/dist/shared/attaform.DdQN7sgN.cjs +0 -1302
  146. package/dist/shared/attaform.DdQN7sgN.cjs.map +0 -1
  147. package/dist/shared/attaform.DhnPb6nK.mjs.map +0 -1
  148. package/dist/shared/attaform.DniawQLP.d.mts +0 -4763
  149. package/dist/shared/attaform.DniawQLP.d.ts +0 -4763
  150. package/dist/shared/attaform.DoQm_Vkd.cjs +0 -58
  151. package/dist/shared/attaform.DoQm_Vkd.cjs.map +0 -1
  152. package/dist/shared/attaform.DrvMscNX.cjs +0 -7697
  153. package/dist/shared/attaform.DrvMscNX.cjs.map +0 -1
  154. package/dist/shared/attaform.F2Q8iv38.d.ts +0 -2494
  155. package/dist/shared/attaform.FmqKO1Ex.d.cts +0 -2494
  156. package/dist/shared/attaform.KvlEedlF.mjs.map +0 -1
  157. package/dist/shared/attaform.RaTzp1WF.cjs +0 -26
  158. package/dist/shared/attaform.RaTzp1WF.cjs.map +0 -1
  159. package/dist/shared/attaform.nMaz2C5P.mjs.map +0 -1
  160. package/dist/shared/attaform.v0fQtWyA.mjs.map +0 -1
  161. package/dist/shared/attaform.yUrz7C2z.cjs +0 -29
  162. package/dist/shared/attaform.yUrz7C2z.cjs.map +0 -1
  163. package/dist/transforms.cjs +0 -12
  164. package/dist/transforms.cjs.map +0 -1
  165. package/dist/transforms.d.cts +0 -73
  166. package/dist/transforms.d.ts +0 -73
  167. package/dist/transforms.mjs.map +0 -1
  168. package/dist/vite.cjs +0 -363
  169. package/dist/vite.cjs.map +0 -1
  170. package/dist/vite.d.cts +0 -133
  171. package/dist/vite.d.ts +0 -133
  172. package/dist/vite.mjs.map +0 -1
  173. package/dist/webpack.cjs +0 -10
  174. package/dist/webpack.cjs.map +0 -1
  175. package/dist/webpack.d.cts +0 -37
  176. package/dist/webpack.d.ts +0 -37
  177. package/dist/webpack.mjs.map +0 -1
  178. package/dist/zod-v3.cjs +0 -53
  179. package/dist/zod-v3.cjs.map +0 -1
  180. package/dist/zod-v3.d.cts +0 -246
  181. package/dist/zod-v3.d.ts +0 -246
  182. package/dist/zod-v3.mjs.map +0 -1
  183. package/dist/zod-v4.cjs +0 -55
  184. package/dist/zod-v4.cjs.map +0 -1
  185. package/dist/zod-v4.d.cts +0 -172
  186. package/dist/zod-v4.d.ts +0 -172
  187. package/dist/zod-v4.mjs.map +0 -1
  188. package/dist/zod.cjs +0 -51
  189. package/dist/zod.cjs.map +0 -1
  190. package/dist/zod.d.cts +0 -7
  191. package/dist/zod.d.ts +0 -7
  192. package/dist/zod.mjs.map +0 -1
@@ -1,1275 +0,0 @@
1
- import { r as getAtPath, p as slimKindOf, t as setAtPath, q as humanize, h as useAbstractForm } from './attaform.CKH2lGdL.mjs';
2
- import { A as AttaformError, _ as __DEV__, f as canonicalizePath, a as InvalidUseFormConfigError } from './attaform.nMaz2C5P.mjs';
3
- import { f as fieldMetaStore, g as getFieldMetaForSchema, a as getFieldMetaListForSchema, s as slimPrimitivesWalk, w as walkPathSegments, d as deriveDefaultWalk, m as mergeDeep, c as createAbstractSchema, b as getFieldMetaPathMap } from './attaform.CoR4mWfv.mjs';
4
- import { z } from 'zod';
5
-
6
- const fieldMeta = fieldMetaStore;
7
- function getFieldMetaList(schema) {
8
- return getFieldMetaListForSchema(schema);
9
- }
10
- function withMeta(schema, payload) {
11
- const existing = getFieldMetaForSchema(schema) ?? {};
12
- const cloned = schema.clone();
13
- fieldMetaStore.add(cloned, { ...existing, ...payload });
14
- return cloned;
15
- }
16
- function getFieldMeta(schema) {
17
- return getFieldMetaForSchema(schema);
18
- }
19
-
20
- let warnedZodCodeMissing = false;
21
- function zodIssuesToValidationErrors(issues, formKey) {
22
- return issues.map((issue) => {
23
- let code;
24
- if (typeof issue.code === "string" && issue.code.length > 0) {
25
- code = `zod:${issue.code}`;
26
- } else {
27
- code = "zod:unknown";
28
- if (__DEV__ && !warnedZodCodeMissing) {
29
- warnedZodCodeMissing = true;
30
- console.warn(
31
- "[attaform] zod-v4 adapter received an issue with no string `code`; stamping `'zod:unknown'`. This usually means a custom Zod plugin emitted an issue without the standard code field."
32
- );
33
- }
34
- }
35
- return {
36
- message: issue.message,
37
- // Adapter-side paths stay schema-relative — the validation
38
- // pipeline in `create-form-store.ts` prepends the parent path
39
- // to absolutise, then routes form-level (absolute path length 0)
40
- // entries to the empty-string bucket at storage time.
41
- path: issue.path.map((seg) => typeof seg === "number" ? seg : String(seg)),
42
- formKey,
43
- code
44
- };
45
- });
46
- }
47
- class UnsupportedSchemaError extends AttaformError {
48
- }
49
-
50
- function readDef(schema) {
51
- if (schema === null || typeof schema !== "object") return void 0;
52
- return schema.def;
53
- }
54
- function kindOf(schema) {
55
- const def = readDef(schema);
56
- const rawType = def?.type;
57
- if (rawType === void 0) return "unknown";
58
- switch (rawType) {
59
- case "object":
60
- return "object";
61
- case "array":
62
- return "array";
63
- case "set":
64
- return "set";
65
- case "record":
66
- return "record";
67
- case "tuple":
68
- return "tuple";
69
- case "union":
70
- return def?.discriminator !== void 0 ? "discriminated-union" : "union";
71
- case "discriminated_union":
72
- case "discriminatedUnion":
73
- return "discriminated-union";
74
- case "string":
75
- return "string";
76
- case "number":
77
- return "number";
78
- case "boolean":
79
- return "boolean";
80
- case "bigint":
81
- return "bigint";
82
- case "date":
83
- return "date";
84
- case "enum":
85
- return "enum";
86
- case "literal":
87
- return "literal";
88
- case "null":
89
- return "null";
90
- case "undefined":
91
- return "undefined";
92
- case "optional":
93
- return "optional";
94
- case "nullable":
95
- return "nullable";
96
- case "default":
97
- case "prefault":
98
- return "default";
99
- case "pipe":
100
- return "pipe";
101
- case "readonly":
102
- return "readonly";
103
- case "any":
104
- return "any";
105
- case "nan":
106
- return "nan";
107
- case "void":
108
- return "void";
109
- case "never":
110
- return "never";
111
- case "lazy":
112
- return "lazy";
113
- case "intersection":
114
- return "intersection";
115
- case "catch":
116
- return "catch";
117
- case "transform":
118
- return "transform";
119
- case "promise":
120
- return "promise";
121
- case "custom":
122
- return "custom";
123
- case "template_literal":
124
- case "templateLiteral":
125
- return "template-literal";
126
- case "file":
127
- return "file";
128
- case "map":
129
- return "map";
130
- case "symbol":
131
- return "symbol";
132
- case "function":
133
- return "function";
134
- default:
135
- return "unknown";
136
- }
137
- }
138
- function getObjectShape(schema) {
139
- const s = schema;
140
- return s.shape;
141
- }
142
- function getArrayElement(schema) {
143
- const def = readDef(schema);
144
- return def?.element;
145
- }
146
- function getSetValueType(schema) {
147
- const def = readDef(schema);
148
- return def?.valueType;
149
- }
150
- function getRecordKeyType(schema) {
151
- const def = readDef(schema);
152
- return def?.keyType;
153
- }
154
- function getRecordValueType(schema) {
155
- const def = readDef(schema);
156
- return def?.valueType;
157
- }
158
- function getTupleItems(schema) {
159
- const def = readDef(schema);
160
- return def?.items ?? [];
161
- }
162
- function getUnionOptions(schema) {
163
- const def = readDef(schema);
164
- return def?.options ?? [];
165
- }
166
- function getLiteralValues(schema) {
167
- const def = readDef(schema);
168
- return def?.values ?? [];
169
- }
170
- function getEnumValues(schema) {
171
- const def = readDef(schema);
172
- const entries = def?.entries;
173
- if (entries === void 0) return [];
174
- return Object.values(entries);
175
- }
176
- function unwrapInner(schema) {
177
- const def = readDef(schema);
178
- return def?.innerType;
179
- }
180
- function unwrapPipe(schema) {
181
- const def = readDef(schema);
182
- return def?.in ?? def?.out;
183
- }
184
- function unwrapPipeIn(schema) {
185
- const def = readDef(schema);
186
- return def?.in;
187
- }
188
- function isCoercePrimitive(schema) {
189
- return readDef(schema)?.coerce === true;
190
- }
191
- function isPreprocessNode(schema) {
192
- if (kindOf(schema) !== "pipe") return false;
193
- const pipeIn = unwrapPipeIn(schema);
194
- return pipeIn !== void 0 && kindOf(pipeIn) === "transform";
195
- }
196
- function unwrapPipeOut(schema) {
197
- const def = readDef(schema);
198
- return def?.out;
199
- }
200
- function unwrapLazy(schema) {
201
- const def = readDef(schema);
202
- const getter = def?.getter;
203
- if (typeof getter !== "function") return void 0;
204
- return getter();
205
- }
206
- function getLazyGetter(schema) {
207
- const def = readDef(schema);
208
- return typeof def?.getter === "function" ? def.getter : void 0;
209
- }
210
- function getIntersectionLeft(schema) {
211
- const def = readDef(schema);
212
- return def?.left;
213
- }
214
- function getIntersectionRight(schema) {
215
- const def = readDef(schema);
216
- return def?.right;
217
- }
218
- function getCatchDefault(schema) {
219
- const def = readDef(schema);
220
- const cv = def?.catchValue;
221
- if (typeof cv !== "function") return void 0;
222
- try {
223
- return cv({ error: new Error("atta:default-values"), input: void 0 });
224
- } catch {
225
- return void 0;
226
- }
227
- }
228
- function hasCatchValue(schema) {
229
- const def = readDef(schema);
230
- return typeof def?.catchValue === "function";
231
- }
232
- function getDefaultValue(schema) {
233
- const def = readDef(schema);
234
- return def?.defaultValue;
235
- }
236
- function getNativeEnumValues(_schema) {
237
- return void 0;
238
- }
239
- function unwrapEffectsSource(_schema) {
240
- return void 0;
241
- }
242
- function unwrapBranded(_schema) {
243
- return void 0;
244
- }
245
- function hasChecks(schema) {
246
- const def = readDef(schema);
247
- const checks = def?.checks;
248
- return Array.isArray(checks) && checks.length > 0;
249
- }
250
- function getChecks(schema) {
251
- const def = readDef(schema);
252
- const checks = def?.checks;
253
- return Array.isArray(checks) ? checks : [];
254
- }
255
- function getDiscriminator(schema) {
256
- const def = readDef(schema);
257
- return def?.discriminator;
258
- }
259
- function getDiscriminatedOptions(schema) {
260
- const def = readDef(schema);
261
- const options = def?.options;
262
- return Array.isArray(options) ? options : [];
263
- }
264
- function assertZodVersion(schema) {
265
- const def = readDef(schema);
266
- if (def?.type === void 0) {
267
- throw new Error(
268
- "[attaform/zod-v4] Schema is not a Zod v4 schema. The `attaform/zod-v4` adapter requires zod@^4. Either: (a) install zod@^4 in your project; (b) import from `attaform/zod`, which auto-detects the Zod version (and tree-shakes to a single adapter when the `attaform/vite` plugin is active); or (c) import from `attaform/zod-v3` if you are staying on Zod v3."
269
- );
270
- }
271
- }
272
- function walkSchemaTree(schema, visit, seen) {
273
- const visited = seen ?? /* @__PURE__ */ new WeakSet();
274
- const candidate = schema;
275
- if (typeof candidate !== "object" || candidate === null) return false;
276
- if (visited.has(candidate)) return false;
277
- visited.add(candidate);
278
- if (visit(schema)) return true;
279
- const def = readDef(schema);
280
- if (def === void 0) return false;
281
- if (def.innerType !== void 0 && walkSchemaTree(def.innerType, visit, visited)) {
282
- return true;
283
- }
284
- if (def.element !== void 0 && walkSchemaTree(def.element, visit, visited)) {
285
- return true;
286
- }
287
- if (def.in !== void 0 && walkSchemaTree(def.in, visit, visited)) return true;
288
- if (def.out !== void 0 && walkSchemaTree(def.out, visit, visited)) return true;
289
- if (def.left !== void 0 && walkSchemaTree(def.left, visit, visited)) return true;
290
- if (def.right !== void 0 && walkSchemaTree(def.right, visit, visited)) return true;
291
- if (def.keyType !== void 0 && walkSchemaTree(def.keyType, visit, visited)) {
292
- return true;
293
- }
294
- if (def.valueType !== void 0 && walkSchemaTree(def.valueType, visit, visited)) {
295
- return true;
296
- }
297
- if (def.shape !== void 0) {
298
- for (const sub of Object.values(def.shape)) {
299
- if (walkSchemaTree(sub, visit, visited)) return true;
300
- }
301
- }
302
- if (def.entries !== void 0) {
303
- for (const sub of Object.values(def.entries)) {
304
- if (walkSchemaTree(sub, visit, visited)) return true;
305
- }
306
- }
307
- if (def.options !== void 0) {
308
- for (const sub of def.options) {
309
- if (walkSchemaTree(sub, visit, visited)) return true;
310
- }
311
- }
312
- if (def.items !== void 0) {
313
- for (const sub of def.items) {
314
- if (walkSchemaTree(sub, visit, visited)) return true;
315
- }
316
- }
317
- if (typeof def.getter === "function") {
318
- try {
319
- const inner = def.getter();
320
- if (walkSchemaTree(inner, visit, visited)) return true;
321
- } catch {
322
- }
323
- }
324
- return false;
325
- }
326
- function containsAsyncRefine(schema, seen) {
327
- return walkSchemaTree(
328
- schema,
329
- (node) => {
330
- for (const check of getChecks(node)) {
331
- if (isAsyncCheck(check)) return true;
332
- }
333
- return false;
334
- },
335
- seen
336
- );
337
- }
338
- function hasContainerOrRootRefine(schema, seen) {
339
- return walkSchemaTree(
340
- schema,
341
- (node) => {
342
- const def = readDef(node);
343
- if (def === void 0) return false;
344
- const isContainer = def.shape !== void 0 || def.entries !== void 0 || def.element !== void 0 || def.options !== void 0 || def.items !== void 0 || def.keyType !== void 0 || def.valueType !== void 0 || def.left !== void 0 || def.right !== void 0;
345
- if (!isContainer) return false;
346
- return getChecks(node).length > 0;
347
- },
348
- seen
349
- );
350
- }
351
- function containsAsyncTransform(schema, seen) {
352
- return walkSchemaTree(
353
- schema,
354
- (node) => {
355
- const def = readDef(node);
356
- if (def === void 0) return false;
357
- const fn = def.transform;
358
- if (typeof fn !== "function") return false;
359
- return fn.constructor.name === "AsyncFunction";
360
- },
361
- seen
362
- );
363
- }
364
- function isAsyncCheck(check) {
365
- if (typeof check !== "object" || check === null) return false;
366
- const c = check;
367
- const fn = c._def?.fn ?? c.def?.fn ?? c._zod?.def?.fn;
368
- if (typeof fn !== "function") return false;
369
- return fn.constructor.name === "AsyncFunction";
370
- }
371
-
372
- const UNSUPPORTED = [
373
- "promise",
374
- "custom",
375
- "template-literal",
376
- "map",
377
- "symbol",
378
- "function"
379
- ];
380
- function labelPath(path) {
381
- return path.length === 0 ? "<root>" : path.join(".");
382
- }
383
- function assertSupportedKinds(schema, path = [], lazyGetters = []) {
384
- const kind = kindOf(schema);
385
- if (UNSUPPORTED.includes(kind)) {
386
- throw new UnsupportedSchemaError(
387
- `[attaform/zod] unsupported kind '${kind}' at '${labelPath(path)}'`
388
- );
389
- }
390
- switch (kind) {
391
- case "object": {
392
- const shape = getObjectShape(schema);
393
- for (const [key, sub] of Object.entries(shape)) {
394
- assertSupportedKinds(sub, [...path, key], lazyGetters);
395
- }
396
- return;
397
- }
398
- case "array":
399
- assertSupportedKinds(getArrayElement(schema), [...path, "*"], lazyGetters);
400
- return;
401
- case "set":
402
- assertSupportedKinds(getSetValueType(schema), [...path, "*"], lazyGetters);
403
- return;
404
- case "record":
405
- assertSupportedKinds(getRecordValueType(schema), [...path, "*"], lazyGetters);
406
- return;
407
- case "tuple": {
408
- const items = getTupleItems(schema);
409
- items.forEach((item, i) => assertSupportedKinds(item, [...path, String(i)], lazyGetters));
410
- return;
411
- }
412
- case "union": {
413
- const options = getUnionOptions(schema);
414
- options.forEach((opt, i) => assertSupportedKinds(opt, [...path, `|${i}`], lazyGetters));
415
- return;
416
- }
417
- case "discriminated-union": {
418
- const options = getDiscriminatedOptions(schema);
419
- options.forEach((opt, i) => assertSupportedKinds(opt, [...path, `|${i}`], lazyGetters));
420
- return;
421
- }
422
- case "optional":
423
- case "nullable":
424
- case "default":
425
- case "readonly":
426
- case "catch": {
427
- const inner = unwrapInner(schema);
428
- if (inner !== void 0) assertSupportedKinds(inner, path, lazyGetters);
429
- return;
430
- }
431
- case "pipe": {
432
- const inner = unwrapPipe(schema);
433
- if (inner !== void 0) assertSupportedKinds(inner, path, lazyGetters);
434
- return;
435
- }
436
- case "lazy": {
437
- const getter = getLazyGetter(schema);
438
- if (getter !== void 0 && lazyGetters.includes(getter)) return;
439
- const inner = unwrapLazy(schema);
440
- if (inner !== void 0) {
441
- assertSupportedKinds(
442
- inner,
443
- path,
444
- getter === void 0 ? lazyGetters : [...lazyGetters, getter]
445
- );
446
- }
447
- return;
448
- }
449
- case "intersection": {
450
- const left = getIntersectionLeft(schema);
451
- const right = getIntersectionRight(schema);
452
- if (left !== void 0) assertSupportedKinds(left, [...path, "left"], lazyGetters);
453
- if (right !== void 0) assertSupportedKinds(right, [...path, "right"], lazyGetters);
454
- return;
455
- }
456
- // Leaves: nothing to descend into.
457
- case "string":
458
- case "number":
459
- case "boolean":
460
- case "bigint":
461
- case "date":
462
- case "enum":
463
- case "literal":
464
- case "null":
465
- case "undefined":
466
- case "nan":
467
- case "any":
468
- case "unknown":
469
- case "void":
470
- case "never":
471
- case "promise":
472
- case "custom":
473
- case "template-literal":
474
- case "transform":
475
- case "file":
476
- case "map":
477
- case "symbol":
478
- case "function":
479
- return;
480
- default: {
481
- const _exhaustive = kind;
482
- throw new Error(`assertSupportedKinds: unhandled ZodKind '${_exhaustive}'`);
483
- }
484
- }
485
- }
486
-
487
- function unwrapToDiscriminatedUnion(schema) {
488
- let current = schema;
489
- for (let i = 0; i < 64; i++) {
490
- const kind = kindOf(current);
491
- if (kind === "discriminated-union") return current;
492
- let next;
493
- if (kind === "optional" || kind === "nullable" || kind === "default" || kind === "readonly" || kind === "catch") {
494
- next = unwrapInner(current);
495
- } else if (kind === "pipe") {
496
- next = unwrapPipe(current);
497
- } else if (kind === "intersection") {
498
- const left = getIntersectionLeft(current);
499
- const right = getIntersectionRight(current);
500
- const leftDU = left !== void 0 ? unwrapToDiscriminatedUnion(left) : void 0;
501
- const rightDU = right !== void 0 ? unwrapToDiscriminatedUnion(right) : void 0;
502
- if (leftDU !== void 0 && rightDU !== void 0) {
503
- return void 0;
504
- }
505
- return leftDU ?? rightDU;
506
- }
507
- if (next === void 0) return void 0;
508
- current = next;
509
- }
510
- return void 0;
511
- }
512
- function getDiscriminatedUnionFirstOption(schema) {
513
- const options = getDiscriminatedOptions(schema);
514
- return options[0];
515
- }
516
-
517
- const V4_INTROSPECTOR = {
518
- kindOf: (schema) => kindOf(schema),
519
- getObjectShape: (schema) => getObjectShape(schema),
520
- getTupleItems,
521
- getDiscriminatedOptions: (schema) => getDiscriminatedOptions(schema),
522
- getDiscriminator,
523
- getLiteralValues,
524
- isPreprocessNode,
525
- isCoercePrimitive,
526
- containsAsyncRefine,
527
- containsAsyncTransform,
528
- hasContainerOrRootRefine,
529
- // Walker accessors (D2 / D3 / D5).
530
- getArrayElement: (schema) => {
531
- if (kindOf(schema) !== "array") return void 0;
532
- return getArrayElement(schema);
533
- },
534
- getSetValueType: (schema) => kindOf(schema) === "set" ? getSetValueType(schema) : void 0,
535
- getRecordKeyType: (schema) => kindOf(schema) === "record" ? getRecordKeyType(schema) : void 0,
536
- getRecordValueType: (schema) => kindOf(schema) === "record" ? getRecordValueType(schema) : void 0,
537
- getUnionOptions,
538
- getIntersectionLeft,
539
- getIntersectionRight,
540
- getEnumValues,
541
- getNativeEnumValues,
542
- unwrapInner,
543
- unwrapBranded,
544
- unwrapEffectsSource,
545
- unwrapPipeIn,
546
- unwrapPipeOut,
547
- unwrapLazy,
548
- getLazyGetter,
549
- getDefaultValue,
550
- getCatchDefault,
551
- hasCatchValue
552
- };
553
-
554
- function slimPrimitivesOf(schema, maxRecursionDepth) {
555
- return new Set(slimPrimitivesWalk(schema, V4_INTROSPECTOR, maxRecursionDepth));
556
- }
557
-
558
- const PATH_SEPARATOR = ".";
559
- function getNestedZodSchemasAtPath(schema, path, maxRecursionDepth) {
560
- if (Array.isArray(path)) {
561
- return walkPathSegments(schema, path.map(String), V4_INTROSPECTOR, maxRecursionDepth, 0);
562
- }
563
- const pathString = path;
564
- if (pathString.length === 0) return [schema];
565
- return walkPathSegments(
566
- schema,
567
- pathString.split(PATH_SEPARATOR),
568
- V4_INTROSPECTOR,
569
- maxRecursionDepth,
570
- 0
571
- );
572
- }
573
-
574
- function carryChecks(rebuilt, original, stripConfig) {
575
- if (stripConfig.stripRefinements === true) return rebuilt;
576
- if (!hasChecks(original)) return rebuilt;
577
- const all = getChecks(original);
578
- const checks = stripConfig.shouldKeepCheck === void 0 ? all : all.filter(stripConfig.shouldKeepCheck);
579
- if (checks.length === 0) return rebuilt;
580
- return rebuilt.check(
581
- ...checks
582
- );
583
- }
584
- function unhandledZodKind(fnName, kind) {
585
- throw new Error(`${fnName}: unhandled ZodKind '${kind}'`);
586
- }
587
- function stripRefinements(schema) {
588
- const kind = kindOf(schema);
589
- switch (kind) {
590
- case "string":
591
- return hasChecks(schema) ? z.string() : schema;
592
- case "number":
593
- return hasChecks(schema) ? z.number() : schema;
594
- case "bigint":
595
- return hasChecks(schema) ? z.bigint() : schema;
596
- case "array": {
597
- const element = getArrayElement(schema);
598
- return z.array(stripRefinements(element));
599
- }
600
- case "set": {
601
- const valueType = getSetValueType(schema);
602
- return z.set(stripRefinements(valueType));
603
- }
604
- case "tuple": {
605
- const items = getTupleItems(schema).map(stripRefinements);
606
- return z.tuple(items);
607
- }
608
- case "object": {
609
- const shape = getObjectShape(schema);
610
- const next = {};
611
- for (const [k, v] of Object.entries(shape)) {
612
- next[k] = stripRefinements(v);
613
- }
614
- return z.object(next);
615
- }
616
- case "record": {
617
- const keyType = getRecordKeyType(
618
- schema
619
- );
620
- const valueType = stripRefinements(getRecordValueType(schema));
621
- return z.record(keyType, valueType);
622
- }
623
- case "union": {
624
- const options = getUnionOptions(schema).map(stripRefinements);
625
- return z.union(options);
626
- }
627
- case "discriminated-union": {
628
- const options = getDiscriminatedOptions(schema).map(
629
- (opt) => stripRefinements(opt)
630
- );
631
- const discriminator = getDiscriminator(schema);
632
- if (discriminator === void 0) return schema;
633
- return z.discriminatedUnion(
634
- discriminator,
635
- options
636
- );
637
- }
638
- // Wrappers: strip the inner, preserve the wrapper semantics where
639
- // possible. For stripping refinements we typically want wrappers to
640
- // survive (optional/nullable/default), so leave them alone.
641
- case "optional":
642
- case "nullable":
643
- case "default":
644
- case "readonly":
645
- case "pipe":
646
- return schema;
647
- case "lazy": {
648
- const inner = unwrapLazy(schema);
649
- if (inner === void 0) return schema;
650
- const slimmedInner = stripRefinements(inner);
651
- return z.lazy(() => slimmedInner);
652
- }
653
- case "intersection": {
654
- const left = getIntersectionLeft(schema);
655
- const right = getIntersectionRight(schema);
656
- if (left === void 0 || right === void 0) return schema;
657
- return z.intersection(stripRefinements(left), stripRefinements(right));
658
- }
659
- case "catch": {
660
- const inner = unwrapInner(schema);
661
- if (inner === void 0) return schema;
662
- const slimmedInner = stripRefinements(inner);
663
- return slimmedInner.catch(getCatchDefault(schema));
664
- }
665
- // Leaf types without refinements, or Zod features we don't rewrite.
666
- case "boolean":
667
- case "date":
668
- case "enum":
669
- case "literal":
670
- case "null":
671
- case "undefined":
672
- case "any":
673
- case "unknown":
674
- case "nan":
675
- case "void":
676
- case "never":
677
- case "promise":
678
- case "custom":
679
- case "template-literal":
680
- case "transform":
681
- case "file":
682
- case "map":
683
- case "symbol":
684
- case "function":
685
- return schema;
686
- default:
687
- return unhandledZodKind("stripRefinements", kind);
688
- }
689
- }
690
- function stripAsyncChecks(schema) {
691
- const config = {
692
- stripRefinements: false,
693
- shouldKeepCheck: (c) => !isAsyncCheck(c)
694
- };
695
- const seen = /* @__PURE__ */ new WeakSet();
696
- function recurse(s) {
697
- if (seen.has(s)) return s;
698
- seen.add(s);
699
- const kind = kindOf(s);
700
- switch (kind) {
701
- case "string":
702
- return hasChecks(s) ? carryChecks(z.string(), s, config) : s;
703
- case "number":
704
- return hasChecks(s) ? carryChecks(z.number(), s, config) : s;
705
- case "bigint":
706
- return hasChecks(s) ? carryChecks(z.bigint(), s, config) : s;
707
- case "array": {
708
- const element = getArrayElement(s);
709
- return carryChecks(z.array(recurse(element)), s, config);
710
- }
711
- case "set": {
712
- const valueType = getSetValueType(s);
713
- return carryChecks(z.set(recurse(valueType)), s, config);
714
- }
715
- case "tuple": {
716
- const items = getTupleItems(s).map(recurse);
717
- const rebuilt = z.tuple(
718
- items
719
- );
720
- return carryChecks(rebuilt, s, config);
721
- }
722
- case "object": {
723
- const shape = getObjectShape(s);
724
- const next = {};
725
- for (const [k, v] of Object.entries(shape)) {
726
- next[k] = recurse(v);
727
- }
728
- return carryChecks(z.object(next), s, config);
729
- }
730
- case "record": {
731
- const keyType = getRecordKeyType(s);
732
- const valueType = recurse(getRecordValueType(s));
733
- const rebuilt = z.record(keyType, valueType);
734
- return carryChecks(rebuilt, s, config);
735
- }
736
- case "union": {
737
- const options = getUnionOptions(s).map(recurse);
738
- const rebuilt = z.union(
739
- options
740
- );
741
- return carryChecks(rebuilt, s, config);
742
- }
743
- case "discriminated-union": {
744
- const options = getDiscriminatedOptions(s).map((opt) => recurse(opt));
745
- const discriminator = getDiscriminator(s);
746
- if (discriminator === void 0) return s;
747
- return z.discriminatedUnion(
748
- discriminator,
749
- options
750
- );
751
- }
752
- case "optional": {
753
- const inner = unwrapInner(s);
754
- if (inner === void 0) return s;
755
- return recurse(inner).optional();
756
- }
757
- case "nullable": {
758
- const inner = unwrapInner(s);
759
- if (inner === void 0) return s;
760
- return recurse(inner).nullable();
761
- }
762
- case "default": {
763
- const inner = unwrapInner(s);
764
- if (inner === void 0) return s;
765
- return recurse(inner).default(getDefaultValue(s));
766
- }
767
- case "readonly": {
768
- const inner = unwrapInner(s);
769
- if (inner === void 0) return s;
770
- return recurse(inner).readonly();
771
- }
772
- case "pipe":
773
- return s;
774
- case "lazy": {
775
- const inner = unwrapLazy(s);
776
- if (inner === void 0) return s;
777
- const stripped = recurse(inner);
778
- return z.lazy(() => stripped);
779
- }
780
- case "intersection": {
781
- const left = getIntersectionLeft(s);
782
- const right = getIntersectionRight(s);
783
- if (left === void 0 || right === void 0) return s;
784
- return z.intersection(recurse(left), recurse(right));
785
- }
786
- case "catch": {
787
- const inner = unwrapInner(s);
788
- if (inner === void 0) return s;
789
- return recurse(inner).catch(getCatchDefault(s));
790
- }
791
- // Leaves with no checks — pass through unchanged.
792
- case "boolean":
793
- case "date":
794
- case "enum":
795
- case "literal":
796
- case "null":
797
- case "undefined":
798
- case "any":
799
- case "unknown":
800
- case "nan":
801
- case "void":
802
- case "never":
803
- case "promise":
804
- case "custom":
805
- case "template-literal":
806
- case "transform":
807
- case "file":
808
- case "map":
809
- case "symbol":
810
- case "function":
811
- return s;
812
- default:
813
- return unhandledZodKind("stripAsyncChecks", kind);
814
- }
815
- }
816
- return recurse(schema);
817
- }
818
- function getSlimSchema(schema, stripConfig, maxRecursionDepth) {
819
- return walkSlim(schema, stripConfig, maxRecursionDepth, 0);
820
- }
821
- function walkSlim(schema, stripConfig, maxDepth, lazyDepth) {
822
- const kind = kindOf(schema);
823
- switch (kind) {
824
- case "optional": {
825
- const inner = unwrapInner(schema) ?? schema;
826
- const slimmedInner = walkSlim(inner, stripConfig, maxDepth, lazyDepth);
827
- return stripConfig.stripOptional === true ? slimmedInner : slimmedInner.optional();
828
- }
829
- case "nullable": {
830
- const inner = unwrapInner(schema) ?? schema;
831
- const slimmedInner = walkSlim(inner, stripConfig, maxDepth, lazyDepth);
832
- return stripConfig.stripNullable === true ? slimmedInner : slimmedInner.nullable();
833
- }
834
- case "default": {
835
- const inner = unwrapInner(schema) ?? schema;
836
- const slimmedInner = walkSlim(inner, stripConfig, maxDepth, lazyDepth);
837
- if (stripConfig.stripDefaultValues === true) return slimmedInner;
838
- const defaultValue = getDefaultValue(schema);
839
- return slimmedInner.default(defaultValue);
840
- }
841
- case "readonly": {
842
- const inner = unwrapInner(schema);
843
- return inner === void 0 ? schema : walkSlim(inner, stripConfig, maxDepth, lazyDepth).readonly();
844
- }
845
- case "pipe": {
846
- if (stripConfig.stripPipe === true) {
847
- const pipeIn = unwrapPipeIn(schema);
848
- const pipeOut = unwrapPipeOut(schema);
849
- const real = pipeIn !== void 0 && kindOf(pipeIn) !== "transform" ? pipeIn : pipeOut !== void 0 && kindOf(pipeOut) !== "transform" ? pipeOut : pipeIn ?? pipeOut ?? schema;
850
- return walkSlim(real, stripConfig, maxDepth, lazyDepth);
851
- }
852
- return schema;
853
- }
854
- case "object": {
855
- const shape = getObjectShape(schema);
856
- const next = {};
857
- for (const [k, v] of Object.entries(shape)) {
858
- next[k] = walkSlim(v, stripConfig, maxDepth, lazyDepth);
859
- }
860
- return carryChecks(z.object(next), schema, stripConfig);
861
- }
862
- case "array": {
863
- const element = getArrayElement(schema);
864
- return carryChecks(
865
- z.array(walkSlim(element, stripConfig, maxDepth, lazyDepth)),
866
- schema,
867
- stripConfig
868
- );
869
- }
870
- case "set": {
871
- const valueType = getSetValueType(schema);
872
- return carryChecks(
873
- z.set(walkSlim(valueType, stripConfig, maxDepth, lazyDepth)),
874
- schema,
875
- stripConfig
876
- );
877
- }
878
- case "tuple": {
879
- const items = getTupleItems(schema).map(
880
- (it) => walkSlim(it, stripConfig, maxDepth, lazyDepth)
881
- );
882
- const rebuilt = z.tuple(
883
- items
884
- );
885
- return carryChecks(rebuilt, schema, stripConfig);
886
- }
887
- case "record": {
888
- const keyType = getRecordKeyType(schema);
889
- const valueType = walkSlim(getRecordValueType(schema), stripConfig, maxDepth, lazyDepth);
890
- const rebuilt = z.record(keyType, valueType);
891
- return carryChecks(rebuilt, schema, stripConfig);
892
- }
893
- case "union": {
894
- const options = getUnionOptions(schema).map(
895
- (opt) => walkSlim(opt, stripConfig, maxDepth, lazyDepth)
896
- );
897
- const rebuilt = z.union(options);
898
- return carryChecks(rebuilt, schema, stripConfig);
899
- }
900
- case "discriminated-union": {
901
- const options = getDiscriminatedOptions(schema).map(
902
- (opt) => walkSlim(opt, stripConfig, maxDepth, lazyDepth)
903
- );
904
- const discriminator = getDiscriminator(schema);
905
- if (discriminator === void 0) return schema;
906
- return z.discriminatedUnion(
907
- discriminator,
908
- options
909
- );
910
- }
911
- // Leaves: strip refinements if requested, otherwise pass through.
912
- case "string":
913
- case "number":
914
- case "bigint":
915
- return stripConfig.stripRefinements === true && hasChecks(schema) ? stripRefinements(schema) : schema;
916
- case "boolean":
917
- case "date":
918
- case "enum":
919
- case "literal":
920
- case "null":
921
- case "undefined":
922
- case "any":
923
- case "unknown":
924
- case "nan":
925
- case "void":
926
- case "never":
927
- case "promise":
928
- case "custom":
929
- case "template-literal":
930
- case "map":
931
- case "symbol":
932
- case "function":
933
- return schema;
934
- case "lazy": {
935
- if (lazyDepth >= maxDepth) return schema;
936
- const inner = unwrapLazy(schema);
937
- if (inner === void 0) return schema;
938
- const slimmedInner = walkSlim(inner, stripConfig, maxDepth, lazyDepth + 1);
939
- return z.lazy(() => slimmedInner);
940
- }
941
- case "intersection": {
942
- const left = getIntersectionLeft(schema);
943
- const right = getIntersectionRight(schema);
944
- if (left === void 0 || right === void 0) return schema;
945
- return z.intersection(
946
- walkSlim(left, stripConfig, maxDepth, lazyDepth),
947
- walkSlim(right, stripConfig, maxDepth, lazyDepth)
948
- );
949
- }
950
- case "catch": {
951
- const inner = unwrapInner(schema);
952
- if (inner === void 0) return schema;
953
- const slimmedInner = walkSlim(inner, stripConfig, maxDepth, lazyDepth);
954
- return slimmedInner.catch(getCatchDefault(schema));
955
- }
956
- case "transform":
957
- case "file":
958
- return schema;
959
- default:
960
- return unhandledZodKind("getSlimSchema", kind);
961
- }
962
- }
963
-
964
- function deriveDefault(schema, useDefault, maxRecursionDepth) {
965
- return deriveDefaultWalk(schema, useDefault, V4_INTROSPECTOR, maxRecursionDepth, {
966
- // v4 has an exhaustive switch against `SchemaIntrospector.kindOf`;
967
- // unknown kinds genuinely shouldn't appear, so return undefined.
968
- unsupportedKindFallback: () => void 0,
969
- // v4 historically recurses into the inner on `useDefault=false`
970
- // so a `.catch(v)` slot returns the leaf empty rather than the
971
- // fallback. Pinned by `test/adapters/zod-v4/unsupported-kinds.test.ts`
972
- // (`z.catch falls through to inner leaf default when useDefault=false`).
973
- catchOnUseDefaultFalse: "recurseInner"
974
- });
975
- }
976
- function getDefaultValuesFromZodSchema(opts) {
977
- const { schema, useDefaultSchemaValues, constraints, maxRecursionDepth } = opts;
978
- const initial = deriveDefault(schema, useDefaultSchemaValues, maxRecursionDepth);
979
- const merged = mergeDeep(initial, constraints);
980
- const slimSchema = getSlimSchema(
981
- schema,
982
- {
983
- stripDefaultValues: true,
984
- stripPipe: true,
985
- stripRefinements: true
986
- },
987
- maxRecursionDepth
988
- );
989
- const firstParse = slimSchema.safeParse(merged);
990
- if (firstParse.success) {
991
- return { data: firstParse.data, success: true, slimSchema };
992
- }
993
- let fixedData = merged;
994
- for (const issue of firstParse.error.issues) {
995
- const pathSegments = issue.path.map((seg) => typeof seg === "number" ? seg : String(seg));
996
- const originalCandidate = getNestedZodSchemasAtPath(schema, pathSegments, maxRecursionDepth)[0];
997
- if (originalCandidate !== void 0) {
998
- if (isCoercePrimitive(originalCandidate)) continue;
999
- if (kindOf(originalCandidate) === "pipe") {
1000
- const pipeIn = unwrapPipeIn(originalCandidate);
1001
- if (pipeIn !== void 0 && kindOf(pipeIn) === "transform") continue;
1002
- }
1003
- }
1004
- const candidates = getNestedZodSchemasAtPath(slimSchema, pathSegments, maxRecursionDepth);
1005
- if (candidates.length === 0) continue;
1006
- const candidate = candidates[0];
1007
- if (candidate === void 0) continue;
1008
- const valueAtPath = getAtPath(merged, pathSegments);
1009
- const slimKinds = slimPrimitivesOf(candidate, maxRecursionDepth);
1010
- if (slimKinds.size > 0 && slimKinds.has(slimKindOf(valueAtPath))) {
1011
- continue;
1012
- }
1013
- const fixValue = defaultFromIssue(issue, candidate, useDefaultSchemaValues, maxRecursionDepth);
1014
- if (fixValue === SKIP) continue;
1015
- fixedData = pathSegments.length === 0 ? fixValue : setAtPath(fixedData, pathSegments, fixValue);
1016
- }
1017
- const secondParse = slimSchema.safeParse(fixedData);
1018
- if (secondParse.success) {
1019
- return { data: secondParse.data, success: true, slimSchema };
1020
- }
1021
- return { data: fixedData, success: false, slimSchema };
1022
- }
1023
- const SKIP = /* @__PURE__ */ Symbol("atta:skip-fix");
1024
- function defaultFromIssue(issue, candidate, useDefaultSchemaValues, maxRecursionDepth) {
1025
- if (issue.code === "invalid_type") {
1026
- const du = unwrapToDiscriminatedUnion(candidate);
1027
- if (du !== void 0) {
1028
- const first = getDiscriminatedUnionFirstOption(du);
1029
- if (first !== void 0)
1030
- return deriveDefault(first, useDefaultSchemaValues, maxRecursionDepth);
1031
- }
1032
- return deriveDefault(candidate, useDefaultSchemaValues, maxRecursionDepth);
1033
- }
1034
- if (issue.code === "invalid_value") {
1035
- const values = issue.values;
1036
- if (values !== void 0 && values.length > 0) return values[0];
1037
- return deriveDefault(candidate, useDefaultSchemaValues, maxRecursionDepth);
1038
- }
1039
- return deriveDefault(candidate, useDefaultSchemaValues, maxRecursionDepth);
1040
- }
1041
-
1042
- function unwrapStructuralWrappers(schema) {
1043
- let current = schema;
1044
- for (let i = 0; i < 64; i++) {
1045
- const outerKind = kindOf(current);
1046
- if (outerKind !== "optional" && outerKind !== "nullable") break;
1047
- const inner = unwrapInner(current);
1048
- if (inner === void 0) return current;
1049
- if (!isStructuralKind(kindOf(inner))) break;
1050
- current = inner;
1051
- }
1052
- return current;
1053
- }
1054
- function peelAllWrappers(schema) {
1055
- let current = schema;
1056
- for (let i = 0; i < 64; i++) {
1057
- const k = kindOf(current);
1058
- let inner;
1059
- if (k === "optional" || k === "nullable" || k === "default" || k === "readonly" || k === "catch") {
1060
- inner = unwrapInner(current);
1061
- } else if (k === "pipe") {
1062
- inner = unwrapPipe(current);
1063
- } else if (k === "lazy") {
1064
- inner = unwrapLazy(current);
1065
- } else {
1066
- return current;
1067
- }
1068
- if (inner === void 0) return current;
1069
- current = inner;
1070
- }
1071
- return current;
1072
- }
1073
- const STRUCTURAL_KINDS = /* @__PURE__ */ new Set([
1074
- "object",
1075
- "array",
1076
- "tuple",
1077
- "record",
1078
- "discriminated-union",
1079
- "union",
1080
- "intersection",
1081
- "optional",
1082
- "nullable",
1083
- "default",
1084
- "readonly",
1085
- "catch",
1086
- "pipe",
1087
- "lazy"
1088
- ]);
1089
- function isStructuralKind(kind) {
1090
- return STRUCTURAL_KINDS.has(kind);
1091
- }
1092
- const MAX_REQUIRED_DEPTH = 64;
1093
- function isLeafRequired(schema, depth = 0) {
1094
- if (depth > MAX_REQUIRED_DEPTH) return true;
1095
- const kind = kindOf(schema);
1096
- if (kind === "optional" || kind === "nullable" || kind === "default" || kind === "catch" || kind === "undefined" || kind === "null" || kind === "void") {
1097
- return false;
1098
- }
1099
- if (kind === "readonly") {
1100
- const inner = unwrapInner(schema);
1101
- return inner === void 0 ? true : isLeafRequired(inner, depth + 1);
1102
- }
1103
- if (kind === "pipe") {
1104
- const inner = unwrapPipe(schema);
1105
- return inner === void 0 ? true : isLeafRequired(inner, depth + 1);
1106
- }
1107
- if (kind === "lazy") {
1108
- const inner = unwrapLazy(schema);
1109
- return inner === void 0 ? true : isLeafRequired(inner, depth + 1);
1110
- }
1111
- if (kind === "union" || kind === "discriminated-union") {
1112
- const options = kind === "discriminated-union" ? getDiscriminatedOptions(schema) : getUnionOptions(schema);
1113
- if (options.length === 0) return true;
1114
- return options.every((opt) => isLeafRequired(opt, depth + 1));
1115
- }
1116
- if (kind === "intersection") {
1117
- const left = getIntersectionLeft(schema);
1118
- const right = getIntersectionRight(schema);
1119
- const leftReq = left === void 0 ? true : isLeafRequired(left, depth + 1);
1120
- const rightReq = right === void 0 ? true : isLeafRequired(right, depth + 1);
1121
- return leftReq || rightReq;
1122
- }
1123
- return true;
1124
- }
1125
- function zodV4Adapter(rootSchema) {
1126
- assertZodVersion(rootSchema);
1127
- assertSupportedKinds(rootSchema);
1128
- return (formKey, options) => createAbstractSchema(
1129
- rootSchema,
1130
- V4_INTROSPECTOR,
1131
- buildV4Services(),
1132
- formKey,
1133
- options
1134
- );
1135
- }
1136
- async function lazyFingerprint(schema) {
1137
- const { fingerprintZodSchema } = await import('../chunks/fingerprint2.mjs');
1138
- return fingerprintZodSchema(schema);
1139
- }
1140
- function buildV4Services() {
1141
- return {
1142
- fingerprint: (schema) => lazyFingerprint(schema),
1143
- getNestedSchemasAtPath: (schema, path, maxRecursionDepth) => getNestedZodSchemasAtPath(schema, path, maxRecursionDepth),
1144
- // v4 doesn't pre-strip for the slim-mode walk — its path walker
1145
- // already peels every transparent wrapper inline, so the slim and
1146
- // unstripped walks coincide.
1147
- getNestedSchemasInSlimMode: (schema, path, maxRecursionDepth) => getNestedZodSchemasAtPath(schema, path, maxRecursionDepth),
1148
- slimPrimitivesOf: (schema, maxRecursionDepth) => slimPrimitivesOf(schema, maxRecursionDepth),
1149
- deriveDefault: (schema, useDefault, maxRecursionDepth) => deriveDefault(schema, useDefault, maxRecursionDepth),
1150
- runStrictGetDefaults: (schema, config, fk, maxRecursionDepth) => runStrictGetDefaultsV4(schema, config, fk, maxRecursionDepth),
1151
- unwrapStructuralWrappers: (schema) => unwrapStructuralWrappers(schema),
1152
- unwrapToDiscriminatedUnion: (schema) => unwrapToDiscriminatedUnion(schema),
1153
- peelAllWrappers: (schema) => peelAllWrappers(schema),
1154
- isLeafRequired: (schema) => isLeafRequired(schema),
1155
- resolveFieldMetaAtPath: (schema, path, maxRecursionDepth) => resolveFieldMetaAtPath(schema, path, maxRecursionDepth),
1156
- issuesToValidationErrors: (issues, fk) => zodIssuesToValidationErrors(issues, fk),
1157
- safeParseSync: (schema, data) => {
1158
- const result = schema.safeParse(data);
1159
- return result.success ? { success: true, data: result.data } : { success: false, issues: result.error.issues };
1160
- },
1161
- safeParseAsync: async (schema, data) => {
1162
- const result = await schema.safeParseAsync(data);
1163
- return result.success ? { success: true, data: result.data } : { success: false, issues: result.error.issues };
1164
- },
1165
- makeSubSchema: (schema, fk, maxRecursionDepth) => buildSubSchemaStubV4(schema, fk, maxRecursionDepth)
1166
- };
1167
- }
1168
- function runStrictGetDefaultsV4(rootSchema, config, formKey, maxRecursionDepth) {
1169
- const { data } = getDefaultValuesFromZodSchema({
1170
- schema: rootSchema,
1171
- useDefaultSchemaValues: config.useDefaultSchemaValues,
1172
- constraints: config.constraints,
1173
- maxRecursionDepth
1174
- });
1175
- if (config.strict === false) {
1176
- return { data, errors: void 0, success: true, formKey };
1177
- }
1178
- if (containsAsyncTransform(rootSchema)) {
1179
- return { data, errors: void 0, success: true, formKey };
1180
- }
1181
- const parseTarget = containsAsyncRefine(rootSchema) ? stripAsyncChecks(rootSchema) : rootSchema;
1182
- try {
1183
- const strictResult = parseTarget.safeParse(data);
1184
- if (strictResult.success) {
1185
- return { data, errors: void 0, success: true, formKey };
1186
- }
1187
- return {
1188
- data,
1189
- errors: zodIssuesToValidationErrors(strictResult.error.issues, formKey),
1190
- success: false,
1191
- formKey
1192
- };
1193
- } catch {
1194
- return { data, errors: void 0, success: true, formKey };
1195
- }
1196
- }
1197
- function buildSubSchemaStubV4(schema, formKey, maxRecursionDepth) {
1198
- return {
1199
- fingerprint: () => lazyFingerprint(schema),
1200
- needsAsyncValidation: () => containsAsyncRefine(schema),
1201
- getDefaultValues: () => ({
1202
- data: deriveDefault(schema, true, maxRecursionDepth),
1203
- errors: void 0,
1204
- success: true,
1205
- formKey
1206
- }),
1207
- getSchemasAtPath: () => [],
1208
- validateAtPath: async (data) => {
1209
- const result = await schema.safeParseAsync(data);
1210
- if (result.success) {
1211
- return {
1212
- data: result.data,
1213
- errors: void 0,
1214
- success: true,
1215
- formKey
1216
- };
1217
- }
1218
- return {
1219
- data: void 0,
1220
- errors: zodIssuesToValidationErrors(result.error.issues, formKey),
1221
- success: false,
1222
- formKey
1223
- };
1224
- }
1225
- };
1226
- }
1227
- function resolveFieldMetaAtPath(rootSchema, path, maxRecursionDepth) {
1228
- const lastSegment = path.length === 0 ? "" : path[path.length - 1];
1229
- const candidates = path.length === 0 ? [rootSchema] : getNestedZodSchemasAtPath(rootSchema, path, maxRecursionDepth);
1230
- const target = candidates[0];
1231
- if (target === void 0) {
1232
- return {
1233
- label: humanize(lastSegment),
1234
- description: void 0,
1235
- placeholder: void 0,
1236
- meta: Object.freeze({})
1237
- };
1238
- }
1239
- const pathMap = getFieldMetaPathMap(rootSchema, {
1240
- intro: V4_INTROSPECTOR,
1241
- peelAllWrappers,
1242
- getFieldMetaList
1243
- });
1244
- const pathKey = canonicalizePath(path).key;
1245
- const peeled = peelAllWrappers(target);
1246
- const payload = pathMap.get(pathKey) ?? getFieldMeta(target) ?? (peeled !== target ? getFieldMeta(peeled) : void 0);
1247
- const targetDescription = readDescription(target);
1248
- const peeledDescription = peeled !== target ? readDescription(peeled) : void 0;
1249
- const schemaDescription = targetDescription ?? peeledDescription;
1250
- return {
1251
- label: payload?.label ?? humanize(lastSegment),
1252
- description: payload?.description ?? schemaDescription ?? void 0,
1253
- placeholder: payload?.placeholder ?? void 0,
1254
- meta: Object.freeze({ ...payload ?? {} })
1255
- };
1256
- }
1257
- function readDescription(schema) {
1258
- const candidate = schema.description;
1259
- return typeof candidate === "string" ? candidate : void 0;
1260
- }
1261
-
1262
- function useForm(configuration) {
1263
- const candidate = configuration;
1264
- if (candidate === void 0 || candidate === null || candidate.schema === void 0) {
1265
- throw new InvalidUseFormConfigError();
1266
- }
1267
- const adapter = zodV4Adapter(configuration.schema);
1268
- return useAbstractForm({
1269
- ...configuration,
1270
- schema: adapter
1271
- });
1272
- }
1273
-
1274
- export { UnsupportedSchemaError as U, assertZodVersion as a, getIntersectionRight as b, unwrapLazy as c, unwrapInner as d, unwrapPipe as e, fieldMeta as f, getIntersectionLeft as g, getDiscriminator as h, getDiscriminatedOptions as i, getUnionOptions as j, kindOf as k, getRecordKeyType as l, getRecordValueType as m, getTupleItems as n, getSetValueType as o, getArrayElement as p, getObjectShape as q, getEnumValues as r, getLiteralValues as s, getChecks as t, useForm as u, getCatchDefault as v, withMeta as w, getDefaultValue as x, zodV4Adapter as z };
1275
- //# sourceMappingURL=attaform.DMxM2kol.mjs.map