@macrulez/vue-form-schema 0.1.9 → 0.2.0

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 (82) hide show
  1. package/README.md +461 -180
  2. package/dist/MaskEngine-BEXwX4BK.js +144 -0
  3. package/dist/MaskEngine-CPr-fSPy.cjs +1 -0
  4. package/dist/ValidationEngine-BC4U1ef1.js +135 -0
  5. package/dist/ValidationEngine-Diz-qTFs.cjs +1 -0
  6. package/dist/_plugin-vue_export-helper-BHFhmbuH.cjs +1 -0
  7. package/dist/_plugin-vue_export-helper-CHgC5LLL.js +9 -0
  8. package/dist/core/ConditionEvaluator.d.ts.map +1 -1
  9. package/dist/core/MaskEngine.d.ts.map +1 -1
  10. package/dist/core/ValidationEngine.d.ts +7 -0
  11. package/dist/core/ValidationEngine.d.ts.map +1 -1
  12. package/dist/core/formRegistry.d.ts +33 -0
  13. package/dist/core/formRegistry.d.ts.map +1 -0
  14. package/dist/core/inferTypes.d.ts.map +1 -1
  15. package/dist/core/schemaUtils.d.ts +38 -0
  16. package/dist/core/schemaUtils.d.ts.map +1 -1
  17. package/dist/core/serverErrors.d.ts +69 -0
  18. package/dist/core/serverErrors.d.ts.map +1 -0
  19. package/dist/core/types.d.ts +12 -0
  20. package/dist/core/types.d.ts.map +1 -1
  21. package/dist/core/useForm.d.ts +4 -1
  22. package/dist/core/useForm.d.ts.map +1 -1
  23. package/dist/core/useMultiStepForm.d.ts.map +1 -1
  24. package/dist/devtools/index.d.ts +26 -0
  25. package/dist/devtools/index.d.ts.map +1 -0
  26. package/dist/devtools.cjs +1 -0
  27. package/dist/devtools.d.ts +6 -0
  28. package/dist/devtools.js +93 -0
  29. package/dist/formRegistry-Bv1eaWQ-.js +31 -0
  30. package/dist/formRegistry-DaDmXyYY.cjs +1 -0
  31. package/dist/index.cjs +1 -1
  32. package/dist/index.d.ts +4 -2
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +393 -368
  35. package/dist/openapi.cjs +1 -0
  36. package/dist/openapi.d.ts +202 -0
  37. package/dist/openapi.js +118 -0
  38. package/dist/parsers/json.d.ts.map +1 -1
  39. package/dist/parsers/openapi.d.ts +139 -0
  40. package/dist/parsers/openapi.d.ts.map +1 -0
  41. package/dist/parsers/valibot.d.ts +13 -4
  42. package/dist/parsers/valibot.d.ts.map +1 -1
  43. package/dist/parsers/yup.d.ts +10 -4
  44. package/dist/parsers/yup.d.ts.map +1 -1
  45. package/dist/parsers/zod.d.ts +18 -4
  46. package/dist/parsers/zod.d.ts.map +1 -1
  47. package/dist/schemaUtils-Cc7CwGXB.cjs +1 -0
  48. package/dist/schemaUtils-Cvlsk24U.js +337 -0
  49. package/dist/style.css +1 -0
  50. package/dist/ui/naive/index.d.ts +11 -0
  51. package/dist/ui/naive/index.d.ts.map +1 -0
  52. package/dist/ui/primevue/index.d.ts +11 -0
  53. package/dist/ui/primevue/index.d.ts.map +1 -0
  54. package/dist/ui/shadcn/index.d.ts +11 -0
  55. package/dist/ui/shadcn/index.d.ts.map +1 -0
  56. package/dist/ui-naive.cjs +1 -0
  57. package/dist/ui-naive.d.ts +411 -0
  58. package/dist/ui-naive.js +667 -0
  59. package/dist/ui-primevue.cjs +1 -0
  60. package/dist/ui-primevue.d.ts +411 -0
  61. package/dist/ui-primevue.js +651 -0
  62. package/dist/ui-shadcn.cjs +1 -0
  63. package/dist/ui-shadcn.d.ts +411 -0
  64. package/dist/ui-shadcn.js +650 -0
  65. package/dist/ui-tailwind.cjs +1 -1
  66. package/dist/ui-tailwind.d.ts +14 -0
  67. package/dist/ui-tailwind.js +180 -161
  68. package/dist/ui.cjs +1 -1
  69. package/dist/ui.d.ts +14 -0
  70. package/dist/ui.js +130 -131
  71. package/dist/valibot.cjs +1 -1
  72. package/dist/valibot.d.ts +25 -2
  73. package/dist/valibot.js +47 -20
  74. package/dist/yup.cjs +1 -1
  75. package/dist/yup.d.ts +23 -3
  76. package/dist/yup.js +16 -15
  77. package/dist/zod.cjs +1 -1
  78. package/dist/zod.d.ts +31 -3
  79. package/dist/zod.js +58 -28
  80. package/package.json +66 -6
  81. package/dist/MaskEngine-DAKSNIHQ.cjs +0 -1
  82. package/dist/MaskEngine-mLoXKd4d.js +0 -251
