@overgaming/valiform 0.1.4

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 (66) hide show
  1. package/README.md +0 -0
  2. package/dist/index.d.ts +8 -0
  3. package/dist/index.js +948 -0
  4. package/dist/index.umd.cjs +1 -0
  5. package/dist/src/components/Field.vue.d.ts +56 -0
  6. package/dist/src/components/Form.vue.d.ts +39 -0
  7. package/dist/src/components/__tests__/Field.test.d.ts +1 -0
  8. package/dist/src/components/__tests__/Form.test.d.ts +1 -0
  9. package/dist/src/components/__tests__/components/CustomInput.vue.d.ts +9 -0
  10. package/dist/src/components/__tests__/components/CustomSelect.vue.d.ts +19 -0
  11. package/dist/src/components/__tests__/components/ExampleField.vue.d.ts +53 -0
  12. package/dist/src/components/__tests__/components/ExampleForm.vue.d.ts +40 -0
  13. package/dist/src/components/__tests__/components/ExampleFormWithNestedFields.vue.d.ts +51 -0
  14. package/dist/src/composables/useFormContext.d.ts +1 -0
  15. package/dist/src/composables/useLocale.d.ts +2 -0
  16. package/dist/src/composables/useValidation.d.ts +14 -0
  17. package/dist/src/context/useFieldContext.d.ts +5 -0
  18. package/dist/src/context/useFormContext.d.ts +5 -0
  19. package/dist/src/context/useFormStateContext.d.ts +5 -0
  20. package/dist/src/context/useLocaleContext.d.ts +4 -0
  21. package/dist/src/locales/en.d.ts +2 -0
  22. package/dist/src/locales/es.d.ts +2 -0
  23. package/dist/src/plugins/FormsPlugin.d.ts +5 -0
  24. package/dist/src/test/setup.d.ts +1 -0
  25. package/dist/src/types.d.ts +84 -0
  26. package/dist/src/utils/parseRules.d.ts +2 -0
  27. package/dist/src/utils/validation.d.ts +1 -0
  28. package/dist/src/utils/valueByPath.d.ts +2 -0
  29. package/dist/src/validation/index.d.ts +3 -0
  30. package/dist/src/validation/registry.d.ts +5 -0
  31. package/dist/src/validation/rules/accepted.d.ts +2 -0
  32. package/dist/src/validation/rules/alpha.d.ts +2 -0
  33. package/dist/src/validation/rules/alphaSpaces.d.ts +2 -0
  34. package/dist/src/validation/rules/alphanumeric.d.ts +2 -0
  35. package/dist/src/validation/rules/between.d.ts +2 -0
  36. package/dist/src/validation/rules/confirm.d.ts +2 -0
  37. package/dist/src/validation/rules/containsAlpha.d.ts +2 -0
  38. package/dist/src/validation/rules/containsAlphaSpaces.d.ts +2 -0
  39. package/dist/src/validation/rules/containsAlphanumeric.d.ts +2 -0
  40. package/dist/src/validation/rules/containsLowercase.d.ts +2 -0
  41. package/dist/src/validation/rules/containsNumeric.d.ts +2 -0
  42. package/dist/src/validation/rules/containsSymbol.d.ts +2 -0
  43. package/dist/src/validation/rules/containsUppercase.d.ts +2 -0
  44. package/dist/src/validation/rules/dateAfter.d.ts +2 -0
  45. package/dist/src/validation/rules/dateAfterOrEqual.d.ts +2 -0
  46. package/dist/src/validation/rules/dateBefore.d.ts +2 -0
  47. package/dist/src/validation/rules/dateBeforeOrEqual.d.ts +2 -0
  48. package/dist/src/validation/rules/dateBetween.d.ts +2 -0
  49. package/dist/src/validation/rules/dateFormat.d.ts +2 -0
  50. package/dist/src/validation/rules/email.d.ts +2 -0
  51. package/dist/src/validation/rules/endsWith.d.ts +2 -0
  52. package/dist/src/validation/rules/index.d.ts +34 -0
  53. package/dist/src/validation/rules/is.d.ts +2 -0
  54. package/dist/src/validation/rules/length.d.ts +2 -0
  55. package/dist/src/validation/rules/lowercase.d.ts +2 -0
  56. package/dist/src/validation/rules/matches.d.ts +2 -0
  57. package/dist/src/validation/rules/max.d.ts +2 -0
  58. package/dist/src/validation/rules/min.d.ts +2 -0
  59. package/dist/src/validation/rules/not.d.ts +2 -0
  60. package/dist/src/validation/rules/number.d.ts +2 -0
  61. package/dist/src/validation/rules/required.d.ts +2 -0
  62. package/dist/src/validation/rules/startsWith.d.ts +2 -0
  63. package/dist/src/validation/rules/symbol.d.ts +2 -0
  64. package/dist/src/validation/rules/uppercase.d.ts +2 -0
  65. package/dist/src/validation/rules/url.d.ts +2 -0
  66. package/package.json +60 -0
