attaform 0.30.0 → 0.30.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/abstract.d.mts +15 -21
  2. package/dist/abstract.mjs +2 -2
  3. package/dist/dev/abstract.mjs +4 -4
  4. package/dist/dev/chunks/devtools.mjs +2 -2
  5. package/dist/dev/directive.mjs +1 -1
  6. package/dist/dev/history.mjs +1 -1
  7. package/dist/dev/index.mjs +5 -5
  8. package/dist/dev/runtime/plugins/attaform.mjs +1 -1
  9. package/dist/dev/shared/{attaform-dev.BK6Ge2qR.mjs → attaform-dev.BJK1kqHY.mjs} +14 -14
  10. package/dist/dev/shared/{attaform-dev.D6CLvaQT.mjs → attaform-dev.BMQ3GcgD.mjs} +46 -59
  11. package/dist/dev/shared/{attaform-dev.BisFstxh.mjs → attaform-dev.BUIFcTYf.mjs} +6 -6
  12. package/dist/dev/shared/{attaform-dev.DTrHonpc.mjs → attaform-dev.CT7MDjPy.mjs} +27 -36
  13. package/dist/dev/shared/{attaform-dev.BcYT6tFh.mjs → attaform-dev.CZz4GYZ6.mjs} +21 -9
  14. package/dist/dev/shared/{attaform-dev.DUZckyV8.mjs → attaform-dev.Chm4D6SJ.mjs} +2 -2
  15. package/dist/dev/shared/{attaform-dev.BcNtyOmf.mjs → attaform-dev.DuEE4GU1.mjs} +4 -4
  16. package/dist/dev/shared/{attaform-dev.CQ2rJiAX.mjs → attaform-dev.DxHdkkPG.mjs} +126 -115
  17. package/dist/dev/shared/{attaform-dev.BQc5QV3Y.mjs → attaform-dev.zlvDr0WB.mjs} +2 -2
  18. package/dist/dev/zod-v3.mjs +6 -6
  19. package/dist/dev/zod-v4.mjs +6 -6
  20. package/dist/dev/zod.mjs +5 -5
  21. package/dist/directive.d.mts +4 -4
  22. package/dist/directive.mjs +1 -1
  23. package/dist/esbuild.d.mts +11 -0
  24. package/dist/esbuild.mjs +1 -1
  25. package/dist/history.d.mts +3 -32
  26. package/dist/history.mjs +1 -1
  27. package/dist/index.d.mts +67 -70
  28. package/dist/index.mjs +3 -3
  29. package/dist/nuxt.d.mts +4 -3
  30. package/dist/nuxt.mjs +3 -6
  31. package/dist/rollup.d.mts +11 -0
  32. package/dist/rollup.mjs +1 -1
  33. package/dist/rspack.d.mts +19 -11
  34. package/dist/rspack.mjs +1 -1
  35. package/dist/runtime/components/AttaformDevtoolsPanel.vue +12 -12
  36. package/dist/runtime/components/DevtoolsValueTree.vue +2 -2
  37. package/dist/shared/{attaform.Rc9u4Vfw.d.mts → attaform.2FslhB9R.d.mts} +83 -95
  38. package/dist/shared/{attaform.BRDDQeHV.mjs → attaform.8mfKZCwH.mjs} +2 -2
  39. package/dist/shared/{attaform.DRUT703x.d.mts → attaform.B-Tb62qV.d.mts} +12 -12
  40. package/dist/shared/{attaform.v0fQtWyA.mjs → attaform.B1rH9ht6.mjs} +1 -1
  41. package/dist/shared/{attaform.ByWP6kSx.mjs → attaform.B2iebkPA.mjs} +3 -3
  42. package/dist/shared/{attaform.DhnPb6nK.mjs → attaform.BAf3UNn4.mjs} +1 -1
  43. package/dist/shared/{attaform.DNJOWjQw.mjs → attaform.BIWicztt.mjs} +102 -100
  44. package/dist/shared/attaform.BcQwgWaq.d.mts +2153 -0
  45. package/dist/shared/attaform.Br8EBn5B.d.mts +4553 -0
  46. package/dist/shared/{attaform.BXneBxEj.mjs → attaform.CO918TdU.mjs} +13 -13
  47. package/dist/shared/{attaform.CUfrMK7t.mjs → attaform.DRsANMok.mjs} +5 -5
  48. package/dist/shared/{attaform.B3resMQ1.mjs → attaform.D_f1WgYf.mjs} +40 -53
  49. package/dist/shared/{attaform.CJ8DpRGj.mjs → attaform.D_pt1gOj.mjs} +26 -33
  50. package/dist/shared/attaform.L0kUn3vL.d.mts +42 -0
  51. package/dist/shared/{attaform.BK0cgu2K.mjs → attaform.ZYn2ahzJ.mjs} +3 -3
  52. package/dist/transforms.d.mts +153 -26
  53. package/dist/transforms.mjs +1 -1
  54. package/dist/vite.d.mts +29 -52
  55. package/dist/vite.mjs +3 -3
  56. package/dist/webpack.d.mts +20 -12
  57. package/dist/webpack.mjs +1 -1
  58. package/dist/zod-v3.d.mts +90 -96
  59. package/dist/zod-v3.mjs +4 -4
  60. package/dist/zod-v4.d.mts +118 -118
  61. package/dist/zod-v4.mjs +4 -4
  62. package/dist/zod.d.mts +5 -5
  63. package/dist/zod.mjs +3 -3
  64. package/package.json +7 -6
  65. package/dist/shared/attaform.Clz0ArIi.d.mts +0 -44
  66. package/dist/shared/attaform.UGyOK83T.d.mts +0 -2366
  67. package/dist/shared/attaform.bKLzMU0o.d.mts +0 -4761
@@ -1,7 +1,7 @@
1
- import { a as InvalidUseFormConfigError } from './attaform-dev.BQc5QV3Y.mjs';
2
- import { u as useForm$2 } from './attaform-dev.DTrHonpc.mjs';
3
- import { u as useForm$1 } from './attaform-dev.BK6Ge2qR.mjs';
4
- import { i as installingFieldMetaStore, g as getFieldMetaForSchema } from './attaform-dev.BisFstxh.mjs';
1
+ import { a as InvalidUseFormConfigError } from './attaform-dev.zlvDr0WB.mjs';
2
+ import { u as useForm$2 } from './attaform-dev.CT7MDjPy.mjs';
3
+ import { u as useForm$1 } from './attaform-dev.BJK1kqHY.mjs';
4
+ import { i as installingFieldMetaStore, g as getFieldMetaForSchema } from './attaform-dev.BUIFcTYf.mjs';
5
5
 