@@ -0,0 +1,144 @@
1
+ import { inject as x, provide as M, computed as g } from "vue";
2
+ const v = Symbol("vfs:registry");
3
+ function P(t) {
4
+ return {
5
+ install(e) {
6
+ e.provide(v, t);
7
+ }
8
+ };
9
+ }
10
+ function _() {
11
+ return x(v, {});
12
+ }
13
+ function b(t) {
14
+ M(v, t);
15
+ }
16
+ function k(t, e) {
17
+ const c = g(() => w(t.fields.value, e)), r = g(() => (t.getField(e) ?? []).map((o, i) => {
18
+ var p;
19
+ return {
20
+ key: `${e}__${i}`,
21
+ index: i,
22
+ fields: I(((p = c.value) == null ? void 0 : p.fields) ?? [], e, i)
23
+ };
24
+ })), s = g(() => r.value.length);
25
+ function n() {
26
+ return [...t.getField(e) ?? []];
27
+ }
28
+ function a(u = {}) {
29
+ const o = n();
30
+ o.push(u), t.setField(e, o);
31
+ }
32
+ function f(u = {}) {
33
+ const o = n();
34
+ o.unshift(u), t.setField(e, o);
35
+ }
36
+ function l(u) {
37
+ const o = n();
38
+ o.splice(u, 1), t.setField(e, o);
39
+ }
40
+ function d(u, o) {
41
+ const i = n(), [p] = i.splice(u, 1);
42
+ i.splice(o, 0, p), t.setField(e, i);
43
+ }
44
+ function S(u, o) {
45
+ const i = n();
46
+ [i[u], i[o]] = [i[o], i[u]], t.setField(e, i);
47
+ }
48
+ function E(u, o) {
49
+ const i = n();
50
+ i[u] = o, t.setField(e, i);
51
+ }
52
+ return { rows: r, count: s, append: a, prepend: f, remove: l, move: d, swap: S, replace: E };
53
+ }
54
+ function I(t, e, c) {
55
+ return t.map((r) => ({
56
+ ...r,
57
+ name: `${e}.${c}.${r.name}`,
58
+ fields: r.fields ? I(r.fields, e, c) : void 0
59
+ }));
60
+ }
61
+ function w(t, e) {
62
+ for (const c of t) {
63
+ if (c.name === e) return c;
64
+ if (c.fields) {
65
+ const r = w(c.fields, e);
66
+ if (r) return r;
67
+ }
68
+ }
69
+ }
70
+ const $ = {
71
+ "phone-ru": "+7 (###) ###-##-##",
72
+ "phone-eu": "+## (##) ###-##-##",
73
+ date: "##.##.####",
74
+ inn: "############",
75
+ iban: "AA## #### #### #### #### #### ####"
76
+ };
77
+ function R(t) {
78
+ return t.preset ? $[t.preset] : t.pattern ?? "";
79
+ }
80
+ function h(t) {
81
+ return t === "#" || t === "A";
82
+ }
83
+ function F(t, e) {
84
+ return e === "#" ? /\d/.test(t) : e === "A" ? /[a-zA-Z]/.test(t) : !1;
85
+ }
86
+ function y(t, e) {
87
+ const r = R(typeof e == "string" ? { pattern: e } : e);
88
+ if (!r) return t;
89
+ const s = Array.from(t);
90
+ let n = 0, a = -1;
91
+ for (let l = 0; l < r.length && n < s.length; l++) {
92
+ const d = r[l];
93
+ if (h(d)) {
94
+ for (; n < s.length && !F(s[n], d); ) n++;
95
+ n < s.length && (a = l, n++);
96
+ }
97
+ }
98
+ if (a === -1) return "";
99
+ let f = "";
100
+ n = 0;
101
+ for (let l = 0; l <= a; l++) {
102
+ const d = r[l];
103
+ if (h(d)) {
104
+ for (; n < s.length && !F(s[n], d); ) n++;
105
+ n < s.length && (f += d === "A" ? s[n++].toUpperCase() : s[n++]);
106
+ } else
107
+ f += d;
108
+ }
109
+ return f;
110
+ }
111
+ function A(t, e) {
112
+ const r = R(typeof e == "string" ? { pattern: e } : e);
113
+ if (!r) return t;
114
+ const s = [];
115
+ let n = 0;
116
+ for (let a = 0; a < r.length && n < t.length; a++) {
117
+ const f = r[a], l = t[n];
118
+ h(f) ? (s.push(l), n++) : l === f && n++;
119
+ }
120
+ return s.join("");
121
+ }
122
+ function j(t, e) {
123
+ function c() {
124
+ const s = A(t.value, e), n = y(s, e);
125
+ if (t.value !== n) {
126
+ const a = t.selectionStart ?? n.length;
127
+ t.value = n;
128
+ const f = Math.min(a, n.length);
129
+ t.setSelectionRange(f, f);
130
+ }
131
+ }
132
+ t.addEventListener("input", c);
133
+ const r = y(A(t.value, e), e);
134
+ return t.value !== r && r && (t.value = r), () => t.removeEventListener("input", c);
135
+ }
136
+ export {
137
+ y as a,
138
+ j as b,
139
+ P as c,
140
+ _ as d,
141
+ b as p,
142
+ A as r,
143
+ k as u
144
+ };
@@ -0,0 +1 @@
1
+ "use strict";const p=require("vue"),F=Symbol("vfs:registry");function k(e){return{install(t){t.provide(F,e)}}}function E(){return p.inject(F,{})}function $(e){p.provide(F,e)}function x(e,t){const c=p.computed(()=>I(e.fields.value,t)),r=p.computed(()=>(e.getField(t)??[]).map((o,i)=>{var g;return{key:`${t}__${i}`,index:i,fields:R(((g=c.value)==null?void 0:g.fields)??[],t,i)}})),s=p.computed(()=>r.value.length);function n(){return[...e.getField(t)??[]]}function a(u={}){const o=n();o.push(u),e.setField(t,o)}function f(u={}){const o=n();o.unshift(u),e.setField(t,o)}function l(u){const o=n();o.splice(u,1),e.setField(t,o)}function d(u,o){const i=n(),[g]=i.splice(u,1);i.splice(o,0,g),e.setField(t,i)}function w(u,o){const i=n();[i[u],i[o]]=[i[o],i[u]],e.setField(t,i)}function S(u,o){const i=n();i[u]=o,e.setField(t,i)}return{rows:r,count:s,append:a,prepend:f,remove:l,move:d,swap:w,replace:S}}function R(e,t,c){return e.map(r=>({...r,name:`${t}.${c}.${r.name}`,fields:r.fields?R(r.fields,t,c):void 0}))}function I(e,t){for(const c of e){if(c.name===t)return c;if(c.fields){const r=I(c.fields,t);if(r)return r}}}const C={"phone-ru":"+7 (###) ###-##-##","phone-eu":"+## (##) ###-##-##",date:"##.##.####",inn:"############",iban:"AA## #### #### #### #### #### ####"};function M(e){return e.preset?C[e.preset]:e.pattern??""}function v(e){return e==="#"||e==="A"}function A(e,t){return t==="#"?/\d/.test(e):t==="A"?/[a-zA-Z]/.test(e):!1}function h(e,t){const r=M(typeof t=="string"?{pattern:t}:t);if(!r)return e;const s=Array.from(e);let n=0,a=-1;for(let l=0;l<r.length&&n<s.length;l++){const d=r[l];if(v(d)){for(;n<s.length&&!A(s[n],d);)n++;n<s.length&&(a=l,n++)}}if(a===-1)return"";let f="";n=0;for(let l=0;l<=a;l++){const d=r[l];if(v(d)){for(;n<s.length&&!A(s[n],d);)n++;n<s.length&&(f+=d==="A"?s[n++].toUpperCase():s[n++])}else f+=d}return f}function y(e,t){const r=M(typeof t=="string"?{pattern:t}:t);if(!r)return e;const s=[];let n=0;for(let a=0;a<r.length&&n<e.length;a++){const f=r[a],l=e[n];v(f)?(s.push(l),n++):l===f&&n++}return s.join("")}function P(e,t){function c(){const s=y(e.value,t),n=h(s,t);if(e.value!==n){const a=e.selectionStart??n.length;e.value=n;const f=Math.min(a,n.length);e.setSelectionRange(f,f)}}e.addEventListener("input",c);const r=h(y(e.value,t),t);return e.value!==r&&r&&(e.value=r),()=>e.removeEventListener("input",c)}exports.applyMask=h;exports.bindMask=P;exports.createFormRegistry=k;exports.provideRegistry=$;exports.removeMask=y;exports.useFieldArray=x;exports.useRegistry=E;
@@ -0,0 +1,135 @@
1
+ const h = (t) => t == null || t === "" || Array.isArray(t) && t.length === 0 ? "This field is required" : null, y = (t, e) => (r) => typeof r != "string" && !Array.isArray(r) || r.length >= t ? null : e ?? `Minimum length is ${t}`, g = (t, e) => (r) => typeof r != "string" && !Array.isArray(r) || r.length <= t ? null : e ?? `Maximum length is ${t}`, p = (t, e) => (r) => {
2
+ const n = Number(r);
3
+ return isNaN(n) || n >= t ? null : e ?? `Minimum value is ${t}`;
4
+ }, A = (t, e) => (r) => {
5
+ const n = Number(r);
6
+ return isNaN(n) || n <= t ? null : e ?? `Maximum value is ${t}`;
7
+ }, M = (t, e) => (r) => typeof r != "string" || t.test(r) ? null : e ?? "Invalid format", $ = (t) => t ? /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(t)) ? null : "Invalid email address" : null, T = (t) => {
8
+ if (!t) return null;
9
+ try {
10
+ return new URL(String(t)), null;
11
+ } catch {
12
+ return "Invalid URL";
13
+ }
14
+ }, E = (t, e) => (r, n) => r === n[t] ? null : e ?? `Must match ${t}`;
15
+ function f(t) {
16
+ return t ? t instanceof File ? [t] : Array.isArray(t) ? t.filter((e) => e instanceof File) : [] : [];
17
+ }
18
+ function m(t) {
19
+ return t < 1024 ? `${t} B` : t < 1024 * 1024 ? `${(t / 1024).toFixed(1)} KB` : `${(t / (1024 * 1024)).toFixed(1)} MB`;
20
+ }
21
+ const w = (t, e) => (r) => {
22
+ const n = f(r);
23
+ return n.length && n.filter(
24
+ (s) => !t.some((l) => s.type.startsWith(l) || s.name.toLowerCase().endsWith(l))
25
+ ).length ? e ?? `Accepted formats: ${t.join(", ")}` : null;
26
+ }, F = (t, e) => (r) => {
27
+ const n = f(r);
28
+ return n.length && n.filter((s) => s.size > t).length ? e ?? `File size must not exceed ${m(t)}` : null;
29
+ }, x = (t, e) => (r) => f(r).length > t ? e ?? `Maximum ${t} file${t === 1 ? "" : "s"} allowed` : null;
30
+ class N {
31
+ constructor(e = 300, r = "first") {
32
+ this.asyncTimers = /* @__PURE__ */ new Map(), this.debounceMs = e, this.validateMode = r;
33
+ }
34
+ /** Run sync validators for a single field; returns list of error messages */
35
+ validateField(e, r, n) {
36
+ const i = [];
37
+ if (e.required) {
38
+ const s = h(r);
39
+ if (s && (i.push(s), this.validateMode === "first"))
40
+ return i;
41
+ }
42
+ for (const s of e.validators ?? []) {
43
+ const l = s(r, n);
44
+ if (l && (i.push(l), this.validateMode === "first"))
45
+ return i;
46
+ }
47
+ return i;
48
+ }
49
+ /** Run all sync validators across all visible fields */
50
+ validateAll(e, r) {
51
+ const n = {};
52
+ return this.collectErrors(e, r, n), n;
53
+ }
54
+ collectErrors(e, r, n) {
55
+ for (const i of e) {
56
+ const s = d(r, i.name), l = this.validateField(i, s, r);
57
+ l.length && (n[i.name] = l), (i.type === "group" || i.type === "array") && i.fields && this.collectErrors(i.fields, r, n);
58
+ }
59
+ }
60
+ /** Run async validators with debounce; calls onResult when done */
61
+ validateAsync(e, r, n, i) {
62
+ var o;
63
+ if (!((o = e.asyncValidators) != null && o.length)) return;
64
+ const s = this.asyncTimers.get(e.name);
65
+ s && clearTimeout(s);
66
+ const l = setTimeout(async () => {
67
+ const u = (await Promise.all(
68
+ e.asyncValidators.map((c) => c(r, n))
69
+ )).filter((c) => c !== null);
70
+ i(e.name, u), this.asyncTimers.delete(e.name);
71
+ }, this.debounceMs);
72
+ this.asyncTimers.set(e.name, l);
73
+ }
74
+ /**
75
+ * Run all async validators across all fields immediately (no debounce) and
76
+ * wait for the result. Used at submit time so a pending async validator
77
+ * (e.g. "username taken") can actually block submission.
78
+ */
79
+ async validateAllAsync(e, r) {
80
+ const n = {};
81
+ return await this.collectAsyncErrors(e, r, n), n;
82
+ }
83
+ async collectAsyncErrors(e, r, n) {
84
+ var s;
85
+ const i = [];
86
+ for (const l of e) {
87
+ if ((s = l.asyncValidators) != null && s.length) {
88
+ const o = d(r, l.name);
89
+ i.push(
90
+ Promise.all(l.asyncValidators.map((a) => a(o, r))).then((a) => {
91
+ const u = a.filter((c) => c !== null);
92
+ u.length && (n[l.name] = u);
93
+ })
94
+ );
95
+ }
96
+ (l.type === "group" || l.type === "array") && l.fields && i.push(this.collectAsyncErrors(l.fields, r, n));
97
+ }
98
+ await Promise.all(i);
99
+ }
100
+ destroy() {
101
+ for (const e of this.asyncTimers.values()) clearTimeout(e);
102
+ this.asyncTimers.clear();
103
+ }
104
+ }
105
+ function d(t, e) {
106
+ return e.split(".").reduce((r, n) => {
107
+ if (r && typeof r == "object") return r[n];
108
+ }, t);
109
+ }
110
+ function z(t, e, r) {
111
+ const n = e.split("."), i = { ...t };
112
+ let s = i;
113
+ for (let l = 0; l < n.length - 1; l++) {
114
+ const o = n[l], a = s[o];
115
+ Array.isArray(a) ? s[o] = [...a] : a && typeof a == "object" ? s[o] = { ...a } : s[o] = {}, s = s[o];
116
+ }
117
+ return s[n[n.length - 1]] = r, i;
118
+ }
119
+ export {
120
+ N as V,
121
+ F as a,
122
+ w as b,
123
+ g as c,
124
+ p as d,
125
+ $ as e,
126
+ x as f,
127
+ d as g,
128
+ y as h,
129
+ z as i,
130
+ A as m,
131
+ M as p,
132
+ h as r,
133
+ E as s,
134
+ T as u
135
+ };
@@ -0,0 +1 @@
1
+ "use strict";const m=t=>t==null||t===""||Array.isArray(t)&&t.length===0?"This field is required":null,h=(t,e)=>r=>typeof r!="string"&&!Array.isArray(r)||r.length>=t?null:e??`Minimum length is ${t}`,y=(t,e)=>r=>typeof r!="string"&&!Array.isArray(r)||r.length<=t?null:e??`Maximum length is ${t}`,g=(t,e)=>r=>{const n=Number(r);return isNaN(n)||n>=t?null:e??`Minimum value is ${t}`},p=(t,e)=>r=>{const n=Number(r);return isNaN(n)||n<=t?null:e??`Maximum value is ${t}`},A=(t,e)=>r=>typeof r!="string"||t.test(r)?null:e??"Invalid format",M=t=>t?/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(t))?null:"Invalid email address":null,T=t=>{if(!t)return null;try{return new URL(String(t)),null}catch{return"Invalid URL"}},$=(t,e)=>(r,n)=>r===n[t]?null:e??`Must match ${t}`;function d(t){return t?t instanceof File?[t]:Array.isArray(t)?t.filter(e=>e instanceof File):[]:[]}function E(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}const w=(t,e)=>r=>{const n=d(r);return n.length&&n.filter(i=>!t.some(l=>i.type.startsWith(l)||i.name.toLowerCase().endsWith(l))).length?e??`Accepted formats: ${t.join(", ")}`:null},x=(t,e)=>r=>{const n=d(r);return n.length&&n.filter(i=>i.size>t).length?e??`File size must not exceed ${E(t)}`:null},B=(t,e)=>r=>d(r).length>t?e??`Maximum ${t} file${t===1?"":"s"} allowed`:null;class F{constructor(e=300,r="first"){this.asyncTimers=new Map,this.debounceMs=e,this.validateMode=r}validateField(e,r,n){const s=[];if(e.required){const i=m(r);if(i&&(s.push(i),this.validateMode==="first"))return s}for(const i of e.validators??[]){const l=i(r,n);if(l&&(s.push(l),this.validateMode==="first"))return s}return s}validateAll(e,r){const n={};return this.collectErrors(e,r,n),n}collectErrors(e,r,n){for(const s of e){const i=f(r,s.name),l=this.validateField(s,i,r);l.length&&(n[s.name]=l),(s.type==="group"||s.type==="array")&&s.fields&&this.collectErrors(s.fields,r,n)}}validateAsync(e,r,n,s){var o;if(!((o=e.asyncValidators)!=null&&o.length))return;const i=this.asyncTimers.get(e.name);i&&clearTimeout(i);const l=setTimeout(async()=>{const u=(await Promise.all(e.asyncValidators.map(c=>c(r,n)))).filter(c=>c!==null);s(e.name,u),this.asyncTimers.delete(e.name)},this.debounceMs);this.asyncTimers.set(e.name,l)}async validateAllAsync(e,r){const n={};return await this.collectAsyncErrors(e,r,n),n}async collectAsyncErrors(e,r,n){var i;const s=[];for(const l of e){if((i=l.asyncValidators)!=null&&i.length){const o=f(r,l.name);s.push(Promise.all(l.asyncValidators.map(a=>a(o,r))).then(a=>{const u=a.filter(c=>c!==null);u.length&&(n[l.name]=u)}))}(l.type==="group"||l.type==="array")&&l.fields&&s.push(this.collectAsyncErrors(l.fields,r,n))}await Promise.all(s)}destroy(){for(const e of this.asyncTimers.values())clearTimeout(e);this.asyncTimers.clear()}}function f(t,e){return e.split(".").reduce((r,n)=>{if(r&&typeof r=="object")return r[n]},t)}function L(t,e,r){const n=e.split("."),s={...t};let i=s;for(let l=0;l<n.length-1;l++){const o=n[l],a=i[o];Array.isArray(a)?i[o]=[...a]:a&&typeof a=="object"?i[o]={...a}:i[o]={},i=i[o]}return i[n[n.length-1]]=r,s}exports.ValidationEngine=F;exports.email=M;exports.fileCount=B;exports.fileSize=x;exports.fileType=w;exports.getByPath=f;exports.max=p;exports.maxLength=y;exports.min=g;exports.minLength=h;exports.pattern=A;exports.required=m;exports.sameAs=$;exports.setByPath=L;exports.url=T;
@@ -0,0 +1 @@
1
+ "use strict";const e=(t,o)=>{const c=t.__vccOpts||t;for(const[r,s]of o)c[r]=s;return c};exports._export_sfc=e;
@@ -0,0 +1,9 @@
1
+ const s = (t, r) => {
2
+ const o = t.__vccOpts || t;
3
+ for (const [c, e] of r)
4
+ o[c] = e;
5
+ return o;
6
+ };
7
+ export {
8
+ s as _
9
+ };
@@ -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,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"}
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;AA6T9C,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,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,EAAE;IA0B7F,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 +1 @@
1
- {"version":3,"file":"MaskEngine.d.ts","sourceRoot":"","sources":["../../src/core/MaskEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,SAAS,CAAA;AA+BrD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAyC1E;AAID;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAwB3E;AAID;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,MAAM,GAAG,UAAU,GACxB,MAAM,IAAI,CAiBZ"}
1
+ {"version":3,"file":"MaskEngine.d.ts","sourceRoot":"","sources":["../../src/core/MaskEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,SAAS,CAAA;AA+BrD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAyC1E;AAID;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAwB3E;AAID;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,IAAI,CAiBvF"}
@@ -26,6 +26,13 @@ export declare class ValidationEngine {
26
26
  private collectErrors;
27
27
  /** Run async validators with debounce; calls onResult when done */
28
28
  validateAsync(field: FieldDefinition, value: unknown, allValues: Record<string, unknown>, onResult: (path: string, errors: string[]) => void): void;
29
+ /**
30
+ * Run all async validators across all fields immediately (no debounce) and
31
+ * wait for the result. Used at submit time so a pending async validator
32
+ * (e.g. "username taken") can actually block submission.
33
+ */
34
+ validateAllAsync(fields: FieldDefinition[], values: Record<string, unknown>): Promise<Record<string, string[]>>;
35
+ private collectAsyncErrors;
29
36
  destroy(): void;
30
37
  }
31
38
  export declare function getByPath(obj: Record<string, unknown>, path: string): unknown;
@@ -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;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"}
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;;;;OAIG;IACG,gBAAgB,CACpB,MAAM,EAAE,eAAe,EAAE,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAMtB,kBAAkB;IA0BhC,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,33 @@
1
+ import type { UseFormReturn } from './types';
2
+ /**
3
+ * Lightweight, dependency-free registry of active `useForm()` instances and
4
+ * a matching event bus — the data source for the optional DevTools plugin
5
+ * (`vue-form-schema/devtools`). Deliberately has zero `@vue/devtools-api`
6
+ * import anywhere in this file, or anywhere `useForm` touches, so devtools
7
+ * support costs nothing in the core bundle: `emitFormEvent` is a no-op
8
+ * (one `Set.size` check) whenever nothing is listening, i.e. whenever the
9
+ * devtools plugin isn't installed.
10
+ */
11
+ export interface RegisteredForm {
12
+ id: number;
13
+ label: string;
14
+ form: UseFormReturn;
15
+ createdAt: number;
16
+ }
17
+ export type FormEventType = 'setField' | 'touch' | 'submit' | 'submitSuccess' | 'submitError' | 'reset' | 'asyncValidate';
18
+ export interface FormEvent {
19
+ formId: number;
20
+ type: FormEventType;
21
+ payload?: Record<string, unknown>;
22
+ time: number;
23
+ }
24
+ type Listener = (event: FormEvent) => void;
25
+ export declare function registerForm(form: UseFormReturn, label: string): number;
26
+ export declare function unregisterForm(id: number): void;
27
+ export declare function getRegisteredForm(id: number): RegisteredForm | undefined;
28
+ export declare function getRegisteredForms(): RegisteredForm[];
29
+ export declare function emitFormEvent(formId: number, type: FormEventType, payload?: Record<string, unknown>): void;
30
+ /** Subscribes to form events; returns an unsubscribe function. */
31
+ export declare function onFormEvent(listener: Listener): () => void;
32
+ export {};
33
+ //# sourceMappingURL=formRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formRegistry.d.ts","sourceRoot":"","sources":["../../src/core/formRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C;;;;;;;;GAQG;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,aAAa,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,aAAa,GACvB,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,eAAe,GAAG,aAAa,GAAG,OAAO,GAAG,eAAe,CAAA;AAE/F,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,aAAa,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,IAAI,EAAE,MAAM,CAAA;CACb;AAED,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;AAM1C,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIvE;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAExE;AAED,wBAAgB,kBAAkB,IAAI,cAAc,EAAE,CAErD;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,aAAa,EACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI,CAIN;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI,CAG1D"}
@@ -1 +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"}
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,IAAI,CAAC,SAAS,UAAU,GAC3D,OAAO,GACP,CAAC,SAAS,QAAQ,GAChB,MAAM,GACN,CAAC,SAAS,OAAO,GACf,OAAO,EAAE,GACT,CAAC,SAAS,OAAO,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,MAAM,CAAA;AAIhB,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS;IAC7B,IAAI,EAAE,MAAM,IAAI,SAAS,MAAM,CAAA;IAC/B,IAAI,EAAE,MAAM,IAAI,SAAS,SAAS,CAAA;CACnC,GACG;KAAG,CAAC,IAAI,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;CAAE,GACrC,KAAK,CAAA;AAET,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,SAAS,CACjF,CAAC,EAAE,MAAM,CAAC,KACP,IAAI,GACL,CAAC,GACD,KAAK,CAAA;AAIT;;;;;;;;;;;;;;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"}
@@ -17,4 +17,42 @@ export declare function pickFields(schema: FieldDefinition[], keys: string[]): F
17
17
  * Does not mutate the original schema.
18
18
  */
19
19
  export declare function extendField(schema: FieldDefinition[], fieldName: string, overrides: Partial<FieldDefinition>): FieldDefinition[];
20
+ /**
21
+ * Builds a schema fragment whose fields switch entirely based on another
22
+ * field's ("discriminator") current value — the common "payment method" /
23
+ * "address type" / "document type" pattern, where each option has a wholly
24
+ * different set of fields, instead of one flat list where every field's
25
+ * `visible` is hand-wired individually.
26
+ *
27
+ * Every field in every variant gets `visible` set to "the discriminator's
28
+ * value matches this variant" — combined with the field's own `visible`
29
+ * (if it already has one) via AND, so a field can still be conditionally
30
+ * hidden within its variant for other reasons.
31
+ *
32
+ * Doesn't create the discriminator field itself — define that separately
33
+ * (typically a `select`/`radio` with one option per variant key) and
34
+ * spread this helper's result alongside it. Combine with `clearOnHide: true`
35
+ * on `useForm` so switching variants resets the now-hidden variant's values.
36
+ *
37
+ * @example
38
+ * const schema: FieldDefinition[] = [
39
+ * {
40
+ * type: 'radio',
41
+ * name: 'paymentMethod',
42
+ * label: 'Payment method',
43
+ * options: [
44
+ * { label: 'Card', value: 'card' },
45
+ * { label: 'PayPal', value: 'paypal' },
46
+ * ],
47
+ * },
48
+ * ...discriminatedFields('paymentMethod', {
49
+ * card: [
50
+ * { type: 'text', name: 'cardNumber', label: 'Card number', required: true },
51
+ * { type: 'text', name: 'cvc', label: 'CVC', required: true },
52
+ * ],
53
+ * paypal: [{ type: 'email', name: 'paypalEmail', label: 'PayPal email', required: true }],
54
+ * }),
55
+ * ]
56
+ */
57
+ export declare function discriminatedFields<K extends string>(discriminatorName: string, variants: Record<K, FieldDefinition[]>): FieldDefinition[];
20
58
  //# sourceMappingURL=schemaUtils.d.ts.map
@@ -1 +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
+ {"version":3,"file":"schemaUtils.d.ts","sourceRoot":"","sources":["../../src/core/schemaUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAG9C;;;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;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAClD,iBAAiB,EAAE,MAAM,EACzB,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,GACrC,eAAe,EAAE,CAWnB"}
@@ -0,0 +1,69 @@
1
+ import type { UseFormReturn } from './types';
2
+ /**
3
+ * Result of normalising a server error response: errors attributable to a
4
+ * specific field (keyed the same way as `form.errors`, i.e. by
5
+ * `FieldDefinition.name` / dot-path) and errors that aren't tied to any
6
+ * single field (e.g. Laravel's top-level `message`, DRF's
7
+ * `non_field_errors` / `detail`) — the caller decides where to show those
8
+ * (a toast, a banner above the form, ...), since there's no single input to
9
+ * attach them to.
10
+ */
11
+ export interface NormalizedServerErrors {
12
+ fieldErrors: Record<string, string[]>;
13
+ formErrors: string[];
14
+ }
15
+ export type ServerErrorFormat = 'laravel' | 'drf' | 'flat';
16
+ export type ServerErrorMapper = (raw: unknown) => NormalizedServerErrors;
17
+ export interface ApplyServerErrorsOptions {
18
+ /**
19
+ * Built-in format name, or a custom mapper for anything else.
20
+ * @default 'flat'
21
+ */
22
+ format?: ServerErrorFormat | ServerErrorMapper;
23
+ /**
24
+ * Mark every field that receives a server error as touched, so it's
25
+ * visible immediately instead of waiting for the user to blur it.
26
+ * @default true
27
+ */
28
+ touch?: boolean;
29
+ /**
30
+ * Merge into the form's current `errors` rather than replacing it
31
+ * wholesale — keeps any client-side errors on fields the server response
32
+ * didn't mention.
33
+ * @default true
34
+ */
35
+ merge?: boolean;
36
+ }
37
+ /**
38
+ * Normalises a raw server error response body into `{ fieldErrors, formErrors }`
39
+ * without touching a form — use this if you want to inspect/display the
40
+ * result yourself instead of (or in addition to) calling `applyServerErrors`.
41
+ */
42
+ export declare function normalizeServerErrors(raw: unknown, format?: ServerErrorFormat | ServerErrorMapper): NormalizedServerErrors;
43
+ /**
44
+ * Maps a server's validation error response onto a form's `errors` (and,
45
+ * by default, marks the affected fields as touched so the errors are
46
+ * visible right away).
47
+ *
48
+ * Field errors set this way behave like any other entry in `form.errors`:
49
+ * the next time the field is validated client-side (per `validateOn` —
50
+ * on blur by default, on every keystroke with `validateOn: 'input'`), that
51
+ * field's entry is recomputed from the schema's own validators and the
52
+ * server error is naturally replaced/cleared. `submit()` also fully
53
+ * recomputes `errors` for every field, so stale server errors never
54
+ * survive into the next submit attempt.
55
+ *
56
+ * Errors not tied to a specific field (Laravel's top-level `message`,
57
+ * DRF's `non_field_errors` / `detail`) are returned as `formErrors` for
58
+ * you to display wherever makes sense (a toast, a banner) — there's no
59
+ * single input to attach them to.
60
+ *
61
+ * @example
62
+ * const res = await fetch('/api/users', { method: 'POST', body: JSON.stringify(form.values.value) })
63
+ * if (!res.ok) {
64
+ * const { formErrors } = applyServerErrors(form, await res.json(), { format: 'laravel' })
65
+ * if (formErrors.length) toast.error(formErrors[0])
66
+ * }
67
+ */
68
+ export declare function applyServerErrors(form: UseFormReturn, raw: unknown, options?: ApplyServerErrorsOptions): NormalizedServerErrors;
69
+ //# sourceMappingURL=serverErrors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverErrors.d.ts","sourceRoot":"","sources":["../../src/core/serverErrors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C;;;;;;;;GAQG;AACH,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACrC,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,CAAA;AAE1D,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,sBAAsB,CAAA;AAExE,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,MAAM,CAAC,EAAE,iBAAiB,GAAG,iBAAiB,CAAA;IAC9C;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAsFD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,EACZ,MAAM,GAAE,iBAAiB,GAAG,iBAA0B,GACrD,sBAAsB,CAExB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE,wBAA6B,GACrC,sBAAsB,CAiBxB"}
@@ -87,6 +87,18 @@ export interface JSONSchemaField {
87
87
  }>;
88
88
  }
89
89
  export type JSONSchema = JSONSchemaField[];
90
+ /**
91
+ * A `FieldDefinition[]` returned by a schema adapter (`parseZod` / `parseYup`
92
+ * / `parseValibot`) that also carries the source schema's inferred value
93
+ * type at the type level. `useForm({ schema: parseZod(mySchema) })` then
94
+ * infers `T` automatically — no `useForm<Values>(...)` needed.
95
+ *
96
+ * `__inferredValues` does not exist at runtime; it is a type-only marker
97
+ * erased by the compiler.
98
+ */
99
+ export type TypedFieldDefinitions<T> = FieldDefinition[] & {
100
+ readonly __inferredValues?: T;
101
+ };
90
102
  export type ValidateOn = 'input' | 'blur' | 'submit' | 'eager';
91
103
  export type ValidateMode = 'first' | 'all';
92
104
  export interface UseFormConfig<T extends Record<string, unknown> = Record<string, unknown>> {
@@ -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,3 +1,6 @@
1
- import type { UseFormConfig, UseFormReturn } from './types';
1
+ import type { UseFormConfig, UseFormReturn, TypedFieldDefinitions } from './types';
2
+ export declare function useForm<T extends Record<string, unknown>>(config: Omit<UseFormConfig<T>, 'schema'> & {
3
+ schema: TypedFieldDefinitions<T>;
4
+ }): UseFormReturn<T>;
2
5
  export declare function useForm<T extends Record<string, unknown> = Record<string, unknown>>(config: UseFormConfig<T>): UseFormReturn<T>;
3
6
  //# sourceMappingURL=useForm.d.ts.map
@@ -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;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"}
1
+ {"version":3,"file":"useForm.d.ts","sourceRoot":"","sources":["../../src/core/useForm.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAEV,aAAa,EACb,aAAa,EAEb,qBAAqB,EACtB,MAAM,SAAS,CAAA;AAwGhB,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvD,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAA;CAAE,GAC9E,aAAa,CAAC,CAAC,CAAC,CAAA;AAGnB,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,CAAA"}
@@ -1 +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"}
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,CAgErB"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Vue DevTools integration — subentry-point 'vue-form-schema/devtools'.
3
+ *
4
+ * Deliberately a separate entry point (not part of the core bundle):
5
+ * `@vue/devtools-api` is only imported here, so importing the core package
6
+ * (or any other subentry) never pulls it in. Call `installFormDevtools`
7
+ * once, in development only — it adds a custom inspector listing every
8
+ * active `useForm()` instance (values/errors/touched/isValid/isDirty) and
9
+ * a timeline layer for `setField`/`touch`/`submit`/`reset`/async-validation
10
+ * events.
11
+ *
12
+ * @example
13
+ * import { createApp } from 'vue'
14
+ * import App from './App.vue'
15
+ *
16
+ * const app = createApp(App)
17
+ * if (import.meta.env.DEV) {
18
+ * const { installFormDevtools } = await import('@macrulez/vue-form-schema/devtools')
19
+ * installFormDevtools(app)
20
+ * }
21
+ * app.mount('#app')
22
+ */
23
+ import type { App } from 'vue';
24
+ /** Installs the DevTools inspector + timeline for this Vue app. Safe to call multiple times or during SSR (no-ops without a browser). */
25
+ export declare function installFormDevtools(app: App): void;
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAkE9B,yIAAyI;AACzI,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAiElD"}
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("@vue/devtools-api"),n=require("./formRegistry-DaDmXyYY.cjs"),l="vue-form-schema-inspector",c="vue-form-schema-timeline",b={setField:"default",touch:"default",submit:"default",submitSuccess:"default",submitError:"error",reset:"warning",asyncValidate:"default"};function a(o){return`${o.label} #${o.id}`}function p(o){const r=Object.values(o.form.errors.value).some(e=>e.length>0);return{id:String(o.id),label:a(o),tags:r?[{label:"invalid",textColor:16777215,backgroundColor:14427686}]:o.form.isDirty.value?[{label:"dirty",textColor:1120295,backgroundColor:16498468}]:[]}}function u(o){const{values:r,errors:e,touched:s,isDirty:m,isValid:d,isSubmitting:f,optionsLoading:g}=o.form;return{summary:[{key:"isValid",value:d.value},{key:"isDirty",value:m.value},{key:"isSubmitting",value:f.value}],values:Object.entries(r.value).map(([t,i])=>({key:t,value:i})),errors:Object.entries(e.value).filter(([,t])=>t.length>0).map(([t,i])=>({key:t,value:i})),touched:Object.entries(s.value).filter(([,t])=>t).map(([t,i])=>({key:t,value:i})),optionsLoading:Object.entries(g.value).filter(([,t])=>t).map(([t,i])=>({key:t,value:i}))}}function h(o){typeof window>"u"||v.setupDevtoolsPlugin({id:"vue-form-schema",label:"vue-form-schema",packageName:"@macrulez/vue-form-schema",homepage:"https://github.com/macrulezru/vue-form-schema",componentStateTypes:["vue-form-schema"],app:o},r=>{r.addInspector({id:l,label:"Forms",icon:"dynamic_form",treeFilterPlaceholder:"Search active forms",nodeActions:[{icon:"content_copy",tooltip:"Log snapshot to console",action:e=>{const s=n.getRegisteredForm(Number(e));s&&console.log(`[vue-form-schema] ${a(s)}`,u(s))}}]}),r.addTimelineLayer({id:c,label:"Forms",color:2450411}),r.on.getInspectorTree(e=>{e.inspectorId===l&&(e.rootNodes=n.getRegisteredForms().map(p))}),r.on.getInspectorState(e=>{if(e.inspectorId!==l)return;const s=n.getRegisteredForm(Number(e.nodeId));s&&(e.state=u(s))}),n.onFormEvent(e=>{const s=n.getRegisteredForm(e.formId);r.addTimelineEvent({layerId:c,event:{time:e.time,title:e.type,subtitle:s?a(s):`#${e.formId}`,data:e.payload??{},logType:b[e.type]}}),r.sendInspectorTree(l),r.sendInspectorState(l)})})}exports.installFormDevtools=h;
@@ -0,0 +1,6 @@
1
+ import { App } from 'vue';
2
+
3
+ /** Installs the DevTools inspector + timeline for this Vue app. Safe to call multiple times or during SSR (no-ops without a browser). */
4
+ export declare function installFormDevtools(app: App): void;
5
+
6
+ export { }