@macrulez/vue-form-schema 0.1.0 → 0.1.5

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 (51) hide show
  1. package/README.md +707 -410
  2. package/dist/MaskEngine-BqJQYybS.js +233 -0
  3. package/dist/MaskEngine-BwAs2Zb0.cjs +1 -0
  4. package/dist/__tests__/phase3.test.d.ts +2 -0
  5. package/dist/__tests__/phase3.test.d.ts.map +1 -0
  6. package/dist/__tests__/phase4.test.d.ts +2 -0
  7. package/dist/__tests__/phase4.test.d.ts.map +1 -0
  8. package/dist/__tests__/useFieldArray.test.d.ts +2 -0
  9. package/dist/__tests__/useFieldArray.test.d.ts.map +1 -0
  10. package/dist/__tests__/useMultiStepForm.test.d.ts +2 -0
  11. package/dist/__tests__/useMultiStepForm.test.d.ts.map +1 -0
  12. package/dist/core/ConditionEvaluator.d.ts +1 -1
  13. package/dist/core/ConditionEvaluator.d.ts.map +1 -1
  14. package/dist/core/ValidationEngine.d.ts +3 -1
  15. package/dist/core/ValidationEngine.d.ts.map +1 -1
  16. package/dist/core/inferTypes.d.ts +39 -0
  17. package/dist/core/inferTypes.d.ts.map +1 -0
  18. package/dist/core/registry.d.ts +17 -0
  19. package/dist/core/registry.d.ts.map +1 -0
  20. package/dist/core/schemaUtils.d.ts +20 -0
  21. package/dist/core/schemaUtils.d.ts.map +1 -0
  22. package/dist/core/types.d.ts +43 -3
  23. package/dist/core/types.d.ts.map +1 -1
  24. package/dist/core/useFieldArray.d.ts +21 -0
  25. package/dist/core/useFieldArray.d.ts.map +1 -0
  26. package/dist/core/useForm.d.ts.map +1 -1
  27. package/dist/core/useFormDebug.d.ts +29 -0
  28. package/dist/core/useFormDebug.d.ts.map +1 -0
  29. package/dist/core/useFormField.d.ts +18 -0
  30. package/dist/core/useFormField.d.ts.map +1 -0
  31. package/dist/core/useMultiStepForm.d.ts +30 -0
  32. package/dist/core/useMultiStepForm.d.ts.map +1 -0
  33. package/dist/index.cjs +1 -1
  34. package/dist/index.d.ts +14 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +386 -196
  37. package/dist/parsers/valibot.d.ts +20 -0
  38. package/dist/parsers/valibot.d.ts.map +1 -0
  39. package/dist/ui/index.d.ts +2 -0
  40. package/dist/ui/index.d.ts.map +1 -1
  41. package/dist/ui.cjs +1 -1
  42. package/dist/ui.d.ts +114 -18
  43. package/dist/ui.js +360 -193
  44. package/dist/valibot.cjs +1 -0
  45. package/dist/valibot.d.ts +84 -0
  46. package/dist/valibot.js +43 -0
  47. package/dist/yup.d.ts +26 -2
  48. package/dist/zod.d.ts +26 -2
  49. package/package.json +39 -4
  50. package/dist/MaskEngine-D22m29OM.js +0 -157
  51. package/dist/MaskEngine-hd5xHed7.cjs +0 -1
