attaform 0.20.2 → 0.21.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 (150) hide show
  1. package/dist/chunks/dev-key-collision-warnings.cjs +58 -0
  2. package/dist/chunks/dev-key-collision-warnings.cjs.map +1 -0
  3. package/dist/chunks/dev-key-collision-warnings.mjs +55 -0
  4. package/dist/chunks/dev-key-collision-warnings.mjs.map +1 -0
  5. package/dist/chunks/devtools.cjs +1 -1
  6. package/dist/chunks/devtools.mjs +1 -1
  7. package/dist/chunks/fingerprint.cjs +186 -0
  8. package/dist/chunks/fingerprint.cjs.map +1 -0
  9. package/dist/chunks/fingerprint.mjs +184 -0
  10. package/dist/chunks/fingerprint.mjs.map +1 -0
  11. package/dist/chunks/fingerprint2.cjs +162 -0
  12. package/dist/chunks/fingerprint2.cjs.map +1 -0
  13. package/dist/chunks/fingerprint2.mjs +160 -0
  14. package/dist/chunks/fingerprint2.mjs.map +1 -0
  15. package/dist/chunks/indexeddb.cjs +1 -1
  16. package/dist/chunks/indexeddb.mjs +1 -1
  17. package/dist/chunks/local-storage.cjs +1 -1
  18. package/dist/chunks/local-storage.mjs +1 -1
  19. package/dist/chunks/multi-tab-sync.cjs +367 -0
  20. package/dist/chunks/multi-tab-sync.cjs.map +1 -0
  21. package/dist/chunks/multi-tab-sync.mjs +364 -0
  22. package/dist/chunks/multi-tab-sync.mjs.map +1 -0
  23. package/dist/chunks/session-storage.cjs +1 -1
  24. package/dist/chunks/session-storage.mjs +1 -1
  25. package/dist/chunks/wire-persistence.cjs +396 -0
  26. package/dist/chunks/wire-persistence.cjs.map +1 -0
  27. package/dist/chunks/wire-persistence.mjs +394 -0
  28. package/dist/chunks/wire-persistence.mjs.map +1 -0
  29. package/dist/esbuild.cjs +28 -0
  30. package/dist/esbuild.cjs.map +1 -0
  31. package/dist/esbuild.d.cts +56 -0
  32. package/dist/esbuild.d.mts +56 -0
  33. package/dist/esbuild.d.ts +56 -0
  34. package/dist/esbuild.mjs +26 -0
  35. package/dist/esbuild.mjs.map +1 -0
  36. package/dist/index.cjs +5 -3
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.d.cts +66 -70
  39. package/dist/index.d.mts +66 -70
  40. package/dist/index.d.ts +66 -70
  41. package/dist/index.mjs +5 -5
  42. package/dist/nuxt.d.cts +1 -1
  43. package/dist/nuxt.d.mts +1 -1
  44. package/dist/nuxt.d.ts +1 -1
  45. package/dist/rollup.cjs +24 -0
  46. package/dist/rollup.cjs.map +1 -0
  47. package/dist/rollup.d.cts +35 -0
  48. package/dist/rollup.d.mts +35 -0
  49. package/dist/rollup.d.ts +35 -0
  50. package/dist/rollup.mjs +22 -0
  51. package/dist/rollup.mjs.map +1 -0
  52. package/dist/rspack.cjs +10 -0
  53. package/dist/rspack.cjs.map +1 -0
  54. package/dist/rspack.d.cts +40 -0
  55. package/dist/rspack.d.mts +40 -0
  56. package/dist/rspack.d.ts +40 -0
  57. package/dist/rspack.mjs +8 -0
  58. package/dist/rspack.mjs.map +1 -0
  59. package/dist/runtime/plugins/attaform.cjs +2 -2
  60. package/dist/runtime/plugins/attaform.mjs +2 -2
  61. package/dist/shared/attaform.BJGA_UOS.mjs +37 -0
  62. package/dist/shared/attaform.BJGA_UOS.mjs.map +1 -0
  63. package/dist/shared/attaform.BRGIpZo4.cjs +26 -0
  64. package/dist/shared/attaform.BRGIpZo4.cjs.map +1 -0
  65. package/dist/shared/{attaform.DAKrGhxc.cjs → attaform.BSkvn43g.cjs} +101 -417
  66. package/dist/shared/attaform.BSkvn43g.cjs.map +1 -0
  67. package/dist/shared/{attaform.sWm8B15V.d.mts → attaform.BWfliRIK.d.cts} +172 -2
  68. package/dist/shared/{attaform.BGk8cfw2.mjs → attaform.Be8NZG9M.mjs} +178 -21
  69. package/dist/shared/attaform.Be8NZG9M.mjs.map +1 -0
  70. package/dist/shared/{attaform.D2SCCd4O.cjs → attaform.Bq5sX7TF.cjs} +2 -2
  71. package/dist/shared/{attaform.D2SCCd4O.cjs.map → attaform.Bq5sX7TF.cjs.map} +1 -1
  72. package/dist/shared/{attaform.ceGEAEMk.d.ts → attaform.Bv7dRDWK.d.ts} +172 -2
  73. package/dist/shared/attaform.C3Doa9Pt.mjs +24 -0
  74. package/dist/shared/attaform.C3Doa9Pt.mjs.map +1 -0
  75. package/dist/shared/{attaform.B_hph5AE.cjs → attaform.CICFZ1iS.cjs} +178 -20
  76. package/dist/shared/attaform.CICFZ1iS.cjs.map +1 -0
  77. package/dist/shared/attaform.CQN9R62B.cjs +39 -0
  78. package/dist/shared/attaform.CQN9R62B.cjs.map +1 -0
  79. package/dist/shared/{attaform.CwLjUqmQ.cjs → attaform.ClXwitZj.cjs} +735 -960
  80. package/dist/shared/attaform.ClXwitZj.cjs.map +1 -0
  81. package/dist/shared/{attaform.99cfHcIt.d.cts → attaform.D0dWZsJt.d.cts} +349 -77
  82. package/dist/shared/{attaform.99cfHcIt.d.mts → attaform.D0dWZsJt.d.mts} +349 -77
  83. package/dist/shared/{attaform.99cfHcIt.d.ts → attaform.D0dWZsJt.d.ts} +349 -77
  84. package/dist/shared/{attaform.z5j3LwJz.cjs → attaform.D32WwKk6.cjs} +216 -35
  85. package/dist/shared/attaform.D32WwKk6.cjs.map +1 -0
  86. package/dist/shared/{attaform.C5aYC_T8.mjs → attaform.DMEP_ENr.mjs} +39 -392
  87. package/dist/shared/attaform.DMEP_ENr.mjs.map +1 -0
  88. package/dist/shared/{attaform.tiWEVznj.mjs → attaform.DR6RmxWZ.mjs} +725 -962
  89. package/dist/shared/attaform.DR6RmxWZ.mjs.map +1 -0
  90. package/dist/shared/{attaform.Dt7dEcHk.mjs → attaform.DozgVlCE.mjs} +89 -405
  91. package/dist/shared/attaform.DozgVlCE.mjs.map +1 -0
  92. package/dist/shared/{attaform.DN5CvZrg.d.ts → attaform.Duecg2NO.d.mts} +2 -2
  93. package/dist/shared/attaform.DuzQYscR.d.cts +41 -0
  94. package/dist/shared/attaform.DuzQYscR.d.mts +41 -0
  95. package/dist/shared/attaform.DuzQYscR.d.ts +41 -0
  96. package/dist/shared/{attaform.BXinSW2T.d.mts → attaform.FudOcHaa.d.cts} +2 -2
  97. package/dist/shared/attaform.LEWUFqUw.cjs +54 -0
  98. package/dist/shared/attaform.LEWUFqUw.cjs.map +1 -0
  99. package/dist/shared/{attaform.CywE4y8x.d.cts → attaform.MtrpT6Ki.d.ts} +2 -2
  100. package/dist/shared/{attaform.DbRgDFa7.d.cts → attaform.NQ8mybyW.d.mts} +172 -2
  101. package/dist/shared/{attaform.Cd4AOfwu.cjs → attaform.S-pYLSo4.cjs} +68 -402
  102. package/dist/shared/attaform.S-pYLSo4.cjs.map +1 -0
  103. package/dist/shared/{attaform.CnrxbkB6.mjs → attaform.Y1ZGhM4k.mjs} +2 -2
  104. package/dist/shared/{attaform.CnrxbkB6.mjs.map → attaform.Y1ZGhM4k.mjs.map} +1 -1
  105. package/dist/shared/{attaform.QG5TG8lB.mjs → attaform.pmtahXKy.mjs} +216 -36
  106. package/dist/shared/attaform.pmtahXKy.mjs.map +1 -0
  107. package/dist/shared/attaform.sHkHv_98.mjs +51 -0
  108. package/dist/shared/attaform.sHkHv_98.mjs.map +1 -0
  109. package/dist/vite.cjs +9 -45
  110. package/dist/vite.cjs.map +1 -1
  111. package/dist/vite.d.cts +36 -0
  112. package/dist/vite.d.mts +36 -0
  113. package/dist/vite.d.ts +36 -0
  114. package/dist/vite.mjs +8 -44
  115. package/dist/vite.mjs.map +1 -1
  116. package/dist/webpack.cjs +10 -0
  117. package/dist/webpack.cjs.map +1 -0
  118. package/dist/webpack.d.cts +37 -0
  119. package/dist/webpack.d.mts +37 -0
  120. package/dist/webpack.d.ts +37 -0
  121. package/dist/webpack.mjs +8 -0
  122. package/dist/webpack.mjs.map +1 -0
  123. package/dist/zod-v3.cjs +3 -3
  124. package/dist/zod-v3.d.cts +3 -3
  125. package/dist/zod-v3.d.mts +3 -3
  126. package/dist/zod-v3.d.ts +3 -3
  127. package/dist/zod-v3.mjs +3 -3
  128. package/dist/zod-v4.cjs +3 -3
  129. package/dist/zod-v4.d.cts +4 -4
  130. package/dist/zod-v4.d.mts +4 -4
  131. package/dist/zod-v4.d.ts +4 -4
  132. package/dist/zod-v4.mjs +3 -3
  133. package/dist/zod.cjs +8 -8
  134. package/dist/zod.cjs.map +1 -1
  135. package/dist/zod.d.cts +52 -10
  136. package/dist/zod.d.mts +52 -10
  137. package/dist/zod.d.ts +52 -10
  138. package/dist/zod.mjs +6 -6
  139. package/dist/zod.mjs.map +1 -1
  140. package/package.json +19 -5
  141. package/dist/shared/attaform.BGk8cfw2.mjs.map +0 -1
  142. package/dist/shared/attaform.B_hph5AE.cjs.map +0 -1
  143. package/dist/shared/attaform.C5aYC_T8.mjs.map +0 -1
  144. package/dist/shared/attaform.Cd4AOfwu.cjs.map +0 -1
  145. package/dist/shared/attaform.CwLjUqmQ.cjs.map +0 -1
  146. package/dist/shared/attaform.DAKrGhxc.cjs.map +0 -1
  147. package/dist/shared/attaform.Dt7dEcHk.mjs.map +0 -1
  148. package/dist/shared/attaform.QG5TG8lB.mjs.map +0 -1
  149. package/dist/shared/attaform.tiWEVznj.mjs.map +0 -1
  150. package/dist/shared/attaform.z5j3LwJz.cjs.map +0 -1
