@macrulez/vue-form-schema 0.1.6 → 0.1.9

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 (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +12 -0
  3. package/dist/MaskEngine-DAKSNIHQ.cjs +1 -0
  4. package/dist/MaskEngine-mLoXKd4d.js +251 -0
  5. package/dist/core/ValidationEngine.d.ts +6 -0
  6. package/dist/core/ValidationEngine.d.ts.map +1 -1
  7. package/dist/core/types.d.ts +10 -2
  8. package/dist/core/types.d.ts.map +1 -1
  9. package/dist/core/useForm.d.ts.map +1 -1
  10. package/dist/index.cjs +1 -1
  11. package/dist/index.d.ts +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +159 -151
  14. package/dist/ui/index.d.ts +1 -0
  15. package/dist/ui/index.d.ts.map +1 -1
  16. package/dist/ui/tailwind/index.d.ts +11 -0
  17. package/dist/ui/tailwind/index.d.ts.map +1 -0
  18. package/dist/ui-tailwind.cjs +1 -0
  19. package/dist/ui-tailwind.d.ts +397 -0
  20. package/dist/ui-tailwind.js +650 -0
  21. package/dist/ui.cjs +1 -1
  22. package/dist/ui.d.ts +47 -10
  23. package/dist/ui.js +436 -300
  24. package/dist/valibot.d.ts +10 -2
  25. package/dist/yup.d.ts +10 -2
  26. package/dist/zod.d.ts +10 -2
  27. package/package.json +38 -24
  28. package/dist/MaskEngine-BqJQYybS.js +0 -233
  29. package/dist/MaskEngine-BwAs2Zb0.cjs +0 -1
  30. package/dist/__tests__/ConditionEvaluator.test.d.ts +0 -2
  31. package/dist/__tests__/ConditionEvaluator.test.d.ts.map +0 -1
  32. package/dist/__tests__/MaskEngine.test.d.ts +0 -2
  33. package/dist/__tests__/MaskEngine.test.d.ts.map +0 -1
  34. package/dist/__tests__/ValidationEngine.test.d.ts +0 -2
  35. package/dist/__tests__/ValidationEngine.test.d.ts.map +0 -1
  36. package/dist/__tests__/parsers.test.d.ts +0 -2
  37. package/dist/__tests__/parsers.test.d.ts.map +0 -1
  38. package/dist/__tests__/phase3.test.d.ts +0 -2
  39. package/dist/__tests__/phase3.test.d.ts.map +0 -1
  40. package/dist/__tests__/phase4.test.d.ts +0 -2
  41. package/dist/__tests__/phase4.test.d.ts.map +0 -1
  42. package/dist/__tests__/useFieldArray.test.d.ts +0 -2
  43. package/dist/__tests__/useFieldArray.test.d.ts.map +0 -1
  44. package/dist/__tests__/useForm.test.d.ts +0 -2
  45. package/dist/__tests__/useForm.test.d.ts.map +0 -1
  46. package/dist/__tests__/useMultiStepForm.test.d.ts +0 -2
  47. package/dist/__tests__/useMultiStepForm.test.d.ts.map +0 -1
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Danil Lisin Vladimirovich (macrulez)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1133,3 +1133,15 @@ Danil Lisin Vladimirovich aka Macrulez
1133
1133
  GitHub: [macrulezru](https://github.com/macrulezru) · Website: [macrulez.ru/en](https://macrulez.ru/en)
1134
1134
 
1135
1135
  Questions and bugs — [issues](https://github.com/macrulezru/vue-form-schema/issues)
1136
+
1137
+ ---
1138
+
1139
+ ## 💖 Support the project
1140
+
1141
+ Open source takes time and effort. If my work saves you time or brings value, consider supporting further development.
1142
+
1143
+ <a href="https://donate.cryptocloud.plus/M6O34NIN" target="_blank">
1144
+ <img src="https://img.shields.io/badge/Donate-CryptoCloud-8A2BE2?style=for-the-badge&logo=cryptocurrency&logoColor=white" alt="Donate via CryptoCloud">
1145
+ </a>
1146
+
1147
+ Thank you for being part of this journey. ❤️
@@ -0,0 +1 @@
1
+ "use strict";const g=require("vue"),A=Symbol("vfs:registry");function I(t){return{install(e){e.provide(A,t)}}}function S(){return g.inject(A,{})}function L(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((c,a)=>{var p;return{key:`${e}__${a}`,index:a,fields:$(((p=n.value)==null?void 0:p.fields)??[],e,a)}})),s=g.computed(()=>r.value.length);function i(){return[...t.getField(e)??[]]}function o(f={}){const c=i();c.push(f),t.setField(e,c)}function l(f={}){const c=i();c.unshift(f),t.setField(e,c)}function u(f){const c=i();c.splice(f,1),t.setField(e,c)}function d(f,c){const a=i(),[p]=a.splice(f,1);a.splice(c,0,p),t.setField(e,a)}function h(f,c){const a=i();[a[f],a[c]]=[a[c],a[f]],t.setField(e,a)}function x(f,c){const a=i();a[f]=c,t.setField(e,a)}return{rows:r,count:s,append:o,prepend:l,remove:u,move:d,swap:h,replace:x}}function $(t,e,n){return t.map(r=>({...r,name:`${e}.${n}.${r.name}`,fields:r.fields?$(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 w=t=>t==null||t===""||Array.isArray(t)&&t.length===0?"This field is required":null,k=(t,e)=>n=>typeof n!="string"&&!Array.isArray(n)||n.length>=t?null:e??`Minimum length is ${t}`,z=(t,e)=>n=>typeof n!="string"&&!Array.isArray(n)||n.length<=t?null:e??`Maximum length is ${t}`,B=(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}`},b=(t,e)=>n=>typeof n!="string"||t.test(n)?null:e??"Invalid format",j=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}`;function F(t){return t?t instanceof File?[t]:Array.isArray(t)?t.filter(e=>e instanceof File):[]:[]}function U(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}const K=(t,e)=>n=>{const r=F(n);return r.length&&r.filter(i=>!t.some(o=>i.type.startsWith(o)||i.name.toLowerCase().endsWith(o))).length?e??`Accepted formats: ${t.join(", ")}`:null},V=(t,e)=>n=>{const r=F(n);return r.length&&r.filter(i=>i.size>t).length?e??`File size must not exceed ${U(t)}`:null},W=(t,e)=>n=>F(n).length>t?e??`Maximum ${t} file${t===1?"":"s"} allowed`:null;class Y{constructor(e=300,n="first"){this.asyncTimers=new Map,this.debounceMs=e,this.validateMode=n}validateField(e,n,r){const s=[];if(e.required){const i=w(n);if(i&&(s.push(i),this.validateMode==="first"))return s}for(const i of e.validators??[]){const o=i(n,r);if(o&&(s.push(o),this.validateMode==="first"))return s}return s}validateAll(e,n){const r={};return this.collectErrors(e,n,r),r}collectErrors(e,n,r){for(const s of e){const i=E(n,s.name),o=this.validateField(s,i,n);o.length&&(r[s.name]=o),(s.type==="group"||s.type==="array")&&s.fields&&this.collectErrors(s.fields,n,r)}}validateAsync(e,n,r,s){var l;if(!((l=e.asyncValidators)!=null&&l.length))return;const i=this.asyncTimers.get(e.name);i&&clearTimeout(i);const o=setTimeout(async()=>{const d=(await Promise.all(e.asyncValidators.map(h=>h(n,r)))).filter(h=>h!==null);s(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 E(t,e){return e.split(".").reduce((n,r)=>{if(n&&typeof n=="object")return n[r]},t)}function G(t,e,n){const r=e.split("."),s={...t};let i=s;for(let o=0;o<r.length-1;o++){const l=r[o],u=i[l];Array.isArray(u)?i[l]=[...u]:u&&typeof u=="object"?i[l]={...u}:i[l]={},i=i[l]}return i[r[r.length-1]]=n,s}const Z={"phone-ru":"+7 (###) ###-##-##","phone-eu":"+## (##) ###-##-##",date:"##.##.####",inn:"############",iban:"AA## #### #### #### #### #### ####"};function R(t){return t.preset?Z[t.preset]:t.pattern??""}function y(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=R(typeof e=="string"?{pattern:e}:e);if(!r)return t;const s=Array.from(t);let i=0,o=-1;for(let u=0;u<r.length&&i<s.length;u++){const d=r[u];if(y(d)){for(;i<s.length&&!M(s[i],d);)i++;i<s.length&&(o=u,i++)}}if(o===-1)return"";let l="";i=0;for(let u=0;u<=o;u++){const d=r[u];if(y(d)){for(;i<s.length&&!M(s[i],d);)i++;i<s.length&&(l+=d==="A"?s[i++].toUpperCase():s[i++])}else l+=d}return l}function v(t,e){const r=R(typeof e=="string"?{pattern:e}:e);if(!r)return t;const s=[];let i=0;for(let o=0;o<r.length&&i<t.length;o++){const l=r[o],u=t[i];y(l)?(s.push(u),i++):u===l&&i++}return s.join("")}function D(t,e){function n(){const s=v(t.value,e),i=m(s,e);if(t.value!==i){const o=t.selectionStart??i.length;t.value=i;const l=Math.min(o,i.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=Y;exports.applyMask=m;exports.bindMask=D;exports.createFormRegistry=I;exports.email=j;exports.fileCount=W;exports.fileSize=V;exports.fileType=K;exports.getByPath=E;exports.max=q;exports.maxLength=z;exports.min=B;exports.minLength=k;exports.pattern=b;exports.provideRegistry=L;exports.removeMask=v;exports.required=w;exports.sameAs=_;exports.setByPath=G;exports.url=C;exports.useFieldArray=P;exports.useRegistry=S;
@@ -0,0 +1,251 @@
1
+ import { inject as I, provide as x, computed as p } from "vue";
2
+ const m = Symbol("vfs:registry");
3
+ function k(t) {
4
+ return {
5
+ install(e) {
6
+ e.provide(m, t);
7
+ }
8
+ };
9
+ }
10
+ function z() {
11
+ return I(m, {});
12
+ }
13
+ function b(t) {
14
+ x(m, t);
15
+ }
16
+ function q(t, e) {
17
+ const n = p(() => T(t.fields.value, e)), r = p(() => (t.getField(e) ?? []).map((u, a) => {
18
+ var g;
19
+ return {
20
+ key: `${e}__${a}`,
21
+ index: a,
22
+ fields: $(((g = n.value) == null ? void 0 : g.fields) ?? [], e, a)
23
+ };
24
+ })), i = p(() => r.value.length);
25
+ function s() {
26
+ return [...t.getField(e) ?? []];
27
+ }
28
+ function o(f = {}) {
29
+ const u = s();
30
+ u.push(f), t.setField(e, u);
31
+ }
32
+ function l(f = {}) {
33
+ const u = s();
34
+ u.unshift(f), t.setField(e, u);
35
+ }
36
+ function c(f) {
37
+ const u = s();
38
+ u.splice(f, 1), t.setField(e, u);
39
+ }
40
+ function d(f, u) {
41
+ const a = s(), [g] = a.splice(f, 1);
42
+ a.splice(u, 0, g), t.setField(e, a);
43
+ }
44
+ function h(f, u) {
45
+ const a = s();
46
+ [a[f], a[u]] = [a[u], a[f]], t.setField(e, a);
47
+ }
48
+ function E(f, u) {
49
+ const a = s();
50
+ a[f] = u, t.setField(e, a);
51
+ }
52
+ return { rows: r, count: i, append: o, prepend: l, remove: c, move: d, swap: h, replace: E };
53
+ }
54
+ function $(t, e, n) {
55
+ return t.map((r) => ({
56
+ ...r,
57
+ name: `${e}.${n}.${r.name}`,
58
+ fields: r.fields ? $(r.fields, e, n) : void 0
59
+ }));
60
+ }
61
+ function T(t, e) {
62
+ for (const n of t) {
63
+ if (n.name === e) return n;
64
+ if (n.fields) {
65
+ const r = T(n.fields, e);
66
+ if (r) return r;
67
+ }
68
+ }
69
+ }
70
+ const S = (t) => t == null || t === "" || Array.isArray(t) && t.length === 0 ? "This field is required" : null, B = (t, e) => (n) => typeof n != "string" && !Array.isArray(n) || n.length >= t ? null : e ?? `Minimum length is ${t}`, C = (t, e) => (n) => typeof n != "string" && !Array.isArray(n) || n.length <= t ? null : e ?? `Maximum length is ${t}`, _ = (t, e) => (n) => {
71
+ const r = Number(n);
72
+ return isNaN(r) || r >= t ? null : e ?? `Minimum value is ${t}`;
73
+ }, U = (t, e) => (n) => {
74
+ const r = Number(n);
75
+ return isNaN(r) || r <= t ? null : e ?? `Maximum value is ${t}`;
76
+ }, K = (t, e) => (n) => typeof n != "string" || t.test(n) ? null : e ?? "Invalid format", V = (t) => t ? /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(t)) ? null : "Invalid email address" : null, W = (t) => {
77
+ if (!t) return null;
78
+ try {
79
+ return new URL(String(t)), null;
80
+ } catch {
81
+ return "Invalid URL";
82
+ }
83
+ }, Y = (t, e) => (n, r) => n === r[t] ? null : e ?? `Must match ${t}`;
84
+ function v(t) {
85
+ return t ? t instanceof File ? [t] : Array.isArray(t) ? t.filter((e) => e instanceof File) : [] : [];
86
+ }
87
+ function R(t) {
88
+ return t < 1024 ? `${t} B` : t < 1024 * 1024 ? `${(t / 1024).toFixed(1)} KB` : `${(t / (1024 * 1024)).toFixed(1)} MB`;
89
+ }
90
+ const G = (t, e) => (n) => {
91
+ const r = v(n);
92
+ return r.length && r.filter(
93
+ (s) => !t.some((o) => s.type.startsWith(o) || s.name.toLowerCase().endsWith(o))
94
+ ).length ? e ?? `Accepted formats: ${t.join(", ")}` : null;
95
+ }, Z = (t, e) => (n) => {
96
+ const r = v(n);
97
+ return r.length && r.filter((s) => s.size > t).length ? e ?? `File size must not exceed ${R(t)}` : null;
98
+ }, D = (t, e) => (n) => v(n).length > t ? e ?? `Maximum ${t} file${t === 1 ? "" : "s"} allowed` : null;
99
+ class H {
100
+ constructor(e = 300, n = "first") {
101
+ this.asyncTimers = /* @__PURE__ */ new Map(), this.debounceMs = e, this.validateMode = n;
102
+ }
103
+ /** Run sync validators for a single field; returns list of error messages */
104
+ validateField(e, n, r) {
105
+ const i = [];
106
+ if (e.required) {
107
+ const s = S(n);
108
+ if (s && (i.push(s), this.validateMode === "first"))
109
+ return i;
110
+ }
111
+ for (const s of e.validators ?? []) {
112
+ const o = s(n, r);
113
+ if (o && (i.push(o), this.validateMode === "first"))
114
+ return i;
115
+ }
116
+ return i;
117
+ }
118
+ /** Run all sync validators across all visible fields */
119
+ validateAll(e, n) {
120
+ const r = {};
121
+ return this.collectErrors(e, n, r), r;
122
+ }
123
+ collectErrors(e, n, r) {
124
+ for (const i of e) {
125
+ const s = L(n, i.name), o = this.validateField(i, s, n);
126
+ o.length && (r[i.name] = o), (i.type === "group" || i.type === "array") && i.fields && this.collectErrors(i.fields, n, r);
127
+ }
128
+ }
129
+ /** Run async validators with debounce; calls onResult when done */
130
+ validateAsync(e, n, r, i) {
131
+ var l;
132
+ if (!((l = e.asyncValidators) != null && l.length)) return;
133
+ const s = this.asyncTimers.get(e.name);
134
+ s && clearTimeout(s);
135
+ const o = setTimeout(async () => {
136
+ const d = (await Promise.all(
137
+ e.asyncValidators.map((h) => h(n, r))
138
+ )).filter((h) => h !== null);
139
+ i(e.name, d), this.asyncTimers.delete(e.name);
140
+ }, this.debounceMs);
141
+ this.asyncTimers.set(e.name, o);
142
+ }
143
+ destroy() {
144
+ for (const e of this.asyncTimers.values()) clearTimeout(e);
145
+ this.asyncTimers.clear();
146
+ }
147
+ }
148
+ function L(t, e) {
149
+ return e.split(".").reduce((n, r) => {
150
+ if (n && typeof n == "object") return n[r];
151
+ }, t);
152
+ }
153
+ function J(t, e, n) {
154
+ const r = e.split("."), i = { ...t };
155
+ let s = i;
156
+ for (let o = 0; o < r.length - 1; o++) {
157
+ const l = r[o], c = s[l];
158
+ Array.isArray(c) ? s[l] = [...c] : c && typeof c == "object" ? s[l] = { ...c } : s[l] = {}, s = s[l];
159
+ }
160
+ return s[r[r.length - 1]] = n, i;
161
+ }
162
+ const P = {
163
+ "phone-ru": "+7 (###) ###-##-##",
164
+ "phone-eu": "+## (##) ###-##-##",
165
+ date: "##.##.####",
166
+ inn: "############",
167
+ iban: "AA## #### #### #### #### #### ####"
168
+ };
169
+ function w(t) {
170
+ return t.preset ? P[t.preset] : t.pattern ?? "";
171
+ }
172
+ function y(t) {
173
+ return t === "#" || t === "A";
174
+ }
175
+ function A(t, e) {
176
+ return e === "#" ? /\d/.test(t) : e === "A" ? /[a-zA-Z]/.test(t) : !1;
177
+ }
178
+ function F(t, e) {
179
+ const r = w(typeof e == "string" ? { pattern: e } : e);
180
+ if (!r) return t;
181
+ const i = Array.from(t);
182
+ let s = 0, o = -1;
183
+ for (let c = 0; c < r.length && s < i.length; c++) {
184
+ const d = r[c];
185
+ if (y(d)) {
186
+ for (; s < i.length && !A(i[s], d); ) s++;
187
+ s < i.length && (o = c, s++);
188
+ }
189
+ }
190
+ if (o === -1) return "";
191
+ let l = "";
192
+ s = 0;
193
+ for (let c = 0; c <= o; c++) {
194
+ const d = r[c];
195
+ if (y(d)) {
196
+ for (; s < i.length && !A(i[s], d); ) s++;
197
+ s < i.length && (l += d === "A" ? i[s++].toUpperCase() : i[s++]);
198
+ } else
199
+ l += d;
200
+ }
201
+ return l;
202
+ }
203
+ function M(t, e) {
204
+ const r = w(typeof e == "string" ? { pattern: e } : e);
205
+ if (!r) return t;
206
+ const i = [];
207
+ let s = 0;
208
+ for (let o = 0; o < r.length && s < t.length; o++) {
209
+ const l = r[o], c = t[s];
210
+ y(l) ? (i.push(c), s++) : c === l && s++;
211
+ }
212
+ return i.join("");
213
+ }
214
+ function O(t, e) {
215
+ function n() {
216
+ const i = M(t.value, e), s = F(i, e);
217
+ if (t.value !== s) {
218
+ const o = t.selectionStart ?? s.length;
219
+ t.value = s;
220
+ const l = Math.min(o, s.length);
221
+ t.setSelectionRange(l, l);
222
+ }
223
+ }
224
+ t.addEventListener("input", n);
225
+ const r = F(M(t.value, e), e);
226
+ return t.value !== r && r && (t.value = r), () => t.removeEventListener("input", n);
227
+ }
228
+ export {
229
+ H as V,
230
+ F as a,
231
+ O as b,
232
+ k as c,
233
+ Z as d,
234
+ V as e,
235
+ D as f,
236
+ G as g,
237
+ L as h,
238
+ C as i,
239
+ _ as j,
240
+ B as k,
241
+ b as l,
242
+ U as m,
243
+ S as n,
244
+ J as o,
245
+ K as p,
246
+ q,
247
+ M as r,
248
+ Y as s,
249
+ z as t,
250
+ W as u
251
+ };
@@ -8,6 +8,12 @@ export declare const pattern: (regex: RegExp, message?: string) => ValidatorFn;
8
8
  export declare const email: ValidatorFn;
9
9
  export declare const url: ValidatorFn;
10
10
  export declare const sameAs: (otherField: string, message?: string) => ValidatorFn;
11
+ /** Validate that all selected files match one of the provided MIME-type prefixes or extensions */
12
+ export declare const fileType: (types: string[], message?: string) => ValidatorFn;
13
+ /** Validate that all selected files are within the size limit */
14
+ export declare const fileSize: (maxBytes: number, message?: string) => ValidatorFn;
15
+ /** Validate that no more than maxCount files are selected */
16
+ export declare const fileCount: (maxCount: number, message?: string) => ValidatorFn;
11
17
  export declare class ValidationEngine {
12
18
  private asyncTimers;
13
19
  private readonly debounceMs;
@@ -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;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"}
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;AAiBpF,kGAAkG;AAClG,eAAO,MAAM,QAAQ,GAClB,OAAO,MAAM,EAAE,EAAE,UAAU,MAAM,KAAG,WAQpC,CAAA;AAEH,iEAAiE;AACjE,eAAO,MAAM,QAAQ,GAClB,UAAU,MAAM,EAAE,UAAU,MAAM,KAAG,WAQrC,CAAA;AAEH,6DAA6D;AAC7D,eAAO,MAAM,SAAS,GACnB,UAAU,MAAM,EAAE,UAAU,MAAM,KAAG,WAMrC,CAAA;AAIH,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"}
@@ -11,14 +11,14 @@ export interface FieldOption {
11
11
  label: string;
12
12
  value: unknown;
13
13
  }
14
- export type FieldType = 'text' | 'number' | 'email' | 'select' | 'checkbox' | 'radio' | 'textarea' | 'date' | 'array' | 'group';
14
+ export type FieldType = 'text' | 'number' | 'email' | 'select' | 'checkbox' | 'radio' | 'textarea' | 'date' | 'array' | 'group' | 'file';
15
15
  export interface FieldDefinition {
16
16
  type: FieldType;
17
17
  /** Dot-path for nested fields, e.g. "address.city" */
18
18
  name: string;
19
19
  label?: string;
20
20
  placeholder?: string;
21
- defaultValue?: unknown;
21
+ defaultValue?: unknown | ((values: Record<string, unknown>) => unknown);
22
22
  required?: boolean;
23
23
  /** Static or dynamic disabled state */
24
24
  disabled?: boolean | ((values: Record<string, unknown>) => boolean);
@@ -53,6 +53,14 @@ export interface FieldDefinition {
53
53
  * Receives FormFieldProps and must emit 'update:modelValue' and 'blur'.
54
54
  */
55
55
  component?: Component | string;
56
+ /** Accepted file types, e.g. "image/*,.pdf" — passed to <input accept> */
57
+ accept?: string;
58
+ /** Allow selecting multiple files */
59
+ multiple?: boolean;
60
+ /** Maximum file size in bytes */
61
+ maxSize?: number;
62
+ /** Maximum number of files (only relevant when multiple=true) */
63
+ maxFiles?: number;
56
64
  }
57
65
  export interface FormFieldProps {
58
66
  field: FieldDefinition;
@@ -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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"}
@@ -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,CA6QlB"}
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;AAsFxF,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"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./MaskEngine-BwAs2Zb0.cjs"),l=require("vue");function G(n){const s=l.computed(()=>n.touched&&n.error.length>0),t=l.computed(()=>s.value?n.error[0]:null),e=l.computed(()=>n.touched?n.error:[]),i=l.computed(()=>n.field.required??!1),m=l.computed(()=>typeof n.field.disabled=="boolean"?n.field.disabled:!1);return{hasError:s,errorMessage:t,allErrors:e,isRequired:i,isDisabled:m}}const Q=/^[\w\s\d.'"[\]()!<>=&|?:+\-*/%]+$/;function Y(n,s){if(!Q.test(n))return console.warn(`[vue-form-schema] Blocked unsafe expression: "${n}"`),!0;try{return!!new Function("values",`"use strict"; return (${n})`)(s)}catch{return!0}}class N{constructor(){this.stopHandle=null}start(s,t,e,i){this.stopHandle=l.watchEffect(()=>{const m=t.value,f=e.value,d=this.evaluateFields(s,m);i&&this.clearHiddenValues(s,d,m,t,f),e.value=d})}stop(){var s;(s=this.stopHandle)==null||s.call(this),this.stopHandle=null}evaluateFields(s,t){return s.map(e=>{const i=this.resolveBoolean(e.visible,t,!0),m=this.resolveBoolean(e.disabled,t,!1);let f;if(typeof e.options=="function"){const p=e.options(t);f=p instanceof Promise?void 0:p}else f=e.options;return{...e,visible:i,disabled:m,options:f,fields:e.fields?this.evaluateFields(e.fields,t):void 0}})}resolveBoolean(s,t,e){return s===void 0?e:typeof s=="boolean"?s:typeof s=="function"?s(t):typeof s=="string"?Y(s,t):e}clearHiddenValues(s,t,e,i,m){for(let f=0;f<s.length;f++){const d=s[f],p=t[f],O=this.wasVisible(m,d.name),h=p.visible;if(O&&!h){const y=r.getByPath(e,d.name),F=d.defaultValue??null;y!==F&&(i.value=r.setByPath(i.value,d.name,F))}d.fields&&p.fields&&this.clearHiddenValues(d.fields,p.fields,e,i,m)}}wasVisible(s,t){const e=s.find(i=>i.name===t);return e?e.visible!==!1:!0}}function Z(n,s){return new N().evaluateFields(n,s)}function ee(n,s,t){switch(n){case"required":return t?(e,i)=>r.required(e)?t:null:r.required;case"minLength":return r.minLength(Number(s),t);case"maxLength":return r.maxLength(Number(s),t);case"min":return r.min(Number(s),t);case"max":return r.max(Number(s),t);case"pattern":return r.pattern(new RegExp(String(s)),t);case"email":return t?(e,i)=>r.email(e)?t:null:r.email;case"url":return t?(e,i)=>r.url(e)?t:null:r.url;default:return console.warn(`[vue-form-schema] Unknown validator rule: "${n}"`),null}}function D(n){const s=[];for(const t of n.validators??[]){const e=ee(t.rule,t.value,t.message);e&&s.push(e)}return{type:n.type,name:n.name,label:n.label,placeholder:n.placeholder,defaultValue:n.default,required:n.required,disabled:n.disabled,visible:n.visible,mask:n.mask,options:n.options,validators:s.length?s:void 0,fields:n.fields?n.fields.map(D):void 0}}function H(n){return n.map(D)}function te(n){if(!Array.isArray(n)||n.length===0)return!1;for(const s of n){const t=s.validators;if(Array.isArray(t)&&t.some(e=>typeof e=="function"))return!1}return n.some(s=>{const t=s;if("default"in t)return!0;const e=t.validators;return Array.isArray(e)&&e.length>0&&typeof e[0]=="object"&&e[0]!==null&&"rule"in e[0]})}function ne(n){return te(n)?H(n):n}function V(n,s={}){const t={};for(const e of n)if(e.type==="group"&&e.fields){const i=V(e.fields,s);Object.assign(t,i)}else if(e.type==="array"){const i=r.getByPath(s,e.name);t[e.name]=i??e.defaultValue??[]}else{const i=r.getByPath(s,e.name);t[e.name]=i!==void 0?i:e.defaultValue??null}for(const[e,i]of Object.entries(s))e in t||(t[e]=i);return t}function R(n){var j;const{schema:s,initialValues:t={},validateOn:e="blur",validateMode:i="first",clearOnHide:m=!1,onSubmit:f,persist:d=!1,persistKey:p,debug:O=!1}=n,h=ne(s),y=new r.ValidationEngine(300,i),F=new N,w=p??`vfs:${h.map(a=>a.name).join(",")}`;function E(){return typeof window>"u"||!d?null:d==="local"?window.localStorage:window.sessionStorage}const o=l.ref(V(h,t)),v=l.ref({}),b=l.ref({}),P=l.ref(!1),g=l.ref(h),S=l.ref({}),B=l.ref({}),x=new Set;let k=!1;F.start(h,o,g,m??!1);async function M(a){if(typeof a.options!="function")return;const u=a.options(o.value);if(u instanceof Promise){S.value={...S.value,[a.name]:!0};try{const c=await u;B.value={...B.value,[a.name]:c}}catch(c){console.warn(`[vue-form-schema] Failed to load options for "${a.name}"`,c)}finally{S.value={...S.value,[a.name]:!1}}}}const q=h.filter(a=>typeof a.options=="function");l.onMounted(async()=>{const a=E();if(a)try{const u=a.getItem(w);if(u){const c=JSON.parse(u);o.value={...o.value,...c}}}catch{}await Promise.all(q.map(u=>M(u)))}),d&&l.watch(o,a=>{var u;if(!k)try{(u=E())==null||u.setItem(w,JSON.stringify(a))}catch{}},{deep:!0});for(const a of q)(j=a.optionsDeps)!=null&&j.length&&l.watch(()=>a.optionsDeps.map(u=>r.getByPath(o.value,u)),()=>M(a));O&&l.watch(o,a=>{console.group("[vue-form-schema] values changed"),console.log("values:",JSON.parse(JSON.stringify(a))),console.log("errors:",v.value),console.log("touched:",b.value),console.groupEnd()},{deep:!0});const T=l.computed(()=>g.value.map(a=>({...a,options:B.value[a.name]??a.options,optionsLoading:S.value[a.name]??!1}))),I=l.computed(()=>{const a=V(h,t);return JSON.stringify(o.value)!==JSON.stringify(a)}),K=l.computed(()=>{const a=y.validateAll(g.value,o.value);return Object.values(a).every(u=>u.length===0)});function J(a){if(a){const u=y.validateField(a,r.getByPath(o.value,a.name),o.value);v.value={...v.value,[a.name]:u},y.validateAsync(a,r.getByPath(o.value,a.name),o.value,(c,A)=>{v.value={...v.value,[c]:[...v.value[c]??[],...A]}})}else v.value=y.validateAll(g.value,o.value)}function U(a,u){const c=L(g.value,a),A=c!=null&&c.transform?c.transform(u,o.value):u;o.value=r.setByPath(o.value,a,A),(e==="input"||e==="eager"&&x.has(a))&&c&&J(c)}function W(a){return r.getByPath(o.value,a)}function X(a){if(b.value={...b.value,[a]:!0},x.add(a),e==="blur"||e==="eager"){const u=L(g.value,a);u&&J(u)}}async function _(){const a={};for(const c of g.value)$(c,a);if(b.value=a,v.value=y.validateAll(g.value,o.value),!Object.values(v.value).some(c=>c.length>0)){P.value=!0;try{const c=C(g.value,o.value);await(f==null?void 0:f(c))}finally{P.value=!1}}}function z(a){var c;const u=a??t;o.value=V(h,u??{}),v.value={},b.value={},P.value=!1,k=!0,(c=E())==null||c.removeItem(w),Promise.resolve().then(()=>{k=!1})}return l.onUnmounted(()=>{F.stop(),y.destroy()}),{fields:T,values:o,errors:v,touched:b,optionsLoading:S,isDirty:I,isValid:K,isSubmitting:P,submit:_,reset:z,setField:U,getField:W,touchField:X}}function L(n,s){for(const t of n){if(t.name===s)return t;if(t.fields){const e=L(t.fields,s);if(e)return e}}}function $(n,s={}){return s[n.name]=!0,n.fields&&n.fields.forEach(t=>$(t,s)),s}function C(n,s){const t={...s};for(const e of n){if(e.parse){const i=r.getByPath(t,e.name);t[e.name]=e.parse(i)}if(e.fields){const i=C(e.fields,t);Object.assign(t,i)}}return t}function se(n,s){const t=n.map(o=>R(o)),e=l.ref(0),i=t.length,m=l.computed(()=>e.value===0),f=l.computed(()=>e.value===i-1),d=l.computed(()=>t[e.value]),p=l.computed(()=>t.reduce((o,v)=>({...o,...v.values.value}),{})),O=l.computed(()=>t.every(o=>o.isValid.value)),h=l.computed(()=>t.some(o=>o.isSubmitting.value));async function y(){return await t[e.value].submit(),Object.values(t[e.value].errors.value).some(v=>v.length>0)?!1:(f.value||e.value++,!0)}function F(){m.value||e.value--}function w(o){o>=0&&o<i&&(e.value=o)}async function E(){for(const o of t)if(await o.submit(),Object.values(o.errors.value).some(b=>b.length>0))return;await(s==null?void 0:s(p.value))}return{currentStep:e,totalSteps:i,isFirstStep:m,isLastStep:f,form:d,steps:t,values:p,isValid:O,isSubmitting:h,next:y,back:F,goTo:w,submit:E}}function ae(n){return{snapshot:l.computed(()=>({values:JSON.parse(JSON.stringify(n.values.value)),errors:n.errors.value,touched:n.touched.value,isDirty:n.isDirty.value,isValid:n.isValid.value,isSubmitting:n.isSubmitting.value,optionsLoading:n.optionsLoading.value,fields:n.fields.value.map(t=>({name:t.name,visible:t.visible,disabled:t.disabled}))}))}}function re(...n){const s=new Map;for(const t of n)for(const e of t)s.set(e.name,e);return Array.from(s.values())}function oe(n,s){const t=new Set(s);return n.filter(e=>!t.has(e.name))}function ie(n,s){const t=new Set(s);return n.filter(e=>t.has(e.name))}function le(n,s,t){return n.map(e=>e.name===s?{...e,...t}:e)}function ue(n){return n}exports.ValidationEngine=r.ValidationEngine;exports.applyMask=r.applyMask;exports.bindMask=r.bindMask;exports.createFormRegistry=r.createFormRegistry;exports.email=r.email;exports.getByPath=r.getByPath;exports.max=r.max;exports.maxLength=r.maxLength;exports.min=r.min;exports.minLength=r.minLength;exports.pattern=r.pattern;exports.provideRegistry=r.provideRegistry;exports.removeMask=r.removeMask;exports.required=r.required;exports.sameAs=r.sameAs;exports.setByPath=r.setByPath;exports.url=r.url;exports.useFieldArray=r.useFieldArray;exports.useRegistry=r.useRegistry;exports.ConditionEvaluator=N;exports.defineSchema=ue;exports.evaluateFieldConditions=Z;exports.extendField=le;exports.mergeSchemas=re;exports.omitFields=oe;exports.parseJSON=H;exports.pickFields=ie;exports.useForm=R;exports.useFormDebug=ae;exports.useFormField=G;exports.useMultiStepForm=se;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./MaskEngine-DAKSNIHQ.cjs"),l=require("vue");function G(n){const s=l.computed(()=>n.touched&&n.error.length>0),t=l.computed(()=>s.value?n.error[0]:null),e=l.computed(()=>n.touched?n.error:[]),r=l.computed(()=>n.field.required??!1),d=l.computed(()=>typeof n.field.disabled=="boolean"?n.field.disabled:!1);return{hasError:s,errorMessage:t,allErrors:e,isRequired:r,isDisabled:d}}const Q=/^[\w\s\d.'"[\]()!<>=&|?:+\-*/%]+$/;function Y(n,s){if(!Q.test(n))return console.warn(`[vue-form-schema] Blocked unsafe expression: "${n}"`),!0;try{return!!new Function("values",`"use strict"; return (${n})`)(s)}catch{return!0}}class L{constructor(){this.stopHandle=null}start(s,t,e,r){this.stopHandle=l.watchEffect(()=>{const d=t.value,f=e.value,v=this.evaluateFields(s,d);r&&this.clearHiddenValues(s,v,d,t,f),e.value=v})}stop(){var s;(s=this.stopHandle)==null||s.call(this),this.stopHandle=null}evaluateFields(s,t){return s.map(e=>{const r=this.resolveBoolean(e.visible,t,!0),d=this.resolveBoolean(e.disabled,t,!1);let f;if(typeof e.options=="function"){const p=e.options(t);f=p instanceof Promise?void 0:p}else f=e.options;return{...e,visible:r,disabled:d,options:f,fields:e.fields?this.evaluateFields(e.fields,t):void 0}})}resolveBoolean(s,t,e){return s===void 0?e:typeof s=="boolean"?s:typeof s=="function"?s(t):typeof s=="string"?Y(s,t):e}clearHiddenValues(s,t,e,r,d){for(let f=0;f<s.length;f++){const v=s[f],p=t[f],O=this.wasVisible(d,v.name),y=p.visible;if(O&&!y){const h=i.getByPath(e,v.name),F=v.defaultValue??null;h!==F&&(r.value=i.setByPath(r.value,v.name,F))}v.fields&&p.fields&&this.clearHiddenValues(v.fields,p.fields,e,r,d)}}wasVisible(s,t){const e=s.find(r=>r.name===t);return e?e.visible!==!1:!0}}function Z(n,s){return new L().evaluateFields(n,s)}function ee(n,s,t){switch(n){case"required":return t?(e,r)=>i.required(e)?t:null:i.required;case"minLength":return i.minLength(Number(s),t);case"maxLength":return i.maxLength(Number(s),t);case"min":return i.min(Number(s),t);case"max":return i.max(Number(s),t);case"pattern":return i.pattern(new RegExp(String(s)),t);case"email":return t?(e,r)=>i.email(e)?t:null:i.email;case"url":return t?(e,r)=>i.url(e)?t:null:i.url;default:return console.warn(`[vue-form-schema] Unknown validator rule: "${n}"`),null}}function D(n){const s=[];for(const t of n.validators??[]){const e=ee(t.rule,t.value,t.message);e&&s.push(e)}return{type:n.type,name:n.name,label:n.label,placeholder:n.placeholder,defaultValue:n.default,required:n.required,disabled:n.disabled,visible:n.visible,mask:n.mask,options:n.options,validators:s.length?s:void 0,fields:n.fields?n.fields.map(D):void 0}}function H(n){return n.map(D)}function te(n){if(!Array.isArray(n)||n.length===0)return!1;for(const s of n){const t=s.validators;if(Array.isArray(t)&&t.some(e=>typeof e=="function"))return!1}return n.some(s=>{const t=s;if("default"in t)return!0;const e=t.validators;return Array.isArray(e)&&e.length>0&&typeof e[0]=="object"&&e[0]!==null&&"rule"in e[0]})}function ne(n){return te(n)?H(n):n}function E(n,s={}){const t={};for(const e of n)if(e.type==="group"&&e.fields){const r=E(e.fields,s);Object.assign(t,r)}else if(e.type==="array"){const r=i.getByPath(s,e.name),d=typeof e.defaultValue=="function"?void 0:e.defaultValue;t[e.name]=r??d??[]}else if(typeof e.defaultValue!="function"){const r=i.getByPath(s,e.name);t[e.name]=r!==void 0?r:e.defaultValue??null}for(const e of n)if(e.type!=="group"&&typeof e.defaultValue=="function"){const r=i.getByPath(s,e.name);r===void 0?t[e.name]=e.defaultValue(t):t[e.name]=r}for(const[e,r]of Object.entries(s))e in t||(t[e]=r);return t}function C(n){var j;const{schema:s,initialValues:t={},validateOn:e="blur",validateMode:r="first",clearOnHide:d=!1,onSubmit:f,persist:v=!1,persistKey:p,debug:O=!1}=n,y=ne(s),h=new i.ValidationEngine(300,r),F=new L,V=p??`vfs:${y.map(a=>a.name).join(",")}`;function w(){return typeof window>"u"||!v?null:v==="local"?window.localStorage:window.sessionStorage}const o=l.ref(E(y,t)),m=l.ref({}),b=l.ref({}),P=l.ref(!1),g=l.ref(y),S=l.ref({}),B=l.ref({}),N=new Set;let k=!1;F.start(y,o,g,d??!1);async function M(a){if(typeof a.options!="function")return;const u=a.options(o.value);if(u instanceof Promise){S.value={...S.value,[a.name]:!0};try{const c=await u;B.value={...B.value,[a.name]:c}}catch(c){console.warn(`[vue-form-schema] Failed to load options for "${a.name}"`,c)}finally{S.value={...S.value,[a.name]:!1}}}}const q=y.filter(a=>typeof a.options=="function");l.onMounted(async()=>{const a=w();if(a)try{const u=a.getItem(V);if(u){const c=JSON.parse(u);o.value={...o.value,...c}}}catch{}await Promise.all(q.map(u=>M(u)))}),v&&l.watch(o,a=>{var u;if(!k)try{(u=w())==null||u.setItem(V,JSON.stringify(a))}catch{}},{deep:!0});for(const a of q)(j=a.optionsDeps)!=null&&j.length&&l.watch(()=>a.optionsDeps.map(u=>i.getByPath(o.value,u)),()=>M(a));O&&l.watch(o,a=>{console.group("[vue-form-schema] values changed"),console.log("values:",JSON.parse(JSON.stringify(a))),console.log("errors:",m.value),console.log("touched:",b.value),console.groupEnd()},{deep:!0});const $=l.computed(()=>g.value.map(a=>({...a,options:B.value[a.name]??a.options,optionsLoading:S.value[a.name]??!1}))),I=l.computed(()=>{const a=E(y,t);return JSON.stringify(o.value)!==JSON.stringify(a)}),z=l.computed(()=>{const a=h.validateAll(g.value,o.value);return Object.values(a).every(u=>u.length===0)});function J(a){if(a){const u=h.validateField(a,i.getByPath(o.value,a.name),o.value);m.value={...m.value,[a.name]:u},h.validateAsync(a,i.getByPath(o.value,a.name),o.value,(c,A)=>{m.value={...m.value,[c]:[...m.value[c]??[],...A]}})}else m.value=h.validateAll(g.value,o.value)}function K(a,u){const c=x(g.value,a),A=c!=null&&c.transform?c.transform(u,o.value):u;o.value=i.setByPath(o.value,a,A),(e==="input"||e==="eager"&&N.has(a))&&c&&J(c)}function U(a){return i.getByPath(o.value,a)}function W(a){if(b.value={...b.value,[a]:!0},N.add(a),e==="blur"||e==="eager"){const u=x(g.value,a);u&&J(u)}}async function X(){const a={};for(const c of g.value)R(c,a);if(b.value=a,m.value=h.validateAll(g.value,o.value),!Object.values(m.value).some(c=>c.length>0)){P.value=!0;try{const c=T(g.value,o.value);await(f==null?void 0:f(c))}finally{P.value=!1}}}function _(a){var c;const u=a??t;o.value=E(y,u??{}),m.value={},b.value={},P.value=!1,k=!0,(c=w())==null||c.removeItem(V),Promise.resolve().then(()=>{k=!1})}return l.onUnmounted(()=>{F.stop(),h.destroy()}),{fields:$,values:o,errors:m,touched:b,optionsLoading:S,isDirty:I,isValid:z,isSubmitting:P,submit:X,reset:_,setField:K,getField:U,touchField:W}}function x(n,s){for(const t of n){if(t.name===s)return t;if(t.fields){const e=x(t.fields,s);if(e)return e}}}function R(n,s={}){return s[n.name]=!0,n.fields&&n.fields.forEach(t=>R(t,s)),s}function T(n,s){const t={...s};for(const e of n){if(e.parse){const r=i.getByPath(t,e.name);t[e.name]=e.parse(r)}if(e.fields){const r=T(e.fields,t);Object.assign(t,r)}}return t}function se(n,s){const t=n.map(o=>C(o)),e=l.ref(0),r=t.length,d=l.computed(()=>e.value===0),f=l.computed(()=>e.value===r-1),v=l.computed(()=>t[e.value]),p=l.computed(()=>t.reduce((o,m)=>({...o,...m.values.value}),{})),O=l.computed(()=>t.every(o=>o.isValid.value)),y=l.computed(()=>t.some(o=>o.isSubmitting.value));async function h(){return await t[e.value].submit(),Object.values(t[e.value].errors.value).some(m=>m.length>0)?!1:(f.value||e.value++,!0)}function F(){d.value||e.value--}function V(o){o>=0&&o<r&&(e.value=o)}async function w(){for(const o of t)if(await o.submit(),Object.values(o.errors.value).some(b=>b.length>0))return;await(s==null?void 0:s(p.value))}return{currentStep:e,totalSteps:r,isFirstStep:d,isLastStep:f,form:v,steps:t,values:p,isValid:O,isSubmitting:y,next:h,back:F,goTo:V,submit:w}}function ae(n){return{snapshot:l.computed(()=>({values:JSON.parse(JSON.stringify(n.values.value)),errors:n.errors.value,touched:n.touched.value,isDirty:n.isDirty.value,isValid:n.isValid.value,isSubmitting:n.isSubmitting.value,optionsLoading:n.optionsLoading.value,fields:n.fields.value.map(t=>({name:t.name,visible:t.visible,disabled:t.disabled}))}))}}function ie(...n){const s=new Map;for(const t of n)for(const e of t)s.set(e.name,e);return Array.from(s.values())}function oe(n,s){const t=new Set(s);return n.filter(e=>!t.has(e.name))}function re(n,s){const t=new Set(s);return n.filter(e=>t.has(e.name))}function le(n,s,t){return n.map(e=>e.name===s?{...e,...t}:e)}function ue(n){return n}exports.ValidationEngine=i.ValidationEngine;exports.applyMask=i.applyMask;exports.bindMask=i.bindMask;exports.createFormRegistry=i.createFormRegistry;exports.email=i.email;exports.fileCount=i.fileCount;exports.fileSize=i.fileSize;exports.fileType=i.fileType;exports.getByPath=i.getByPath;exports.max=i.max;exports.maxLength=i.maxLength;exports.min=i.min;exports.minLength=i.minLength;exports.pattern=i.pattern;exports.provideRegistry=i.provideRegistry;exports.removeMask=i.removeMask;exports.required=i.required;exports.sameAs=i.sameAs;exports.setByPath=i.setByPath;exports.url=i.url;exports.useFieldArray=i.useFieldArray;exports.useRegistry=i.useRegistry;exports.ConditionEvaluator=L;exports.defineSchema=ue;exports.evaluateFieldConditions=Z;exports.extendField=le;exports.mergeSchemas=ie;exports.omitFields=oe;exports.parseJSON=H;exports.pickFields=re;exports.useForm=C;exports.useFormDebug=ae;exports.useFormField=G;exports.useMultiStepForm=se;
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@ export type { MultiStepFormReturn } from './core/useMultiStepForm';
9
9
  export { useFormDebug } from './core/useFormDebug';
10
10
  export type { FormSnapshot } from './core/useFormDebug';
11
11
  export { useForm } from './core/useForm';
12
- export { required, minLength, maxLength, min, max, pattern, email, url, sameAs, ValidationEngine, getByPath, setByPath, } from './core/ValidationEngine';
12
+ export { required, minLength, maxLength, min, max, pattern, email, url, sameAs, fileType, fileSize, fileCount, ValidationEngine, getByPath, setByPath, } from './core/ValidationEngine';
13
13
  export { mergeSchemas, omitFields, pickFields, extendField } from './core/schemaUtils';
14
14
  export type { InferValues } from './core/inferTypes';
15
15
  export { defineSchema } from './core/inferTypes';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,eAAe,EACf,SAAS,EACT,WAAW,EACX,UAAU,EACV,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,UAAU,EACV,eAAe,EACf,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAClF,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAG9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGvD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAGxC,OAAO,EACL,QAAQ,EACR,SAAS,EACT,SAAS,EACT,GAAG,EACH,GAAG,EACH,OAAO,EACP,KAAK,EACL,GAAG,EACH,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,SAAS,GACV,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGtF,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGhD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAGvF,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,eAAe,EACf,SAAS,EACT,WAAW,EACX,UAAU,EACV,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,UAAU,EACV,eAAe,EACf,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAClF,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAG9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGvD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAGxC,OAAO,EACL,QAAQ,EACR,SAAS,EACT,SAAS,EACT,GAAG,EACH,GAAG,EACH,OAAO,EACP,KAAK,EACL,GAAG,EACH,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,SAAS,GACV,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGtF,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGhD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAGvF,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA"}