@@ -0,0 +1,233 @@
1
+ import { inject as $, provide as w, computed as p } from "vue";
2
+ const m = Symbol("vfs:registry");
3
+ function P(t) {
4
+ return {
5
+ install(n) {
6
+ n.provide(m, t);
7
+ }
8
+ };
9
+ }
10
+ function k() {
11
+ return $(m, {});
12
+ }
13
+ function L(t) {
14
+ w(m, t);
15
+ }
16
+ function j(t, n) {
17
+ const e = p(() => T(t.fields.value, n)), r = p(() => (t.getField(n) ?? []).map((c, u) => {
18
+ var g;
19
+ return {
20
+ key: `${n}__${u}`,
21
+ index: u,
22
+ fields: F(((g = e.value) == null ? void 0 : g.fields) ?? [], n, u)
23
+ };
24
+ })), i = p(() => r.value.length);
25
+ function s() {
26
+ return [...t.getField(n) ?? []];
27
+ }
28
+ function o(f = {}) {
29
+ const c = s();
30
+ c.push(f), t.setField(n, c);
31
+ }
32
+ function l(f = {}) {
33
+ const c = s();
34
+ c.unshift(f), t.setField(n, c);
35
+ }
36
+ function a(f) {
37
+ const c = s();
38
+ c.splice(f, 1), t.setField(n, c);
39
+ }
40
+ function d(f, c) {
41
+ const u = s(), [g] = u.splice(f, 1);
42
+ u.splice(c, 0, g), t.setField(n, u);
43
+ }
44
+ function h(f, c) {
45
+ const u = s();
46
+ [u[f], u[c]] = [u[c], u[f]], t.setField(n, u);
47
+ }
48
+ function I(f, c) {
49
+ const u = s();
50
+ u[f] = c, t.setField(n, u);
51
+ }
52
+ return { rows: r, count: i, append: o, prepend: l, remove: a, move: d, swap: h, replace: I };
53
+ }
54
+ function F(t, n, e) {
55
+ return t.map((r) => ({
56
+ ...r,
57
+ name: `${n}.${e}.${r.name}`,
58
+ fields: r.fields ? F(r.fields, n, e) : void 0
59
+ }));
60
+ }
61
+ function T(t, n) {
62
+ for (const e of t) {
63
+ if (e.name === n) return e;
64
+ if (e.fields) {
65
+ const r = T(e.fields, n);
66
+ if (r) return r;
67
+ }
68
+ }
69
+ }
70
+ const b = (t) => t == null || t === "" || Array.isArray(t) && t.length === 0 ? "This field is required" : null, q = (t, n) => (e) => typeof e != "string" && !Array.isArray(e) || e.length >= t ? null : n ?? `Minimum length is ${t}`, C = (t, n) => (e) => typeof e != "string" && !Array.isArray(e) || e.length <= t ? null : n ?? `Maximum length is ${t}`, _ = (t, n) => (e) => {
71
+ const r = Number(e);
72
+ return isNaN(r) || r >= t ? null : n ?? `Minimum value is ${t}`;
73
+ }, U = (t, n) => (e) => {
74
+ const r = Number(e);
75
+ return isNaN(r) || r <= t ? null : n ?? `Maximum value is ${t}`;
76
+ }, B = (t, n) => (e) => typeof e != "string" || t.test(e) ? null : n ?? "Invalid format", V = (t) => t ? /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(t)) ? null : "Invalid email address" : null, Y = (t) => {
77
+ if (!t) return null;
78
+ try {
79
+ return new URL(String(t)), null;
80
+ } catch {
81
+ return "Invalid URL";
82
+ }
83
+ }, z = (t, n) => (e, r) => e === r[t] ? null : n ?? `Must match ${t}`;
84
+ class G {
85
+ constructor(n = 300, e = "first") {
86
+ this.asyncTimers = /* @__PURE__ */ new Map(), this.debounceMs = n, this.validateMode = e;
87
+ }
88
+ /** Run sync validators for a single field; returns list of error messages */
89
+ validateField(n, e, r) {
90
+ const i = [];
91
+ if (n.required) {
92
+ const s = b(e);
93
+ if (s && (i.push(s), this.validateMode === "first"))
94
+ return i;
95
+ }
96
+ for (const s of n.validators ?? []) {
97
+ const o = s(e, r);
98
+ if (o && (i.push(o), this.validateMode === "first"))
99
+ return i;
100
+ }
101
+ return i;
102
+ }
103
+ /** Run all sync validators across all visible fields */
104
+ validateAll(n, e) {
105
+ const r = {};
106
+ return this.collectErrors(n, e, r), r;
107
+ }
108
+ collectErrors(n, e, r) {
109
+ for (const i of n) {
110
+ const s = x(e, i.name), o = this.validateField(i, s, e);
111
+ o.length && (r[i.name] = o), (i.type === "group" || i.type === "array") && i.fields && this.collectErrors(i.fields, e, r);
112
+ }
113
+ }
114
+ /** Run async validators with debounce; calls onResult when done */
115
+ validateAsync(n, e, r, i) {
116
+ var l;
117
+ if (!((l = n.asyncValidators) != null && l.length)) return;
118
+ const s = this.asyncTimers.get(n.name);
119
+ s && clearTimeout(s);
120
+ const o = setTimeout(async () => {
121
+ const d = (await Promise.all(
122
+ n.asyncValidators.map((h) => h(e, r))
123
+ )).filter((h) => h !== null);
124
+ i(n.name, d), this.asyncTimers.delete(n.name);
125
+ }, this.debounceMs);
126
+ this.asyncTimers.set(n.name, o);
127
+ }
128
+ destroy() {
129
+ for (const n of this.asyncTimers.values()) clearTimeout(n);
130
+ this.asyncTimers.clear();
131
+ }
132
+ }
133
+ function x(t, n) {
134
+ return n.split(".").reduce((e, r) => {
135
+ if (e && typeof e == "object") return e[r];
136
+ }, t);
137
+ }
138
+ function K(t, n, e) {
139
+ const r = n.split("."), i = { ...t };
140
+ let s = i;
141
+ for (let o = 0; o < r.length - 1; o++) {
142
+ const l = r[o], a = s[l];
143
+ Array.isArray(a) ? s[l] = [...a] : a && typeof a == "object" ? s[l] = { ...a } : s[l] = {}, s = s[l];
144
+ }
145
+ return s[r[r.length - 1]] = e, i;
146
+ }
147
+ const R = {
148
+ "phone-ru": "+7 (###) ###-##-##",
149
+ "phone-eu": "+## (##) ###-##-##",
150
+ date: "##.##.####",
151
+ inn: "############",
152
+ iban: "AA## #### #### #### #### #### ####"
153
+ };
154
+ function E(t) {
155
+ return t.preset ? R[t.preset] : t.pattern ?? "";
156
+ }
157
+ function y(t) {
158
+ return t === "#" || t === "A";
159
+ }
160
+ function v(t, n) {
161
+ return n === "#" ? /\d/.test(t) : n === "A" ? /[a-zA-Z]/.test(t) : !1;
162
+ }
163
+ function A(t, n) {
164
+ const r = E(typeof n == "string" ? { pattern: n } : n);
165
+ if (!r) return t;
166
+ const i = Array.from(t);
167
+ let s = 0, o = -1;
168
+ for (let a = 0; a < r.length && s < i.length; a++) {
169
+ const d = r[a];
170
+ if (y(d)) {
171
+ for (; s < i.length && !v(i[s], d); ) s++;
172
+ s < i.length && (o = a, s++);
173
+ }
174
+ }
175
+ if (o === -1) return "";
176
+ let l = "";
177
+ s = 0;
178
+ for (let a = 0; a <= o; a++) {
179
+ const d = r[a];
180
+ if (y(d)) {
181
+ for (; s < i.length && !v(i[s], d); ) s++;
182
+ s < i.length && (l += d === "A" ? i[s++].toUpperCase() : i[s++]);
183
+ } else
184
+ l += d;
185
+ }
186
+ return l;
187
+ }
188
+ function M(t, n) {
189
+ const r = E(typeof n == "string" ? { pattern: n } : n);
190
+ if (!r) return t;
191
+ const i = [];
192
+ let s = 0;
193
+ for (let o = 0; o < r.length && s < t.length; o++) {
194
+ const l = r[o], a = t[s];
195
+ y(l) ? (i.push(a), s++) : a === l && s++;
196
+ }
197
+ return i.join("");
198
+ }
199
+ function Z(t, n) {
200
+ function e() {
201
+ const i = M(t.value, n), s = A(i, n);
202
+ if (t.value !== s) {
203
+ const o = t.selectionStart ?? s.length;
204
+ t.value = s;
205
+ const l = Math.min(o, s.length);
206
+ t.setSelectionRange(l, l);
207
+ }
208
+ }
209
+ t.addEventListener("input", e);
210
+ const r = A(M(t.value, n), n);
211
+ return t.value !== r && r && (t.value = r), () => t.removeEventListener("input", e);
212
+ }
213
+ export {
214
+ G as V,
215
+ A as a,
216
+ Z as b,
217
+ P as c,
218
+ C as d,
219
+ V as e,
220
+ _ as f,
221
+ x as g,
222
+ q as h,
223
+ L as i,
224
+ b as j,
225
+ K as k,
226
+ j as l,
227
+ U as m,
228
+ k as n,
229
+ B as p,
230
+ M as r,
231
+ z as s,
232
+ Y as u
233
+ };
@@ -0,0 +1 @@
1
+ "use strict";const g=require("vue"),A=Symbol("vfs:registry");function w(t){return{install(e){e.provide(A,t)}}}function x(){return g.inject(A,{})}function b(t){g.provide(A,t)}function P(t,e){const n=g.computed(()=>T(t.fields.value,e)),r=g.computed(()=>(t.getField(e)??[]).map((u,a)=>{var y;return{key:`${e}__${a}`,index:a,fields:F(((y=n.value)==null?void 0:y.fields)??[],e,a)}})),i=g.computed(()=>r.value.length);function s(){return[...t.getField(e)??[]]}function o(f={}){const u=s();u.push(f),t.setField(e,u)}function l(f={}){const u=s();u.unshift(f),t.setField(e,u)}function c(f){const u=s();u.splice(f,1),t.setField(e,u)}function d(f,u){const a=s(),[y]=a.splice(f,1);a.splice(u,0,y),t.setField(e,a)}function h(f,u){const a=s();[a[f],a[u]]=[a[u],a[f]],t.setField(e,a)}function $(f,u){const a=s();a[f]=u,t.setField(e,a)}return{rows:r,count:i,append:o,prepend:l,remove:c,move:d,swap:h,replace:$}}function F(t,e,n){return t.map(r=>({...r,name:`${e}.${n}.${r.name}`,fields:r.fields?F(r.fields,e,n):void 0}))}function T(t,e){for(const n of t){if(n.name===e)return n;if(n.fields){const r=T(n.fields,e);if(r)return r}}}const E=t=>t==null||t===""||Array.isArray(t)&&t.length===0?"This field is required":null,S=(t,e)=>n=>typeof n!="string"&&!Array.isArray(n)||n.length>=t?null:e??`Minimum length is ${t}`,k=(t,e)=>n=>typeof n!="string"&&!Array.isArray(n)||n.length<=t?null:e??`Maximum length is ${t}`,L=(t,e)=>n=>{const r=Number(n);return isNaN(r)||r>=t?null:e??`Minimum value is ${t}`},q=(t,e)=>n=>{const r=Number(n);return isNaN(r)||r<=t?null:e??`Maximum value is ${t}`},j=(t,e)=>n=>typeof n!="string"||t.test(n)?null:e??"Invalid format",B=t=>t?/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(t))?null:"Invalid email address":null,C=t=>{if(!t)return null;try{return new URL(String(t)),null}catch{return"Invalid URL"}},_=(t,e)=>(n,r)=>n===r[t]?null:e??`Must match ${t}`;class U{constructor(e=300,n="first"){this.asyncTimers=new Map,this.debounceMs=e,this.validateMode=n}validateField(e,n,r){const i=[];if(e.required){const s=E(n);if(s&&(i.push(s),this.validateMode==="first"))return i}for(const s of e.validators??[]){const o=s(n,r);if(o&&(i.push(o),this.validateMode==="first"))return i}return i}validateAll(e,n){const r={};return this.collectErrors(e,n,r),r}collectErrors(e,n,r){for(const i of e){const s=R(n,i.name),o=this.validateField(i,s,n);o.length&&(r[i.name]=o),(i.type==="group"||i.type==="array")&&i.fields&&this.collectErrors(i.fields,n,r)}}validateAsync(e,n,r,i){var l;if(!((l=e.asyncValidators)!=null&&l.length))return;const s=this.asyncTimers.get(e.name);s&&clearTimeout(s);const o=setTimeout(async()=>{const d=(await Promise.all(e.asyncValidators.map(h=>h(n,r)))).filter(h=>h!==null);i(e.name,d),this.asyncTimers.delete(e.name)},this.debounceMs);this.asyncTimers.set(e.name,o)}destroy(){for(const e of this.asyncTimers.values())clearTimeout(e);this.asyncTimers.clear()}}function R(t,e){return e.split(".").reduce((n,r)=>{if(n&&typeof n=="object")return n[r]},t)}function V(t,e,n){const r=e.split("."),i={...t};let s=i;for(let o=0;o<r.length-1;o++){const l=r[o],c=s[l];Array.isArray(c)?s[l]=[...c]:c&&typeof c=="object"?s[l]={...c}:s[l]={},s=s[l]}return s[r[r.length-1]]=n,i}const Y={"phone-ru":"+7 (###) ###-##-##","phone-eu":"+## (##) ###-##-##",date:"##.##.####",inn:"############",iban:"AA## #### #### #### #### #### ####"};function I(t){return t.preset?Y[t.preset]:t.pattern??""}function p(t){return t==="#"||t==="A"}function M(t,e){return e==="#"?/\d/.test(t):e==="A"?/[a-zA-Z]/.test(t):!1}function m(t,e){const r=I(typeof e=="string"?{pattern:e}:e);if(!r)return t;const i=Array.from(t);let s=0,o=-1;for(let c=0;c<r.length&&s<i.length;c++){const d=r[c];if(p(d)){for(;s<i.length&&!M(i[s],d);)s++;s<i.length&&(o=c,s++)}}if(o===-1)return"";let l="";s=0;for(let c=0;c<=o;c++){const d=r[c];if(p(d)){for(;s<i.length&&!M(i[s],d);)s++;s<i.length&&(l+=d==="A"?i[s++].toUpperCase():i[s++])}else l+=d}return l}function v(t,e){const r=I(typeof e=="string"?{pattern:e}:e);if(!r)return t;const i=[];let s=0;for(let o=0;o<r.length&&s<t.length;o++){const l=r[o],c=t[s];p(l)?(i.push(c),s++):c===l&&s++}return i.join("")}function z(t,e){function n(){const i=v(t.value,e),s=m(i,e);if(t.value!==s){const o=t.selectionStart??s.length;t.value=s;const l=Math.min(o,s.length);t.setSelectionRange(l,l)}}t.addEventListener("input",n);const r=m(v(t.value,e),e);return t.value!==r&&r&&(t.value=r),()=>t.removeEventListener("input",n)}exports.ValidationEngine=U;exports.applyMask=m;exports.bindMask=z;exports.createFormRegistry=w;exports.email=B;exports.getByPath=R;exports.max=q;exports.maxLength=k;exports.min=L;exports.minLength=S;exports.pattern=j;exports.provideRegistry=b;exports.removeMask=v;exports.required=E;exports.sameAs=_;exports.setByPath=V;exports.url=C;exports.useFieldArray=P;exports.useRegistry=x;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=phase3.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase3.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/phase3.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=phase4.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase4.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/phase4.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useFieldArray.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFieldArray.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/useFieldArray.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useMultiStepForm.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMultiStepForm.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/useMultiStepForm.test.ts"],"names":[],"mappings":""}
@@ -8,7 +8,7 @@ export declare class ConditionEvaluator {
8
8
  */
9
9
  start(rawFields: FieldDefinition[], values: Ref<Record<string, unknown>>, resolvedFields: Ref<FieldDefinition[]>, clearOnHide: boolean): void;
10
10
  stop(): void;
11
- /** Recursively evaluate visible/disabled/required for each field */
11
+ /** Recursively evaluate visible/disabled/options for each field */
12
12
  evaluateFields(fields: FieldDefinition[], values: Record<string, unknown>): FieldDefinition[];
13
13
  private resolveBoolean;
14
14
  private clearHiddenValues;
@@ -1 +1 @@
1
- {"version":3,"file":"ConditionEvaluator.d.ts","sourceRoot":"","sources":["../../src/core/ConditionEvaluator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAsB9C,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAA4B;IAE9C;;;OAGG;IACH,KAAK,CACH,SAAS,EAAE,eAAe,EAAE,EAC5B,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACpC,cAAc,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,EACtC,WAAW,EAAE,OAAO;IAgBtB,IAAI;IAKJ,oEAAoE;IACpE,cAAc,CACZ,MAAM,EAAE,eAAe,EAAE,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,eAAe,EAAE;IAiBpB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,UAAU;CAKnB;AAID,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,EAAE,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,eAAe,EAAE,CAGnB"}
1
+ {"version":3,"file":"ConditionEvaluator.d.ts","sourceRoot":"","sources":["../../src/core/ConditionEvaluator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAsB9C,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAA4B;IAE9C;;;OAGG;IACH,KAAK,CACH,SAAS,EAAE,eAAe,EAAE,EAC5B,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACpC,cAAc,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,EACtC,WAAW,EAAE,OAAO;IAgBtB,IAAI;IAKJ,mEAAmE;IACnE,cAAc,CACZ,MAAM,EAAE,eAAe,EAAE,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,eAAe,EAAE;IA0BpB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,UAAU;CAKnB;AAID,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,EAAE,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,eAAe,EAAE,CAGnB"}
@@ -7,10 +7,12 @@ export declare const max: (maxVal: number, message?: string) => ValidatorFn;
7
7
  export declare const pattern: (regex: RegExp, message?: string) => ValidatorFn;
8
8
  export declare const email: ValidatorFn;
9
9
  export declare const url: ValidatorFn;
10
+ export declare const sameAs: (otherField: string, message?: string) => ValidatorFn;
10
11
  export declare class ValidationEngine {
11
12
  private asyncTimers;
12
13
  private readonly debounceMs;
13
- constructor(debounceMs?: number);
14
+ private readonly validateMode;
15
+ constructor(debounceMs?: number, validateMode?: 'first' | 'all');
14
16
  /** Run sync validators for a single field; returns list of error messages */
15
17
  validateField(field: FieldDefinition, value: unknown, allValues: Record<string, unknown>): string[];
16
18
  /** Run all sync validators across all visible fields */
@@ -1 +1 @@
1
- {"version":3,"file":"ValidationEngine.d.ts","sourceRoot":"","sources":["../../src/core/ValidationEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAoB,MAAM,SAAS,CAAA;AAI7E,eAAO,MAAM,QAAQ,EAAE,WAItB,CAAA;AAED,eAAO,MAAM,SAAS,GACnB,KAAK,MAAM,EAAE,UAAU,MAAM,KAAG,WAMhC,CAAA;AAEH,eAAO,MAAM,SAAS,GACnB,KAAK,MAAM,EAAE,UAAU,MAAM,KAAG,WAMhC,CAAA;AAEH,eAAO,MAAM,GAAG,GACb,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,WAKnC,CAAA;AAEH,eAAO,MAAM,GAAG,GACb,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,WAKnC,CAAA;AAEH,eAAO,MAAM,OAAO,GACjB,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,WAIlC,CAAA;AAEH,eAAO,MAAM,KAAK,EAAE,WAInB,CAAA;AAED,eAAO,MAAM,GAAG,EAAE,WAQjB,CAAA;AAID,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAmD;IACtE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;gBAEvB,UAAU,SAAM;IAI5B,6EAA6E;IAC7E,aAAa,CACX,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,MAAM,EAAE;IAgBX,wDAAwD;IACxD,WAAW,CACT,MAAM,EAAE,eAAe,EAAE,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAM3B,OAAO,CAAC,aAAa;IAgBrB,mEAAmE;IACnE,aAAa,CACX,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,GACjD,IAAI;IAkBP,OAAO;CAIR;AAID,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK7E;AAED,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAezB"}
1
+ {"version":3,"file":"ValidationEngine.d.ts","sourceRoot":"","sources":["../../src/core/ValidationEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAoB,MAAM,SAAS,CAAA;AAI7E,eAAO,MAAM,QAAQ,EAAE,WAItB,CAAA;AAED,eAAO,MAAM,SAAS,GACnB,KAAK,MAAM,EAAE,UAAU,MAAM,KAAG,WAMhC,CAAA;AAEH,eAAO,MAAM,SAAS,GACnB,KAAK,MAAM,EAAE,UAAU,MAAM,KAAG,WAMhC,CAAA;AAEH,eAAO,MAAM,GAAG,GACb,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,WAKnC,CAAA;AAEH,eAAO,MAAM,GAAG,GACb,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,WAKnC,CAAA;AAEH,eAAO,MAAM,OAAO,GACjB,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,WAIlC,CAAA;AAEH,eAAO,MAAM,KAAK,EAAE,WAInB,CAAA;AAED,eAAO,MAAM,GAAG,EAAE,WAQjB,CAAA;AAED,eAAO,MAAM,MAAM,GAChB,YAAY,MAAM,EAAE,UAAU,MAAM,KAAG,WAE0C,CAAA;AAIpF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAmD;IACtE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiB;gBAElC,UAAU,SAAM,EAAE,YAAY,GAAE,OAAO,GAAG,KAAe;IAKrE,6EAA6E;IAC7E,aAAa,CACX,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,MAAM,EAAE;IAsBX,wDAAwD;IACxD,WAAW,CACT,MAAM,EAAE,eAAe,EAAE,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAM3B,OAAO,CAAC,aAAa;IAgBrB,mEAAmE;IACnE,aAAa,CACX,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,GACjD,IAAI;IAkBP,OAAO;CAIR;AAID,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK7E;AAED,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBzB"}
@@ -0,0 +1,39 @@
1
+ import type { FieldDefinition, FieldType } from './types';
2
+ type FieldTypeValue<T extends FieldType> = T extends 'checkbox' ? boolean : T extends 'number' ? number : T extends 'array' ? unknown[] : T extends 'group' ? Record<string, unknown> : string;
3
+ type InferField<F> = F extends {
4
+ name: infer Name extends string;
5
+ type: infer Type extends FieldType;
6
+ } ? {
7
+ [K in Name]: FieldTypeValue<Type>;
8
+ } : never;
9
+ type UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
10
+ /**
11
+ * Infer a typed values object from a `const` schema tuple.
12
+ *
13
+ * @example
14
+ * const schema = defineSchema([
15
+ * { type: 'text', name: 'email' },
16
+ * { type: 'number', name: 'age' },
17
+ * { type: 'checkbox', name: 'agreed' },
18
+ * ] as const)
19
+ *
20
+ * type Values = InferValues<typeof schema>
21
+ * // { email: string; age: number; agreed: boolean }
22
+ *
23
+ * const form = useForm<Values>({ schema })
24
+ */
25
+ export type InferValues<T extends readonly FieldDefinition[]> = UnionToIntersection<{
26
+ [K in keyof T]: InferField<T[K]>;
27
+ }[number]>;
28
+ /**
29
+ * Identity helper that preserves literal types in a schema array.
30
+ * Wrap your schema with this to enable `InferValues<typeof schema>`.
31
+ *
32
+ * @example
33
+ * const schema = defineSchema([
34
+ * { type: 'text' as const, name: 'username' as const },
35
+ * ])
36
+ */
37
+ export declare function defineSchema<T extends readonly FieldDefinition[]>(schema: T): T;
38
+ export {};
39
+ //# sourceMappingURL=inferTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inferTypes.d.ts","sourceRoot":"","sources":["../../src/core/inferTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAIzD,KAAK,cAAc,CAAC,CAAC,SAAS,SAAS,IACrC,CAAC,SAAS,UAAU,GAAG,OAAO,GAC9B,CAAC,SAAS,QAAQ,GAAG,MAAM,GAC3B,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,GAC7B,CAAC,SAAS,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3C,MAAM,CAAA;AAIR,KAAK,UAAU,CAAC,CAAC,IACf,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,IAAI,SAAS,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,IAAI,SAAS,SAAS,CAAA;CAAE,GAC7E;KAAG,CAAC,IAAI,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;CAAE,GACrC,KAAK,CAAA;AAEX,KAAK,mBAAmB,CAAC,CAAC,IACxB,CAAC,CAAC,SAAS,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,CAAA;AAIvF;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,SAAS,eAAe,EAAE,IAAI,mBAAmB,CACjF;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,MAAM,CAAC,CAC7C,CAAA;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAE/E"}
@@ -0,0 +1,17 @@
1
+ import { type App, type Component } from 'vue';
2
+ import type { FieldType } from './types';
3
+ export type ComponentMap = Partial<Record<FieldType, Component | string>>;
4
+ /**
5
+ * Install a global default component map for all FormRenderer instances.
6
+ *
7
+ * Usage (main.ts):
8
+ * app.use(createFormRegistry({ text: MyTextInput, select: MySelect }))
9
+ */
10
+ export declare function createFormRegistry(components: ComponentMap): {
11
+ install(app: App): void;
12
+ };
13
+ /** Called inside FormRenderer to read the app-level registry */
14
+ export declare function useRegistry(): ComponentMap;
15
+ /** Called inside a component subtree to provide a local registry override */
16
+ export declare function provideRegistry(components: ComponentMap): void;
17
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,MAAM,KAAK,CAAA;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExC,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,CAAC,CAAA;AAIzE;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,YAAY;iBAE1C,GAAG;EAInB;AAED,gEAAgE;AAChE,wBAAgB,WAAW,IAAI,YAAY,CAE1C;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,UAAU,EAAE,YAAY,QAEvD"}
@@ -0,0 +1,20 @@
1
+ import type { FieldDefinition } from './types';
2
+ /**
3
+ * Merge multiple schemas into one, later schemas override earlier ones
4
+ * when field names collide.
5
+ */
6
+ export declare function mergeSchemas(...schemas: FieldDefinition[][]): FieldDefinition[];
7
+ /**
8
+ * Return a schema without the specified field names (top-level only).
9
+ */
10
+ export declare function omitFields(schema: FieldDefinition[], keys: string[]): FieldDefinition[];
11
+ /**
12
+ * Return only the fields with the specified names, preserving original order.
13
+ */
14
+ export declare function pickFields(schema: FieldDefinition[], keys: string[]): FieldDefinition[];
15
+ /**
16
+ * Return a new schema with the given field merged with `overrides`.
17
+ * Does not mutate the original schema.
18
+ */
19
+ export declare function extendField(schema: FieldDefinition[], fieldName: string, overrides: Partial<FieldDefinition>): FieldDefinition[];
20
+ //# sourceMappingURL=schemaUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaUtils.d.ts","sourceRoot":"","sources":["../../src/core/schemaUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE9C;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,OAAO,EAAE,eAAe,EAAE,EAAE,GAAG,eAAe,EAAE,CAQ/E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAGvF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAGvF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,eAAe,EAAE,EACzB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,OAAO,CAAC,eAAe,CAAC,GAClC,eAAe,EAAE,CAEnB"}
@@ -1,3 +1,4 @@
1
+ import type { Component } from 'vue';
1
2
  export type ValidatorFn = (value: unknown, values: Record<string, unknown>) => string | null;
2
3
  export type AsyncValidatorFn = (value: unknown, values: Record<string, unknown>) => Promise<string | null>;
3
4
  export type MaskPreset = 'phone-ru' | 'phone-eu' | 'date' | 'inn' | 'iban';
@@ -26,10 +27,38 @@ export interface FieldDefinition {
26
27
  validators?: ValidatorFn[];
27
28
  asyncValidators?: AsyncValidatorFn[];
28
29
  mask?: string | MaskConfig;
29
- /** For select / radio */
30
- options?: FieldOption[];
30
+ /** For select / radio — static list, sync function, or async function */
31
+ options?: FieldOption[] | ((values: Record<string, unknown>) => FieldOption[] | Promise<FieldOption[]>);
32
+ /**
33
+ * Field names whose values trigger re-fetching of async options.
34
+ * Only relevant when `options` is an async function.
35
+ */
36
+ optionsDeps?: string[];
37
+ /** Internal: set by useForm when async options are loading. Read-only for consumers. */
38
+ optionsLoading?: boolean;
31
39
  /** For group and array */
32
40
  fields?: FieldDefinition[];
41
+ /**
42
+ * Applied on every setField call before the value is stored.
43
+ * Use for trimming, type coercion, formatting, etc.
44
+ */
45
+ transform?: (value: unknown, values: Record<string, unknown>) => unknown;
46
+ /**
47
+ * Applied at submit time to produce the final payload value.
48
+ * Runs after all validation passes.
49
+ */
50
+ parse?: (raw: unknown) => unknown;
51
+ /**
52
+ * Custom Vue component to render this field.
53
+ * Receives FormFieldProps and must emit 'update:modelValue' and 'blur'.
54
+ */
55
+ component?: Component | string;
56
+ }
57
+ export interface FormFieldProps {
58
+ field: FieldDefinition;
59
+ modelValue: unknown;
60
+ error: string[];
61
+ touched: boolean;
33
62
  }
34
63
  export interface JSONSchemaField {
35
64
  type: FieldType;
@@ -50,13 +79,22 @@ export interface JSONSchemaField {
50
79
  }>;
51
80
  }
52
81
  export type JSONSchema = JSONSchemaField[];
53
- export type ValidateOn = 'input' | 'blur' | 'submit';
82
+ export type ValidateOn = 'input' | 'blur' | 'submit' | 'eager';
83
+ export type ValidateMode = 'first' | 'all';
54
84
  export interface UseFormConfig<T extends Record<string, unknown> = Record<string, unknown>> {
55
85
  schema: FieldDefinition[] | JSONSchema;
56
86
  initialValues?: Partial<T>;
57
87
  validateOn?: ValidateOn;
88
+ /** 'first' returns only the first error per field (default); 'all' returns all errors */
89
+ validateMode?: ValidateMode;
58
90
  clearOnHide?: boolean;
59
91
  onSubmit?: (values: T) => void | Promise<void>;
92
+ /** Persist form values to storage between page reloads */
93
+ persist?: false | 'session' | 'local';
94
+ /** Storage key prefix. Defaults to a hash of the schema field names. */
95
+ persistKey?: string;
96
+ /** Log state changes to console */
97
+ debug?: boolean;
60
98
  }
61
99
  import type { ComputedRef, Ref } from 'vue';
62
100
  export interface UseFormReturn<T extends Record<string, unknown> = Record<string, unknown>> {
@@ -64,6 +102,8 @@ export interface UseFormReturn<T extends Record<string, unknown> = Record<string
64
102
  values: Ref<T>;
65
103
  errors: Ref<Record<string, string[]>>;
66
104
  touched: Ref<Record<string, boolean>>;
105
+ /** Per-field async options loading state */
106
+ optionsLoading: Ref<Record<string, boolean>>;
67
107
  isDirty: ComputedRef<boolean>;
68
108
  isValid: ComputedRef<boolean>;
69
109
  isSubmitting: Ref<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ComputedRef } from 'vue';
2
+ import type { FieldDefinition, UseFormReturn } from './types';
3
+ export interface FieldArrayRow {
4
+ /** Stable key for v-for */
5
+ key: string;
6
+ index: number;
7
+ /** Sub-field definitions with row-namespaced names: `arrayName.rowIndex.subField` */
8
+ fields: FieldDefinition[];
9
+ }
10
+ export interface UseFieldArrayReturn {
11
+ rows: ComputedRef<FieldArrayRow[]>;
12
+ count: ComputedRef<number>;
13
+ append(value?: Record<string, unknown>): void;
14
+ prepend(value?: Record<string, unknown>): void;
15
+ remove(index: number): void;
16
+ move(from: number, to: number): void;
17
+ swap(a: number, b: number): void;
18
+ replace(index: number, value: Record<string, unknown>): void;
19
+ }
20
+ export declare function useFieldArray(form: UseFormReturn, fieldName: string): UseFieldArrayReturn;
21
+ //# sourceMappingURL=useFieldArray.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFieldArray.d.ts","sourceRoot":"","sources":["../../src/core/useFieldArray.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,CAAA;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE7D,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,qFAAqF;IACrF,MAAM,EAAE,eAAe,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,WAAW,CAAC,aAAa,EAAE,CAAC,CAAA;IAClC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAC7C,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAC9C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAC7D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,mBAAmB,CAwDzF"}
@@ -1 +1 @@
1
- {"version":3,"file":"useForm.d.ts","sourceRoot":"","sources":["../../src/core/useForm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,aAAa,EAAE,aAAa,EAAc,MAAM,SAAS,CAAA;AAwExF,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjF,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GACvB,aAAa,CAAC,CAAC,CAAC,CA6JlB"}
1
+ {"version":3,"file":"useForm.d.ts","sourceRoot":"","sources":["../../src/core/useForm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,aAAa,EAAE,aAAa,EAAc,MAAM,SAAS,CAAA;AAwExF,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjF,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GACvB,aAAa,CAAC,CAAC,CAAC,CA6QlB"}
@@ -0,0 +1,29 @@
1
+ import type { ComputedRef } from 'vue';
2
+ import type { UseFormReturn } from './types';
3
+ export interface FormSnapshot {
4
+ values: Record<string, unknown>;
5
+ errors: Record<string, string[]>;
6
+ touched: Record<string, boolean>;
7
+ isDirty: boolean;
8
+ isValid: boolean;
9
+ isSubmitting: boolean;
10
+ optionsLoading: Record<string, boolean>;
11
+ fields: Array<{
12
+ name: string;
13
+ visible: unknown;
14
+ disabled: unknown;
15
+ }>;
16
+ }
17
+ /**
18
+ * Returns a reactive snapshot of all form state — useful for debugging
19
+ * or building a DevTools-style inspector panel.
20
+ *
21
+ * @example
22
+ * const form = useForm({ schema })
23
+ * const { snapshot } = useFormDebug(form)
24
+ * // render snapshot in a <pre> tag during development
25
+ */
26
+ export declare function useFormDebug(form: UseFormReturn): {
27
+ snapshot: ComputedRef<FormSnapshot>;
28
+ };
29
+ //# sourceMappingURL=useFormDebug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFormDebug.d.ts","sourceRoot":"","sources":["../../src/core/useFormDebug.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,CAAA;AACtC,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,SAAS,CAAA;AAE7D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,OAAO,CAAA;IACrB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CACrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAC,YAAY,CAAC,CAAA;CAAE,CAiBzF"}
@@ -0,0 +1,18 @@
1
+ import type { FormFieldProps } from './types';
2
+ /**
3
+ * Helper composable for custom field component authors.
4
+ * Provides computed shortcuts and a typed emit helper.
5
+ *
6
+ * Usage in a custom field component:
7
+ * const props = defineProps<FormFieldProps>()
8
+ * const emit = defineEmits<{ 'update:modelValue': [value: unknown]; blur: [] }>()
9
+ * const { hasError, errorMessage } = useFormField(props)
10
+ */
11
+ export declare function useFormField(props: FormFieldProps): {
12
+ hasError: import("vue").ComputedRef<boolean>;
13
+ errorMessage: import("vue").ComputedRef<string | null>;
14
+ allErrors: import("vue").ComputedRef<string[]>;
15
+ isRequired: import("vue").ComputedRef<boolean>;
16
+ isDisabled: import("vue").ComputedRef<boolean>;
17
+ };
18
+ //# sourceMappingURL=useFormField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFormField.d.ts","sourceRoot":"","sources":["../../src/core/useFormField.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc;;;;;;EAUjD"}
@@ -0,0 +1,30 @@
1
+ import type { Ref, ComputedRef } from 'vue';
2
+ import type { UseFormConfig, UseFormReturn } from './types';
3
+ export interface MultiStepFormReturn {
4
+ currentStep: Ref<number>;
5
+ totalSteps: number;
6
+ isFirstStep: ComputedRef<boolean>;
7
+ isLastStep: ComputedRef<boolean>;
8
+ /** The active step's form instance */
9
+ form: ComputedRef<UseFormReturn>;
10
+ /** All step form instances */
11
+ steps: UseFormReturn[];
12
+ /** Merged values from all steps */
13
+ values: ComputedRef<Record<string, unknown>>;
14
+ isValid: ComputedRef<boolean>;
15
+ isSubmitting: ComputedRef<boolean>;
16
+ /** Validate current step and advance. Returns false if validation fails. */
17
+ next(): Promise<boolean>;
18
+ back(): void;
19
+ goTo(step: number): void;
20
+ submit(): Promise<void>;
21
+ }
22
+ /**
23
+ * Manages a multi-step form. Each step is an independent `useForm` instance.
24
+ * Must be called inside a component `setup()`.
25
+ *
26
+ * @param stepConfigs - Array of useForm configs (without onSubmit — handled centrally)
27
+ * @param onSubmit - Called with merged values from all steps when the last step is submitted
28
+ */
29
+ export declare function useMultiStepForm(stepConfigs: Omit<UseFormConfig, 'onSubmit'>[], onSubmit?: (values: Record<string, unknown>) => void | Promise<void>): MultiStepFormReturn;
30
+ //# sourceMappingURL=useMultiStepForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMultiStepForm.d.ts","sourceRoot":"","sources":["../../src/core/useMultiStepForm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,KAAK,CAAA;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE3D,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;IACjC,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;IAChC,sCAAsC;IACtC,IAAI,EAAE,WAAW,CAAC,aAAa,CAAC,CAAA;IAChC,8BAA8B;IAC9B,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,mCAAmC;IACnC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC5C,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;IAC7B,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;IAClC,4EAA4E;IAC5E,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACxB,IAAI,IAAI,IAAI,CAAA;IACZ,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACxB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,EAC9C,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACnE,mBAAmB,CAkErB"}