@@ -0,0 +1,58 @@
1
+ 'use strict';
2
+
3
+ const injectWizard = require('../shared/attaform.ClXwitZj.cjs');
4
+
5
+ async function warnOnSchemaFingerprintMismatch(key, existing, incoming) {
6
+ let existingFp;
7
+ let incomingFp;
8
+ try {
9
+ existingFp = await existing.fingerprint();
10
+ incomingFp = await incoming.fingerprint();
11
+ } catch (error) {
12
+ console.error(
13
+ `[attaform] fingerprint() rejected for key "${key}"; skipping mismatch check.`,
14
+ error
15
+ );
16
+ return;
17
+ }
18
+ if (existingFp === incomingFp) return;
19
+ console.warn(
20
+ `[attaform] useForm() calls with key "${key}" use different schemas; first wins, second is ignored. Use identical schemas or unique keys.
21
+ existing: ${existingFp}
22
+ incoming: ${incomingFp}`
23
+ );
24
+ }
25
+ function warnOnPersistDivergence(key, existing, incomingPersist) {
26
+ if (incomingPersist === void 0) return;
27
+ const wired = existing.modules.get(injectWizard.PERSISTENCE_MODULE_KEY);
28
+ const incomingNormalized = injectWizard.normalizePersistConfig(incomingPersist);
29
+ if (wired === void 0) {
30
+ console.warn(
31
+ `[attaform] useForm({ key: "${key}" }) passed a persist config but the first useForm({ key }) call didn't wire persistence; the new config is silently dropped. Pass persist on the first call, or remove persist here to make the inheritance explicit.`
32
+ );
33
+ return;
34
+ }
35
+ if (persistConfigsEquivalent(wired.config, incomingNormalized)) return;
36
+ console.warn(
37
+ `[attaform] useForm({ key: "${key}" }) passed a persist config that differs from the first useForm({ key }) call's; first wins, this one is ignored.
38
+ wired: ${describePersist(wired.config)}
39
+ incoming: ${describePersist(incomingNormalized)}`
40
+ );
41
+ }
42
+ function persistConfigsEquivalent(a, b) {
43
+ if (a.storage !== b.storage) return false;
44
+ if ((a.key ?? void 0) !== (b.key ?? void 0)) return false;
45
+ if ((a.debounceMs ?? void 0) !== (b.debounceMs ?? void 0)) return false;
46
+ return true;
47
+ }
48
+ function describePersist(config) {
49
+ const storage = typeof config.storage === "string" ? config.storage : "custom-adapter";
50
+ const parts = [`storage=${storage}`];
51
+ if (config.key !== void 0) parts.push(`key=${config.key}`);
52
+ if (config.debounceMs !== void 0) parts.push(`debounceMs=${config.debounceMs}`);
53
+ return `{ ${parts.join(", ")} }`;
54
+ }
55
+
56
+ exports.warnOnPersistDivergence = warnOnPersistDivergence;
57
+ exports.warnOnSchemaFingerprintMismatch = warnOnSchemaFingerprintMismatch;
58
+ //# sourceMappingURL=dev-key-collision-warnings.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-key-collision-warnings.cjs","sources":["../../src/runtime/core/dev-key-collision-warnings.ts"],"sourcesContent":["/**\n * Dev-only shared-key collision diagnostics for `useForm`. When two\n * `useForm({ key })` calls land on the same key, they resolve to one\n * `FormStore` by design (the shared-store semantic), and the second\n * call's schema and `persist:` config are silently dropped in favour of\n * the first's wiring. The warnings here surface that divergence so a\n * genuine collision (two unrelated call sites that happen to agree on a\n * key) is diagnosable rather than silent.\n *\n * This whole module is loaded behind a `__DEV__`-gated dynamic import in\n * `use-abstract-form.ts`. A production build folds that gate to `false`,\n * dead-code-eliminates the `import()` call, and leaves this module an\n * unreferenced chunk the consumer's bundler drops. Keeping the warnings\n * here (rather than as plain functions called from the gated block)\n * matters because esbuild removes the inline dead branch but NOT a\n * top-level function it is the sole caller of: tree-shaking runs before\n * the define-fold, so the function survives. A separately-imported\n * module sidesteps that and keeps the cluster out of every consumer's\n * production bundle.\n */\nimport { normalizePersistConfig, PERSISTENCE_MODULE_KEY } from './persistence'\nimport type { PersistenceHandle } from './persistence'\nimport type { FormStore } from './create-form-store'\nimport type {\n AbstractSchema,\n FormKey,\n PersistConfig,\n PersistConfigOptions,\n} from '../types/types-api'\nimport type { GenericForm } from '../types/types-core'\n\n/**\n * Dev-only: warn when a second `useForm` lands on the same key with\n * a structurally-different schema. Two schemas resolve their own\n * fingerprints; we compare the strings and flag mismatches. An adapter\n * `fingerprint()` that rejects is caught (never crashes the form) and\n * surfaced as a `console.error` in dev: the mismatch check is skipped,\n * matching the \"allow the inconsistency\" failure mode. See\n * `AbstractSchema.fingerprint()` in types-api.ts for the contract.\n */\nexport async function warnOnSchemaFingerprintMismatch(\n key: FormKey,\n existing: AbstractSchema<GenericForm, GenericForm>,\n incoming: AbstractSchema<GenericForm, GenericForm>\n): Promise<void> {\n let existingFp: string\n let incomingFp: string\n try {\n existingFp = await existing.fingerprint()\n incomingFp = await incoming.fingerprint()\n } catch (error) {\n console.error(\n `[attaform] fingerprint() rejected for key \"${key}\"; skipping mismatch check.`,\n error\n )\n return\n }\n if (existingFp === incomingFp) return\n console.warn(\n `[attaform] useForm() calls with key \"${key}\" use different schemas; first wins, second is ignored. Use identical schemas or unique keys.\\n existing: ${existingFp}\\n incoming: ${incomingFp}`\n )\n}\n\n/**\n * Dev-only: warn when a second `useForm` lands on the same key with a\n * `persist:` config that diverges from what the first call wired. The\n * persist channel is single-IO (one storage key, one debounce timer);\n * silent drop is a high-stakes footgun (\"I configured persist but\n * sessionStorage is empty\"). Skipped when the second call passes no\n * persist config (intentional inheritance), and when the comparison\n * is deemed equivalent (same `storage` reference / kind, same `key`,\n * same `debounceMs`). Custom adapter functions compare by reference\n * — distinct closures look distinct, which is conservative but\n * correct: distinct closures may persist to different backends.\n */\nexport function warnOnPersistDivergence<F extends GenericForm>(\n key: FormKey,\n existing: FormStore<F, GenericForm>,\n incomingPersist: PersistConfig | undefined\n): void {\n if (incomingPersist === undefined) return\n const wired = existing.modules.get(PERSISTENCE_MODULE_KEY) as PersistenceHandle | undefined\n const incomingNormalized = normalizePersistConfig(incomingPersist)\n if (wired === undefined) {\n console.warn(\n `[attaform] useForm({ key: \"${key}\" }) passed a persist config but the first useForm({ key }) call didn't wire persistence; the new config is silently dropped. Pass persist on the first call, or remove persist here to make the inheritance explicit.`\n )\n return\n }\n if (persistConfigsEquivalent(wired.config, incomingNormalized)) return\n console.warn(\n `[attaform] useForm({ key: \"${key}\" }) passed a persist config that differs from the first useForm({ key }) call's; first wins, this one is ignored.\\n wired: ${describePersist(wired.config)}\\n incoming: ${describePersist(incomingNormalized)}`\n )\n}\n\nfunction persistConfigsEquivalent(a: PersistConfigOptions, b: PersistConfigOptions): boolean {\n if (a.storage !== b.storage) return false\n if ((a.key ?? undefined) !== (b.key ?? undefined)) return false\n if ((a.debounceMs ?? undefined) !== (b.debounceMs ?? undefined)) return false\n return true\n}\n\nfunction describePersist(config: PersistConfigOptions): string {\n const storage = typeof config.storage === 'string' ? config.storage : 'custom-adapter'\n const parts = [`storage=${storage}`]\n if (config.key !== undefined) parts.push(`key=${config.key}`)\n if (config.debounceMs !== undefined) parts.push(`debounceMs=${config.debounceMs}`)\n return `{ ${parts.join(', ')} }`\n}\n"],"names":["PERSISTENCE_MODULE_KEY","normalizePersistConfig"],"mappings":";;;;AAwCA,eAAsB,+BAAA,CACpB,GAAA,EACA,QAAA,EACA,QAAA,EACe;AACf,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,MAAM,SAAS,WAAA,EAAY;AACxC,IAAA,UAAA,GAAa,MAAM,SAAS,WAAA,EAAY;AAAA,EAC1C,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN,8CAA8C,GAAG,CAAA,2BAAA,CAAA;AAAA,MACjD;AAAA,KACF;AACA,IAAA;AAAA,EACF;AACA,EAAA,IAAI,eAAe,UAAA,EAAY;AAC/B,EAAA,OAAA,CAAQ,IAAA;AAAA,IACN,wCAAwC,GAAG,CAAA;AAAA,YAAA,EAA8G,UAAU;AAAA,YAAA,EAAiB,UAAU,CAAA;AAAA,GAChM;AACF;AAcO,SAAS,uBAAA,CACd,GAAA,EACA,QAAA,EACA,eAAA,EACM;AACN,EAAA,IAAI,oBAAoB,MAAA,EAAW;AACnC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAIA,mCAAsB,CAAA;AACzD,EAAA,MAAM,kBAAA,GAAqBC,oCAAuB,eAAe,CAAA;AACjE,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,8BAA8B,GAAG,CAAA,sNAAA;AAAA,KACnC;AACA,IAAA;AAAA,EACF;AACA,EAAA,IAAI,wBAAA,CAAyB,KAAA,CAAM,MAAA,EAAQ,kBAAkB,CAAA,EAAG;AAChE,EAAA,OAAA,CAAQ,IAAA;AAAA,IACN,8BAA8B,GAAG,CAAA;AAAA,YAAA,EAAmI,eAAA,CAAgB,KAAA,CAAM,MAAM,CAAC;AAAA,YAAA,EAAiB,eAAA,CAAgB,kBAAkB,CAAC,CAAA;AAAA,GACvP;AACF;AAEA,SAAS,wBAAA,CAAyB,GAAyB,CAAA,EAAkC;AAC3F,EAAA,IAAI,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,OAAA,EAAS,OAAO,KAAA;AACpC,EAAA,IAAA,CAAK,EAAE,GAAA,IAAO,MAAA,OAAgB,CAAA,CAAE,GAAA,IAAO,SAAY,OAAO,KAAA;AAC1D,EAAA,IAAA,CAAK,EAAE,UAAA,IAAc,MAAA,OAAgB,CAAA,CAAE,UAAA,IAAc,SAAY,OAAO,KAAA;AACxE,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,gBAAgB,MAAA,EAAsC;AAC7D,EAAA,MAAM,UAAU,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,GAAW,OAAO,OAAA,GAAU,gBAAA;AACtE,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,QAAA,EAAW,OAAO,CAAA,CAAE,CAAA;AACnC,EAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,IAAA,EAAO,MAAA,CAAO,GAAG,CAAA,CAAE,CAAA;AAC5D,EAAA,IAAI,MAAA,CAAO,eAAe,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,WAAA,EAAc,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AACjF,EAAA,OAAO,CAAA,EAAA,EAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,CAAA;AAC9B;;;;;"}
@@ -0,0 +1,55 @@
1
+ import { P as PERSISTENCE_MODULE_KEY, s as normalizePersistConfig } from '../shared/attaform.DR6RmxWZ.mjs';
2
+
3
+ async function warnOnSchemaFingerprintMismatch(key, existing, incoming) {
4
+ let existingFp;
5
+ let incomingFp;
6
+ try {
7
+ existingFp = await existing.fingerprint();
8
+ incomingFp = await incoming.fingerprint();
9
+ } catch (error) {
10
+ console.error(
11
+ `[attaform] fingerprint() rejected for key "${key}"; skipping mismatch check.`,
12
+ error
13
+ );
14
+ return;
15
+ }
16
+ if (existingFp === incomingFp) return;
17
+ console.warn(
18
+ `[attaform] useForm() calls with key "${key}" use different schemas; first wins, second is ignored. Use identical schemas or unique keys.
19
+ existing: ${existingFp}
20
+ incoming: ${incomingFp}`
21
+ );
22
+ }
23
+ function warnOnPersistDivergence(key, existing, incomingPersist) {
24
+ if (incomingPersist === void 0) return;
25
+ const wired = existing.modules.get(PERSISTENCE_MODULE_KEY);
26
+ const incomingNormalized = normalizePersistConfig(incomingPersist);
27
+ if (wired === void 0) {
28
+ console.warn(
29
+ `[attaform] useForm({ key: "${key}" }) passed a persist config but the first useForm({ key }) call didn't wire persistence; the new config is silently dropped. Pass persist on the first call, or remove persist here to make the inheritance explicit.`
30
+ );
31
+ return;
32
+ }
33
+ if (persistConfigsEquivalent(wired.config, incomingNormalized)) return;
34
+ console.warn(
35
+ `[attaform] useForm({ key: "${key}" }) passed a persist config that differs from the first useForm({ key }) call's; first wins, this one is ignored.
36
+ wired: ${describePersist(wired.config)}
37
+ incoming: ${describePersist(incomingNormalized)}`
38
+ );
39
+ }
40
+ function persistConfigsEquivalent(a, b) {
41
+ if (a.storage !== b.storage) return false;
42
+ if ((a.key ?? void 0) !== (b.key ?? void 0)) return false;
43
+ if ((a.debounceMs ?? void 0) !== (b.debounceMs ?? void 0)) return false;
44
+ return true;
45
+ }
46
+ function describePersist(config) {
47
+ const storage = typeof config.storage === "string" ? config.storage : "custom-adapter";
48
+ const parts = [`storage=${storage}`];
49
+ if (config.key !== void 0) parts.push(`key=${config.key}`);
50
+ if (config.debounceMs !== void 0) parts.push(`debounceMs=${config.debounceMs}`);
51
+ return `{ ${parts.join(", ")} }`;
52
+ }
53
+
54
+ export { warnOnPersistDivergence, warnOnSchemaFingerprintMismatch };
55
+ //# sourceMappingURL=dev-key-collision-warnings.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-key-collision-warnings.mjs","sources":["../../src/runtime/core/dev-key-collision-warnings.ts"],"sourcesContent":["/**\n * Dev-only shared-key collision diagnostics for `useForm`. When two\n * `useForm({ key })` calls land on the same key, they resolve to one\n * `FormStore` by design (the shared-store semantic), and the second\n * call's schema and `persist:` config are silently dropped in favour of\n * the first's wiring. The warnings here surface that divergence so a\n * genuine collision (two unrelated call sites that happen to agree on a\n * key) is diagnosable rather than silent.\n *\n * This whole module is loaded behind a `__DEV__`-gated dynamic import in\n * `use-abstract-form.ts`. A production build folds that gate to `false`,\n * dead-code-eliminates the `import()` call, and leaves this module an\n * unreferenced chunk the consumer's bundler drops. Keeping the warnings\n * here (rather than as plain functions called from the gated block)\n * matters because esbuild removes the inline dead branch but NOT a\n * top-level function it is the sole caller of: tree-shaking runs before\n * the define-fold, so the function survives. A separately-imported\n * module sidesteps that and keeps the cluster out of every consumer's\n * production bundle.\n */\nimport { normalizePersistConfig, PERSISTENCE_MODULE_KEY } from './persistence'\nimport type { PersistenceHandle } from './persistence'\nimport type { FormStore } from './create-form-store'\nimport type {\n AbstractSchema,\n FormKey,\n PersistConfig,\n PersistConfigOptions,\n} from '../types/types-api'\nimport type { GenericForm } from '../types/types-core'\n\n/**\n * Dev-only: warn when a second `useForm` lands on the same key with\n * a structurally-different schema. Two schemas resolve their own\n * fingerprints; we compare the strings and flag mismatches. An adapter\n * `fingerprint()` that rejects is caught (never crashes the form) and\n * surfaced as a `console.error` in dev: the mismatch check is skipped,\n * matching the \"allow the inconsistency\" failure mode. See\n * `AbstractSchema.fingerprint()` in types-api.ts for the contract.\n */\nexport async function warnOnSchemaFingerprintMismatch(\n key: FormKey,\n existing: AbstractSchema<GenericForm, GenericForm>,\n incoming: AbstractSchema<GenericForm, GenericForm>\n): Promise<void> {\n let existingFp: string\n let incomingFp: string\n try {\n existingFp = await existing.fingerprint()\n incomingFp = await incoming.fingerprint()\n } catch (error) {\n console.error(\n `[attaform] fingerprint() rejected for key \"${key}\"; skipping mismatch check.`,\n error\n )\n return\n }\n if (existingFp === incomingFp) return\n console.warn(\n `[attaform] useForm() calls with key \"${key}\" use different schemas; first wins, second is ignored. Use identical schemas or unique keys.\\n existing: ${existingFp}\\n incoming: ${incomingFp}`\n )\n}\n\n/**\n * Dev-only: warn when a second `useForm` lands on the same key with a\n * `persist:` config that diverges from what the first call wired. The\n * persist channel is single-IO (one storage key, one debounce timer);\n * silent drop is a high-stakes footgun (\"I configured persist but\n * sessionStorage is empty\"). Skipped when the second call passes no\n * persist config (intentional inheritance), and when the comparison\n * is deemed equivalent (same `storage` reference / kind, same `key`,\n * same `debounceMs`). Custom adapter functions compare by reference\n * — distinct closures look distinct, which is conservative but\n * correct: distinct closures may persist to different backends.\n */\nexport function warnOnPersistDivergence<F extends GenericForm>(\n key: FormKey,\n existing: FormStore<F, GenericForm>,\n incomingPersist: PersistConfig | undefined\n): void {\n if (incomingPersist === undefined) return\n const wired = existing.modules.get(PERSISTENCE_MODULE_KEY) as PersistenceHandle | undefined\n const incomingNormalized = normalizePersistConfig(incomingPersist)\n if (wired === undefined) {\n console.warn(\n `[attaform] useForm({ key: \"${key}\" }) passed a persist config but the first useForm({ key }) call didn't wire persistence; the new config is silently dropped. Pass persist on the first call, or remove persist here to make the inheritance explicit.`\n )\n return\n }\n if (persistConfigsEquivalent(wired.config, incomingNormalized)) return\n console.warn(\n `[attaform] useForm({ key: \"${key}\" }) passed a persist config that differs from the first useForm({ key }) call's; first wins, this one is ignored.\\n wired: ${describePersist(wired.config)}\\n incoming: ${describePersist(incomingNormalized)}`\n )\n}\n\nfunction persistConfigsEquivalent(a: PersistConfigOptions, b: PersistConfigOptions): boolean {\n if (a.storage !== b.storage) return false\n if ((a.key ?? undefined) !== (b.key ?? undefined)) return false\n if ((a.debounceMs ?? undefined) !== (b.debounceMs ?? undefined)) return false\n return true\n}\n\nfunction describePersist(config: PersistConfigOptions): string {\n const storage = typeof config.storage === 'string' ? config.storage : 'custom-adapter'\n const parts = [`storage=${storage}`]\n if (config.key !== undefined) parts.push(`key=${config.key}`)\n if (config.debounceMs !== undefined) parts.push(`debounceMs=${config.debounceMs}`)\n return `{ ${parts.join(', ')} }`\n}\n"],"names":[],"mappings":";;AAwCA,eAAsB,+BAAA,CACpB,GAAA,EACA,QAAA,EACA,QAAA,EACe;AACf,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,MAAM,SAAS,WAAA,EAAY;AACxC,IAAA,UAAA,GAAa,MAAM,SAAS,WAAA,EAAY;AAAA,EAC1C,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN,8CAA8C,GAAG,CAAA,2BAAA,CAAA;AAAA,MACjD;AAAA,KACF;AACA,IAAA;AAAA,EACF;AACA,EAAA,IAAI,eAAe,UAAA,EAAY;AAC/B,EAAA,OAAA,CAAQ,IAAA;AAAA,IACN,wCAAwC,GAAG,CAAA;AAAA,YAAA,EAA8G,UAAU;AAAA,YAAA,EAAiB,UAAU,CAAA;AAAA,GAChM;AACF;AAcO,SAAS,uBAAA,CACd,GAAA,EACA,QAAA,EACA,eAAA,EACM;AACN,EAAA,IAAI,oBAAoB,MAAA,EAAW;AACnC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,sBAAsB,CAAA;AACzD,EAAA,MAAM,kBAAA,GAAqB,uBAAuB,eAAe,CAAA;AACjE,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,8BAA8B,GAAG,CAAA,sNAAA;AAAA,KACnC;AACA,IAAA;AAAA,EACF;AACA,EAAA,IAAI,wBAAA,CAAyB,KAAA,CAAM,MAAA,EAAQ,kBAAkB,CAAA,EAAG;AAChE,EAAA,OAAA,CAAQ,IAAA;AAAA,IACN,8BAA8B,GAAG,CAAA;AAAA,YAAA,EAAmI,eAAA,CAAgB,KAAA,CAAM,MAAM,CAAC;AAAA,YAAA,EAAiB,eAAA,CAAgB,kBAAkB,CAAC,CAAA;AAAA,GACvP;AACF;AAEA,SAAS,wBAAA,CAAyB,GAAyB,CAAA,EAAkC;AAC3F,EAAA,IAAI,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,OAAA,EAAS,OAAO,KAAA;AACpC,EAAA,IAAA,CAAK,EAAE,GAAA,IAAO,MAAA,OAAgB,CAAA,CAAE,GAAA,IAAO,SAAY,OAAO,KAAA;AAC1D,EAAA,IAAA,CAAK,EAAE,UAAA,IAAc,MAAA,OAAgB,CAAA,CAAE,UAAA,IAAc,SAAY,OAAO,KAAA;AACxE,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,gBAAgB,MAAA,EAAsC;AAC7D,EAAA,MAAM,UAAU,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,GAAW,OAAO,OAAA,GAAU,gBAAA;AACtE,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,QAAA,EAAW,OAAO,CAAA,CAAE,CAAA;AACnC,EAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,IAAA,EAAO,MAAA,CAAO,GAAG,CAAA,CAAE,CAAA;AAC5D,EAAA,IAAI,MAAA,CAAO,eAAe,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,WAAA,EAAc,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AACjF,EAAA,OAAO,CAAA,EAAA,EAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,CAAA;AAC9B;;;;"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const paths = require('../shared/attaform.z5j3LwJz.cjs');
3
+ const paths = require('../shared/attaform.D32WwKk6.cjs');
4
4
 
