attaform 0.20.1 → 0.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +1 -1
  2. package/dist/chunks/devtools.cjs +2 -2
  3. package/dist/chunks/devtools.cjs.map +1 -1
  4. package/dist/chunks/devtools.mjs +2 -2
  5. package/dist/chunks/devtools.mjs.map +1 -1
  6. package/dist/chunks/indexeddb.cjs +1 -1
  7. package/dist/chunks/indexeddb.mjs +1 -1
  8. package/dist/chunks/local-storage.cjs +1 -1
  9. package/dist/chunks/local-storage.mjs +1 -1
  10. package/dist/chunks/session-storage.cjs +1 -1
  11. package/dist/chunks/session-storage.mjs +1 -1
  12. package/dist/index.cjs +3 -3
  13. package/dist/index.d.cts +4 -4
  14. package/dist/index.d.mts +4 -4
  15. package/dist/index.d.ts +4 -4
  16. package/dist/index.mjs +5 -5
  17. package/dist/nuxt.d.cts +1 -1
  18. package/dist/nuxt.d.mts +1 -1
  19. package/dist/nuxt.d.ts +1 -1
  20. package/dist/runtime/plugins/attaform.cjs +2 -2
  21. package/dist/runtime/plugins/attaform.mjs +2 -2
  22. package/dist/shared/{attaform.SfhU0OEY.d.cts → attaform.99cfHcIt.d.cts} +26 -9
  23. package/dist/shared/{attaform.SfhU0OEY.d.mts → attaform.99cfHcIt.d.mts} +26 -9
  24. package/dist/shared/{attaform.SfhU0OEY.d.ts → attaform.99cfHcIt.d.ts} +26 -9
  25. package/dist/shared/{attaform.tVkmQh5w.mjs → attaform.BGk8cfw2.mjs} +3 -3
  26. package/dist/shared/{attaform.tVkmQh5w.mjs.map → attaform.BGk8cfw2.mjs.map} +1 -1
  27. package/dist/shared/{attaform.GbDo_lJi.d.cts → attaform.BXinSW2T.d.mts} +1 -1
  28. package/dist/shared/{attaform.DHRWn-cu.cjs → attaform.B_hph5AE.cjs} +3 -3
  29. package/dist/shared/{attaform.DHRWn-cu.cjs.map → attaform.B_hph5AE.cjs.map} +1 -1
  30. package/dist/shared/{attaform.iWo9soNX.mjs → attaform.C5aYC_T8.mjs} +4 -4
  31. package/dist/shared/{attaform.iWo9soNX.mjs.map → attaform.C5aYC_T8.mjs.map} +1 -1
  32. package/dist/shared/{attaform.BrrXNmfK.cjs → attaform.Cd4AOfwu.cjs} +4 -4
  33. package/dist/shared/{attaform.BrrXNmfK.cjs.map → attaform.Cd4AOfwu.cjs.map} +1 -1
  34. package/dist/shared/{attaform.EZG6fOFb.mjs → attaform.CnrxbkB6.mjs} +2 -2
  35. package/dist/shared/{attaform.EZG6fOFb.mjs.map → attaform.CnrxbkB6.mjs.map} +1 -1
  36. package/dist/shared/{attaform.DLnE5bZa.cjs → attaform.CwLjUqmQ.cjs} +7 -3
  37. package/dist/shared/attaform.CwLjUqmQ.cjs.map +1 -0
  38. package/dist/shared/{attaform.DoKXru-a.d.mts → attaform.CywE4y8x.d.cts} +1 -1
  39. package/dist/shared/{attaform.BPxsYtTe.cjs → attaform.D2SCCd4O.cjs} +2 -2
  40. package/dist/shared/{attaform.BPxsYtTe.cjs.map → attaform.D2SCCd4O.cjs.map} +1 -1
  41. package/dist/shared/{attaform.BCBxTyMC.cjs → attaform.DAKrGhxc.cjs} +4 -4
  42. package/dist/shared/{attaform.BCBxTyMC.cjs.map → attaform.DAKrGhxc.cjs.map} +1 -1
  43. package/dist/shared/{attaform.Dl5kDY-A.d.ts → attaform.DN5CvZrg.d.ts} +1 -1
  44. package/dist/shared/{attaform.D5-1XGQU.d.cts → attaform.DbRgDFa7.d.cts} +1 -1
  45. package/dist/shared/{attaform.D6CwqkPx.mjs → attaform.Dt7dEcHk.mjs} +4 -4
  46. package/dist/shared/{attaform.D6CwqkPx.mjs.map → attaform.Dt7dEcHk.mjs.map} +1 -1
  47. package/dist/shared/{attaform.BKozEdTr.mjs → attaform.QG5TG8lB.mjs} +51 -35
  48. package/dist/shared/attaform.QG5TG8lB.mjs.map +1 -0
  49. package/dist/shared/{attaform.EMzJcQci.d.mts → attaform.ceGEAEMk.d.ts} +1 -1
  50. package/dist/shared/{attaform.Bh3ACtts.d.ts → attaform.sWm8B15V.d.mts} +1 -1
  51. package/dist/shared/{attaform.BqZuwLTK.mjs → attaform.tiWEVznj.mjs} +7 -3
  52. package/dist/shared/attaform.tiWEVznj.mjs.map +1 -0
  53. package/dist/shared/{attaform.BPy-4qRx.cjs → attaform.z5j3LwJz.cjs} +51 -34
  54. package/dist/shared/attaform.z5j3LwJz.cjs.map +1 -0
  55. package/dist/zod-v3.cjs +3 -3
  56. package/dist/zod-v3.d.cts +3 -3
  57. package/dist/zod-v3.d.mts +3 -3
  58. package/dist/zod-v3.d.ts +3 -3
  59. package/dist/zod-v3.mjs +3 -3
  60. package/dist/zod-v4.cjs +3 -3
  61. package/dist/zod-v4.d.cts +4 -4
  62. package/dist/zod-v4.d.mts +4 -4
  63. package/dist/zod-v4.d.ts +4 -4
  64. package/dist/zod-v4.mjs +3 -3
  65. package/dist/zod.cjs +5 -5
  66. package/dist/zod.d.cts +5 -5
  67. package/dist/zod.d.mts +5 -5
  68. package/dist/zod.d.ts +5 -5
  69. package/dist/zod.mjs +6 -6
  70. package/package.json +3 -3
  71. package/dist/shared/attaform.BKozEdTr.mjs.map +0 -1
  72. package/dist/shared/attaform.BPy-4qRx.cjs.map +0 -1
  73. package/dist/shared/attaform.BqZuwLTK.mjs.map +0 -1
  74. package/dist/shared/attaform.DLnE5bZa.cjs.map +0 -1