package/dist/index.js ADDED
@@ -0,0 +1,948 @@
1
+ import { inject as A, shallowRef as B, isRef as te, ref as h, readonly as w, provide as x, defineComponent as R, useModel as W, isReactive as ne, reactive as re, computed as b, openBlock as L, createElementBlock as _, withModifiers as se, renderSlot as z, normalizeProps as I, guardReactiveProps as K, mergeModels as U, watch as Z, toValue as $, useId as oe, onMounted as ae, onUnmounted as ue, unref as ie } from "vue";
2
+ const k = Symbol("locale-context"), Y = (e = null) => {
3
+ const t = A(k, e);
4
+ if (!t && t !== null)
5
+ throw new Error("Context with localeContextKey not found");
6
+ return t;
7
+ }, ce = {
8
+ required: "This field is required",
9
+ email: "Please enter a valid email address",
10
+ min: ({ value: e }) => `Must be at least ${e}`,
11
+ max: ({ value: e }) => `Must be at most ${e}`,
12
+ matches: "Format is not valid",
13
+ number: "Must be a valid number",
14
+ accepted: "Must be accepted",
15
+ alpha: "Must contain only alphabetical characters",
16
+ alphanumeric: "Must contain only letters and numbers",
17
+ alphaSpaces: "Must contain only letters and spaces",
18
+ between: ({ min: e, max: t }) => `Must be between ${e} and ${t}`,
19
+ confirm: ({ fieldName: e }) => `Must match ${e}`,
20
+ containsAlpha: "Must contain at least one letter",
21
+ containsAlphanumeric: "Must contain at least one letter or number",
22
+ containsAlphaSpaces: "Must contain at least one letter or space",
23
+ containsLowercase: "Must contain at least one lowercase letter",
24
+ containsNumeric: "Must contain at least one number",
25
+ containsSymbol: "Must contain at least one symbol",
26
+ containsUppercase: "Must contain at least one uppercase letter",
27
+ dateAfter: ({ date: e }) => e ? `Must be after ${e}` : "Must be after today",
28
+ dateAfterOrEqual: ({ date: e }) => e ? `Must be after or equal to ${e}` : "Must be after or equal to today",
29
+ dateBefore: ({ date: e }) => e ? `Must be before ${e}` : "Must be before today",
30
+ dateBeforeOrEqual: ({ date: e }) => e ? `Must be before or equal to ${e}` : "Must be before or equal to today",
31
+ dateBetween: ({ startDate: e, endDate: t }) => `Must be between ${e} and ${t}`,
32
+ dateFormat: ({ format: e }) => `Must match the format ${e}`,
33
+ endsWith: ({ suffix: e }) => Array.isArray(e) ? `Must end with one of: ${e.map((t) => `"${t}"`).join(", ")}` : `Must end with "${e}"`,
34
+ is: ({ allowedValues: e }) => `Must be one of: ${Array.isArray(e) ? e.join(", ") : e}`,
35
+ length: ({ value: e, min: t, max: n }) => t !== void 0 && n !== void 0 ? `Must be between ${t} and ${n} characters` : e !== void 0 ? `Must be exactly ${e} characters` : "Invalid length",
36
+ lowercase: "Must contain only lowercase characters",
37
+ not: ({ disallowedValues: e }) => `Must not be one of: ${Array.isArray(e) ? e.join(", ") : e}`,
38
+ startsWith: ({ prefix: e }) => Array.isArray(e) ? `Must start with one of: ${e.join(", ")}` : `Must start with "${e}"`,
39
+ symbol: "Must contain only symbols",
40
+ uppercase: "Must contain only uppercase characters",
41
+ url: "Must be a valid URL"
42
+ }, G = B(/* @__PURE__ */ new Map()), le = (e, t) => {
43
+ G.value.set(e, t);
44
+ }, P = (e) => {
45
+ Object.entries(e).forEach(([t, n]) => {
46
+ le(t, n);
47
+ });
48
+ }, fe = (e) => G.value.get(e);
49
+ function me(e) {
50
+ const t = e.accepted;
51
+ return typeof t == "function" ? t({}) : t ?? "Must be accepted";
52
+ }
53
+ function de(e) {
54
+ return e ? ["yes", "on", "1", "true"].includes(String(e).toLowerCase()) : !1;
55
+ }
56
+ function ge(e, t = {}) {
57
+ const { messages: n = {} } = t;
58
+ return de(e) ? !0 : me(n);
59
+ }
60
+ function pe(e) {
61
+ const t = e.alpha;
62
+ return typeof t == "function" ? t({}) : t ?? "Must contain only alphabetical characters";
63
+ }
64
+ function be(e) {
65
+ return e ? /^[a-zA-Z]+$/.test(String(e)) : !0;
66
+ }
67
+ function ye(e, t = {}) {
68
+ const { messages: n = {} } = t;
69
+ return be(e) ? !0 : pe(n);
70
+ }
71
+ function $e(e) {
72
+ const t = e.alphanumeric;
73
+ return typeof t == "function" ? t({}) : t ?? "Must contain only letters and numbers";
74
+ }
75
+ function he(e) {
76
+ return e ? /^[a-zA-Z0-9]+$/.test(String(e)) : !0;
77
+ }
78
+ function ve(e, t = {}) {
79
+ const { messages: n = {} } = t;
80
+ return he(e) ? !0 : $e(n);
81
+ }
82
+ function Me(e) {
83
+ const t = e.alphaSpaces;
84
+ return typeof t == "function" ? t({}) : t ?? "Must contain only letters and spaces";
85
+ }
86
+ function Ne(e) {
87
+ return e ? /^[a-zA-Z\s]+$/.test(String(e)) : !0;
88
+ }
89
+ function we(e, t = {}) {
90
+ const { messages: n = {} } = t;
91
+ return Ne(e) ? !0 : Me(n);
92
+ }
93
+ function Ae(e, t, n) {
94
+ const r = e.between;
95
+ return typeof r == "function" ? r({ min: t, max: n }) : r ?? `Must be between ${t} and ${n}`;
96
+ }
97
+ function De(e, t, n) {
98
+ if (!e && e !== 0) return !0;
99
+ const r = Number(e);
100
+ if (isNaN(r)) return !1;
101
+ const s = Number(t), o = Number(n);
102
+ return isNaN(s) || isNaN(o) ? !1 : r >= s && r <= o;
103
+ }
104
+ function Se(e, t = {}) {
105
+ const { args: n = [], messages: r = {} } = t, [s, o] = n;
106
+ return De(e, s, o) ? !0 : Ae(r, s, o);
107
+ }
108
+ function Fe(e, t) {
109
+ const n = e.confirm;
110
+ return typeof n == "function" ? n({ fieldName: t }) : n ?? `Must match ${t}`;
111
+ }
112
+ function xe(e, t, n) {
113
+ var r;
114
+ return e ? n ? e === ((r = n[t]) == null ? void 0 : r.value) : !1 : !0;
115
+ }
116
+ function je(e, t = {}) {
117
+ const { args: n = [], messages: r = {}, fields: s = {} } = t, [o] = n;
118
+ return xe(e, o, s) ? !0 : Fe(r, o);
119
+ }
120
+ function Te(e) {
121
+ const t = e.containsAlpha;
122
+ return typeof t == "function" ? t({}) : t ?? "Must contain at least one letter";
123
+ }
124
+ function Ve(e) {
125
+ return e ? /[a-zA-Z]/.test(String(e)) : !0;
126
+ }
127
+ function qe(e, t = {}) {
128
+ const { messages: n = {} } = t;
129
+ return Ve(e) ? !0 : Te(n);
130
+ }
131
+ function Ce(e) {
132
+ const t = e.containsAlphanumeric;
133
+ return typeof t == "function" ? t({}) : t ?? "Must contain at least one letter or number";
134
+ }
135
+ function Pe(e) {
136
+ return e ? /[a-zA-Z0-9]/.test(String(e)) : !0;
137
+ }
138
+ function Ee(e, t = {}) {
139
+ const { messages: n = {} } = t;
140
+ return Pe(e) ? !0 : Ce(n);
141
+ }
142
+ function Oe(e) {
143
+ const t = e.containsAlphaSpaces;
144
+ return typeof t == "function" ? t({}) : t ?? "Must contain at least one letter or space";
145
+ }
146
+ function Be(e) {
147
+ return e ? /[a-zA-Z\s]/.test(String(e)) : !0;
148
+ }
149
+ function Re(e, t = {}) {
150
+ const { messages: n = {} } = t;
151
+ return Be(e) ? !0 : Oe(n);
152
+ }
153
+ function We(e) {
154
+ const t = e.containsLowercase;
155
+ return typeof t == "function" ? t({}) : t ?? "Must contain at least one lowercase letter";
156
+ }
157
+ function Le(e) {
158
+ return e ? /[a-z]/.test(String(e)) : !0;
159
+ }
160
+ function _e(e, t = {}) {
161
+ const { messages: n = {} } = t;
162
+ return Le(e) ? !0 : We(n);
163
+ }
164
+ function ze(e) {
165
+ const t = e.containsNumeric;
166
+ return typeof t == "function" ? t({}) : t ?? "Must contain at least one number";
167
+ }
168
+ function Ie(e) {
169
+ return e ? /\d/.test(String(e)) : !0;
170
+ }
171
+ function Ke(e, t = {}) {
172
+ const { messages: n = {} } = t;
173
+ return Ie(e) ? !0 : ze(n);
174
+ }
175
+ function Ue(e) {
176
+ const t = e.containsSymbol;
177
+ return typeof t == "function" ? t({}) : t ?? "Must contain at least one symbol";
178
+ }
179
+ function Ze(e) {
180
+ return e ? /[^\w\s]/.test(String(e)) : !0;
181
+ }
182
+ function ke(e, t = {}) {
183
+ const { messages: n = {} } = t;
184
+ return Ze(e) ? !0 : Ue(n);
185
+ }
186
+ function Ye(e) {
187
+ const t = e.containsUppercase;
188
+ return typeof t == "function" ? t({}) : t ?? "Must contain at least one uppercase letter";
189
+ }
190
+ function Ge(e) {
191
+ return e ? /[A-Z]/.test(String(e)) : !0;
192
+ }
193
+ function He(e, t = {}) {
194
+ const { messages: n = {} } = t;
195
+ return Ge(e) ? !0 : Ye(n);
196
+ }
197
+ function Je(e, t) {
198
+ const n = e.dateAfter;
199
+ return typeof n == "function" ? n({ date: t }) : n ?? (t ? `Must be after ${t}` : "Must be after today");
200
+ }
201
+ function Qe(e, t) {
202
+ if (!e) return !0;
203
+ const n = new Date(String(e)), r = t ? new Date(t) : /* @__PURE__ */ new Date();
204
+ return !isNaN(n.getTime()) && !isNaN(r.getTime()) && n > r;
205
+ }
206
+ function Xe(e, t = {}) {
207
+ const { args: n = [], messages: r = {} } = t, [s] = n;
208
+ return Qe(e, s) ? !0 : Je(r, s);
209
+ }
210
+ function et(e, t) {
211
+ const n = e.dateAfterOrEqual;
212
+ return typeof n == "function" ? n({ date: t }) : n ?? (t ? `Must be after or equal to ${t}` : "Must be after or equal to today");
213
+ }
214
+ function tt(e, t) {
215
+ if (!e) return !0;
216
+ const n = new Date(String(e)), r = t ? new Date(t) : /* @__PURE__ */ new Date();
217
+ return !isNaN(n.getTime()) && !isNaN(r.getTime()) && n >= r;
218
+ }
219
+ function nt(e, t = {}) {
220
+ const { args: n = [], messages: r = {} } = t, [s] = n;
221
+ return tt(e, s) ? !0 : et(r, s);
222
+ }
223
+ function rt(e, t) {
224
+ const n = e.dateBefore;
225
+ return typeof n == "function" ? n({ date: t }) : n ?? (t ? `Must be before ${t}` : "Must be before today");
226
+ }
227
+ function st(e, t) {
228
+ if (!e) return !0;
229
+ const n = new Date(String(e)), r = t ? new Date(t) : /* @__PURE__ */ new Date();
230
+ return !isNaN(n.getTime()) && !isNaN(r.getTime()) && n < r;
231
+ }
232
+ function ot(e, t = {}) {
233
+ const { args: n = [], messages: r = {} } = t, [s] = n;
234
+ return st(e, s) ? !0 : rt(r, s);
235
+ }
236
+ function at(e, t) {
237
+ const n = e.dateBeforeOrEqual;
238
+ return typeof n == "function" ? n({ date: t }) : n ?? (t ? `Must be before or equal to ${t}` : "Must be before or equal to today");
239
+ }
240
+ function ut(e, t) {
241
+ if (!e) return !0;
242
+ const n = new Date(String(e)), r = t ? new Date(t) : /* @__PURE__ */ new Date();
243
+ return !isNaN(n.getTime()) && !isNaN(r.getTime()) && n <= r;
244
+ }
245
+ function it(e, t = {}) {
246
+ const { args: n = [], messages: r = {} } = t, [s] = n;
247
+ return ut(e, s) ? !0 : at(r, s);
248
+ }
249
+ function ct(e, t, n) {
250
+ const r = e.dateBetween;
251
+ return typeof r == "function" ? r({ startDate: t, endDate: n }) : r ?? `Must be between ${t} and ${n}`;
252
+ }
253
+ function lt(e, t, n) {
254
+ if (!e) return !0;
255
+ const r = new Date(String(e)), s = new Date(t), o = new Date(n);
256
+ return !isNaN(r.getTime()) && !isNaN(s.getTime()) && !isNaN(o.getTime()) && r >= s && r <= o;
257
+ }
258
+ function ft(e, t = {}) {
259
+ const { args: n = [], messages: r = {} } = t, [s, o] = n;
260
+ return lt(e, s, o) ? !0 : ct(r, s, o);
261
+ }
262
+ const mt = (e) => {
263
+ const t = e.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&"), n = {
264
+ YYYY: "\\d{4}",
265
+ YY: "\\d{2}",
266
+ MM: "(0[1-9]|1[012])",
267
+ M: "([1-9]|1[012])",
268
+ DD: "([012][0-9]|3[01])",
269
+ D: "([012]?[0-9]|3[01])"
270
+ };
271
+ let r = t;
272
+ return Object.keys(n).forEach((s) => {
273
+ r = r.replace(new RegExp(s, "g"), n[s]);
274
+ }), new RegExp(`^${r}$`);
275
+ };
276
+ function dt(e, t) {
277
+ const n = e.dateFormat;
278
+ return typeof n == "function" ? n({ format: t }) : n ?? `Must match the format ${t}`;
279
+ }
280
+ function gt(e, t) {
281
+ return e ? t && typeof t == "string" ? mt(t).test(String(e)) : !isNaN(Date.parse(String(e))) : !0;
282
+ }
283
+ function pt(e, t = {}) {
284
+ const { args: n = [], messages: r = {} } = t, [s] = n;
285
+ return gt(e, s) ? !0 : dt(r, s);
286
+ }
287
+ function bt(e) {
288
+ const t = e.email;
289
+ return typeof t == "function" ? t({}) : t ?? "Please enter a valid email address";
290
+ }
291
+ function yt(e) {
292
+ return e ? /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(e)) : !0;
293
+ }
294
+ function $t(e, t = {}) {
295
+ const { messages: n = {} } = t;
296
+ return yt(e) ? !0 : bt(n);
297
+ }
298
+ function ht(e, t) {
299
+ const n = e.endsWith;
300
+ return typeof n == "function" ? n({ suffix: t.length === 1 ? t[0] : t }) : n ?? `Must end with: ${t.join(", ")}`;
301
+ }
302
+ function vt(e, ...t) {
303
+ if (!e) return !0;
304
+ const n = String(e);
305
+ return t.some((r) => n.endsWith(r));
306
+ }
307
+ function Mt(e, t = {}) {
308
+ const { args: n = [], messages: r = {} } = t;
309
+ return vt(e, ...n) ? !0 : ht(r, n);
310
+ }
311
+ function Nt(e, t) {
312
+ const n = e.is;
313
+ return typeof n == "function" ? n({ allowedValues: t }) : n ?? `Must be one of: ${t.join(", ")}`;
314
+ }
315
+ function wt(e, ...t) {
316
+ return !e && e !== 0 && e !== !1 ? !0 : t.includes(String(e));
317
+ }
318
+ function At(e, t = {}) {
319
+ const { args: n = [], messages: r = {} } = t;
320
+ return wt(e, ...n) ? !0 : Nt(r, n);
321
+ }
322
+ function Dt(e, t, n) {
323
+ const r = e.length;
324
+ return n !== void 0 ? typeof r == "function" ? r({ min: t, max: n }) : r ?? `Must be between ${t} and ${n} characters` : typeof r == "function" ? r({ value: t }) : r ?? `Must be exactly ${t} characters`;
325
+ }
326
+ function St(e, t, n) {
327
+ if (!e && e !== 0) return !0;
328
+ let r = 0;
329
+ if (typeof e == "string")
330
+ r = e.length;
331
+ else if (Array.isArray(e))
332
+ r = e.length;
333
+ else if (typeof e == "object" && e !== null)
334
+ r = Object.keys(e).length;
335
+ else
336
+ return !1;
337
+ if (n !== void 0) {
338
+ const o = Number(t), a = Number(n);
339
+ return !isNaN(o) && !isNaN(a) && r >= o && r <= a;
340
+ }
341
+ const s = Number(t);
342
+ return !isNaN(s) && r === s;
343
+ }
344
+ function Ft(e, t = {}) {
345
+ const { args: n = [], messages: r = {} } = t, [s, o] = n;
346
+ return St(e, s, o) ? !0 : Dt(r, s, o);
347
+ }
348
+ function xt(e) {
349
+ const t = e.lowercase;
350
+ return typeof t == "function" ? t({}) : t ?? "Must contain only lowercase characters";
351
+ }
352
+ function jt(e) {
353
+ return e ? /^[a-z]+$/.test(String(e)) : !0;
354
+ }
355
+ function Tt(e, t = {}) {
356
+ const { messages: n = {} } = t;
357
+ return jt(e) ? !0 : xt(n);
358
+ }
359
+ function Vt(e, t, n) {
360
+ const r = t.matches;
361
+ return typeof r == "function" ? r({ value: e, pattern: n }) : r ?? "Format is not valid";
362
+ }
363
+ function qt(e, t) {
364
+ if (!e) return !0;
365
+ if (!t) return !1;
366
+ try {
367
+ if (t.startsWith("/") && t.includes("/", 1)) {
368
+ const n = t.lastIndexOf("/"), r = t.slice(1, n), s = t.slice(n + 1);
369
+ return new RegExp(r, s).test(String(e));
370
+ }
371
+ return String(e) === t;
372
+ } catch {
373
+ return !1;
374
+ }
375
+ }
376
+ function Ct(e, t = {}) {
377
+ const { args: n = [], messages: r = {} } = t, [s] = n;
378
+ return qt(e, s) ? !0 : Vt(e, r, s);
379
+ }
380
+ function Pt(e, t) {
381
+ const n = e.max;
382
+ return typeof n == "function" ? n({ value: t }) : n ?? `Must be at most ${t}`;
383
+ }
384
+ function Et(e, t) {
385
+ if (!e && e !== 0) return !0;
386
+ const n = Number(t);
387
+ if (isNaN(n)) return !1;
388
+ if (typeof e == "number") return e <= n;
389
+ if (typeof e == "string") {
390
+ const r = Number(e);
391
+ return isNaN(r) ? e.length <= n : r <= n;
392
+ }
393
+ return Array.isArray(e) ? e.length <= n : !1;
394
+ }
395
+ function Ot(e, t = {}) {
396
+ const { args: n = [], messages: r = {} } = t, [s] = n;
397
+ return Et(e, s) ? !0 : Pt(r, s);
398
+ }
399
+ function Bt(e, t) {
400
+ const n = e.min;
401
+ return typeof n == "function" ? n({ value: t }) : n ?? `Must be at least ${t}`;
402
+ }
403
+ function Rt(e, t) {
404
+ if (!e && e !== 0) return !0;
405
+ const n = Number(t);
406
+ if (isNaN(n)) return !1;
407
+ if (typeof e == "number") return e >= n;
408
+ if (typeof e == "string") {
409
+ const r = Number(e);
410
+ return isNaN(r) ? e.length >= n : r >= n;
411
+ }
412
+ return Array.isArray(e) ? e.length >= n : !1;
413
+ }
414
+ function Wt(e, t = {}) {
415
+ const { args: n = [], messages: r = {} } = t, [s] = n;
416
+ return Rt(e, s) ? !0 : Bt(r, s);
417
+ }
418
+ function Lt(e, t) {
419
+ const n = e.not;
420
+ return typeof n == "function" ? n({ disallowedValues: t }) : n ?? `Must not be one of: ${t.join(", ")}`;
421
+ }
422
+ function _t(e, ...t) {
423
+ return !e && e !== 0 && e !== !1 ? !0 : !t.includes(String(e));
424
+ }
425
+ function zt(e, t = {}) {
426
+ const { args: n = [], messages: r = {} } = t;
427
+ return _t(e, ...n) ? !0 : Lt(r, n);
428
+ }
429
+ function It(e) {
430
+ const t = e.number;
431
+ return typeof t == "function" ? t({}) : t ?? "Must be a valid number";
432
+ }
433
+ function Kt(e) {
434
+ if (e == null || e === "") return !0;
435
+ if (Number.isNaN(e)) return !1;
436
+ const t = Number(e);
437
+ return !isNaN(t) && isFinite(t);
438
+ }
439
+ function Ut(e, t = {}) {
440
+ const { messages: n = {} } = t;
441
+ return Kt(e) ? !0 : It(n);
442
+ }
443
+ function Zt(e) {
444
+ const t = e.required;
445
+ return typeof t == "function" ? t({}) : t ?? "This field is required";
446
+ }
447
+ function kt(e) {
448
+ return e == null || e === "" ? !1 : typeof e == "string" ? e.trim().length > 0 : Array.isArray(e) ? e.length > 0 : typeof e == "object" ? Object.keys(e).length > 0 : e === 0 ? !0 : !!e;
449
+ }
450
+ function Yt(e, t = {}) {
451
+ const { messages: n = {} } = t;
452
+ return kt(e) ? !0 : Zt(n);
453
+ }
454
+ function Gt(e, t) {
455
+ const n = e.startsWith;
456
+ return typeof n == "function" ? n({ prefix: t.length === 1 ? t[0] : t }) : n ?? `Must start with: ${t.join(", ")}`;
457
+ }
458
+ function Ht(e, ...t) {
459
+ if (!e) return !0;
460
+ const n = String(e);
461
+ return t.some((r) => n.startsWith(r));
462
+ }
463
+ function Jt(e, t = {}) {
464
+ const { args: n = [], messages: r = {} } = t;
465
+ return Ht(e, ...n) ? !0 : Gt(r, n);
466
+ }
467
+ function Qt(e) {
468
+ const t = e.symbol;
469
+ return typeof t == "function" ? t({}) : t ?? "Must contain only symbols";
470
+ }
471
+ function Xt(e) {
472
+ return e ? /^[^\w\s]+$/.test(String(e)) : !0;
473
+ }
474
+ function en(e, t = {}) {
475
+ const { messages: n = {} } = t;
476
+ return Xt(e) ? !0 : Qt(n);
477
+ }
478
+ function tn(e) {
479
+ const t = e.uppercase;
480
+ return typeof t == "function" ? t({}) : t ?? "Must contain only uppercase characters";
481
+ }
482
+ function nn(e) {
483
+ return e ? /^[A-Z]+$/.test(String(e)) : !0;
484
+ }
485
+ function rn(e, t = {}) {
486
+ const { messages: n = {} } = t;
487
+ return nn(e) ? !0 : tn(n);
488
+ }
489
+ function sn(e) {
490
+ const t = e.url;
491
+ return typeof t == "function" ? t({}) : t ?? "Must be a valid URL";
492
+ }
493
+ function on(e) {
494
+ if (!e) return !0;
495
+ try {
496
+ const t = new URL(String(e));
497
+ return ["http:", "https:", "ftp:", "ftps:"].includes(t.protocol);
498
+ } catch {
499
+ return !1;
500
+ }
501
+ }
502
+ function an(e, t = {}) {
503
+ const { messages: n = {} } = t;
504
+ return on(e) ? !0 : sn(n);
505
+ }
506
+ const un = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
507
+ __proto__: null,
508
+ accepted: ge,
509
+ alpha: ye,
510
+ alphaSpaces: we,
511
+ alphanumeric: ve,
512
+ between: Se,
513
+ confirm: je,
514
+ containsAlpha: qe,
515
+ containsAlphaSpaces: Re,
516
+ containsAlphanumeric: Ee,
517
+ containsLowercase: _e,
518
+ containsNumeric: Ke,
519
+ containsSymbol: ke,
520
+ containsUppercase: He,
521
+ dateAfter: Xe,
522
+ dateAfterOrEqual: nt,
523
+ dateBefore: ot,
524
+ dateBeforeOrEqual: it,
525
+ dateBetween: ft,
526
+ dateFormat: pt,
527
+ email: $t,
528
+ endsWith: Mt,
529
+ is: At,
530
+ length: Ft,
531
+ lowercase: Tt,
532
+ matches: Ct,
533
+ max: Ot,
534
+ min: Wt,
535
+ not: zt,
536
+ number: Ut,
537
+ required: Yt,
538
+ startsWith: Jt,
539
+ symbol: en,
540
+ uppercase: rn,
541
+ url: an
542
+ }, Symbol.toStringTag, { value: "Module" })), An = {
543
+ install(e, t = {}) {
544
+ P(un), t.rules && P(t.rules);
545
+ const n = te(t.locale) ? t.locale : h(t.locale ?? "en"), r = { en: ce };
546
+ t.locales && Object.keys(t.locales).forEach((o) => {
547
+ r[o] = { ...r[o] ?? {}, ...t.locales[o] };
548
+ });
549
+ const s = B(r);
550
+ e.provide(k, {
551
+ locale: w(n),
552
+ locales: w(s),
553
+ setLocale: (o) => {
554
+ s.value[o] ? n.value = o : console.warn(`Locale "${o}" not available.`);
555
+ }
556
+ });
557
+ }
558
+ }, H = Symbol("form-state-context"), cn = (e) => {
559
+ x(H, e);
560
+ }, ln = (e = null) => {
561
+ const t = A(H, e);
562
+ if (!t && t !== null)
563
+ throw new Error("Context with formStateContextKey not found");
564
+ return t;
565
+ }, J = Symbol("form-context"), fn = (e) => {
566
+ x(J, e);
567
+ }, Dn = (e = null) => {
568
+ const t = A(J, e);
569
+ if (!t && t !== null)
570
+ throw new Error("Context with formContextKey not found");
571
+ return t;
572
+ };
573
+ function mn(e, t) {
574
+ if (!(!e || !t))
575
+ return t.split(".").reduce((n, r) => n == null ? void 0 : n[r], e);
576
+ }
577
+ function dn(e, t, n) {
578
+ if (!e || !t) return e;
579
+ const r = t.split("."), s = r.pop(), o = r.reduce((a, m, i) => {
580
+ if (a[m] === null || a[m] === void 0) {
581
+ const y = r[i + 1] || s;
582
+ a[m] = /^\d+$/.test(y) ? [] : {};
583
+ }
584
+ return a[m];
585
+ }, e);
586
+ return o[s] = n, e;
587
+ }
588
+ const Sn = /* @__PURE__ */ R({
589
+ __name: "Form",
590
+ props: {
591
+ modelValue: {
592
+ default: () => ({})
593
+ },
594
+ modelModifiers: {}
595
+ },
596
+ emits: /* @__PURE__ */ U(["submit"], ["update:modelValue"]),
597
+ setup(e, { emit: t }) {
598
+ const n = t, r = W(e, "modelValue");
599
+ ne(r.value) || (r.value = re(r.value ?? {}));
600
+ const s = h({}), o = h([]), a = b(() => r.value), m = b(() => o.value[0] ?? null), i = b(
601
+ () => Object.keys(s.value).every((u) => s.value[u].isValid)
602
+ ), y = () => {
603
+ Object.keys(s.value).forEach((u) => {
604
+ var g, d;
605
+ (d = (g = s.value[u]).validate) == null || d.call(g);
606
+ });
607
+ }, c = () => {
608
+ y(), i.value && (o.value = [], n("submit", r.value, { setErrors: l, reset: f }));
609
+ }, l = (...u) => {
610
+ var g;
611
+ if (u.length === 1) {
612
+ const d = u[0];
613
+ if (typeof d == "object" && !Array.isArray(d) && d !== null) {
614
+ Object.keys(d).forEach((v) => {
615
+ l(v, d[v]);
616
+ });
617
+ return;
618
+ }
619
+ o.value = Array.isArray(d) ? d : [d];
620
+ } else if (u.length === 2) {
621
+ const [d, v] = u;
622
+ (g = s.value[d]) == null || g.setErrors(v);
623
+ }
624
+ }, f = () => {
625
+ o.value = [], Object.keys(s.value).forEach((u) => {
626
+ s.value[u].reset();
627
+ });
628
+ };
629
+ return cn({
630
+ getFields() {
631
+ return s.value;
632
+ },
633
+ getField(u) {
634
+ return s.value[u];
635
+ },
636
+ addField(u, g) {
637
+ s.value[u] = g;
638
+ },
639
+ removeField(u) {
640
+ delete s.value[u];
641
+ },
642
+ setFieldValue(u, g) {
643
+ dn(r.value, u, g);
644
+ },
645
+ getFieldValue(u) {
646
+ return mn(r.value, u);
647
+ }
648
+ }), fn({
649
+ values: a,
650
+ isValid: i,
651
+ error: m,
652
+ errors: o,
653
+ fields: s,
654
+ reset: f,
655
+ setErrors: l,
656
+ validate: y
657
+ }), (u, g) => (L(), _("form", {
658
+ onSubmit: se(c, ["prevent"])
659
+ }, [
660
+ z(u.$slots, "default", I(K({
661
+ isValid: i.value,
662
+ error: m.value,
663
+ errors: o.value,
664
+ values: a.value,
665
+ fields: s.value,
666
+ reset: f,
667
+ setErrors: l,
668
+ validate: y
669
+ })))
670
+ ], 32));
671
+ }
672
+ });
673
+ function Q(e) {
674
+ if (!e || typeof e != "string")
675
+ return {};
676
+ const t = e.split("|").filter(Boolean), n = {};
677
+ for (const r of t) {
678
+ const [s, ...o] = r.split(":"), a = s.trim();
679
+ if (o.length === 0)
680
+ n[a] = !0;
681
+ else {
682
+ const i = o.join(":").split(",").map((y) => y.trim());
683
+ n[a] = i.length === 1 ? i[0] : i;
684
+ }
685
+ }
686
+ return n;
687
+ }
688
+ const gn = (e, t, n = {}, r = {}) => {
689
+ if (!t) return !0;
690
+ const s = Q(t), o = [];
691
+ for (const [a, m] of Object.entries(s)) {
692
+ const i = fe(a);
693
+ if (i) {
694
+ const c = { args: m === !0 ? [] : Array.isArray(m) ? m : [m], messages: n, fields: r }, l = i(e, c);
695
+ l !== !0 && o.push(l ?? "Invalid value");
696
+ } else
697
+ console.warn(`[Forms] Validation rule "${a}" not found.`);
698
+ }
699
+ return o.length === 0 ? !0 : o;
700
+ }, pn = (e, t) => {
701
+ const n = t(e);
702
+ return n === !0 ? !0 : typeof n == "string" ? [n] : Array.isArray(n) ? n : !!n ? !0 : ["Invalid value"];
703
+ };
704
+ typeof WorkerGlobalScope < "u" && globalThis instanceof WorkerGlobalScope;
705
+ const E = () => {
706
+ };
707
+ function bn(e, t) {
708
+ function n(...r) {
709
+ return new Promise((s, o) => {
710
+ Promise.resolve(e(() => t.apply(this, r), {
711
+ fn: t,
712
+ thisArg: this,
713
+ args: r
714
+ })).then(s).catch(o);
715
+ });
716
+ }
717
+ return n;
718
+ }
719
+ const yn = (e) => e();
720
+ function $n(e, t = {}) {
721
+ let n, r, s = E;
722
+ const o = (i) => {
723
+ clearTimeout(i), s(), s = E;
724
+ };
725
+ let a;
726
+ return (i) => {
727
+ const y = $(e), c = $(t.maxWait);
728
+ return n && o(n), y <= 0 || c !== void 0 && c <= 0 ? (r && (o(r), r = void 0), Promise.resolve(i())) : new Promise((l, f) => {
729
+ s = t.rejectOnCancel ? f : l, a = i, c && !r && (r = setTimeout(() => {
730
+ n && o(n), r = void 0, l(a());
731
+ }, c)), n = setTimeout(() => {
732
+ r && o(r), r = void 0, l(i());
733
+ }, y);
734
+ });
735
+ };
736
+ }
737
+ function hn(e, t, n = {}) {
738
+ const { eventFilter: r = yn, ...s } = n;
739
+ return Z(e, bn(r, t), s);
740
+ }
741
+ function O(e, t, n = {}) {
742
+ const { debounce: r = 0, maxWait: s = void 0, ...o } = n;
743
+ return hn(e, t, {
744
+ ...o,
745
+ eventFilter: $n(r, { maxWait: s })
746
+ });
747
+ }
748
+ function vn(e, t = {}) {
749
+ const n = h(!0), r = h(!1), s = h([]), o = h(null), a = b(() => $(t.rules) ?? null), m = b(() => $(t.messages) ?? {}), i = b(() => $(t.fields) ?? {}), y = b(() => {
750
+ if (!a.value || typeof a.value != "string") return null;
751
+ const u = Q(a.value).confirm;
752
+ if (!u || u === !0) return null;
753
+ const g = i.value[u];
754
+ return (g == null ? void 0 : g.value) ?? null;
755
+ }), c = () => {
756
+ let f;
757
+ return typeof a.value == "function" ? f = pn($(e), a.value) : f = gn(
758
+ $(e),
759
+ a.value,
760
+ m.value,
761
+ i.value
762
+ ), f === !0 ? (n.value = !0, s.value = [], !0) : Array.isArray(f) ? (n.value = !1, s.value = f, !1) : f;
763
+ }, l = () => {
764
+ o.value && clearTimeout(o.value), r.value = !0, n.value = !0, s.value = [], o.value = setTimeout(() => {
765
+ r.value = !1, o.value = null;
766
+ }, 1e3);
767
+ };
768
+ return O(
769
+ () => $(e),
770
+ () => {
771
+ r.value || c();
772
+ },
773
+ { debounce: 300 }
774
+ ), O(
775
+ () => $(y),
776
+ () => {
777
+ r.value || $(e) && c();
778
+ },
779
+ { debounce: 300 }
780
+ ), {
781
+ validate: c,
782
+ reset: l,
783
+ isValid: w(n),
784
+ errors: w(s)
785
+ };
786
+ }
787
+ const X = Symbol("field-context"), Mn = (e) => {
788
+ x(X, e);
789
+ }, Fn = (e = null) => {
790
+ const t = A(X, e);
791
+ if (!t && t !== null)
792
+ throw new Error("Context with fieldContextKey not found");
793
+ return t;
794
+ }, xn = /* @__PURE__ */ R({
795
+ __name: "Field",
796
+ props: /* @__PURE__ */ U({
797
+ id: {},
798
+ name: {},
799
+ validation: { type: [String, Function, null] },
800
+ validationMessages: {},
801
+ error: {}
802
+ }, {
803
+ modelValue: {},
804
+ modelModifiers: {}
805
+ }),
806
+ emits: ["update:modelValue"],
807
+ setup(e) {
808
+ const t = e, n = W(e, "modelValue"), r = oe(), s = ln(), o = Y(), a = b({
809
+ get: () => s ? s.getFieldValue(t.name) : n.value,
810
+ set: (p) => {
811
+ s ? s.setFieldValue(t.name, p) : n.value = p;
812
+ }
813
+ }), m = b(() => t.validation ?? null), i = b(() => ({
814
+ ...o ? o.locales.value[o.locale.value] : {},
815
+ ...t.validationMessages ?? {}
816
+ })), y = b({
817
+ get: () => s ? s.getFields() : {},
818
+ set: () => {
819
+ }
820
+ }), c = vn(a, { rules: m, messages: i, fields: y }), l = h(!1), f = h(!1), u = h([]), g = b(() => a.value ?? null), d = b(() => c.isValid.value && u.value.length === 0), v = b(() => [...c.errors.value, ...u.value]), M = b(() => v.value[0] ?? null), j = $(a), N = t.id ?? r, D = `${N}-error`, S = `${N}-help`, ee = (p) => {
821
+ u.value = Array.isArray(p) ? p : [p];
822
+ }, F = () => {
823
+ a.value = j, l.value = !1, f.value = !1, u.value = [], c.reset();
824
+ };
825
+ Z(
826
+ () => t.error,
827
+ (p) => {
828
+ p ? u.value = Array.isArray(p) ? p : [p] : u.value = [];
829
+ },
830
+ { immediate: !0 }
831
+ );
832
+ const T = b(() => ({
833
+ id: N,
834
+ name: t.name,
835
+ modelValue: a.value,
836
+ "aria-invalid": !!M.value,
837
+ "aria-describedby": M.value ? `${D} ${S}` : S,
838
+ "aria-errormessage": M.value ? D : void 0,
839
+ "onUpdate:modelValue": (p) => {
840
+ a.value = p, !f.value && p !== j && (f.value = !0);
841
+ },
842
+ onBlur: () => {
843
+ l.value || (l.value = !0, c.validate());
844
+ }
845
+ })), V = { for: N }, q = { id: D, role: "alert", "aria-live": "polite" }, C = { id: S };
846
+ return ae(() => {
847
+ s && s.addField(t.name, {
848
+ value: g,
849
+ isValid: d,
850
+ isTouched: l,
851
+ isDirty: f,
852
+ error: M,
853
+ errors: v,
854
+ setErrors: ee,
855
+ reset: F,
856
+ validate: c.validate
857
+ });
858
+ }), ue(() => {
859
+ s && s.removeField(t.name);
860
+ }), Mn({
861
+ inputValue: a,
862
+ inputProps: T,
863
+ labelProps: V,
864
+ helpProps: C,
865
+ errorProps: q,
866
+ isValid: d,
867
+ isTouched: l,
868
+ isDirty: f,
869
+ error: M,
870
+ errors: v,
871
+ validate: c.validate,
872
+ reset: F
873
+ }), (p, Nn) => (L(), _("div", null, [
874
+ z(p.$slots, "default", I(K({
875
+ inputValue: a.value,
876
+ inputProps: T.value,
877
+ labelProps: V,
878
+ helpProps: C,
879
+ errorProps: q,
880
+ isValid: d.value,
881
+ isTouched: l.value,
882
+ isDirty: f.value,
883
+ error: M.value,
884
+ errors: v.value,
885
+ validate: ie(c).validate,
886
+ reset: F
887
+ })))
888
+ ]));
889
+ }
890
+ });
891
+ function jn() {
892
+ const e = Y();
893
+ if (!e)
894
+ throw new Error(
895
+ "[Valiform] useLocale() must be used inside a component with FormsPlugin installed."
896
+ );
897
+ return {
898
+ locale: e.locale,
899
+ locales: e.locales,
900
+ setLocale: e.setLocale
901
+ };
902
+ }
903
+ const Tn = {
904
+ required: "Este campo es obligatorio",
905
+ email: "Por favor ingresa un email válido",
906
+ min: ({ value: e }) => `Debe ser al menos ${e}`,
907
+ max: ({ value: e }) => `Debe ser como máximo ${e}`,
908
+ matches: "El formato no es válido",
909
+ number: "Debe ser un número válido",
910
+ accepted: "Debe ser aceptado",
911
+ alpha: "Debe contener solo caracteres alfabéticos",
912
+ alphanumeric: "Debe contener solo letras y números",
913
+ alphaSpaces: "Debe contener solo letras y espacios",
914
+ between: ({ min: e, max: t }) => `Debe estar entre ${e} y ${t}`,
915
+ confirm: ({ fieldName: e }) => `Debe coincidir con ${e}`,
916
+ containsAlpha: "Debe contener al menos una letra",
917
+ containsAlphanumeric: "Debe contener al menos una letra o número",
918
+ containsAlphaSpaces: "Debe contener al menos una letra o espacio",
919
+ containsLowercase: "Debe contener al menos una letra minúscula",
920
+ containsNumeric: "Debe contener al menos un número",
921
+ containsSymbol: "Debe contener al menos un símbolo",
922
+ containsUppercase: "Debe contener al menos una letra mayúscula",
923
+ dateAfter: ({ date: e }) => e ? `Debe ser posterior a ${e}` : "Debe ser posterior a hoy",
924
+ dateAfterOrEqual: ({ date: e }) => e ? `Debe ser posterior o igual a ${e}` : "Debe ser posterior o igual a hoy",
925
+ dateBefore: ({ date: e }) => e ? `Debe ser anterior a ${e}` : "Debe ser anterior a hoy",
926
+ dateBeforeOrEqual: ({ date: e }) => e ? `Debe ser anterior o igual a ${e}` : "Debe ser anterior o igual a hoy",
927
+ dateBetween: ({ startDate: e, endDate: t }) => `Debe estar entre ${e} y ${t}`,
928
+ dateFormat: ({ format: e }) => `Debe coincidir con el formato ${e}`,
929
+ endsWith: ({ suffix: e }) => Array.isArray(e) ? `Debe terminar con uno de: ${e.map((t) => `"${t}"`).join(", ")}` : `Debe terminar con "${e}"`,
930
+ is: ({ allowedValues: e }) => `Debe ser uno de: ${Array.isArray(e) ? e.join(", ") : e}`,
931
+ length: ({ value: e, min: t, max: n }) => t !== void 0 && n !== void 0 ? `Debe tener entre ${t} y ${n} caracteres` : e !== void 0 ? `Debe tener exactamente ${e} caracteres` : "Longitud inválida",
932
+ lowercase: "Debe contener solo caracteres en minúscula",
933
+ not: ({ disallowedValues: e }) => `No debe ser uno de: ${Array.isArray(e) ? e.join(", ") : e}`,
934
+ startsWith: ({ prefix: e }) => Array.isArray(e) ? `Debe comenzar con uno de: ${e.join(", ")}` : `Debe comenzar con "${e}"`,
935
+ symbol: "Debe contener solo símbolos",
936
+ uppercase: "Debe contener solo caracteres en mayúscula",
937
+ url: "Debe ser una URL válida"
938
+ };
939
+ export {
940
+ xn as Field,
941
+ Sn as Form,
942
+ An as FormsPlugin,
943
+ ce as en,
944
+ Tn as es,
945
+ Fn as useFieldContext,
946
+ Dn as useFormContext,
947
+ jn as useLocale
948
+ };