5
5
  const INSPECTOR_ID = "attaform";
6
6
  const TIMELINE_LAYER_ID = "attaform:events";
@@ -1,4 +1,4 @@
1
- import { j as canonicalizePath } from '../shared/attaform.QG5TG8lB.mjs';
1
+ import { j as canonicalizePath } from '../shared/attaform.pmtahXKy.mjs';
2
2
 
3
3
  const INSPECTOR_ID = "attaform";
4
4
  const TIMELINE_LAYER_ID = "attaform:events";
@@ -0,0 +1,186 @@
1
+ 'use strict';
2
+
3
+ const canonicalStringify = require('../shared/attaform.CQN9R62B.cjs');
4
+
5
+ const cyclicSentinel = "<cyclic>";
6
+ function fingerprintZodSchema(schema) {
7
+ const cache = /* @__PURE__ */ new WeakMap();
8
+ const inProgress = /* @__PURE__ */ new WeakSet();
9
+ return visit(schema, cache, inProgress);
10
+ }
11
+ function visit(schema, cache, inProgress) {
12
+ const key = schema;
13
+ const cached = cache.get(key);
14
+ if (cached !== void 0) return cached;
15
+ if (inProgress.has(key)) return cyclicSentinel;
16
+ inProgress.add(key);
17
+ try {
18
+ const computed = computeFingerprint(schema, cache, inProgress);
19
+ cache.set(key, computed);
20
+ return computed;
21
+ } finally {
22
+ inProgress.delete(key);
23
+ }
24
+ }
25
+ function getDef(schema) {
26
+ return schema._def;
27
+ }
28
+ function computeFingerprint(schema, cache, inProgress) {
29
+ const def = getDef(schema);
30
+ const kind = def.typeName ?? "ZodUnknown";
31
+ const recurse = (child) => visit(child, cache, inProgress);
32
+ switch (kind) {
33
+ case "ZodString":
34
+ case "ZodNumber":
35
+ case "ZodBigInt":
36
+ case "ZodDate":
37
+ return `${kind}${formatChecks(def.checks)}`;
38
+ case "ZodBoolean":
39
+ case "ZodNull":
40
+ case "ZodUndefined":
41
+ case "ZodAny":
42
+ case "ZodUnknown":
43
+ case "ZodNaN":
44
+ case "ZodVoid":
45
+ case "ZodNever":
46
+ return kind;
47
+ case "ZodLiteral":
48
+ return `ZodLiteral:${canonicalStringify.canonicalStringify(def.value)}`;
49
+ case "ZodEnum": {
50
+ const values = Array.isArray(def.values) ? def.values : [];
51
+ const sorted = [...values].sort((a, b) => {
52
+ const as = String(a);
53
+ const bs = String(b);
54
+ return as < bs ? -1 : as > bs ? 1 : 0;
55
+ });
56
+ return `ZodEnum:${canonicalStringify.canonicalStringify(sorted)}`;
57
+ }
58
+ case "ZodNativeEnum": {
59
+ const values = def.values && typeof def.values === "object" && !Array.isArray(def.values) ? Object.values(def.values) : [];
60
+ const sorted = [...values].sort((a, b) => {
61
+ const as = String(a);
62
+ const bs = String(b);
63
+ return as < bs ? -1 : as > bs ? 1 : 0;
64
+ });
65
+ return `ZodNativeEnum:${canonicalStringify.canonicalStringify(sorted)}`;
66
+ }
67
+ case "ZodObject": {
68
+ const shape = readShapeSafely(def);
69
+ const sortedEntries = Object.entries(shape).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([k, v]) => `${JSON.stringify(k)}:${recurse(v)}`);
70
+ return `ZodObject{${sortedEntries.join(",")}}${formatChecks(def.checks)}`;
71
+ }
72
+ case "ZodArray":
73
+ return `ZodArray[${def.type === void 0 ? "?" : recurse(def.type)}]${formatChecks(def.checks)}`;
74
+ case "ZodTuple": {
75
+ const items = def.items ?? [];
76
+ return `ZodTuple[${items.map(recurse).join(",")}]`;
77
+ }
78
+ case "ZodRecord": {
79
+ const keyPart = def.keyType === void 0 ? "?" : recurse(def.keyType);
80
+ const valuePart = def.valueType === void 0 ? "?" : recurse(def.valueType);
81
+ return `ZodRecord<${keyPart},${valuePart}>`;
82
+ }
83
+ case "ZodUnion": {
84
+ const options = (def.options ?? []).map(recurse).sort();
85
+ return `ZodUnion(${options.join("|")})`;
86
+ }
87
+ case "ZodDiscriminatedUnion": {
88
+ const disc = def.discriminator ?? "?";
89
+ const options = (def.options ?? []).map(recurse).sort();
90
+ return `ZodDiscriminatedUnion[${JSON.stringify(disc)}](${options.join("|")})`;
91
+ }
92
+ case "ZodOptional": {
93
+ const inner = def.innerType;
94
+ return inner === void 0 ? "ZodOptional(?)" : `ZodOptional(${recurse(inner)})`;
95
+ }
96
+ case "ZodNullable": {
97
+ const inner = def.innerType;
98
+ return inner === void 0 ? "ZodNullable(?)" : `ZodNullable(${recurse(inner)})`;
99
+ }
100
+ case "ZodDefault": {
101
+ const inner = def.innerType;
102
+ return `ZodDefault[${defaultFactoryRepr(def.defaultValue)}](${inner === void 0 ? "?" : recurse(inner)})`;
103
+ }
104
+ case "ZodReadonly": {
105
+ const inner = def.innerType;
106
+ return inner === void 0 ? "ZodReadonly(?)" : `ZodReadonly(${recurse(inner)})`;
107
+ }
108
+ case "ZodEffects": {
109
+ const effectType = def.effect?.type ?? "effect";
110
+ const inner = def.schema;
111
+ return `ZodEffects:${effectType}:fn:*(${inner === void 0 ? "?" : recurse(inner)})`;
112
+ }
113
+ case "ZodPipeline": {
114
+ const inner = def.in ?? def.out;
115
+ return inner === void 0 ? "ZodPipeline(?)" : `ZodPipeline(${recurse(inner)})`;
116
+ }
117
+ case "ZodCatch": {
118
+ const inner = def.innerType ?? def.schema;
119
+ const catchRepr = defaultFactoryRepr(def.catchValue);
120
+ return `ZodCatch[${catchRepr}](${inner === void 0 ? "?" : recurse(inner)})`;
121
+ }
122
+ case "ZodLazy": {
123
+ const resolve = def.getter;
124
+ if (typeof resolve !== "function") return "ZodLazy(?)";
125
+ try {
126
+ const inner = resolve();
127
+ return `ZodLazy(${recurse(inner)})`;
128
+ } catch {
129
+ return "ZodLazy(?)";
130
+ }
131
+ }
132
+ case "ZodIntersection": {
133
+ const leftPart = def.left === void 0 ? "?" : recurse(def.left);
134
+ const rightPart = def.right === void 0 ? "?" : recurse(def.right);
135
+ const parts = [leftPart, rightPart].sort();
136
+ return `ZodIntersection(${parts.join("&")})`;
137
+ }
138
+ case "ZodSet": {
139
+ const inner = def.valueType;
140
+ return inner === void 0 ? "ZodSet(?)" : `ZodSet<${recurse(inner)}>${formatChecks(def.checks)}`;
141
+ }
142
+ case "ZodBranded": {
143
+ const inner = def.type;
144
+ return inner === void 0 ? "ZodBranded(?)" : `ZodBranded(${recurse(inner)})`;
145
+ }
146
+ // Structural opacity — schemas whose runtime behaviour isn't
147
+ // introspectable via `_def` fall here. Still distinguishable
148
+ // from other kinds by the returned string.
149
+ case "ZodPromise":
150
+ case "ZodFunction":
151
+ case "ZodMap":
152
+ case "ZodSymbol":
153
+ default:
154
+ return `${kind}:*`;
155
+ }
156
+ }
157
+ function readShapeSafely(def) {
158
+ if (typeof def.shape !== "function") return {};
159
+ try {
160
+ return def.shape();
161
+ } catch {
162
+ return {};
163
+ }
164
+ }
165
+ function defaultFactoryRepr(factory) {
166
+ if (typeof factory !== "function") return "none";
167
+ let first;
168
+ let second;
169
+ try {
170
+ first = factory();
171
+ second = factory();
172
+ } catch {
173
+ return "fn:*";
174
+ }
175
+ if (!Object.is(first, second)) return "fn:*";
176
+ if (typeof first === "function") return "fn:*";
177
+ return canonicalStringify.canonicalStringify(first);
178
+ }
179
+ function formatChecks(checks) {
180
+ if (!Array.isArray(checks) || checks.length === 0) return "";
181
+ const parts = checks.map((c) => canonicalStringify.canonicalStringify(c)).sort();
182
+ return `[${parts.join(";")}]`;
183
+ }
184
+
185
+ exports.fingerprintZodSchema = fingerprintZodSchema;
186
+ //# sourceMappingURL=fingerprint.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.cjs","sources":["../../src/runtime/adapters/zod-v3/fingerprint.ts"],"sourcesContent":["import type { z } from 'zod-v3'\nimport { canonicalStringify } from '../../core/canonical-stringify'\n\n/**\n * Compute a structural fingerprint for a Zod v3 schema.\n *\n * Same contract as the v4 counterpart — deterministic across\n * reference-distinct but structurally-equal schemas, key-order-\n * insensitive for `z.object` shapes, membership-order-insensitive\n * for `z.union` options, idempotent across calls. See\n * `src/runtime/adapters/zod-v4/fingerprint.ts` for the full\n * rationale and the list of compromises (function-valued\n * refinements / transforms / non-deterministic default factories\n * collapse to opaque `fn:*` sentinels).\n *\n * Caching is per-call, not module-global: cycles mean a cached\n * mid-traversal result from one call is invalid for another\n * (the `<cyclic>` sentinel's meaning depends on the starting\n * node). A WeakSet guards against cycles introduced by `z.lazy`.\n */\n\ntype V3Schema = z.ZodTypeAny\n\ninterface V3Def {\n readonly typeName?: string\n readonly shape?: () => Record<string, V3Schema>\n readonly type?: V3Schema\n readonly keyType?: V3Schema\n readonly valueType?: V3Schema\n readonly items?: readonly V3Schema[]\n readonly options?: readonly V3Schema[]\n readonly discriminator?: string\n // ZodEnum stores its admitted values as an array; ZodNativeEnum\n // stores them as the enum OBJECT (`{Red: 'red', '0': 'Red'}` for a\n // numeric enum). The fingerprint walker handles the two shapes in\n // separate branches.\n readonly values?: readonly unknown[] | Record<string, unknown>\n readonly value?: unknown\n readonly innerType?: V3Schema\n readonly defaultValue?: () => unknown\n readonly checks?: readonly unknown[]\n readonly schema?: V3Schema\n readonly effect?: { readonly type?: string }\n readonly getter?: () => V3Schema\n readonly left?: V3Schema\n readonly right?: V3Schema\n readonly catchValue?: () => unknown\n // ZodPipeline stores its input + output sides on `in` / `out`\n // respectively — NOT on `schema`. The pre-fix walker read `schema`\n // (always `undefined`) and emitted `ZodPipeline(?)` for every\n // pipeline.\n readonly in?: V3Schema\n readonly out?: V3Schema\n}\n\nconst cyclicSentinel = '<cyclic>'\n\nexport function fingerprintZodSchema(schema: V3Schema): string {\n const cache = new WeakMap<object, string>()\n const inProgress = new WeakSet<object>()\n return visit(schema, cache, inProgress)\n}\n\nfunction visit(\n schema: V3Schema,\n cache: WeakMap<object, string>,\n inProgress: WeakSet<object>\n): string {\n const key = schema as unknown as object\n const cached = cache.get(key)\n if (cached !== undefined) return cached\n if (inProgress.has(key)) return cyclicSentinel\n inProgress.add(key)\n try {\n const computed = computeFingerprint(schema, cache, inProgress)\n cache.set(key, computed)\n return computed\n } finally {\n inProgress.delete(key)\n }\n}\n\nfunction getDef(schema: V3Schema): V3Def {\n return (schema as unknown as { _def: V3Def })._def\n}\n\nfunction computeFingerprint(\n schema: V3Schema,\n cache: WeakMap<object, string>,\n inProgress: WeakSet<object>\n): string {\n const def = getDef(schema)\n const kind = def.typeName ?? 'ZodUnknown'\n const recurse = (child: V3Schema): string => visit(child, cache, inProgress)\n\n switch (kind) {\n case 'ZodString':\n case 'ZodNumber':\n case 'ZodBigInt':\n case 'ZodDate':\n return `${kind}${formatChecks(def.checks)}`\n\n case 'ZodBoolean':\n case 'ZodNull':\n case 'ZodUndefined':\n case 'ZodAny':\n case 'ZodUnknown':\n case 'ZodNaN':\n case 'ZodVoid':\n case 'ZodNever':\n return kind\n\n case 'ZodLiteral':\n return `ZodLiteral:${canonicalStringify(def.value)}`\n\n case 'ZodEnum': {\n // ZodEnum stores its admitted values as an array on `_def.values`.\n // Sort + canonicalStringify for a deterministic fingerprint.\n const values = Array.isArray(def.values) ? def.values : []\n const sorted = [...values].sort((a, b) => {\n const as = String(a)\n const bs = String(b)\n return as < bs ? -1 : as > bs ? 1 : 0\n })\n return `ZodEnum:${canonicalStringify(sorted)}`\n }\n\n case 'ZodNativeEnum': {\n // ZodNativeEnum stores the enum OBJECT on `_def.values` (e.g.\n // `{Red: 'red'}` for a string enum or `{A: 0, '0': 'A'}` for a\n // numeric enum). The pre-fix walker shared the ZodEnum branch\n // which did `[...values]` — that throws `TypeError: not\n // iterable` on the object. Use `Object.values` to extract the\n // admitted runtime members; numeric enums include their\n // reverse-mapped string keys, which is fine for fingerprint\n // determinism (both forms are valid Zod inputs).\n const values =\n def.values && typeof def.values === 'object' && !Array.isArray(def.values)\n ? Object.values(def.values)\n : []\n const sorted = [...values].sort((a, b) => {\n const as = String(a)\n const bs = String(b)\n return as < bs ? -1 : as > bs ? 1 : 0\n })\n return `ZodNativeEnum:${canonicalStringify(sorted)}`\n }\n\n case 'ZodObject': {\n const shape = readShapeSafely(def)\n const sortedEntries = Object.entries(shape)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([k, v]) => `${JSON.stringify(k)}:${recurse(v)}`)\n // Object-level `formatChecks` matches v4's `object{…}${formatChecks(schema)}`\n // (`fingerprint.ts:148`). ZodObject rarely carries `_def.checks`\n // in v3 — the call is structurally for parity rather than\n // expected-to-fire — but consumers who reach through a custom\n // ZodObject builder that stores extra constraints get them\n // surfaced symmetrically.\n return `ZodObject{${sortedEntries.join(',')}}${formatChecks(def.checks)}`\n }\n\n case 'ZodArray':\n return `ZodArray[${def.type === undefined ? '?' : recurse(def.type)}]${formatChecks(def.checks)}`\n\n case 'ZodTuple': {\n const items = def.items ?? []\n return `ZodTuple[${items.map(recurse).join(',')}]`\n }\n\n case 'ZodRecord': {\n const keyPart = def.keyType === undefined ? '?' : recurse(def.keyType)\n const valuePart = def.valueType === undefined ? '?' : recurse(def.valueType)\n return `ZodRecord<${keyPart},${valuePart}>`\n }\n\n case 'ZodUnion': {\n const options = (def.options ?? []).map(recurse).sort()\n return `ZodUnion(${options.join('|')})`\n }\n\n case 'ZodDiscriminatedUnion': {\n const disc = def.discriminator ?? '?'\n const options = (def.options ?? []).map(recurse).sort()\n return `ZodDiscriminatedUnion[${JSON.stringify(disc)}](${options.join('|')})`\n }\n\n case 'ZodOptional': {\n const inner = def.innerType\n return inner === undefined ? 'ZodOptional(?)' : `ZodOptional(${recurse(inner)})`\n }\n\n case 'ZodNullable': {\n const inner = def.innerType\n return inner === undefined ? 'ZodNullable(?)' : `ZodNullable(${recurse(inner)})`\n }\n\n case 'ZodDefault': {\n const inner = def.innerType\n // v3 stores defaults as a factory: `defaultValue: () => X`.\n // Call it twice and compare with Object.is — non-deterministic\n // factories (`() => new Date()`) return distinct objects each\n // call, so we collapse to `fn:*` to stay idempotent. Pure\n // factories that return the same primitive / cached reference\n // serialise normally.\n return `ZodDefault[${defaultFactoryRepr(def.defaultValue)}](${\n inner === undefined ? '?' : recurse(inner)\n })`\n }\n\n case 'ZodReadonly': {\n const inner = def.innerType\n return inner === undefined ? 'ZodReadonly(?)' : `ZodReadonly(${recurse(inner)})`\n }\n\n case 'ZodEffects': {\n // `.refine` / `.transform` / `.preprocess` — the effect function\n // isn't stably hashable. We can distinguish effect kinds (refine\n // vs transform) via `def.effect.type` and fold that into the\n // fingerprint, but the function body collapses to an opaque\n // sentinel.\n const effectType = def.effect?.type ?? 'effect'\n const inner = def.schema\n return `ZodEffects:${effectType}:fn:*(${inner === undefined ? '?' : recurse(inner)})`\n }\n\n case 'ZodPipeline': {\n // Internally `z.pipe(a, b)` — `.in` and `.out` live on the def\n // (NOT `.schema`). The pre-fix walker read `def.schema`\n // (undefined for a pipeline) so every pipeline collapsed to\n // `ZodPipeline(?)`. Read the input side first (mirrors v4's\n // `unwrapPipe` which returns `in ?? out`); the output side is\n // a derived shape rather than a consumer-authored schema.\n const inner = def.in ?? def.out\n return inner === undefined ? 'ZodPipeline(?)' : `ZodPipeline(${recurse(inner)})`\n }\n\n case 'ZodCatch': {\n const inner = def.innerType ?? def.schema\n const catchRepr = defaultFactoryRepr(def.catchValue)\n return `ZodCatch[${catchRepr}](${inner === undefined ? '?' : recurse(inner)})`\n }\n\n case 'ZodLazy': {\n const resolve = def.getter\n if (typeof resolve !== 'function') return 'ZodLazy(?)'\n try {\n const inner = resolve()\n return `ZodLazy(${recurse(inner)})`\n } catch {\n return 'ZodLazy(?)'\n }\n }\n\n case 'ZodIntersection': {\n const leftPart = def.left === undefined ? '?' : recurse(def.left)\n const rightPart = def.right === undefined ? '?' : recurse(def.right)\n const parts = [leftPart, rightPart].sort()\n return `ZodIntersection(${parts.join('&')})`\n }\n\n case 'ZodSet': {\n // ZodSet stores its element type on `_def.valueType` (same slot\n // ZodRecord uses for its value type). The pre-fix walker fell\n // through to the opaque default branch, so `z.set(z.string())`\n // and `z.set(z.number())` collapsed to the same `ZodSet:*`.\n // Mirrors v4's `set<element>${formatChecks(schema)}`.\n const inner = def.valueType\n return inner === undefined\n ? 'ZodSet(?)'\n : `ZodSet<${recurse(inner)}>${formatChecks(def.checks)}`\n }\n\n case 'ZodBranded': {\n // ZodBranded stores its inner on `_def.type` (the v3 quirk; v4's\n // brand is type-only). The pre-fix walker fell through to the\n // opaque default branch and lost the inner's shape entirely, so\n // `z.string().brand<'A'>()` and `z.number().brand<'B'>()`\n // collapsed to the same `ZodBranded:*`. Brand annotations are\n // type-level only at runtime, so emit just the inner's\n // fingerprint with a transparent wrapper.\n const inner = def.type\n return inner === undefined ? 'ZodBranded(?)' : `ZodBranded(${recurse(inner)})`\n }\n\n // Structural opacity — schemas whose runtime behaviour isn't\n // introspectable via `_def` fall here. Still distinguishable\n // from other kinds by the returned string.\n case 'ZodPromise':\n case 'ZodFunction':\n case 'ZodMap':\n case 'ZodSymbol':\n default:\n return `${kind}:*`\n }\n}\n\nfunction readShapeSafely(def: V3Def): Record<string, V3Schema> {\n if (typeof def.shape !== 'function') return {}\n try {\n return def.shape()\n } catch {\n return {}\n }\n}\n\n/**\n * Render a v3 default / catch factory. Called twice; if the two\n * results differ (by `Object.is`), the factory is non-deterministic\n * and we collapse to `fn:*` to preserve idempotence. Same fix as\n * v4's `defaultValueRepr` — factories like `() => new Date()` would\n * otherwise make the fingerprint time-dependent.\n */\nfunction defaultFactoryRepr(factory: (() => unknown) | undefined): string {\n if (typeof factory !== 'function') return 'none'\n let first: unknown\n let second: unknown\n try {\n first = factory()\n second = factory()\n } catch {\n return 'fn:*'\n }\n if (!Object.is(first, second)) return 'fn:*'\n if (typeof first === 'function') return 'fn:*'\n return canonicalStringify(first)\n}\n\nfunction formatChecks(checks: readonly unknown[] | undefined): string {\n if (!Array.isArray(checks) || checks.length === 0) return ''\n const parts = checks.map((c) => canonicalStringify(c)).sort()\n return `[${parts.join(';')}]`\n}\n"],"names":["canonicalStringify"],"mappings":"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"}
@@ -0,0 +1,184 @@
1
+ import { c as canonicalStringify } from '../shared/attaform.BJGA_UOS.mjs';
2
+
3
+ const cyclicSentinel = "<cyclic>";
4
+ function fingerprintZodSchema(schema) {
5
+ const cache = /* @__PURE__ */ new WeakMap();
6
+ const inProgress = /* @__PURE__ */ new WeakSet();
7
+ return visit(schema, cache, inProgress);
8
+ }
9
+ function visit(schema, cache, inProgress) {
10
+ const key = schema;
11
+ const cached = cache.get(key);
12
+ if (cached !== void 0) return cached;
13
+ if (inProgress.has(key)) return cyclicSentinel;
14
+ inProgress.add(key);
15
+ try {
16
+ const computed = computeFingerprint(schema, cache, inProgress);
17
+ cache.set(key, computed);
18
+ return computed;
19
+ } finally {
20
+ inProgress.delete(key);
21
+ }
22
+ }
23
+ function getDef(schema) {
24
+ return schema._def;
25
+ }
26
+ function computeFingerprint(schema, cache, inProgress) {
27
+ const def = getDef(schema);
28
+ const kind = def.typeName ?? "ZodUnknown";
29
+ const recurse = (child) => visit(child, cache, inProgress);
30
+ switch (kind) {
31
+ case "ZodString":
32
+ case "ZodNumber":
33
+ case "ZodBigInt":
34
+ case "ZodDate":
35
+ return `${kind}${formatChecks(def.checks)}`;
36
+ case "ZodBoolean":
37
+ case "ZodNull":
38
+ case "ZodUndefined":
39
+ case "ZodAny":
40
+ case "ZodUnknown":
41
+ case "ZodNaN":
42
+ case "ZodVoid":
43
+ case "ZodNever":
44
+ return kind;
45
+ case "ZodLiteral":
46
+ return `ZodLiteral:${canonicalStringify(def.value)}`;
47
+ case "ZodEnum": {
48
+ const values = Array.isArray(def.values) ? def.values : [];
49
+ const sorted = [...values].sort((a, b) => {
50
+ const as = String(a);
51
+ const bs = String(b);
52
+ return as < bs ? -1 : as > bs ? 1 : 0;
53
+ });
54
+ return `ZodEnum:${canonicalStringify(sorted)}`;
55
+ }
56
+ case "ZodNativeEnum": {
57
+ const values = def.values && typeof def.values === "object" && !Array.isArray(def.values) ? Object.values(def.values) : [];
58
+ const sorted = [...values].sort((a, b) => {
59
+ const as = String(a);
60
+ const bs = String(b);
61
+ return as < bs ? -1 : as > bs ? 1 : 0;
62
+ });
63
+ return `ZodNativeEnum:${canonicalStringify(sorted)}`;
64
+ }
65
+ case "ZodObject": {
66
+ const shape = readShapeSafely(def);
67
+ const sortedEntries = Object.entries(shape).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([k, v]) => `${JSON.stringify(k)}:${recurse(v)}`);
68
+ return `ZodObject{${sortedEntries.join(",")}}${formatChecks(def.checks)}`;
69
+ }
70
+ case "ZodArray":
71
+ return `ZodArray[${def.type === void 0 ? "?" : recurse(def.type)}]${formatChecks(def.checks)}`;
72
+ case "ZodTuple": {
73
+ const items = def.items ?? [];
74
+ return `ZodTuple[${items.map(recurse).join(",")}]`;
75
+ }
76
+ case "ZodRecord": {
77
+ const keyPart = def.keyType === void 0 ? "?" : recurse(def.keyType);
78
+ const valuePart = def.valueType === void 0 ? "?" : recurse(def.valueType);
79
+ return `ZodRecord<${keyPart},${valuePart}>`;
80
+ }
81
+ case "ZodUnion": {
82
+ const options = (def.options ?? []).map(recurse).sort();
83
+ return `ZodUnion(${options.join("|")})`;
84
+ }
85
+ case "ZodDiscriminatedUnion": {
86
+ const disc = def.discriminator ?? "?";
87
+ const options = (def.options ?? []).map(recurse).sort();
88
+ return `ZodDiscriminatedUnion[${JSON.stringify(disc)}](${options.join("|")})`;
89
+ }
90
+ case "ZodOptional": {
91
+ const inner = def.innerType;
92
+ return inner === void 0 ? "ZodOptional(?)" : `ZodOptional(${recurse(inner)})`;
93
+ }
94
+ case "ZodNullable": {
95
+ const inner = def.innerType;
96
+ return inner === void 0 ? "ZodNullable(?)" : `ZodNullable(${recurse(inner)})`;
97
+ }
98
+ case "ZodDefault": {
99
+ const inner = def.innerType;
100
+ return `ZodDefault[${defaultFactoryRepr(def.defaultValue)}](${inner === void 0 ? "?" : recurse(inner)})`;
101
+ }
102
+ case "ZodReadonly": {
103
+ const inner = def.innerType;
104
+ return inner === void 0 ? "ZodReadonly(?)" : `ZodReadonly(${recurse(inner)})`;
105
+ }
106
+ case "ZodEffects": {
107
+ const effectType = def.effect?.type ?? "effect";
108
+ const inner = def.schema;
109
+ return `ZodEffects:${effectType}:fn:*(${inner === void 0 ? "?" : recurse(inner)})`;
110
+ }
111
+ case "ZodPipeline": {
112
+ const inner = def.in ?? def.out;
113
+ return inner === void 0 ? "ZodPipeline(?)" : `ZodPipeline(${recurse(inner)})`;
114
+ }
115
+ case "ZodCatch": {
116
+ const inner = def.innerType ?? def.schema;
117
+ const catchRepr = defaultFactoryRepr(def.catchValue);
118
+ return `ZodCatch[${catchRepr}](${inner === void 0 ? "?" : recurse(inner)})`;
119
+ }
120
+ case "ZodLazy": {
121
+ const resolve = def.getter;
122
+ if (typeof resolve !== "function") return "ZodLazy(?)";
123
+ try {
124
+ const inner = resolve();
125
+ return `ZodLazy(${recurse(inner)})`;
126
+ } catch {
127
+ return "ZodLazy(?)";
128
+ }
129
+ }
130
+ case "ZodIntersection": {
131
+ const leftPart = def.left === void 0 ? "?" : recurse(def.left);
132
+ const rightPart = def.right === void 0 ? "?" : recurse(def.right);
133
+ const parts = [leftPart, rightPart].sort();
134
+ return `ZodIntersection(${parts.join("&")})`;
135
+ }
136
+ case "ZodSet": {
137
+ const inner = def.valueType;
138
+ return inner === void 0 ? "ZodSet(?)" : `ZodSet<${recurse(inner)}>${formatChecks(def.checks)}`;
139
+ }
140
+ case "ZodBranded": {
141
+ const inner = def.type;
142
+ return inner === void 0 ? "ZodBranded(?)" : `ZodBranded(${recurse(inner)})`;
143
+ }
144
+ // Structural opacity — schemas whose runtime behaviour isn't
145
+ // introspectable via `_def` fall here. Still distinguishable
146
+ // from other kinds by the returned string.
147
+ case "ZodPromise":
148
+ case "ZodFunction":
149
+ case "ZodMap":
150
+ case "ZodSymbol":
151
+ default:
152
+ return `${kind}:*`;
153
+ }
154
+ }
155
+ function readShapeSafely(def) {
156
+ if (typeof def.shape !== "function") return {};
157
+ try {
158
+ return def.shape();
159
+ } catch {
160
+ return {};
161
+ }
162
+ }
163
+ function defaultFactoryRepr(factory) {
164
+ if (typeof factory !== "function") return "none";
165
+ let first;
166
+ let second;
167
+ try {
168
+ first = factory();
169
+ second = factory();
170
+ } catch {
171
+ return "fn:*";
172
+ }
173
+ if (!Object.is(first, second)) return "fn:*";
174
+ if (typeof first === "function") return "fn:*";
175
+ return canonicalStringify(first);
176
+ }
177
+ function formatChecks(checks) {
178
+ if (!Array.isArray(checks) || checks.length === 0) return "";
179
+ const parts = checks.map((c) => canonicalStringify(c)).sort();
180
+ return `[${parts.join(";")}]`;
181
+ }
182
+
183
+ export { fingerprintZodSchema };
184
+ //# sourceMappingURL=fingerprint.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.mjs","sources":["../../src/runtime/adapters/zod-v3/fingerprint.ts"],"sourcesContent":["import type { z } from 'zod-v3'\nimport { canonicalStringify } from '../../core/canonical-stringify'\n\n/**\n * Compute a structural fingerprint for a Zod v3 schema.\n *\n * Same contract as the v4 counterpart — deterministic across\n * reference-distinct but structurally-equal schemas, key-order-\n * insensitive for `z.object` shapes, membership-order-insensitive\n * for `z.union` options, idempotent across calls. See\n * `src/runtime/adapters/zod-v4/fingerprint.ts` for the full\n * rationale and the list of compromises (function-valued\n * refinements / transforms / non-deterministic default factories\n * collapse to opaque `fn:*` sentinels).\n *\n * Caching is per-call, not module-global: cycles mean a cached\n * mid-traversal result from one call is invalid for another\n * (the `<cyclic>` sentinel's meaning depends on the starting\n * node). A WeakSet guards against cycles introduced by `z.lazy`.\n */\n\ntype V3Schema = z.ZodTypeAny\n\ninterface V3Def {\n readonly typeName?: string\n readonly shape?: () => Record<string, V3Schema>\n readonly type?: V3Schema\n readonly keyType?: V3Schema\n readonly valueType?: V3Schema\n readonly items?: readonly V3Schema[]\n readonly options?: readonly V3Schema[]\n readonly discriminator?: string\n // ZodEnum stores its admitted values as an array; ZodNativeEnum\n // stores them as the enum OBJECT (`{Red: 'red', '0': 'Red'}` for a\n // numeric enum). The fingerprint walker handles the two shapes in\n // separate branches.\n readonly values?: readonly unknown[] | Record<string, unknown>\n readonly value?: unknown\n readonly innerType?: V3Schema\n readonly defaultValue?: () => unknown\n readonly checks?: readonly unknown[]\n readonly schema?: V3Schema\n readonly effect?: { readonly type?: string }\n readonly getter?: () => V3Schema\n readonly left?: V3Schema\n readonly right?: V3Schema\n readonly catchValue?: () => unknown\n // ZodPipeline stores its input + output sides on `in` / `out`\n // respectively — NOT on `schema`. The pre-fix walker read `schema`\n // (always `undefined`) and emitted `ZodPipeline(?)` for every\n // pipeline.\n readonly in?: V3Schema\n readonly out?: V3Schema\n}\n\nconst cyclicSentinel = '<cyclic>'\n\nexport function fingerprintZodSchema(schema: V3Schema): string {\n const cache = new WeakMap<object, string>()\n const inProgress = new WeakSet<object>()\n return visit(schema, cache, inProgress)\n}\n\nfunction visit(\n schema: V3Schema,\n cache: WeakMap<object, string>,\n inProgress: WeakSet<object>\n): string {\n const key = schema as unknown as object\n const cached = cache.get(key)\n if (cached !== undefined) return cached\n if (inProgress.has(key)) return cyclicSentinel\n inProgress.add(key)\n try {\n const computed = computeFingerprint(schema, cache, inProgress)\n cache.set(key, computed)\n return computed\n } finally {\n inProgress.delete(key)\n }\n}\n\nfunction getDef(schema: V3Schema): V3Def {\n return (schema as unknown as { _def: V3Def })._def\n}\n\nfunction computeFingerprint(\n schema: V3Schema,\n cache: WeakMap<object, string>,\n inProgress: WeakSet<object>\n): string {\n const def = getDef(schema)\n const kind = def.typeName ?? 'ZodUnknown'\n const recurse = (child: V3Schema): string => visit(child, cache, inProgress)\n\n switch (kind) {\n case 'ZodString':\n case 'ZodNumber':\n case 'ZodBigInt':\n case 'ZodDate':\n return `${kind}${formatChecks(def.checks)}`\n\n case 'ZodBoolean':\n case 'ZodNull':\n case 'ZodUndefined':\n case 'ZodAny':\n case 'ZodUnknown':\n case 'ZodNaN':\n case 'ZodVoid':\n case 'ZodNever':\n return kind\n\n case 'ZodLiteral':\n return `ZodLiteral:${canonicalStringify(def.value)}`\n\n case 'ZodEnum': {\n // ZodEnum stores its admitted values as an array on `_def.values`.\n // Sort + canonicalStringify for a deterministic fingerprint.\n const values = Array.isArray(def.values) ? def.values : []\n const sorted = [...values].sort((a, b) => {\n const as = String(a)\n const bs = String(b)\n return as < bs ? -1 : as > bs ? 1 : 0\n })\n return `ZodEnum:${canonicalStringify(sorted)}`\n }\n\n case 'ZodNativeEnum': {\n // ZodNativeEnum stores the enum OBJECT on `_def.values` (e.g.\n // `{Red: 'red'}` for a string enum or `{A: 0, '0': 'A'}` for a\n // numeric enum). The pre-fix walker shared the ZodEnum branch\n // which did `[...values]` — that throws `TypeError: not\n // iterable` on the object. Use `Object.values` to extract the\n // admitted runtime members; numeric enums include their\n // reverse-mapped string keys, which is fine for fingerprint\n // determinism (both forms are valid Zod inputs).\n const values =\n def.values && typeof def.values === 'object' && !Array.isArray(def.values)\n ? Object.values(def.values)\n : []\n const sorted = [...values].sort((a, b) => {\n const as = String(a)\n const bs = String(b)\n return as < bs ? -1 : as > bs ? 1 : 0\n })\n return `ZodNativeEnum:${canonicalStringify(sorted)}`\n }\n\n case 'ZodObject': {\n const shape = readShapeSafely(def)\n const sortedEntries = Object.entries(shape)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([k, v]) => `${JSON.stringify(k)}:${recurse(v)}`)\n // Object-level `formatChecks` matches v4's `object{…}${formatChecks(schema)}`\n // (`fingerprint.ts:148`). ZodObject rarely carries `_def.checks`\n // in v3 — the call is structurally for parity rather than\n // expected-to-fire — but consumers who reach through a custom\n // ZodObject builder that stores extra constraints get them\n // surfaced symmetrically.\n return `ZodObject{${sortedEntries.join(',')}}${formatChecks(def.checks)}`\n }\n\n case 'ZodArray':\n return `ZodArray[${def.type === undefined ? '?' : recurse(def.type)}]${formatChecks(def.checks)}`\n\n case 'ZodTuple': {\n const items = def.items ?? []\n return `ZodTuple[${items.map(recurse).join(',')}]`\n }\n\n case 'ZodRecord': {\n const keyPart = def.keyType === undefined ? '?' : recurse(def.keyType)\n const valuePart = def.valueType === undefined ? '?' : recurse(def.valueType)\n return `ZodRecord<${keyPart},${valuePart}>`\n }\n\n case 'ZodUnion': {\n const options = (def.options ?? []).map(recurse).sort()\n return `ZodUnion(${options.join('|')})`\n }\n\n case 'ZodDiscriminatedUnion': {\n const disc = def.discriminator ?? '?'\n const options = (def.options ?? []).map(recurse).sort()\n return `ZodDiscriminatedUnion[${JSON.stringify(disc)}](${options.join('|')})`\n }\n\n case 'ZodOptional': {\n const inner = def.innerType\n return inner === undefined ? 'ZodOptional(?)' : `ZodOptional(${recurse(inner)})`\n }\n\n case 'ZodNullable': {\n const inner = def.innerType\n return inner === undefined ? 'ZodNullable(?)' : `ZodNullable(${recurse(inner)})`\n }\n\n case 'ZodDefault': {\n const inner = def.innerType\n // v3 stores defaults as a factory: `defaultValue: () => X`.\n // Call it twice and compare with Object.is — non-deterministic\n // factories (`() => new Date()`) return distinct objects each\n // call, so we collapse to `fn:*` to stay idempotent. Pure\n // factories that return the same primitive / cached reference\n // serialise normally.\n return `ZodDefault[${defaultFactoryRepr(def.defaultValue)}](${\n inner === undefined ? '?' : recurse(inner)\n })`\n }\n\n case 'ZodReadonly': {\n const inner = def.innerType\n return inner === undefined ? 'ZodReadonly(?)' : `ZodReadonly(${recurse(inner)})`\n }\n\n case 'ZodEffects': {\n // `.refine` / `.transform` / `.preprocess` — the effect function\n // isn't stably hashable. We can distinguish effect kinds (refine\n // vs transform) via `def.effect.type` and fold that into the\n // fingerprint, but the function body collapses to an opaque\n // sentinel.\n const effectType = def.effect?.type ?? 'effect'\n const inner = def.schema\n return `ZodEffects:${effectType}:fn:*(${inner === undefined ? '?' : recurse(inner)})`\n }\n\n case 'ZodPipeline': {\n // Internally `z.pipe(a, b)` — `.in` and `.out` live on the def\n // (NOT `.schema`). The pre-fix walker read `def.schema`\n // (undefined for a pipeline) so every pipeline collapsed to\n // `ZodPipeline(?)`. Read the input side first (mirrors v4's\n // `unwrapPipe` which returns `in ?? out`); the output side is\n // a derived shape rather than a consumer-authored schema.\n const inner = def.in ?? def.out\n return inner === undefined ? 'ZodPipeline(?)' : `ZodPipeline(${recurse(inner)})`\n }\n\n case 'ZodCatch': {\n const inner = def.innerType ?? def.schema\n const catchRepr = defaultFactoryRepr(def.catchValue)\n return `ZodCatch[${catchRepr}](${inner === undefined ? '?' : recurse(inner)})`\n }\n\n case 'ZodLazy': {\n const resolve = def.getter\n if (typeof resolve !== 'function') return 'ZodLazy(?)'\n try {\n const inner = resolve()\n return `ZodLazy(${recurse(inner)})`\n } catch {\n return 'ZodLazy(?)'\n }\n }\n\n case 'ZodIntersection': {\n const leftPart = def.left === undefined ? '?' : recurse(def.left)\n const rightPart = def.right === undefined ? '?' : recurse(def.right)\n const parts = [leftPart, rightPart].sort()\n return `ZodIntersection(${parts.join('&')})`\n }\n\n case 'ZodSet': {\n // ZodSet stores its element type on `_def.valueType` (same slot\n // ZodRecord uses for its value type). The pre-fix walker fell\n // through to the opaque default branch, so `z.set(z.string())`\n // and `z.set(z.number())` collapsed to the same `ZodSet:*`.\n // Mirrors v4's `set<element>${formatChecks(schema)}`.\n const inner = def.valueType\n return inner === undefined\n ? 'ZodSet(?)'\n : `ZodSet<${recurse(inner)}>${formatChecks(def.checks)}`\n }\n\n case 'ZodBranded': {\n // ZodBranded stores its inner on `_def.type` (the v3 quirk; v4's\n // brand is type-only). The pre-fix walker fell through to the\n // opaque default branch and lost the inner's shape entirely, so\n // `z.string().brand<'A'>()` and `z.number().brand<'B'>()`\n // collapsed to the same `ZodBranded:*`. Brand annotations are\n // type-level only at runtime, so emit just the inner's\n // fingerprint with a transparent wrapper.\n const inner = def.type\n return inner === undefined ? 'ZodBranded(?)' : `ZodBranded(${recurse(inner)})`\n }\n\n // Structural opacity — schemas whose runtime behaviour isn't\n // introspectable via `_def` fall here. Still distinguishable\n // from other kinds by the returned string.\n case 'ZodPromise':\n case 'ZodFunction':\n case 'ZodMap':\n case 'ZodSymbol':\n default:\n return `${kind}:*`\n }\n}\n\nfunction readShapeSafely(def: V3Def): Record<string, V3Schema> {\n if (typeof def.shape !== 'function') return {}\n try {\n return def.shape()\n } catch {\n return {}\n }\n}\n\n/**\n * Render a v3 default / catch factory. Called twice; if the two\n * results differ (by `Object.is`), the factory is non-deterministic\n * and we collapse to `fn:*` to preserve idempotence. Same fix as\n * v4's `defaultValueRepr` — factories like `() => new Date()` would\n * otherwise make the fingerprint time-dependent.\n */\nfunction defaultFactoryRepr(factory: (() => unknown) | undefined): string {\n if (typeof factory !== 'function') return 'none'\n let first: unknown\n let second: unknown\n try {\n first = factory()\n second = factory()\n } catch {\n return 'fn:*'\n }\n if (!Object.is(first, second)) return 'fn:*'\n if (typeof first === 'function') return 'fn:*'\n return canonicalStringify(first)\n}\n\nfunction formatChecks(checks: readonly unknown[] | undefined): string {\n if (!Array.isArray(checks) || checks.length === 0) return ''\n const parts = checks.map((c) => canonicalStringify(c)).sort()\n return `[${parts.join(';')}]`\n}\n"],"names":[],"mappings":";;AAuDA,MAAM,cAAA,GAAiB,UAAA;AAEhB,SAAS,qBAAqB,MAAA,EAA0B;AAC7D,EAAA,MAAM,KAAA,uBAAY,OAAA,EAAwB;AAC1C,EAAA,MAAM,UAAA,uBAAiB,OAAA,EAAgB;AACvC,EAAA,OAAO,KAAA,CAAM,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA;AACxC;AAEA,SAAS,KAAA,CACP,MAAA,EACA,KAAA,EACA,UAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,MAAA;AACZ,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC5B,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AACjC,EAAA,IAAI,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,cAAA;AAChC,EAAA,UAAA,CAAW,IAAI,GAAG,CAAA;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA;AAC7D,IAAA,KAAA,CAAM,GAAA,CAAI,KAAK,QAAQ,CAAA;AACvB,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,UAAA,CAAW,OAAO,GAAG,CAAA;AAAA,EACvB;AACF;AAEA,SAAS,OAAO,MAAA,EAAyB;AACvC,EAAA,OAAQ,MAAA,CAAsC,IAAA;AAChD;AAEA,SAAS,kBAAA,CACP,MAAA,EACA,KAAA,EACA,UAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,OAAO,MAAM,CAAA;AACzB,EAAA,MAAM,IAAA,GAAO,IAAI,QAAA,IAAY,YAAA;AAC7B,EAAA,MAAM,UAAU,CAAC,KAAA,KAA4B,KAAA,CAAM,KAAA,EAAO,OAAO,UAAU,CAAA;AAE3E,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,WAAA;AAAA,IACL,KAAK,WAAA;AAAA,IACL,KAAK,WAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO,GAAG,IAAI,CAAA,EAAG,YAAA,CAAa,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA;AAAA,IAE3C,KAAK,YAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,cAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,YAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,IAAA;AAAA,IAET,KAAK,YAAA;AACH,MAAA,OAAO,CAAA,WAAA,EAAc,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA;AAAA,IAEpD,KAAK,SAAA,EAAW;AAGd,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,GAAI,GAAA,CAAI,SAAS,EAAC;AACzD,MAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAM,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACxC,QAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,QAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,QAAA,OAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,KAAK,CAAA,GAAI,CAAA;AAAA,MACtC,CAAC,CAAA;AACD,MAAA,OAAO,CAAA,QAAA,EAAW,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA;AAAA,IAC9C;AAAA,IAEA,KAAK,eAAA,EAAiB;AASpB,MAAA,MAAM,SACJ,GAAA,CAAI,MAAA,IAAU,OAAO,GAAA,CAAI,MAAA,KAAW,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,GACrE,MAAA,CAAO,OAAO,GAAA,CAAI,MAAM,IACxB,EAAC;AACP,MAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAM,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACxC,QAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,QAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,QAAA,OAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,KAAK,CAAA,GAAI,CAAA;AAAA,MACtC,CAAC,CAAA;AACD,MAAA,OAAO,CAAA,cAAA,EAAiB,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA;AAAA,IACpD;AAAA,IAEA,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,KAAA,GAAQ,gBAAgB,GAAG,CAAA;AACjC,MAAA,MAAM,gBAAgB,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CACvC,KAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAO,CAAA,GAAI,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAE,EAC/C,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AAOvD,MAAA,OAAO,CAAA,UAAA,EAAa,cAAc,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA;AAAA,IACzE;AAAA,IAEA,KAAK,UAAA;AACH,MAAA,OAAO,CAAA,SAAA,EAAY,GAAA,CAAI,IAAA,KAAS,MAAA,GAAY,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA;AAAA,IAEjG,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,IAAS,EAAC;AAC5B,MAAA,OAAO,YAAY,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IACjD;AAAA,IAEA,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,UAAU,GAAA,CAAI,OAAA,KAAY,SAAY,GAAA,GAAM,OAAA,CAAQ,IAAI,OAAO,CAAA;AACrE,MAAA,MAAM,YAAY,GAAA,CAAI,SAAA,KAAc,SAAY,GAAA,GAAM,OAAA,CAAQ,IAAI,SAAS,CAAA;AAC3E,MAAA,OAAO,CAAA,UAAA,EAAa,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,CAAA;AAAA,IAC1C;AAAA,IAEA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,OAAA,GAAA,CAAW,IAAI,OAAA,IAAW,IAAI,GAAA,CAAI,OAAO,EAAE,IAAA,EAAK;AACtD,MAAA,OAAO,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IACtC;AAAA,IAEA,KAAK,uBAAA,EAAyB;AAC5B,MAAA,MAAM,IAAA,GAAO,IAAI,aAAA,IAAiB,GAAA;AAClC,MAAA,MAAM,OAAA,GAAA,CAAW,IAAI,OAAA,IAAW,IAAI,GAAA,CAAI,OAAO,EAAE,IAAA,EAAK;AACtD,MAAA,OAAO,CAAA,sBAAA,EAAyB,KAAK,SAAA,CAAU,IAAI,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IAC5E;AAAA,IAEA,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,QAAQ,GAAA,CAAI,SAAA;AAClB,MAAA,OAAO,UAAU,MAAA,GAAY,gBAAA,GAAmB,CAAA,YAAA,EAAe,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/E;AAAA,IAEA,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,QAAQ,GAAA,CAAI,SAAA;AAClB,MAAA,OAAO,UAAU,MAAA,GAAY,gBAAA,GAAmB,CAAA,YAAA,EAAe,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/E;AAAA,IAEA,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,QAAQ,GAAA,CAAI,SAAA;AAOlB,MAAA,OAAO,CAAA,WAAA,EAAc,kBAAA,CAAmB,GAAA,CAAI,YAAY,CAAC,CAAA,EAAA,EACvD,KAAA,KAAU,MAAA,GAAY,GAAA,GAAM,OAAA,CAAQ,KAAK,CAC3C,CAAA,CAAA,CAAA;AAAA,IACF;AAAA,IAEA,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,QAAQ,GAAA,CAAI,SAAA;AAClB,MAAA,OAAO,UAAU,MAAA,GAAY,gBAAA,GAAmB,CAAA,YAAA,EAAe,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/E;AAAA,IAEA,KAAK,YAAA,EAAc;AAMjB,MAAA,MAAM,UAAA,GAAa,GAAA,CAAI,MAAA,EAAQ,IAAA,IAAQ,QAAA;AACvC,MAAA,MAAM,QAAQ,GAAA,CAAI,MAAA;AAClB,MAAA,OAAO,CAAA,WAAA,EAAc,UAAU,CAAA,MAAA,EAAS,KAAA,KAAU,SAAY,GAAA,GAAM,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IACpF;AAAA,IAEA,KAAK,aAAA,EAAe;AAOlB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,GAAA;AAC5B,MAAA,OAAO,UAAU,MAAA,GAAY,gBAAA,GAAmB,CAAA,YAAA,EAAe,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/E;AAAA,IAEA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,MAAA;AACnC,MAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,GAAA,CAAI,UAAU,CAAA;AACnD,MAAA,OAAO,CAAA,SAAA,EAAY,SAAS,CAAA,EAAA,EAAK,KAAA,KAAU,SAAY,GAAA,GAAM,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC7E;AAAA,IAEA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,UAAU,GAAA,CAAI,MAAA;AACpB,MAAA,IAAI,OAAO,OAAA,KAAY,UAAA,EAAY,OAAO,YAAA;AAC1C,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,OAAA,EAAQ;AACtB,QAAA,OAAO,CAAA,QAAA,EAAW,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,MAClC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,IACF;AAAA,IAEA,KAAK,iBAAA,EAAmB;AACtB,MAAA,MAAM,WAAW,GAAA,CAAI,IAAA,KAAS,SAAY,GAAA,GAAM,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChE,MAAA,MAAM,YAAY,GAAA,CAAI,KAAA,KAAU,SAAY,GAAA,GAAM,OAAA,CAAQ,IAAI,KAAK,CAAA;AACnE,MAAA,MAAM,KAAA,GAAQ,CAAC,QAAA,EAAU,SAAS,EAAE,IAAA,EAAK;AACzC,MAAA,OAAO,CAAA,gBAAA,EAAmB,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IAC3C;AAAA,IAEA,KAAK,QAAA,EAAU;AAMb,MAAA,MAAM,QAAQ,GAAA,CAAI,SAAA;AAClB,MAAA,OAAO,KAAA,KAAU,MAAA,GACb,WAAA,GACA,CAAA,OAAA,EAAU,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA;AAAA,IAC1D;AAAA,IAEA,KAAK,YAAA,EAAc;AAQjB,MAAA,MAAM,QAAQ,GAAA,CAAI,IAAA;AAClB,MAAA,OAAO,UAAU,MAAA,GAAY,eAAA,GAAkB,CAAA,WAAA,EAAc,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC7E;AAAA;AAAA;AAAA;AAAA,IAKA,KAAK,YAAA;AAAA,IACL,KAAK,aAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,WAAA;AAAA,IACL;AACE,MAAA,OAAO,GAAG,IAAI,CAAA,EAAA,CAAA;AAAA;AAEpB;AAEA,SAAS,gBAAgB,GAAA,EAAsC;AAC7D,EAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,UAAA,SAAmB,EAAC;AAC7C,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,KAAA,EAAM;AAAA,EACnB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AASA,SAAS,mBAAmB,OAAA,EAA8C;AACxE,EAAA,IAAI,OAAO,OAAA,KAAY,UAAA,EAAY,OAAO,MAAA;AAC1C,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,OAAA,EAAQ;AAChB,IAAA,MAAA,GAAS,OAAA,EAAQ;AAAA,EACnB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,EAAA,CAAG,KAAA,EAAO,MAAM,GAAG,OAAO,MAAA;AACtC,EAAA,IAAI,OAAO,KAAA,KAAU,UAAA,EAAY,OAAO,MAAA;AACxC,EAAA,OAAO,mBAAmB,KAAK,CAAA;AACjC;AAEA,SAAS,aAAa,MAAA,EAAgD;AACpE,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,MAAM,KAAK,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,EAAA;AAC1D,EAAA,MAAM,KAAA,GAAQ,OAAO,GAAA,CAAI,CAAC,MAAM,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAE,IAAA,EAAK;AAC5D,EAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAC5B;;;;"}