@@ -832,12 +832,8 @@ function syncElementRegistration(el, value, oldValue) {
832
832
  const wasRegistered = isRegisterValue(oldValue);
833
833
  const isRegistered = isRegisterValue(value);
834
834
  if (!wasRegistered && !isRegistered) return;
835
- if (wasRegistered && isRegistered) {
836
- const old = oldValue;
837
- const next = value;
838
- if (old.path === next.path && old.persistOptIns === next.persistOptIns) return;
839
- }
840
- if (wasRegistered) {
835
+ const samePathAndStore = wasRegistered && isRegistered && oldValue.path === value.path && oldValue.persistOptIns === value.persistOptIns;
836
+ if (wasRegistered && !samePathAndStore) {
841
837
  oldValue.deregisterElement(el);
842
838
  }
843
839
  if (isRegistered) {
@@ -861,14 +857,28 @@ function isRegisterValue(val) {
861
857
  function writeLastTypedForm(rv, next) {
862
858
  rv.lastTypedForm.value = next;
863
859
  }
864
- function computePersistMeta(el, registerValue) {
865
- const elementId = getOrAssignElementId(el);
866
- return { persist: registerValue.persistOptIns.hasOptIn(elementId, registerValue.path) };
867
- }
868
860
  const DEFAULT_ASSIGNER_TAG = Symbol.for("attaform:default-assigner-tag");
869
861
  function isDefaultAssigner(fn) {
870
862
  return typeof fn === "function" && fn[DEFAULT_ASSIGNER_TAG] === true;
871
863
  }
864
+ const CONSUMER_WRAPPED_TAG = Symbol.for("attaform:consumer-wrapped-assigner");
865
+ function isConsumerWrapped(fn) {
866
+ return typeof fn === "function" && fn[CONSUMER_WRAPPED_TAG] === true;
867
+ }
868
+ function fireAssigner(el, registerValue, value) {
869
+ const fn = el[assignKey];
870
+ if (fn === void 0) return void 0;
871
+ if (isDefaultAssigner(fn) || isConsumerWrapped(fn)) {
872
+ return fn(value);
873
+ }
874
+ if (!isRegisterValue(registerValue)) {
875
+ return fn(value, void 0);
876
+ }
877
+ const r = runTransforms(value, registerValue);
878
+ if (!r.ok) return false;
879
+ const coerced = applyCoerce(r.value, registerValue);
880
+ return fn(coerced, registerValue);
881
+ }
872
882
  function shouldBailListener(el) {
873
883
  if (INTERACTIVE_TAG_NAMES.has(el.tagName)) return false;
874
884
  return isDefaultAssigner(el[assignKey]);
@@ -924,38 +934,39 @@ function logTransformAsync(path) {
924
934
  );
925
935
  }
926
936
  }
927
- const getModelAssigner = (el, vnode, registerValue) => {
937
+ const getModelAssigner = (vnode, registerValue) => {
928
938
  const fn = vnode.props?.["onUpdate:registerValue"] ?? vnode.props?.["on:update:registerValue"];
929
939
  if (isArray(fn)) {
930
940
  const fnArr = fn.filter((x) => isFunction(x));
931
- return (value) => {
941
+ const wrapped = (value) => {
932
942
  const r = runTransforms(value, registerValue);
933
943
  if (!r.ok) return false;
934
944
  const coerced = applyCoerce(r.value, registerValue);
935
945
  invokeArrayFns(fnArr, coerced, registerValue);
936
946
  return void 0;
937
947
  };
948
+ wrapped[CONSUMER_WRAPPED_TAG] = true;
949
+ return wrapped;
938
950
  }
939
951
  if (isFunction(fn)) {
940
952
  const handler = fn;
941
- return (value) => {
953
+ const wrapped = (value) => {
942
954
  const r = runTransforms(value, registerValue);
943
955
  if (!r.ok) return false;
944
956
  const coerced = applyCoerce(r.value, registerValue);
945
957
  return handler(coerced, registerValue);
946
958
  };
959
+ wrapped[CONSUMER_WRAPPED_TAG] = true;
960
+ return wrapped;
947
961
  }
948
962
  const defaultAssigner = (value) => {
949
963
  if (value === void 0 && registerValue.acceptsUndefined) {
950
- return registerValue.setValueWithInternalPath(
951
- void 0,
952
- computePersistMeta(el, registerValue)
953
- );
964
+ return registerValue.setValueWithInternalPath(void 0);
954
965
  }
955
966
  const r = runTransforms(value, registerValue);
956
967
  if (!r.ok) return false;
957
968
  const coerced = applyCoerce(r.value, registerValue);
958
- return registerValue.setValueWithInternalPath(coerced, computePersistMeta(el, registerValue));
969
+ return registerValue.setValueWithInternalPath(coerced);
959
970
  };
960
971
  defaultAssigner[DEFAULT_ASSIGNER_TAG] = true;
961
972
  return defaultAssigner;
@@ -978,7 +989,8 @@ function makeNoopAssigner() {
978
989
  return noop;
979
990
  }
980
991
  function setAssignFunction(el, vnode, value) {
981
- if (el[assignKey] !== void 0 && !isDefaultAssigner(el[assignKey])) {
992
+ const current = el[assignKey];
993
+ if (current !== void 0 && !isDefaultAssigner(current) && !isConsumerWrapped(current)) {
982
994
  return;
983
995
  }
984
996
  if (value === void 0) {
@@ -992,11 +1004,12 @@ function setAssignFunction(el, vnode, value) {
992
1004
  el[assignKey] = makeNoopAssigner();
993
1005
  return;
994
1006
  }
995
- el[assignKey] = getModelAssigner(el, vnode, value);
1007
+ el[assignKey] = getModelAssigner(vnode, value);
996
1008
  }
997
1009
  const vRegisterText = {
998
1010
  created(el, { value, modifiers: { lazy, trim, number } }, vnode) {
999
- const castToNumber = number === true || vnode.props?.["type"] === "number";
1011
+ const castToNumberAtCreated = number === true || vnode.props?.["type"] === "number";
1012
+ const liveCastToNumber = () => number === true || el.getAttribute("type") === "number";
1000
1013
  if (isRegisterValue(value)) {
1001
1014
  value.registerElement(el);
1002
1015
  setAssignFunction(el, vnode, value);
@@ -1006,6 +1019,7 @@ const vRegisterText = {
1006
1019
  const target = e.target;
1007
1020
  if (target === null || target.composing) return;
1008
1021
  noteInteraction(value);
1022
+ const castToNumber = liveCastToNumber();
1009
1023
  let domValue = el.value;
1010
1024
  if (trim === true && lazy === true) {
1011
1025
  domValue = domValue.trim();
@@ -1046,7 +1060,7 @@ const vRegisterText = {
1046
1060
  return;
1047
1061
  }
1048
1062
  const commit = domValue === "" && isRegisterValue(value) && value.acceptsUndefined ? void 0 : domValue;
1049
- el[assignKey]?.(commit);
1063
+ fireAssigner(el, value, commit);
1050
1064
  if (isRegisterValue(value) && isDefaultAssigner(el[assignKey])) {
1051
1065
  const storage = value.innerRef.value;
1052
1066
  if (storage !== domValue) {
@@ -1056,17 +1070,18 @@ const vRegisterText = {
1056
1070
  }
1057
1071
  }
1058
1072
  });
1059
- if (trim === true || castToNumber) {
1073
+ if (trim === true || castToNumberAtCreated) {
1060
1074
  addTrackedListener(el, "change", () => {
1061
1075
  if (shouldBailListener(el)) return;
1062
1076
  let normalized = el.value;
1063
1077
  if (trim === true) normalized = normalized.trim();
1078
+ const castToNumber = liveCastToNumber();
1064
1079
  if (castToNumber) {
1065
1080
  const cast = looseToNumber(normalized);
1066
1081
  if (typeof cast === "number" && Number.isFinite(cast)) {
1067
1082
  if (isRegisterValue(value)) writeLastTypedForm(value, null);
1068
1083
  el.value = String(cast);
1069
- if (lazy !== true) el[assignKey]?.(cast);
1084
+ if (lazy !== true) fireAssigner(el, value, cast);
1070
1085
  } else {
1071
1086
  if (isRegisterValue(value)) {
1072
1087
  writeLastTypedForm(value, null);
@@ -1078,7 +1093,7 @@ const vRegisterText = {
1078
1093
  }
1079
1094
  el.value = typeof normalized === "number" ? String(normalized) : normalized;
1080
1095
  if (trim === true && lazy !== true) {
1081
- el[assignKey]?.(normalized);
1096
+ fireAssigner(el, value, normalized);
1082
1097
  }
1083
1098
  });
1084
1099
  }
@@ -1142,7 +1157,6 @@ const vRegisterCheckbox = {
1142
1157
  const explicitValueRequired = true;
1143
1158
  const rawElementValue = getValue(el, explicitValueRequired);
1144
1159
  const checked = el.checked;
1145
- const assign = el[assignKey];
1146
1160
  if (isArray(modelValue)) {
1147
1161
  if (rawElementValue === void 0) {
1148
1162
  vue.warn(
@@ -1154,11 +1168,11 @@ const vRegisterCheckbox = {
1154
1168
  const index = looseIndexOf(modelValue, elementValue);
1155
1169
  const found = index !== -1;
1156
1170
  if (checked && !found) {
1157
- assign?.(modelValue.concat(elementValue));
1171
+ fireAssigner(el, value, modelValue.concat(elementValue));
1158
1172
  } else if (!checked && found) {
1159
1173
  const filtered = [...modelValue];
1160
1174
  filtered.splice(index, 1);
1161
- assign?.(filtered);
1175
+ fireAssigner(el, value, filtered);
1162
1176
  }
1163
1177
  } else if (isSet(modelValue)) {
1164
1178
  if (rawElementValue === void 0) {
@@ -1174,9 +1188,9 @@ const vRegisterCheckbox = {
1174
1188
  } else {
1175
1189
  cloned.delete(elementValue);
1176
1190
  }
1177
- assign?.(cloned);
1191
+ fireAssigner(el, value, cloned);
1178
1192
  } else {
1179
- assign?.(getCheckboxValue(el, checked));
1193
+ fireAssigner(el, value, getCheckboxValue(el, checked));
1180
1194
  }
1181
1195
  if (isRegisterValue(value) && isDefaultAssigner(el[assignKey])) {
1182
1196
  setChecked(el, value);
@@ -1236,7 +1250,7 @@ const vRegisterRadio = {
1236
1250
  addTrackedListener(el, "change", () => {
1237
1251
  if (shouldBailListener(el)) return;
1238
1252
  noteInteraction(value);
1239
- el[assignKey]?.(getValue(el));
1253
+ fireAssigner(el, value, getValue(el));
1240
1254
  if (isRegisterValue(value) && isDefaultAssigner(el[assignKey])) {
1241
1255
  const currentModel = value.innerRef.value;
1242
1256
  const target = looseEqual(currentModel, applyCoerce(getValue(el), value));
@@ -1281,12 +1295,14 @@ const vRegisterSelect = {
1281
1295
  created(el, { value, modifiers: { number } }, vnode) {
1282
1296
  if (!isRegisterValue(value)) return;
1283
1297
  value.registerElement(el);
1284
- const isSetModel = isSet(value.innerRef.value);
1285
1298
  addTrackedListener(el, "change", () => {
1286
1299
  if (shouldBailListener(el)) return;
1287
1300
  noteInteraction(value);
1301
+ const isSetModel = isSet(value.innerRef.value);
1288
1302
  const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map((o) => number === true ? looseToNumber(getValue(o)) : getValue(o));
1289
- const wrote = el[assignKey]?.(
1303
+ const wrote = fireAssigner(
1304
+ el,
1305
+ value,
1290
1306
  el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]
1291
1307
  );
1292
1308
  if (wrote !== false) {
@@ -1658,6 +1674,7 @@ exports.createIsSensitivePath = createIsSensitivePath;
1658
1674
  exports.createPersistOptInRegistry = createPersistOptInRegistry;
1659
1675
  exports.createRegistry = createRegistry;
1660
1676
  exports.ensureAttaformInstalled = ensureAttaformInstalled;
1677
+ exports.getOrAssignElementId = getOrAssignElementId;
1661
1678
  exports.getRegistryFromApp = getRegistryFromApp;
1662
1679
  exports.isPathPrefix = isPathPrefix;
1663
1680
  exports.isRegisterValue = isRegisterValue;
@@ -1673,4 +1690,4 @@ exports.segmentsForPathKey = segmentsForPathKey;
1673
1690
  exports.useRegister = useRegister;
1674
1691
  exports.useRegistry = useRegistry;
1675
1692
  exports.vRegister = vRegister;
1676
- //# sourceMappingURL=attaform.BPy-4qRx.cjs.map
1693
+ //# sourceMappingURL=attaform.z5j3LwJz.cjs.map