6
6
  function isZodV4SchemaShape(value) {
7
7
  if (typeof value !== "object" || value === null) return false;
@@ -1,11 +1,11 @@
1
1
  import { computed, readonly, toRaw, ref, watchEffect, getCurrentScope, onScopeDispose, shallowReadonly, nextTick, warn, reactive, shallowReactive, shallowRef, toValue, watch, triggerRef, getCurrentInstance, onServerPrefetch, provide, useId, inject, onBeforeMount, onBeforeUpdate, onMounted, effectScope } from 'vue';
2
- import { A as ANONYMOUS_FORM_KEY_PREFIX, i as isShadowedKey, d as safeOwnHas, a as safeOwnRead, e as consumerHas, f as spreadConsumerRecord, g as copyConsumerArray, r as readConsumerIndex, b as safeAssign, h as consumerKeys, j as readConsumerProp, k as diffAndApply, p as pickDefined, s as structuralSnapshot, n as normalizeNumericOption, l as DEFAULT_FIELD_VALIDATION_DEBOUNCE_MS, m as consumerSymbolKeys, o as applyChangedKeys, R as RESERVED_KEY_PREFIX, q as DEFAULT_MAX_RECURSION_DEPTH, t as ANONYMOUS_WIZARD_KEY_PREFIX } from './attaform-dev.BcYT6tFh.mjs';
3
- import { e as ensureAttaformInstalled, u as useRegistry, d as kFormContext, f as kFormInstanceId, b as kAttaformWizardActiveStepResolver, i as kAttaformAncestorWizard } from './attaform-dev.DUZckyV8.mjs';
4
- import { R as REGISTER_OWNER_MARKER, d as armDomBinding, V as V_REGISTER_MARKER } from './attaform-dev.D6CLvaQT.mjs';
5
- import { i as isPathPrefix, e as canonicalizePath, k as keyForSegments, m as mapSegmentKeys, b as ROOT_PATH_KEY, s as segmentsForPathKey, S as SubmitErrorHandlerError, t as toError, j as groupErrorsByKey, n as normalizeErrorInput, h as SET_MEMBER_SEGMENT, R as ROOT_PATH, l as normalizeErrorInputs, a as InvalidUseFormConfigError, d as ReservedFormKeyError } from './attaform-dev.BQc5QV3Y.mjs';
2
+ import { A as ANONYMOUS_FORM_KEY_PREFIX, i as isShadowedKey, d as safeOwnHas, a as safeOwnRead, e as consumerHas, f as spreadConsumerRecord, g as copyConsumerArray, r as readConsumerIndex, b as safeAssign, h as consumerKeys, j as readConsumerProp, k as diffAndApply, p as pickDefined, s as structuralSnapshot, n as normalizeNumericOption, l as DEFAULT_FIELD_VALIDATION_DEBOUNCE_MS, m as consumerSymbolKeys, o as applyChangedKeys, R as RESERVED_KEY_PREFIX, q as DEFAULT_MAX_RECURSION_DEPTH, c as callConsumerFn, t as reportConsumerThrow, u as ANONYMOUS_WIZARD_KEY_PREFIX } from './attaform-dev.CZz4GYZ6.mjs';
3
+ import { e as ensureAttaformInstalled, u as useRegistry, d as kFormContext, f as kFormInstanceId, b as kAttaformWizardActiveStepResolver, i as kAttaformAncestorWizard } from './attaform-dev.Chm4D6SJ.mjs';
4
+ import { R as REGISTER_OWNER_MARKER, d as armDomBinding, V as V_REGISTER_MARKER } from './attaform-dev.BMQ3GcgD.mjs';
5
+ import { i as isPathPrefix, e as canonicalizePath, k as keyForSegments, m as mapSegmentKeys, b as ROOT_PATH_KEY, s as segmentsForPathKey, S as SubmitErrorHandlerError, t as toError, j as groupErrorsByKey, n as normalizeErrorInput, h as SET_MEMBER_SEGMENT, R as ROOT_PATH, l as normalizeErrorInputs, a as InvalidUseFormConfigError, d as ReservedFormKeyError } from './attaform-dev.zlvDr0WB.mjs';
6
6
 
7
7
  const AttaformErrorCode = {
8
- /** A required field is in the blank set — user hasn't supplied a value. */
8
+ /** A required field is in the blank set: no value was supplied. */
9
9
  NoValueSupplied: "atta:no-value-supplied",
10
10
  /** The schema adapter's `validateAtPath` threw synchronously. */
11
11
  AdapterThrew: "atta:adapter-threw",
@@ -565,9 +565,8 @@ function buildLeafFieldStateBase(state, segments, key, formInstanceId) {
565
565
  updatedAt: record?.updatedAt ?? null,
566
566
  errors,
567
567
  // A leaf has no descendants, so its own-bucket errors ARE its subtree
568
- // errors. Reuse the same array reference: referential `ownErrors ===
569
- // errors`, and no second read of the whole-form `derivedBlankErrors`
570
- // map (preserves the P3 blank-reactivity optimization above).
568
+ // errors. Reuse the array reference, which makes `ownErrors === errors`
569
+ // and avoids a second read of the whole-form `derivedBlankErrors` map.
571
570
  ownErrors: errors,
572
571
  validating,
573
572
  valid,
@@ -747,19 +746,19 @@ function buildContainerFieldStateBase(state, segments, key, formInstanceId) {
747
746
  elements: EMPTY_ELEMENTS,
748
747
  updatedAt,
749
748
  errors,
750
- // The container's OWN bucket only (this exact path), excluding every
751
- // descendant that `errors` rolls up: a cross-field `.refine()` here,
752
- // or `setErrors` pinned at this node. The same raw union the leaf
753
- // builds from the three stores; the container already depends on all
754
- // three via `aggregateErrorsAt`, so there's no new reactivity cost.
749
+ // The container's OWN bucket at this exact path, excluding every
750
+ // descendant `errors` rolls up: a cross-field `.refine()` here, or a
751
+ // `setErrors` pinned at this node. The same raw union the leaf builds
752
+ // from the three stores, and the container already depends on all three
753
+ // through `aggregateErrorsAt`, so it costs no new reactivity.
755
754
  ownErrors: state.getErrorsForPath(segments),
756
755
  validating,
757
756
  valid,
758
757
  transforming,
759
758
  busy: transforming || validating,
760
- // A container surfaces its OWN transform failure (a transform registered
761
- // on the container path, e.g. a file normalizer) but never rolls up a
762
- // descendant leaf's failure — that stays a per-field channel.
759
+ // A container surfaces its OWN transform failure, from a transform
760
+ // registered on the container path such as a file normalizer, and never
761
+ // rolls up a descendant's: that stays a per-field channel.
763
762
  transformError: ownTransformError,
764
763
  path: segments,
765
764
  ...computeFieldIdentity(formInstanceId, state.formKey, key),
@@ -886,7 +885,7 @@ function isArrayPath(state, segments) {
886
885
  function warnReadOnly(surface, action, key) {
887
886
  const phrase = action === "write" ? `write to "${String(key)}"` : `${action} of "${String(key)}"`;
888
887
  console.warn(
889
- `[attaform] ${surface} is read-only \u2014 ${phrase} was ignored. Mutate the form via setValue / the directive / field-array helpers instead.`
888
+ `[attaform] ${surface} is read-only; ${phrase} was ignored. Mutate the form via setValue / the directive / field-array helpers instead.`
890
889
  );
891
890
  }
892
891
  function makeReadonlyCoercion(snapshot) {
@@ -1094,9 +1093,9 @@ function buildErrorsSurface(state, sweep) {
1094
1093
  // non-schema keys reachable while a genuinely-absent key stays out.
1095
1094
  hasOwn: (segments, key) => liveContainerHasKey(state, segments, key) || errorAwareContainerKeys(state, segments).includes(key),
1096
1095
  isArrayAt: (segments) => isArrayPath(state, segments),
1097
- // `errors()` / `errors([])` / `errors(path)` are all the subtree
1098
- // aggregate — the same helper `meta.errors` reads, so the surfaces
1099
- // never drift.
1096
+ // `errors()`, `errors([])` and `errors(path)` are all the subtree
1097
+ // aggregate, through the helper `meta.errors` reads, so they cannot
1098
+ // drift.
1100
1099
  call: (path) => aggregateErrorsAt(state, path, keyForSegments(path).key),
1101
1100
  surface: "form.errors",
1102
1101
  sweep
@@ -2161,9 +2160,9 @@ function reportRejection(store, path, kind, accepted) {
2161
2160
  if (!shouldWarnOnce(store, key)) return;
2162
2161
  if (accepted.size === 0) {
2163
2162
  console.warn(
2164
- `[attaform] Cannot write to '${dotted}' \u2014 this path is not in your schema.
2163
+ `[attaform] Cannot write to '${dotted}': this path is not in your schema.
2165
2164
  Fix: check for a typo in register('${dotted}'); it should match a leaf key in your schema.
2166
- (If the path resolves to a never-typed schema, it explicitly admits no values \u2014 relax the schema if intentional.)
2165
+ (If the path resolves to a never-typed schema, it explicitly admits no values; relax the schema if intentional.)
2167
2166
  The write was a no-op.`
2168
2167
  );
2169
2168
  return;
@@ -2171,7 +2170,7 @@ function reportRejection(store, path, kind, accepted) {
2171
2170
  const expected = formatExpectedKinds(accepted);
2172
2171
  if (kind === "string" && accepted.has("number")) {
2173
2172
  console.warn(
2174
- `[attaform] Cannot write a string to '${dotted}' \u2014 the schema expects ${expected}.
2173
+ `[attaform] Cannot write a string to '${dotted}': the schema expects ${expected}.
2175
2174
  Fix: add type="number" to the input, OR use the .number modifier on v-register:
2176
2175
  <input type="number" v-register="register('${dotted}')" />
2177
2176
  <input v-register.number="register('${dotted}')" />
@@ -2180,7 +2179,7 @@ function reportRejection(store, path, kind, accepted) {
2180
2179
  return;
2181
2180
  }
2182
2181
  console.warn(
2183
- `[attaform] Cannot write a ${kind} to '${dotted}' \u2014 the schema expects ${expected}.
2182
+ `[attaform] Cannot write a ${kind} to '${dotted}': the schema expects ${expected}.
2184
2183
  The write was a no-op.`
2185
2184
  );
2186
2185
  }
@@ -2385,7 +2384,7 @@ function buildRegister(state, formInstanceId, instanceConfig) {
2385
2384
  }
2386
2385
  return accepted;
2387
2386
  },
2388
- // Called by the `vRegisterHint` compile-time transform's wrapping
2387
+ // Called by the `vRegisterHintTransform` compile-time transform's wrapping
2389
2388
  // IIFE on every server-side render of `<element v-register="…">`.
2390
2389
  // Without it, every SSR'd FieldState serialises `connected: false`
2391
2390
  // (because Vue skips directive lifecycle during SSR) and the client
@@ -2414,12 +2413,12 @@ function buildRegister(state, formInstanceId, instanceConfig) {
2414
2413
  }
2415
2414
  return false;
2416
2415
  },
2417
- // --- Async transform lifecycle (internal; the directive's
2418
- // deferred orchestrator is the only legitimate consumer). Thin
2419
- // path-bound delegates to the store's per-path token / counter
2420
- // machinery — same pattern as `markBlank` / `setValueWithInternalPath`,
2421
- // so the directive (which holds only this RegisterValue, never the
2422
- // store) can drive the busy/discard/error bookkeeping. ---
2416
+ // --- Async transform lifecycle (internal; the directive's deferred
2417
+ // orchestrator is the only legitimate consumer). Thin path-bound
2418
+ // delegates to the store's per-path token and counter machinery,
2419
+ // the same pattern as `markBlank` and `setValueWithInternalPath`, so
2420
+ // the directive (which holds this RegisterValue and never the store)
2421
+ // can drive the busy / discard / error bookkeeping. ---
2423
2422
  beginTransform: (holder) => state.beginTransform(pathKey, holder),
2424
2423
  isCurrentTransform: (token) => state.isCurrentTransform(pathKey, token),
2425
2424
  endTransform: (token) => state.endTransform(pathKey, token),
@@ -2432,10 +2431,10 @@ function buildRegister(state, formInstanceId, instanceConfig) {
2432
2431
  return (state.fieldTransformCounts.get(pathKey) ?? 0) > 0;
2433
2432
  },
2434
2433
  path: pathKey,
2435
- // Frozen so a wrapper component can pass `rv.segments` directly
2436
- // to `form.fields(...)` without defensive copying — and so test
2437
- // fixtures or downstream code can't mutate the canonical
2438
- // segment list out from under the directive.
2434
+ // Frozen so a wrapper component can pass `rv.segments` straight to
2435
+ // `form.fields(...)` with no defensive copy, and so neither a test
2436
+ // fixture nor downstream code can mutate the canonical segment list
2437
+ // out from under the directive.
2439
2438
  segments: Object.freeze(segments.slice()),
2440
2439
  formKey: state.formKey,
2441
2440
  formInstanceId,
@@ -2641,15 +2640,15 @@ function buildMetaProxy(keys, read) {
2641
2640
  return new Proxy(target, {
2642
2641
  get: (_, key) => owns.has(key) ? read(key) : Reflect.get(target, key),
2643
2642
  has: (_, key) => owns.has(key) || Reflect.has(target, key),
2644
- // Safe to hand back the same array every time: the spec copies a
2645
- // trap's key list before using it.
2643
+ // Safe to hand back the same array every time: the spec copies a trap's
2644
+ // key list before using it.
2646
2645
  ownKeys: () => keys,
2647
2646
  getOwnPropertyDescriptor(_, key) {
2648
2647
  if (!owns.has(key)) return Reflect.getOwnPropertyDescriptor(target, key);
2649
2648
  return { configurable: true, enumerable: true, value: read(key), writable: false };
2650
2649
  },
2651
- // A getter with no setter throws on assignment under strict mode,
2652
- // which every module here is. `false` keeps that.
2650
+ // A getter with no setter throws on assignment under strict mode, which
2651
+ // every module here is; `false` keeps that.
2653
2652
  set: denyWrite,
2654
2653
  deleteProperty: denyWrite,
2655
2654
  defineProperty: denyWrite
@@ -2885,12 +2884,11 @@ function buildFormApi(state, formInstanceId, options = {}) {
2885
2884
  );
2886
2885
  const rootFieldState = getRootFieldStateAt([]);
2887
2886
  const metaOwn = {
2888
- // Whole-form work signals compose the LIFECYCLE counters with the
2889
- // per-leaf rollup: a submit-time validate shows up as
2890
- // activeValidations, per-field debounced validators as
2891
- // fieldValidationCounts — either flips the flag. `valid` keeps the
2892
- // form-level `firstValidationDone` mount gate; `errors` is the
2893
- // unfiltered whole-form aggregate.
2887
+ // Whole-form work signals compose the LIFECYCLE counters with the per-leaf
2888
+ // rollup: a submit-time validate shows up in `activeValidations` and a
2889
+ // per-field debounced validator in `fieldValidationCounts`, and either
2890
+ // flips the flag. `valid` keeps the form-level mount gate, and `errors` is
2891
+ // the unfiltered whole-form aggregate.
2894
2892
  validating: computed(
2895
2893
  () => state.activeValidations.value > 0 || rootFieldState.value.validating
2896
2894
  ),
@@ -2902,7 +2900,7 @@ function buildFormApi(state, formInstanceId, options = {}) {
2902
2900
  busy: computed(
2903
2901
  () => state.activeValidations.value > 0 || state.activeTransforms.value > 0 || rootFieldState.value.validating || rootFieldState.value.transforming
2904
2902
  ),
2905
- // Lifecycle (form-level only — not on FieldState).
2903
+ // Lifecycle, form-level only and never on FieldState.
2906
2904
  submitting,
2907
2905
  submissionAttempts,
2908
2906
  departAttempts,
@@ -3019,10 +3017,10 @@ function buildFormApi(state, formInstanceId, options = {}) {
3019
3017
  }
3020
3018
  const api = {
3021
3019
  handleSubmit: gated(handleSubmit),
3022
- // Callable readonly Proxies (`values`, `fields`, `errors`) and the
3023
- // reactive containers (`meta`, `history`, `blankPaths`) are exposed
3024
- // through getters so reading them activates the form on first
3025
- // touch. Each underlying object is identity-stable across reads.
3020
+ // The callable readonly Proxies (`values`, `fields`, `errors`) and the
3021
+ // reactive containers (`meta`, `history`, `blankPaths`) are exposed through
3022
+ // getters, so reading one activates the form on first touch. Each
3023
+ // underlying object is identity-stable across reads.
3026
3024
  get values() {
3027
3025
  void state.activate();
3028
3026
  return valuesProxy;
@@ -3039,7 +3037,7 @@ function buildFormApi(state, formInstanceId, options = {}) {
3039
3037
  key: state.formKey,
3040
3038
  // Auto-unwrapping views over the per-store async-defaults lifecycle
3041
3039
  // refs (see FormStore.hydrating / hydrateError). Reading either
3042
- // activates the form — observing factory state implies use.
3040
+ // activates the form: observing factory state implies use.
3043
3041
  get hydrating() {
3044
3042
  void state.activate();
3045
3043
  return state.hydrating.value;
@@ -3048,20 +3046,18 @@ function buildFormApi(state, formInstanceId, options = {}) {
3048
3046
  void state.activate();
3049
3047
  return state.hydrateError.value;
3050
3048
  },
3051
- // Orthogonal to `hydrating` and `hydrateError`: `ready` flips true
3052
- // once defaults are applied (sync at construction or async factory
3053
- // resolved successfully). One-way latch — stays true through later
3054
- // refetches even when those refetches fail, so stale-while-
3055
- // revalidate UIs keep rendering the prior values while
3056
- // `hydrateError` surfaces the refresh failure.
3049
+ // Orthogonal to `hydrating` and `hydrateError`. `ready` flips true once
3050
+ // defaults are applied, whether sync at construction or from a factory
3051
+ // that resolved, and it is a one-way latch: it stays true through later
3052
+ // refetches even when those fail, so a stale-while-revalidate UI keeps
3053
+ // rendering the prior values while `hydrateError` surfaces the failure.
3057
3054
  get ready() {
3058
3055
  void state.activate();
3059
3056
  return state.defaultsResolved.value;
3060
3057
  },
3061
- // `rehydrate` and `activate` are themselves activation entry points
3062
- // — they fire the factory by design. Wrapping them with `gated`
3063
- // would double-fire (`state.activate()` plus the underlying call),
3064
- // so they call `state` directly.
3058
+ // `rehydrate` and `activate` are activation entry points themselves and
3059
+ // fire the factory by design, so wrapping them in `gated` would
3060
+ // double-fire. They call `state` directly.
3065
3061
  rehydrate: () => state.rehydrate(),
3066
3062
  activate: () => state.activate(),
3067
3063
  get errors() {
@@ -3724,19 +3720,16 @@ function touchFieldRecord(st, pathKey, path, patch) {
3724
3720
  path,
3725
3721
  updatedAt: patch.updatedAt ?? current?.updatedAt ?? null,
3726
3722
  connected: patch.connected ?? current?.connected ?? false,
3727
- // focused/blurred use an explicit-undefined guard because
3728
- // patches legitimately carry `null` to mark a disconnect — the
3729
- // `??` operator would short-circuit on null and fall through to
3730
- // `current`, losing the intent. `!== undefined` honours an
3731
- // explicit null and preserves current only on absence.
3723
+ // `focused` / `blurred` need an explicit-undefined guard: a patch
3724
+ // legitimately carries `null` to mark a disconnect, and `??` would
3725
+ // short-circuit on it and fall through to `current`, losing the intent.
3732
3726
  focused: patch.focused !== void 0 ? patch.focused : current?.focused ?? null,
3733
3727
  blurred: patch.blurred !== void 0 ? patch.blurred : current?.blurred ?? null,
3734
- // touched is plain `boolean`; `??` is equivalent to the explicit
3735
- // guard here because `false` is not nullish.
3728
+ // `touched` is a plain boolean, so `??` is equivalent to the guard above.
3736
3729
  touched: patch.touched ?? current?.touched ?? false,
3737
- // interacted is sticky-true; a merge patch only ever sets it, so
3738
- // `??` preserves the current bit. It flips back to false solely
3739
- // through the reset paths, which reconstruct the record outright.
3730
+ // `interacted` is sticky-true and a merge patch only ever sets it, so `??`
3731
+ // preserves the current bit. Only the reset paths clear it, and they
3732
+ // reconstruct the record outright.
3740
3733
  interacted: patch.interacted ?? current?.interacted ?? false,
3741
3734
  blurredAfterInteraction: patch.blurredAfterInteraction ?? current?.blurredAfterInteraction ?? false
3742
3735
  });
@@ -4305,13 +4298,13 @@ function markFocused(st, path, focused, meta) {
4305
4298
  touchFieldRecord(st, key, path, {
4306
4299
  focused,
4307
4300
  blurred: !focused,
4308
- // `touched` flips to true on blur and stays true thereafter; while
4309
- // a field is currently focused we keep whatever value it held.
4301
+ // `touched` flips true on blur and stays; a focused field keeps whatever
4302
+ // it held.
4310
4303
  touched: focused ? current?.touched ?? false : true,
4311
- // `blurredAfterInteraction` flips true on the first blur that lands
4312
- // after a value edit and stays true. A tab-through blur before any
4313
- // edit leaves it false (`interacted` is still false at that blur),
4314
- // which is what keeps a clean tab-through from arming the gate.
4304
+ // `blurredAfterInteraction` flips true on the first blur after a value
4305
+ // edit and stays. A tab-through blur before any edit leaves it false,
4306
+ // since `interacted` is still false, which is what keeps a clean
4307
+ // tab-through from arming the gate.
4315
4308
  blurredAfterInteraction: !focused && current?.interacted === true ? true : current?.blurredAfterInteraction ?? false
4316
4309
  });
4317
4310
  const focusMode = meta?.instance?.validateOn ?? st.fieldValidationMode;
@@ -4507,7 +4500,7 @@ function resetField(st, path) {
4507
4500
  const wrote = setValueAtPath(st, targetSegments, leafEntry.value);
4508
4501
  if (!wrote) {
4509
4502
  console.error(
4510
- `[attaform] resetField: leaf write rejected for path '${targetKey}' \u2014 originals contain a value that doesn't satisfy the slim primitive shape. This is a bug in the construction pipeline.`
4503
+ `[attaform] resetField: leaf write rejected for path '${targetKey}'. Originals contain a value that doesn't satisfy the slim primitive shape. This is a bug in the construction pipeline.`
4511
4504
  );
4512
4505
  }
4513
4506
  } else {
@@ -4528,7 +4521,7 @@ function resetField(st, path) {
4528
4521
  const wroteSubtree = setValueAtPath(st, targetSegments, subtree);
4529
4522
  if (!wroteSubtree) {
4530
4523
  console.error(
4531
- `[attaform] resetField: subtree write rejected at path '${targetKey}' \u2014 originals contain values that don't satisfy the slim primitive shape. This is a bug in the construction pipeline.`
4524
+ `[attaform] resetField: subtree write rejected at path '${targetKey}'. Originals contain values that don't satisfy the slim primitive shape. This is a bug in the construction pipeline.`
4532
4525
  );
4533
4526
  }
4534
4527
  }
@@ -4783,15 +4776,12 @@ function createFormStore(options) {
4783
4776
  blankPaths,
4784
4777
  originalBlankPaths,
4785
4778
  // --- kernel-internal state ---
4786
- // Defensive copy, not a fix for an observed alias: today
4787
- // `getDefaultValues` happens to build a fresh tree, so form storage
4788
- // does not currently share structure with the consumer's object.
4789
- // That is an adapter implementation detail rather than a contract,
4790
- // and this field is now durable state that every `reset()` reads, so
4791
- // it should not depend on it. The copy also means a consumer who
4792
- // keeps a reference to the literal they passed cannot mutate the
4793
- // form's defaults from outside. `reset()` snapshots for a harder
4794
- // reason (see there) where an alias IS reachable.
4779
+ // A defensive copy. `getDefaultValues` building a fresh tree is an adapter
4780
+ // implementation detail, not a contract, and this field is durable state
4781
+ // that every `reset()` reads, so it must not depend on one. The copy also
4782
+ // stops a consumer holding a reference to the literal they passed from
4783
+ // mutating the form's defaults from outside. `reset()` snapshots for a
4784
+ // harder reason, where an alias IS reachable.
4795
4785
  defaultValues: structuralSnapshot(defaultValues),
4796
4786
  ssrPrefetch,
4797
4787
  rememberVariants,
@@ -4829,10 +4819,10 @@ function createFormStore(options) {
4829
4819
  arrayElementKey: bind(arrayElementKey),
4830
4820
  reset: bind(reset),
4831
4821
  resetField: bind(resetField),
4832
- // The schema/user pair below reads as a fold waiting to happen. It was
4833
- // tried: a `setErrorsForPathIn(channel)` factory measured 10 B LARGER,
4834
- // because gzip had already collected the rent on two adjacent copies
4835
- // and the helper added a name the original did not need.
4822
+ // The schema/user pair below reads as a fold waiting to happen. Folding
4823
+ // them into a `setErrorsForPathIn(channel)` factory measures 10 B LARGER:
4824
+ // gzip has already collected the rent on two adjacent copies, and the
4825
+ // helper adds a name the original does not need.
4836
4826
  setSchemaErrorsForPath: (path, entries) => setErrorChannelForKey(
4837
4827
  st,
4838
4828
  canonicalizePath(path).key,
@@ -5041,12 +5031,10 @@ function buildFreshState(key, schema, configuration, registry) {
5041
5031
  coerce: configuration.coerce,
5042
5032
  initialBlankPaths
5043
5033
  }),
5044
- // Server-only: bind the SSR prefetch coordination handles. `enqueue`
5045
- // records intent on every `state.activate()` so a wizard skip-list
5046
- // override or a future transform mark has a consistent set to diff
5047
- // against; `shouldFire` lets the activate path bail when the
5048
- // wizard explicitly skipped this key — even an explicit
5049
- // `form.activate()` defers to the wizard's render-efficiency
5034
+ // Server only. `enqueue` records intent on every `state.activate()`
5035
+ // so a wizard skip-list override has a consistent set to diff
5036
+ // against; `shouldFire` lets the activate path bail on a key the
5037
+ // wizard skipped. Even an explicit `form.activate()` defers to that
5050
5038
  // skip-list on the server.
5051
5039
  ...registry.ssr ? {
5052
5040
  ssrPrefetch: {
@@ -5259,7 +5247,7 @@ function warnOutsideSetup() {
5259
5247
  warnedOutsideSetup = true;
5260
5248
  const frame = captureUserCallSite();
5261
5249
  console.warn(
5262
- `[attaform] useRegister() called outside a component setup; returning an unbound RegisterValue proxy. Fix: call it inside <script setup> or a setup() function \u2014 not from an event handler or async callback.` + (frame !== void 0 ? ` ${frame}` : "")
5250
+ `[attaform] useRegister() called outside a component setup; returning an unbound RegisterValue proxy. Fix: call it inside <script setup> or a setup() function, not from an event handler or async callback.` + (frame !== void 0 ? ` ${frame}` : "")
5263
5251
  );
5264
5252
  }
5265
5253
  function warnNoParentRV(instance) {
@@ -5490,7 +5478,7 @@ function useWizard(options) {
5490
5478
  const rawSteps = Array.isArray(options.steps) ? options.steps : [];
5491
5479
  if (rawSteps.length === 0 && true) {
5492
5480
  console.error(
5493
- "[attaform] useWizard({ steps }): expected a non-empty array of step slots. Continuing with an empty step list \u2014 wizard.currentStep reads as undefined, navigation refuses, handleSubmit no-ops."
5481
+ "[attaform] useWizard({ steps }): expected a non-empty array of step slots. Continuing with an empty step list: wizard.currentStep reads as undefined, navigation refuses, handleSubmit no-ops."
5494
5482
  );
5495
5483
  }
5496
5484
  const registry = useRegistry();
@@ -5579,33 +5567,45 @@ function useWizard(options) {
5579
5567
  return activeKey.value === "" ? void 0 : activeKey.value;
5580
5568
  }
5581
5569
  };
5582
- function lazyComputedFor(marker) {
5570
+ function lazyComputedFor(marker, index) {
5583
5571
  const cached = lazyComputeds.get(marker);
5584
5572
  if (cached !== void 0) return cached;
5585
5573
  const c = computed(() => {
5586
5574
  void lazyEpoch.value;
5587
- return marker.resolve(slotCtx);
5575
+ return callConsumerFn(
5576
+ () => marker.resolve(slotCtx),
5577
+ void 0,
5578
+ "wizard-lazy-slot",
5579
+ `steps[${index}]`
5580
+ );
5588
5581
  });
5589
5582
  lazyComputeds.set(marker, c);
5590
5583
  return c;
5591
5584
  }
5592
5585
  const MAX_SLOT_DEPTH = 32;
5593
- function normalizeSlot(slot, ctx, gated, depth) {
5586
+ function normalizeSlot(slot, ctx, gated, depth, index) {
5594
5587
  if (depth > MAX_SLOT_DEPTH) {
5595
5588
  {
5596
5589
  console.warn(
5597
- `[attaform] useWizard: a step slot nested past ${MAX_SLOT_DEPTH} levels (gate / lazy / function); dropping it. Check for a resolver that returns itself.`
5590
+ `[attaform] useWizard: steps[${index}] nested past ${MAX_SLOT_DEPTH} levels (gate / lazy / function); dropping it. Check for a resolver that returns itself.`
5598
5591
  );
5599
5592
  }
5600
5593
  return void 0;
5601
5594
  }
5602
5595
  if (slot === void 0 || slot === null) return void 0;
5603
5596
  if (typeof slot === "string") return { form: getOrBuildNoop(slot), gated };
5604
- if (isGateMarker(slot)) return normalizeSlot(slot.inner, ctx, true, depth + 1);
5605
- if (isLazyMarker(slot)) return normalizeSlot(lazyComputedFor(slot).value, ctx, gated, depth + 1);
5597
+ if (isGateMarker(slot)) return normalizeSlot(slot.inner, ctx, true, depth + 1, index);
5598
+ if (isLazyMarker(slot)) {
5599
+ return normalizeSlot(lazyComputedFor(slot, index).value, ctx, gated, depth + 1, index);
5600
+ }
5606
5601
  if (typeof slot === "function") {
5607
- const result = slot(ctx);
5608
- return normalizeSlot(result, ctx, gated, depth + 1);
5602
+ const result = callConsumerFn(
5603
+ () => slot(ctx),
5604
+ void 0,
5605
+ "wizard-slot",
5606
+ `steps[${index}]`
5607
+ );
5608
+ return normalizeSlot(result, ctx, gated, depth + 1, index);
5609
5609
  }
5610
5610
  if (isAnyForm(slot)) return { form: slot, gated };
5611
5611
  return void 0;
@@ -5614,7 +5614,7 @@ function useWizard(options) {
5614
5614
  const out = [];
5615
5615
  const seen = /* @__PURE__ */ new Set();
5616
5616
  for (let i = 0; i < rawSteps.length; i++) {
5617
- const norm = normalizeSlot(rawSteps[i], slotCtx, false, 0);
5617
+ const norm = normalizeSlot(rawSteps[i], slotCtx, false, 0, i);
5618
5618
  if (norm === void 0) continue;
5619
5619
  const { form, gated } = norm;
5620
5620
  if (seen.has(form.key)) {
@@ -5927,13 +5927,15 @@ function useWizard(options) {
5927
5927
  seedRef.value = resolved.value;
5928
5928
  applyGateSeed(resolved.value);
5929
5929
  } else {
5930
- const eager = resolved.factory();
5930
+ const eager = callConsumerFn(() => resolved.factory(), void 0, "wizard-default-statuses");
5931
5931
  if (eager instanceof Promise) {
5932
5932
  void eager.then((value) => {
5933
5933
  seedRef.value = value;
5934
5934
  applyGateSeed(value);
5935
+ }).catch((err) => {
5936
+ reportConsumerThrow("wizard-default-statuses", void 0, err);
5935
5937
  });
5936
- } else {
5938
+ } else if (eager !== void 0) {
5937
5939
  seedRef.value = eager;
5938
5940
  applyGateSeed(eager);
5939
5941
  }
@@ -6019,10 +6021,15 @@ function useWizard(options) {
6019
6021
  }
6020
6022
  const progressOverride = options.progress;
6021
6023
  const progress = computed(() => {
6024
+ const list = compiledSteps.value;
6022
6025
  if (progressOverride !== void 0) {
6023
- return progressOverride(compiledSteps.value);
6026
+ const override = callConsumerFn(
6027
+ () => progressOverride(list),
6028
+ null,
6029
+ "wizard-progress"
6030
+ );
6031
+ if (override !== null) return override;
6024
6032
  }
6025
- const list = compiledSteps.value;
6026
6033
  if (list.length === 0) return 0;
6027
6034
  let valid = 0;
6028
6035
  for (const step of list) {
@@ -6050,11 +6057,15 @@ function useWizard(options) {
6050
6057
  historyHandle.subscribe((value) => {
6051
6058
  urlMirror.value = value;
6052
6059
  });
6053
- const restoreCallback = options.restore === false ? void 0 : options.restore !== void 0 ? options.restore : () => {
6060
+ const consumerRestore = options.restore;
6061
+ const restoreCallback = consumerRestore === false ? void 0 : consumerRestore !== void 0 ? () => callConsumerFn(() => consumerRestore(), void 0, "wizard-restore") : () => {
6054
6062
  const value = urlMirror.value;
6055
6063
  return value === void 0 ? void 0 : { step: value };
6056
6064
  };
6057
- const persistCallback = options.persist === false ? void 0 : options.persist !== void 0 ? options.persist : (state) => {
6065
+ const consumerPersist = options.persist;
6066
+ const persistCallback = consumerPersist === false ? void 0 : consumerPersist !== void 0 ? (state) => {
6067
+ callConsumerFn(() => consumerPersist(state), void 0, "wizard-persist");
6068
+ } : (state) => {
6058
6069
  if (state.step === void 0) return;
6059
6070
  const current = historyHandle.read();
6060
6071
  const effectiveCurrent = current !== void 0 && isCompiledKey(current) ? current : firstKey();
@@ -9,7 +9,7 @@ class InvalidPathError extends AttaformError {
9
9
  class InvalidUseFormConfigError extends AttaformError {
10
10
  constructor() {
11
11
  super(
12
- "[attaform] useForm received an invalid configuration (a schema directly, no argument, or no `schema` field). Pass it as `useForm({ schema })` \u2014 the schema is one of several configuration options. See https://attaform.dev/docs/reading-the-form/the-form for the full configuration shape."
12
+ "[attaform] useForm received an invalid configuration (a schema directly, no argument, or no `schema` field). Pass it as `useForm({ schema })`: the schema is one of several configuration options. See https://attaform.dev/docs/reading-the-form/the-form for the full configuration shape."
13
13
  );
14
14
  }
15
15
  }
@@ -57,7 +57,7 @@ class OutsideSetupError extends AttaformError {
57
57
  class ReservedFormKeyError extends AttaformError {
58
58
  constructor(key) {
59
59
  super(
60
- `[attaform] Form key "${key}" uses the reserved "__atta:" namespace. Use a different prefix \u2014 "__atta:" is for library-internal synthetic keys (anonymous useForm() calls without an explicit key).`
60
+ `[attaform] Form key "${key}" uses the reserved "__atta:" namespace. Use a different prefix: "__atta:" is for library-internal synthetic keys (anonymous useForm() calls without an explicit key).`
61
61
  );
62
62
  }
63
63
  }
@@ -1,9 +1,9 @@
1
- export { i as isZodSchemaType, u as useForm, z as zodAdapter } from './shared/attaform-dev.DTrHonpc.mjs';
2
- import { i as installingFieldMetaStore, g as getFieldMetaForSchema } from './shared/attaform-dev.BisFstxh.mjs';
3
- export { A as AttaformError, I as InvalidPathError, a as InvalidUseFormConfigError, O as OutsideSetupError, R as ROOT_PATH, b as ROOT_PATH_KEY, c as RegistryNotInstalledError, d as ReservedFormKeyError, S as SubmitErrorHandlerError, e as canonicalizePath, i as isPathPrefix, p as parseDottedPath } from './shared/attaform-dev.BQc5QV3Y.mjs';
4
- export { A as AttaformErrorCode, e as escapeForInlineScript, g as gate, i as injectForm, a as injectWizard, b as isUnset, l as lazy, u as unset, d as useRegister, f as useWizard } from './shared/attaform-dev.CQ2rJiAX.mjs';
5
- export { D as DEVTOOLS_WINDOW_KEY, c as createAttaform, a as createRegistry, g as getRegistryFromApp, h as hydrateAttaformState, k as kAttaformRegistry, r as renderAttaformState, u as useRegistry } from './shared/attaform-dev.DUZckyV8.mjs';
6
- export { a as assignKey, i as isRegisterValue, v as vRegister } from './shared/attaform-dev.D6CLvaQT.mjs';
1
+ export { i as isZodSchemaType, u as useForm, z as zodAdapter } from './shared/attaform-dev.CT7MDjPy.mjs';
2
+ import { i as installingFieldMetaStore, g as getFieldMetaForSchema } from './shared/attaform-dev.BUIFcTYf.mjs';
3
+ export { A as AttaformError, I as InvalidPathError, a as InvalidUseFormConfigError, O as OutsideSetupError, R as ROOT_PATH, b as ROOT_PATH_KEY, c as RegistryNotInstalledError, d as ReservedFormKeyError, S as SubmitErrorHandlerError, e as canonicalizePath, i as isPathPrefix, p as parseDottedPath } from './shared/attaform-dev.zlvDr0WB.mjs';
4
+ export { A as AttaformErrorCode, e as escapeForInlineScript, g as gate, i as injectForm, a as injectWizard, b as isUnset, l as lazy, u as unset, d as useRegister, f as useWizard } from './shared/attaform-dev.DxHdkkPG.mjs';
5
+ export { D as DEVTOOLS_WINDOW_KEY, c as createAttaform, a as createRegistry, g as getRegistryFromApp, h as hydrateAttaformState, k as kAttaformRegistry, r as renderAttaformState, u as useRegistry } from './shared/attaform-dev.Chm4D6SJ.mjs';
6
+ export { a as assignKey, i as isRegisterValue, v as vRegister } from './shared/attaform-dev.BMQ3GcgD.mjs';
7
7
 
8
8
  const fieldMeta = installingFieldMetaStore;
9
9
  function withMeta(schema, payload) {
@@ -1,9 +1,9 @@
1
- export { a as assertZodVersion, k as kindOf, u as useForm, z as zodAdapter } from './shared/attaform-dev.BK6Ge2qR.mjs';
2
- import { i as installingFieldMetaStore, g as getFieldMetaForSchema } from './shared/attaform-dev.BisFstxh.mjs';
3
- export { A as AttaformError, I as InvalidPathError, a as InvalidUseFormConfigError, O as OutsideSetupError, R as ROOT_PATH, b as ROOT_PATH_KEY, c as RegistryNotInstalledError, d as ReservedFormKeyError, S as SubmitErrorHandlerError, e as canonicalizePath, i as isPathPrefix, p as parseDottedPath } from './shared/attaform-dev.BQc5QV3Y.mjs';
4
- export { A as AttaformErrorCode, e as escapeForInlineScript, g as gate, i as injectForm, a as injectWizard, b as isUnset, l as lazy, u as unset, d as useRegister, f as useWizard } from './shared/attaform-dev.CQ2rJiAX.mjs';
5
- export { D as DEVTOOLS_WINDOW_KEY, c as createAttaform, a as createRegistry, g as getRegistryFromApp, h as hydrateAttaformState, k as kAttaformRegistry, r as renderAttaformState, u as useRegistry } from './shared/attaform-dev.DUZckyV8.mjs';
6
- export { a as assignKey, i as isRegisterValue, v as vRegister } from './shared/attaform-dev.D6CLvaQT.mjs';
1
+ export { a as assertZodVersion, k as kindOf, u as useForm, z as zodAdapter } from './shared/attaform-dev.BJK1kqHY.mjs';
2
+ import { i as installingFieldMetaStore, g as getFieldMetaForSchema } from './shared/attaform-dev.BUIFcTYf.mjs';
3
+ export { A as AttaformError, I as InvalidPathError, a as InvalidUseFormConfigError, O as OutsideSetupError, R as ROOT_PATH, b as ROOT_PATH_KEY, c as RegistryNotInstalledError, d as ReservedFormKeyError, S as SubmitErrorHandlerError, e as canonicalizePath, i as isPathPrefix, p as parseDottedPath } from './shared/attaform-dev.zlvDr0WB.mjs';
4
+ export { A as AttaformErrorCode, e as escapeForInlineScript, g as gate, i as injectForm, a as injectWizard, b as isUnset, l as lazy, u as unset, d as useRegister, f as useWizard } from './shared/attaform-dev.DxHdkkPG.mjs';
5
+ export { D as DEVTOOLS_WINDOW_KEY, c as createAttaform, a as createRegistry, g as getRegistryFromApp, h as hydrateAttaformState, k as kAttaformRegistry, r as renderAttaformState, u as useRegistry } from './shared/attaform-dev.Chm4D6SJ.mjs';
6
+ export { a as assignKey, i as isRegisterValue, v as vRegister } from './shared/attaform-dev.BMQ3GcgD.mjs';
7
7
 
8
8
  const fieldMeta = installingFieldMetaStore;
9
9
  function withMeta(schema, payload) {
package/dist/dev/zod.mjs CHANGED
@@ -1,5 +1,5 @@
1
- export { A as AttaformError, I as InvalidPathError, a as InvalidUseFormConfigError, O as OutsideSetupError, R as ROOT_PATH, b as ROOT_PATH_KEY, c as RegistryNotInstalledError, d as ReservedFormKeyError, S as SubmitErrorHandlerError, e as canonicalizePath, i as isPathPrefix, p as parseDottedPath } from './shared/attaform-dev.BQc5QV3Y.mjs';
2
- export { A as AttaformErrorCode, e as escapeForInlineScript, g as gate, i as injectForm, a as injectWizard, b as isUnset, l as lazy, u as unset, d as useRegister, f as useWizard } from './shared/attaform-dev.CQ2rJiAX.mjs';
3
- export { D as DEVTOOLS_WINDOW_KEY, c as createAttaform, a as createRegistry, g as getRegistryFromApp, h as hydrateAttaformState, k as kAttaformRegistry, r as renderAttaformState, u as useRegistry } from './shared/attaform-dev.DUZckyV8.mjs';
4
- export { a as assignKey, i as isRegisterValue, v as vRegister } from './shared/attaform-dev.D6CLvaQT.mjs';
5
- export { f as fieldMeta, u as useForm, w as withMeta } from './shared/attaform-dev.BcNtyOmf.mjs';
1
+ export { A as AttaformError, I as InvalidPathError, a as InvalidUseFormConfigError, O as OutsideSetupError, R as ROOT_PATH, b as ROOT_PATH_KEY, c as RegistryNotInstalledError, d as ReservedFormKeyError, S as SubmitErrorHandlerError, e as canonicalizePath, i as isPathPrefix, p as parseDottedPath } from './shared/attaform-dev.zlvDr0WB.mjs';
2
+ export { A as AttaformErrorCode, e as escapeForInlineScript, g as gate, i as injectForm, a as injectWizard, b as isUnset, l as lazy, u as unset, d as useRegister, f as useWizard } from './shared/attaform-dev.DxHdkkPG.mjs';
3
+ export { D as DEVTOOLS_WINDOW_KEY, c as createAttaform, a as createRegistry, g as getRegistryFromApp, h as hydrateAttaformState, k as kAttaformRegistry, r as renderAttaformState, u as useRegistry } from './shared/attaform-dev.Chm4D6SJ.mjs';
4
+ export { a as assignKey, i as isRegisterValue, v as vRegister } from './shared/attaform-dev.BMQ3GcgD.mjs';
5
+ export { f as fieldMeta, u as useForm, w as withMeta } from './shared/attaform-dev.DuEE4GU1.mjs';
@@ -1,5 +1,5 @@
1
- export { i as installVRegister, v as vRegister } from './shared/attaform.Clz0ArIi.mjs';
2
- import { ao as RegisterModelDynamicCustomDirective } from './shared/attaform.bKLzMU0o.mjs';
1
+ export { i as installVRegister, v as vRegister } from './shared/attaform.L0kUn3vL.mjs';
2
+ import { ao as RegisterModelDynamicCustomDirective } from './shared/attaform.Br8EBn5B.mjs';
3
3
  import 'vue';
4
4
 
5
5
  /**
@@ -8,11 +8,11 @@ import 'vue';
8
8
  * `File[]` (multiple). Storage is the canonical blank shape (`null` /
9
9
  * `[]`) when no file is selected, with the path marked in
10
10
  * `blankPaths` so the friendly "No value supplied" error surfaces
11
- * through `derivedBlankErrors` on required-file fields — same channel
11
+ * through `derivedBlankErrors` on required-file fields, the same channel
12
12
  * as required numbers / bigints.
13
13
  *
14
14
  * The `beforeUpdate` hook keeps the DOM in lockstep with storage by
15
- * clearing `el.value` when storage transitions to blank — the only
15
+ * clearing `el.value` when storage transitions to blank, the only
16
16
  * programmatic write browsers permit on file inputs.
17
17
  */
18
18
  declare const vRegisterFile: RegisterModelDynamicCustomDirective;
@@ -1 +1 @@
1
- export { i as installVRegister, v as vRegister, b as vRegisterFile } from './shared/attaform.B3resMQ1.mjs';
1
+ export { i as installVRegister, v as vRegister, b as vRegisterFile } from './shared/attaform.D_f1WgYf.mjs';