@kklab/fortress-validator 1.0.14 → 1.0.16
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.
- package/README.md +5 -2
- package/dist/FieldValidator.d.ts +14 -2
- package/dist/index.js +126 -87
- package/dist/index.umd.js +1 -1
- package/dist/rules/notEndsWith.d.ts +6 -0
- package/dist/rules/notStartsWith.d.ts +6 -0
- package/dist/rules/object.d.ts +3 -0
- package/dist/rules/startsWith.d.ts +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -87,7 +87,7 @@ const result = validator
|
|
|
87
87
|
| `date` | Passes if the field's value matches the specified date format. |
|
|
88
88
|
| `declined` | Passes if the field's value is considered declined (i.e., "n", "no", "off", "0", "false"). |
|
|
89
89
|
| `different` | Passes if the field's value is different from the specified value in the given field. |
|
|
90
|
-
| `distinct` | Passes if
|
|
90
|
+
| `distinct` | Passes if the field's value contains only unique items. |
|
|
91
91
|
| `domain` | Passes if the field's value is a valid domain. |
|
|
92
92
|
| `email` | Passes if the field's value is a valid email address. |
|
|
93
93
|
| `endsWith` | Passes if the field's value ends with the specified value. |
|
|
@@ -116,11 +116,14 @@ const result = validator
|
|
|
116
116
|
| `lte` | Passes if the field's value is less than or equal to the specified value. |
|
|
117
117
|
| `notContainsAll` | Passes if the field's value does not contain all of the specified values together. |
|
|
118
118
|
| `notContainsAny` | Passes if the field's value does not contain any of the specified values. |
|
|
119
|
+
| `notEndsWith` | Passes if the field's value does not end with the specified value. |
|
|
119
120
|
| `notEquals` | Passes if the field's value is not equal to the specified value. |
|
|
120
121
|
| `notOneOf` | Passes if the field's value is not one of the specified values. |
|
|
122
|
+
| `notStartsWith` | Passes if the field's value does not start with the specified value. |
|
|
121
123
|
| `notSubsetOf` | Passes if the field's value is not a subset of the specified values. |
|
|
122
124
|
| `number` | Passes if the field's value is a number. |
|
|
123
125
|
| `numeric` | Passes if the field's value contains only numeric characters. |
|
|
126
|
+
| `object` | Passes if the field's value is an object. |
|
|
124
127
|
| `oneOf` | Passes if the field's value is one of the specified values. |
|
|
125
128
|
| `protocol` | Passes if the field's value starts with the specified protocol. |
|
|
126
129
|
| `regex` | Passes if the field's value matches the specified regular expression. |
|
|
@@ -141,7 +144,7 @@ const result = validator
|
|
|
141
144
|
| `stringNotContainsAll` | Passes if the field's value does not contain all of the specified text together. |
|
|
142
145
|
| `stringNotContainsAny` | Passes if the field's value does not contain any of the specified text. |
|
|
143
146
|
| `subsetOf` | Passes if the field's value is a subset of the specified values. |
|
|
144
|
-
| `unique` | Passes if the field's value
|
|
147
|
+
| `unique` | Passes if the field's value does not exist in the provided values. |
|
|
145
148
|
| `uppercase` | Passes if the field's value contains only uppercase characters. |
|
|
146
149
|
| `url` | Passes if the field's value is a valid URL. |
|
|
147
150
|
|
package/dist/FieldValidator.d.ts
CHANGED
|
@@ -122,7 +122,7 @@ declare class FieldValidator {
|
|
|
122
122
|
*/
|
|
123
123
|
different(field: string, value: unknown): this;
|
|
124
124
|
/**
|
|
125
|
-
* Passes if
|
|
125
|
+
* Passes if the field's value contains only unique items.
|
|
126
126
|
*/
|
|
127
127
|
distinct(): this;
|
|
128
128
|
/**
|
|
@@ -237,6 +237,10 @@ declare class FieldValidator {
|
|
|
237
237
|
* Passes if the field's value does not contain any of the specified values.
|
|
238
238
|
*/
|
|
239
239
|
notContainsAny(values: unknown[]): this;
|
|
240
|
+
/**
|
|
241
|
+
* Passes if the field's value does not end with the specified value.
|
|
242
|
+
*/
|
|
243
|
+
notEndsWith(value: string): this;
|
|
240
244
|
/**
|
|
241
245
|
* Passes if the field's value is not equal to the specified value.
|
|
242
246
|
*/
|
|
@@ -245,6 +249,10 @@ declare class FieldValidator {
|
|
|
245
249
|
* Passes if the field's value is not one of the specified values.
|
|
246
250
|
*/
|
|
247
251
|
notOneOf(values: string[]): this;
|
|
252
|
+
/**
|
|
253
|
+
* Passes if the field's value does not start with the specified value.
|
|
254
|
+
*/
|
|
255
|
+
notStartsWith(value: string): this;
|
|
248
256
|
/**
|
|
249
257
|
* Passes if the field's value is not a subset of the specified values.
|
|
250
258
|
*/
|
|
@@ -257,6 +265,10 @@ declare class FieldValidator {
|
|
|
257
265
|
* Passes if the field's value contains only numeric characters.
|
|
258
266
|
*/
|
|
259
267
|
numeric(): this;
|
|
268
|
+
/**
|
|
269
|
+
* Passes if the field's value is an object.
|
|
270
|
+
*/
|
|
271
|
+
object(): this;
|
|
260
272
|
/**
|
|
261
273
|
* Passes if the field's value is one of the specified values.
|
|
262
274
|
*/
|
|
@@ -338,7 +350,7 @@ declare class FieldValidator {
|
|
|
338
350
|
*/
|
|
339
351
|
subsetOf(values: string[]): this;
|
|
340
352
|
/**
|
|
341
|
-
* Passes if the field's value
|
|
353
|
+
* Passes if the field's value does not exist in the provided values.
|
|
342
354
|
*/
|
|
343
355
|
unique(values: string[], ignored?: unknown[] | unknown): this;
|
|
344
356
|
/**
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
var D = Object.defineProperty;
|
|
2
2
|
var P = (t, e, r) => e in t ? D(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r;
|
|
3
3
|
var o = (t, e, r) => (P(t, typeof e != "symbol" ? e + "" : e, r), r);
|
|
4
|
-
const
|
|
4
|
+
const L = (t) => {
|
|
5
5
|
const e = ",、;:!?。()《》「」『』【】〔〕", r = "\\x20-\\x7E", a = new RegExp(`\\s*([${e}])`, "gu"), l = new RegExp(`([${e}])\\s*([${r}])`, "gu"), u = new RegExp(`([^${r}${e}])([${r}])`, "gu"), E = new RegExp(`([${r}])([^${r}${e}])`, "gu");
|
|
6
6
|
return t.replace(a, "$1").replace(l, "$1$2").replace(u, "$1 $2").replace(E, "$1 $2").replace(/ +/g, " ");
|
|
7
7
|
}, n = (t, e = 0) => new Intl.NumberFormat(void 0, {
|
|
8
8
|
minimumFractionDigits: e,
|
|
9
9
|
maximumFractionDigits: e
|
|
10
10
|
}).format(t), N = (t) => Object.prototype.toString.call(t).toLowerCase().slice(8, -1), s = (t) => t == null || t === "" || Array.isArray(t) && t.length < 1, i = (t) => `"${t}"`;
|
|
11
|
-
class
|
|
11
|
+
class I {
|
|
12
12
|
constructor({
|
|
13
13
|
name: e,
|
|
14
14
|
locale: r,
|
|
@@ -67,9 +67,9 @@ class W {
|
|
|
67
67
|
const u = N(a);
|
|
68
68
|
if (!(u in l))
|
|
69
69
|
throw new Error(`The message for the "${e}" rule of the "${u}" type is missing.`);
|
|
70
|
-
return
|
|
70
|
+
return L(l[u]);
|
|
71
71
|
}
|
|
72
|
-
return
|
|
72
|
+
return L(l);
|
|
73
73
|
}
|
|
74
74
|
pushRuleFunction(e, r) {
|
|
75
75
|
if (e in this.conditions && !this.conditions[e])
|
|
@@ -239,7 +239,7 @@ class W {
|
|
|
239
239
|
return this.apply(this.different.name, { field: e, value: r });
|
|
240
240
|
}
|
|
241
241
|
/**
|
|
242
|
-
* Passes if
|
|
242
|
+
* Passes if the field's value contains only unique items.
|
|
243
243
|
*/
|
|
244
244
|
distinct() {
|
|
245
245
|
return this.apply(this.distinct.name);
|
|
@@ -415,6 +415,12 @@ class W {
|
|
|
415
415
|
notContainsAny(e) {
|
|
416
416
|
return this.apply(this.notContainsAny.name, { values: e });
|
|
417
417
|
}
|
|
418
|
+
/**
|
|
419
|
+
* Passes if the field's value does not end with the specified value.
|
|
420
|
+
*/
|
|
421
|
+
notEndsWith(e) {
|
|
422
|
+
return this.apply(this.notEndsWith.name, { value: e });
|
|
423
|
+
}
|
|
418
424
|
/**
|
|
419
425
|
* Passes if the field's value is not equal to the specified value.
|
|
420
426
|
*/
|
|
@@ -427,6 +433,12 @@ class W {
|
|
|
427
433
|
notOneOf(e) {
|
|
428
434
|
return this.apply(this.notOneOf.name, { values: e });
|
|
429
435
|
}
|
|
436
|
+
/**
|
|
437
|
+
* Passes if the field's value does not start with the specified value.
|
|
438
|
+
*/
|
|
439
|
+
notStartsWith(e) {
|
|
440
|
+
return this.apply(this.notStartsWith.name, { value: e });
|
|
441
|
+
}
|
|
430
442
|
/**
|
|
431
443
|
* Passes if the field's value is not a subset of the specified values.
|
|
432
444
|
*/
|
|
@@ -445,6 +457,12 @@ class W {
|
|
|
445
457
|
numeric() {
|
|
446
458
|
return this.apply(this.numeric.name);
|
|
447
459
|
}
|
|
460
|
+
/**
|
|
461
|
+
* Passes if the field's value is an object.
|
|
462
|
+
*/
|
|
463
|
+
object() {
|
|
464
|
+
return this.apply(this.object.name);
|
|
465
|
+
}
|
|
448
466
|
/**
|
|
449
467
|
* Passes if the field's value is one of the specified values.
|
|
450
468
|
*/
|
|
@@ -567,7 +585,7 @@ class W {
|
|
|
567
585
|
return this.apply(this.subsetOf.name, { values: e });
|
|
568
586
|
}
|
|
569
587
|
/**
|
|
570
|
-
* Passes if the field's value
|
|
588
|
+
* Passes if the field's value does not exist in the provided values.
|
|
571
589
|
*/
|
|
572
590
|
unique(e, r = []) {
|
|
573
591
|
return this.apply(this.unique.name, { values: e, ignored: r });
|
|
@@ -591,7 +609,7 @@ class W {
|
|
|
591
609
|
return typeof e == "object" ? (this.conditions = e, this) : (e || (this.shouldSkip = !0), this);
|
|
592
610
|
}
|
|
593
611
|
}
|
|
594
|
-
const
|
|
612
|
+
const K = {
|
|
595
613
|
accepted: (t) => `The ${t} field must be accepted.`,
|
|
596
614
|
alpha: (t) => `The ${t} field must only contain letters.`,
|
|
597
615
|
alphaDash: (t) => `The ${t} field must only contain letters, numbers, dashes and underscores.`,
|
|
@@ -649,7 +667,7 @@ const I = {
|
|
|
649
667
|
email: (t) => `The ${t} field must be a valid email address.`,
|
|
650
668
|
endsWith: (t, e) => {
|
|
651
669
|
const { value: r } = e;
|
|
652
|
-
return `The ${t} field must end with ${r}.`;
|
|
670
|
+
return `The ${t} field must end with ${i(r)}.`;
|
|
653
671
|
},
|
|
654
672
|
equals: (t, e) => {
|
|
655
673
|
const { value: r } = e;
|
|
@@ -739,6 +757,10 @@ const I = {
|
|
|
739
757
|
const { values: r } = e;
|
|
740
758
|
return `The ${t} field must not contain all of the following values together: ${r.map(i).join(", ")}.`;
|
|
741
759
|
},
|
|
760
|
+
notEndsWith: (t, e) => {
|
|
761
|
+
const { value: r } = e;
|
|
762
|
+
return `The ${t} field must not end with ${i(r)}.`;
|
|
763
|
+
},
|
|
742
764
|
notContainsAny: (t, e) => {
|
|
743
765
|
const { values: r } = e;
|
|
744
766
|
return `The ${t} field must not contain any of the following values: ${r.map(i).join(", ")}.`;
|
|
@@ -751,12 +773,17 @@ const I = {
|
|
|
751
773
|
const { values: r } = e;
|
|
752
774
|
return `The ${t} field must not be one of the following values: ${r.map(i).join(", ")}.`;
|
|
753
775
|
},
|
|
776
|
+
notStartsWith: (t, e) => {
|
|
777
|
+
const { value: r } = e;
|
|
778
|
+
return `The ${t} field must not start with ${i(r)}.`;
|
|
779
|
+
},
|
|
754
780
|
notSubsetOf: (t, e) => {
|
|
755
781
|
const { values: r } = e;
|
|
756
782
|
return `The ${t} field must not be a subset of the following values: ${r.map(i).join(", ")}.`;
|
|
757
783
|
},
|
|
758
784
|
number: (t) => `The ${t} field must be a number.`,
|
|
759
785
|
numeric: (t) => `The ${t} field must be a number.`,
|
|
786
|
+
object: (t) => `The ${t} field must be an object.`,
|
|
760
787
|
oneOf: (t, e) => {
|
|
761
788
|
const { values: r } = e;
|
|
762
789
|
return `The ${t} field must be one of the following values: ${r.map(i).join(", ")}.`;
|
|
@@ -784,7 +811,7 @@ const I = {
|
|
|
784
811
|
},
|
|
785
812
|
startsWith: (t, e) => {
|
|
786
813
|
const { value: r } = e;
|
|
787
|
-
return `The ${t} field must start with ${r}.`;
|
|
814
|
+
return `The ${t} field must start with ${i(r)}.`;
|
|
788
815
|
},
|
|
789
816
|
string: (t) => `The ${t} field must be a string.`,
|
|
790
817
|
stringContainsAll: (t, e) => {
|
|
@@ -852,7 +879,7 @@ const I = {
|
|
|
852
879
|
unique: (t) => `The ${t} field has already been taken.`,
|
|
853
880
|
uppercase: (t) => `The ${t} field must be uppercase.`,
|
|
854
881
|
url: (t) => `The ${t} field must be a valid URL.`
|
|
855
|
-
},
|
|
882
|
+
}, Z = {
|
|
856
883
|
accepted: () => "此欄位必須被同意",
|
|
857
884
|
alpha: () => "此欄位只能包含字母",
|
|
858
885
|
alphaDash: () => "此欄位只能包含字母、數字、連接號和底線",
|
|
@@ -910,7 +937,7 @@ const I = {
|
|
|
910
937
|
email: () => "此欄位必須是有效的電子郵件地址",
|
|
911
938
|
endsWith: (t, e) => {
|
|
912
939
|
const { value: r } = e;
|
|
913
|
-
return `此欄位必須以${r}結尾`;
|
|
940
|
+
return `此欄位必須以${i(r)}結尾`;
|
|
914
941
|
},
|
|
915
942
|
equals: (t, e) => {
|
|
916
943
|
const { value: r } = e;
|
|
@@ -1000,6 +1027,10 @@ const I = {
|
|
|
1000
1027
|
const { values: r } = e;
|
|
1001
1028
|
return `此欄位不能同時包含以下所有值:${r.map(i).join(", ")}`;
|
|
1002
1029
|
},
|
|
1030
|
+
notEndsWith: (t, e) => {
|
|
1031
|
+
const { value: r } = e;
|
|
1032
|
+
return `此欄位不能以${i(r)}結尾`;
|
|
1033
|
+
},
|
|
1003
1034
|
notContainsAny: (t, e) => {
|
|
1004
1035
|
const { values: r } = e;
|
|
1005
1036
|
return `此欄位不能包含以下任何值:${r.map(i).join(", ")}`;
|
|
@@ -1012,12 +1043,17 @@ const I = {
|
|
|
1012
1043
|
const { values: r } = e;
|
|
1013
1044
|
return `此欄位不能是以下任何值:${r.map(i).join(", ")}`;
|
|
1014
1045
|
},
|
|
1046
|
+
notStartsWith: (t, e) => {
|
|
1047
|
+
const { value: r } = e;
|
|
1048
|
+
return `此欄位不能以${i(r)}開頭`;
|
|
1049
|
+
},
|
|
1015
1050
|
notSubsetOf: (t, e) => {
|
|
1016
1051
|
const { values: r } = e;
|
|
1017
1052
|
return `此欄位不能是以下項目的子集:${r.map(i).join(", ")}`;
|
|
1018
1053
|
},
|
|
1019
1054
|
number: () => "此欄位必須是數字",
|
|
1020
1055
|
numeric: () => "此欄位必須是數字",
|
|
1056
|
+
object: () => "此欄位必須是物件",
|
|
1021
1057
|
oneOf: (t, e) => {
|
|
1022
1058
|
const { values: r } = e;
|
|
1023
1059
|
return `此欄位必須是以下其中一個值:${r.map(i).join(", ")}`;
|
|
@@ -1045,7 +1081,7 @@ const I = {
|
|
|
1045
1081
|
},
|
|
1046
1082
|
startsWith: (t, e) => {
|
|
1047
1083
|
const { value: r } = e;
|
|
1048
|
-
return `此欄位必須以${r}開頭`;
|
|
1084
|
+
return `此欄位必須以${i(r)}開頭`;
|
|
1049
1085
|
},
|
|
1050
1086
|
string: () => "此欄位必須是字串",
|
|
1051
1087
|
stringContainsAll: (t, e) => {
|
|
@@ -1113,40 +1149,40 @@ const I = {
|
|
|
1113
1149
|
unique: () => "此欄位已經存在",
|
|
1114
1150
|
uppercase: () => "此欄位必須是大寫",
|
|
1115
1151
|
url: () => "此欄位必須是有效的 URL"
|
|
1116
|
-
},
|
|
1117
|
-
en:
|
|
1118
|
-
"zh-TW":
|
|
1119
|
-
},
|
|
1152
|
+
}, H = {
|
|
1153
|
+
en: K,
|
|
1154
|
+
"zh-TW": Z
|
|
1155
|
+
}, M = () => (t) => s(t) ? !1 : ["y", "yes", "on", "1", "true"].includes(String(t).toLowerCase()), U = () => (t) => s(t) ? !1 : /^[a-zA-Z]+$/.test(String(t)), J = () => (t) => s(t) ? !1 : /^[a-zA-Z0-9-_]+$/.test(String(t)), V = () => (t) => s(t) ? !1 : /^[a-zA-Z0-9-_.]+$/.test(String(t)), Q = () => (t) => s(t) ? !1 : /^[a-zA-Z0-9]+$/.test(String(t)), X = () => (t) => Array.isArray(t), Y = ({ length: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.length === t : !1, w = ({ length: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.length >= t : !1, v = ({ length: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.length <= t : !1, ee = ({ min: t, max: e }) => (r) => s(r) ? !1 : w({ length: t })(r) && v({ length: e })(r), te = ({ length: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.length > t : !1, re = ({ length: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.length < t : !1, ne = () => (t) => s(t) ? !1 : /^[\x20-\x7E]+$/.test(String(t)), h = ({ value: t }) => (e) => s(e) ? !1 : typeof e == "number" ? e >= t : Array.isArray(e) ? e.every((r) => h({ value: t })(r)) : !1, f = ({ value: t }) => (e) => s(e) ? !1 : typeof e == "number" ? e <= t : Array.isArray(e) ? e.every((r) => f({ value: t })(r)) : !1, se = ({ min: t, max: e }) => (r) => s(r) ? !1 : h({ value: t })(r) && f({ value: e })(r), ae = () => (t) => s(t) ? !1 : typeof t == "boolean", ie = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? t.every((r) => e.includes(r)) : !1, le = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? t.some((r) => e.includes(r)) : !1, oe = () => (t) => s(t) ? !1 : ["n", "no", "off", "0", "false"].includes(String(t).toLowerCase()), ue = ({ value: t }) => (e) => s(e) ? !1 : e !== t, he = () => (t) => s(t) ? !1 : Array.isArray(t) ? new Set(t).size === t.length : !0, fe = () => (t) => s(t) ? !1 : /^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(String(t)), ce = () => (t) => s(t) ? !1 : /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(String(t)), T = ({ value: t }) => (e) => s(e) ? !1 : String(e).toLowerCase().endsWith(t.toLowerCase()), me = ({ value: t }) => (e) => e === t, ye = () => (t) => t instanceof File, R = ({ size: t }) => (e) => {
|
|
1120
1156
|
if (s(e))
|
|
1121
1157
|
return !1;
|
|
1122
1158
|
if (e instanceof File) {
|
|
1123
1159
|
const r = t * 1024, a = (t + 1) * 1024;
|
|
1124
1160
|
return e.size >= r && e.size < a;
|
|
1125
1161
|
}
|
|
1126
|
-
return Array.isArray(e) ? e.every((r) =>
|
|
1127
|
-
}, c = ({ size: t }) => (e) => s(e) ? !1 : e instanceof File ? e.size >= t * 1024 : Array.isArray(e) ? e.every((r) => c({ size: t })(r)) : !1, m = ({ size: t }) => (e) => s(e) ? !1 : e instanceof File ? e.size <= t * 1024 : Array.isArray(e) ? e.every((r) => m({ size: t })(r)) : !1,
|
|
1162
|
+
return Array.isArray(e) ? e.every((r) => R({ size: t })(r)) : !1;
|
|
1163
|
+
}, c = ({ size: t }) => (e) => s(e) ? !1 : e instanceof File ? e.size >= t * 1024 : Array.isArray(e) ? e.every((r) => c({ size: t })(r)) : !1, m = ({ size: t }) => (e) => s(e) ? !1 : e instanceof File ? e.size <= t * 1024 : Array.isArray(e) ? e.every((r) => m({ size: t })(r)) : !1, ge = ({ min: t, max: e }) => (r) => s(r) ? !1 : c({ size: t })(r) && m({ size: e })(r), S = ({ size: t }) => (e) => s(e) ? !1 : e instanceof File ? e.size > t * 1024 : Array.isArray(e) ? e.every((r) => S({ size: t })(r)) : !1, z = ({ size: t }) => (e) => s(e) ? !1 : e instanceof File ? e.size < t * 1024 : Array.isArray(e) ? e.every((r) => z({ size: t })(r)) : !1, j = ({ value: t }) => (e) => s(e) ? !1 : typeof e == "number" ? e > t : Array.isArray(e) ? e.every((r) => j({ value: t })(r)) : !1, y = ({ value: t }) => (e) => s(e) ? !1 : String(e).toLowerCase().startsWith(t.toLowerCase()), g = ({ values: t }) => (e) => s(e) ? !1 : t.map((r) => `${r}://`).some((r) => y({ value: r })(e)), C = () => (t) => s(t) ? !1 : g({ values: ["http"] })(t), F = () => (t) => s(t) ? !1 : g({ values: ["https"] })(t), $e = () => (t) => s(t) ? !1 : C()(t) || F()(t), $ = () => (t) => s(t) ? !1 : typeof t == "number", de = () => (t) => s(t) ? !1 : $()(t) && Number.isInteger(t), d = ({ includeProtocol: t } = {}) => (e) => {
|
|
1128
1164
|
if (s(e))
|
|
1129
1165
|
return !1;
|
|
1130
1166
|
if (t)
|
|
1131
1167
|
try {
|
|
1132
1168
|
const { host: r } = new URL(String(e));
|
|
1133
|
-
return
|
|
1169
|
+
return d({})(r);
|
|
1134
1170
|
} catch {
|
|
1135
1171
|
return !1;
|
|
1136
1172
|
}
|
|
1137
1173
|
return /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(:\d+)?$/.test(String(e));
|
|
1138
|
-
},
|
|
1174
|
+
}, p = ({ includeProtocol: t } = {}) => (e) => {
|
|
1139
1175
|
if (s(e))
|
|
1140
1176
|
return !1;
|
|
1141
1177
|
if (t)
|
|
1142
1178
|
try {
|
|
1143
1179
|
const { host: r } = new URL(String(e));
|
|
1144
|
-
return
|
|
1180
|
+
return p({})(r);
|
|
1145
1181
|
} catch {
|
|
1146
1182
|
return !1;
|
|
1147
1183
|
}
|
|
1148
1184
|
return /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/.test(String(e));
|
|
1149
|
-
}, pe = ({ includeProtocol: t } = {}) => (e) => s(e) ? !1 :
|
|
1185
|
+
}, pe = ({ includeProtocol: t } = {}) => (e) => s(e) ? !1 : d({ includeProtocol: t })(e) || p({ includeProtocol: t })(e), be = () => (t) => {
|
|
1150
1186
|
if (s(t))
|
|
1151
1187
|
return !1;
|
|
1152
1188
|
try {
|
|
@@ -1154,13 +1190,13 @@ const I = {
|
|
|
1154
1190
|
} catch {
|
|
1155
1191
|
return !1;
|
|
1156
1192
|
}
|
|
1157
|
-
}, Ae = () => (t) => s(t) ? !1 : String(t) === String(t).toLowerCase(), _ = ({ value: t }) => (e) => s(e) ? !1 : typeof e == "number" ? e < t : Array.isArray(e) ? e.every((r) => _({ value: t })(r)) : !1, Le = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? !t.every((r) => e.includes(r)) : !1, we = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? !t.some((r) => e.includes(r)) : !1, ve = ({ value: t }) => (e) => e !== t,
|
|
1193
|
+
}, Ae = () => (t) => s(t) ? !1 : String(t) === String(t).toLowerCase(), _ = ({ value: t }) => (e) => s(e) ? !1 : typeof e == "number" ? e < t : Array.isArray(e) ? e.every((r) => _({ value: t })(r)) : !1, Le = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? !t.every((r) => e.includes(r)) : !1, we = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? !t.some((r) => e.includes(r)) : !1, ve = ({ value: t }) => (e) => s(e) ? !1 : !T({ value: t })(e), Te = ({ value: t }) => (e) => e !== t, q = ({ values: t }) => (e) => s(e) ? !1 : !t.includes(e), Re = ({ value: t }) => (e) => s(e) ? !1 : !y({ value: t })(e), Se = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.some((r) => !t.includes(r)) : q({ values: t })(e), O = () => (t) => typeof t == "string", ze = () => (t) => s(t) ? !1 : O()(t) ? /^-?\d+(\.\d+)?$/.test(String(t)) : $()(t), je = () => (t) => typeof t == "object" && t !== null && !Array.isArray(t), G = ({ values: t }) => (e) => s(e) ? !1 : t.includes(e), Ce = ({ expression: t }) => (e) => {
|
|
1158
1194
|
if (s(e))
|
|
1159
1195
|
return !1;
|
|
1160
1196
|
if (!(t instanceof RegExp))
|
|
1161
1197
|
throw new TypeError("The expression provided is not a valid RegExp.");
|
|
1162
1198
|
return t.test(String(e));
|
|
1163
|
-
},
|
|
1199
|
+
}, Fe = () => (t) => !s(t), _e = ({ value: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.every((r) => r === t) : e === t, k = ({ size: t }) => (e) => s(e) ? !1 : typeof e == "number" ? e === t : Array.isArray(e) ? e.every((r) => k({ size: t })(r)) : !1, qe = ({ values: t }) => (e) => s(e) ? !1 : typeof e == "string" ? t.every((r) => e.includes(r)) : !1, Oe = ({ values: t }) => (e) => s(e) ? !1 : typeof e == "string" ? t.some((r) => e.includes(r)) : !1, x = ({ length: t }) => (e) => s(e) ? !1 : typeof e == "string" ? e.length === t : Array.isArray(e) ? e.every((r) => x({ length: t })(r)) : !1, b = ({ length: t }) => (e) => s(e) ? !1 : typeof e == "string" ? e.length >= t : Array.isArray(e) ? e.every((r) => b({ length: t })(r)) : !1, A = ({ length: t }) => (e) => s(e) ? !1 : typeof e == "string" ? e.length <= t : Array.isArray(e) ? e.every((r) => A({ length: t })(r)) : !1, Ge = ({ min: t, max: e }) => (r) => s(r) ? !1 : b({ length: t })(r) && A({ length: e })(r), B = ({ length: t }) => (e) => s(e) ? !1 : typeof e == "string" ? e.length > t : Array.isArray(e) ? e.every((r) => B({ length: t })(r)) : !1, W = ({ length: t }) => (e) => s(e) ? !1 : typeof e == "string" ? e.length < t : Array.isArray(e) ? e.every((r) => W({ length: t })(r)) : !1, ke = ({ values: t }) => (e) => s(e) ? !1 : typeof e == "string" ? !t.every((r) => e.includes(r)) : !1, xe = ({ values: t }) => (e) => s(e) ? !1 : typeof e == "string" ? !t.some((r) => e.includes(r)) : !1, Be = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.every((r) => t.includes(r)) : G({ values: t })(e), We = ({ values: t, ignored: e = [] }) => (r) => s(r) ? !1 : (Array.isArray(e) ? e : [e]).some((a) => a === r) ? !0 : !t.some((a) => a === r), Ee = () => (t) => s(t) ? !1 : String(t) === String(t).toUpperCase(), De = () => (t) => {
|
|
1164
1200
|
if (s(t))
|
|
1165
1201
|
return !1;
|
|
1166
1202
|
try {
|
|
@@ -1168,82 +1204,85 @@ const I = {
|
|
|
1168
1204
|
} catch {
|
|
1169
1205
|
return !1;
|
|
1170
1206
|
}
|
|
1171
|
-
},
|
|
1172
|
-
accepted:
|
|
1173
|
-
alpha:
|
|
1174
|
-
alphaDash:
|
|
1175
|
-
alphaDashDot:
|
|
1176
|
-
alphaNum:
|
|
1177
|
-
array:
|
|
1178
|
-
arrayLength:
|
|
1179
|
-
arrayLengthBetween:
|
|
1180
|
-
arrayLengthGt:
|
|
1181
|
-
arrayLengthGte:
|
|
1182
|
-
arrayLengthLt:
|
|
1183
|
-
arrayLengthLte:
|
|
1184
|
-
ascii:
|
|
1185
|
-
between:
|
|
1186
|
-
boolean:
|
|
1187
|
-
containsAll:
|
|
1188
|
-
containsAny:
|
|
1189
|
-
declined:
|
|
1190
|
-
different:
|
|
1191
|
-
distinct:
|
|
1192
|
-
domain:
|
|
1193
|
-
email:
|
|
1194
|
-
endsWith:
|
|
1207
|
+
}, Pe = {
|
|
1208
|
+
accepted: M,
|
|
1209
|
+
alpha: U,
|
|
1210
|
+
alphaDash: J,
|
|
1211
|
+
alphaDashDot: V,
|
|
1212
|
+
alphaNum: Q,
|
|
1213
|
+
array: X,
|
|
1214
|
+
arrayLength: Y,
|
|
1215
|
+
arrayLengthBetween: ee,
|
|
1216
|
+
arrayLengthGt: te,
|
|
1217
|
+
arrayLengthGte: w,
|
|
1218
|
+
arrayLengthLt: re,
|
|
1219
|
+
arrayLengthLte: v,
|
|
1220
|
+
ascii: ne,
|
|
1221
|
+
between: se,
|
|
1222
|
+
boolean: ae,
|
|
1223
|
+
containsAll: ie,
|
|
1224
|
+
containsAny: le,
|
|
1225
|
+
declined: oe,
|
|
1226
|
+
different: ue,
|
|
1227
|
+
distinct: he,
|
|
1228
|
+
domain: fe,
|
|
1229
|
+
email: ce,
|
|
1230
|
+
endsWith: T,
|
|
1195
1231
|
equals: me,
|
|
1196
|
-
file:
|
|
1197
|
-
fileSize:
|
|
1198
|
-
fileSizeBetween:
|
|
1199
|
-
fileSizeGt:
|
|
1232
|
+
file: ye,
|
|
1233
|
+
fileSize: R,
|
|
1234
|
+
fileSizeBetween: ge,
|
|
1235
|
+
fileSizeGt: S,
|
|
1200
1236
|
fileSizeGte: c,
|
|
1201
|
-
fileSizeLt:
|
|
1237
|
+
fileSizeLt: z,
|
|
1202
1238
|
fileSizeLte: m,
|
|
1203
|
-
gt:
|
|
1239
|
+
gt: j,
|
|
1204
1240
|
gte: h,
|
|
1205
|
-
http:
|
|
1241
|
+
http: C,
|
|
1206
1242
|
httpOrHttps: $e,
|
|
1207
|
-
https:
|
|
1243
|
+
https: F,
|
|
1208
1244
|
integer: de,
|
|
1209
1245
|
ip: pe,
|
|
1210
|
-
ipv4:
|
|
1211
|
-
ipv6:
|
|
1246
|
+
ipv4: d,
|
|
1247
|
+
ipv6: p,
|
|
1212
1248
|
json: be,
|
|
1213
1249
|
lowercase: Ae,
|
|
1214
1250
|
lt: _,
|
|
1215
1251
|
lte: f,
|
|
1216
1252
|
notContainsAll: Le,
|
|
1217
1253
|
notContainsAny: we,
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1254
|
+
notEndsWith: ve,
|
|
1255
|
+
notEquals: Te,
|
|
1256
|
+
notOneOf: q,
|
|
1257
|
+
notStartsWith: Re,
|
|
1258
|
+
notSubsetOf: Se,
|
|
1259
|
+
number: $,
|
|
1260
|
+
numeric: ze,
|
|
1261
|
+
object: je,
|
|
1262
|
+
oneOf: G,
|
|
1224
1263
|
protocol: g,
|
|
1225
|
-
regex:
|
|
1226
|
-
required:
|
|
1227
|
-
same:
|
|
1228
|
-
size:
|
|
1229
|
-
startsWith:
|
|
1264
|
+
regex: Ce,
|
|
1265
|
+
required: Fe,
|
|
1266
|
+
same: _e,
|
|
1267
|
+
size: k,
|
|
1268
|
+
startsWith: y,
|
|
1230
1269
|
string: O,
|
|
1231
1270
|
stringContainsAll: qe,
|
|
1232
|
-
stringContainsAny:
|
|
1233
|
-
stringLength:
|
|
1234
|
-
stringLengthBetween:
|
|
1235
|
-
stringLengthGt:
|
|
1236
|
-
stringLengthGte:
|
|
1237
|
-
stringLengthLt:
|
|
1238
|
-
stringLengthLte:
|
|
1239
|
-
stringNotContainsAll:
|
|
1240
|
-
stringNotContainsAny:
|
|
1241
|
-
subsetOf:
|
|
1242
|
-
unique:
|
|
1243
|
-
uppercase:
|
|
1244
|
-
url:
|
|
1271
|
+
stringContainsAny: Oe,
|
|
1272
|
+
stringLength: x,
|
|
1273
|
+
stringLengthBetween: Ge,
|
|
1274
|
+
stringLengthGt: B,
|
|
1275
|
+
stringLengthGte: b,
|
|
1276
|
+
stringLengthLt: W,
|
|
1277
|
+
stringLengthLte: A,
|
|
1278
|
+
stringNotContainsAll: ke,
|
|
1279
|
+
stringNotContainsAny: xe,
|
|
1280
|
+
subsetOf: Be,
|
|
1281
|
+
unique: We,
|
|
1282
|
+
uppercase: Ee,
|
|
1283
|
+
url: De
|
|
1245
1284
|
};
|
|
1246
|
-
class
|
|
1285
|
+
class Ie {
|
|
1247
1286
|
constructor({
|
|
1248
1287
|
fallbackLocale: e,
|
|
1249
1288
|
locale: r,
|
|
@@ -1253,7 +1292,7 @@ class Pe {
|
|
|
1253
1292
|
o(this, "fallbackLocale", "en");
|
|
1254
1293
|
o(this, "locales", {});
|
|
1255
1294
|
o(this, "rules", {});
|
|
1256
|
-
this.registerLocales(
|
|
1295
|
+
this.registerLocales(H), this.registerRules(Pe), e && this.setFallbackLocale(e), r && this.setLocale(r), a && a.forEach((l) => this.registerPlugin(l));
|
|
1257
1296
|
}
|
|
1258
1297
|
getLocale() {
|
|
1259
1298
|
return this.locale;
|
|
@@ -1272,7 +1311,7 @@ class Pe {
|
|
|
1272
1311
|
return this.fallbackLocale = e, this;
|
|
1273
1312
|
}
|
|
1274
1313
|
defineField(e) {
|
|
1275
|
-
return new
|
|
1314
|
+
return new I({
|
|
1276
1315
|
name: e,
|
|
1277
1316
|
locale: this.locale,
|
|
1278
1317
|
fallbackLocale: this.fallbackLocale,
|
|
@@ -1296,6 +1335,6 @@ class Pe {
|
|
|
1296
1335
|
}
|
|
1297
1336
|
}
|
|
1298
1337
|
export {
|
|
1299
|
-
|
|
1300
|
-
|
|
1338
|
+
I as FieldValidator,
|
|
1339
|
+
Ie as FormValidator
|
|
1301
1340
|
};
|
package/dist/index.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(h,o){typeof exports=="object"&&typeof module<"u"?o(exports):typeof define=="function"&&define.amd?define(["exports"],o):(h=typeof globalThis<"u"?globalThis:h||self,o(h.Fortress={}))})(this,function(h){"use strict";var Oe=Object.defineProperty;var _e=(h,o,n)=>o in h?Oe(h,o,{enumerable:!0,configurable:!0,writable:!0,value:n}):h[o]=n;var u=(h,o,n)=>(_e(h,typeof o!="symbol"?o+"":o,n),n);const o=t=>{const e=",、;:!?。()《》「」『』【】〔〕",r="\\x20-\\x7E",a=new RegExp(`\\s*([${e}])`,"gu"),l=new RegExp(`([${e}])\\s*([${r}])`,"gu"),f=new RegExp(`([^${r}${e}])([${r}])`,"gu"),Ce=new RegExp(`([${r}])([^${r}${e}])`,"gu");return t.replace(a,"$1").replace(l,"$1$2").replace(f,"$1 $2").replace(Ce,"$1 $2").replace(/ +/g," ")},n=(t,e=0)=>new Intl.NumberFormat(void 0,{minimumFractionDigits:e,maximumFractionDigits:e}).format(t),N=t=>Object.prototype.toString.call(t).toLowerCase().slice(8,-1),s=t=>t==null||t===""||Array.isArray(t)&&t.length<1,i=t=>`"${t}"`;class T{constructor({name:e,locale:r,fallbackLocale:a,locales:l,rules:f}){u(this,"name");u(this,"locale");u(this,"fallbackLocale");u(this,"locales");u(this,"rules");u(this,"ruleFunctions",{});u(this,"conditions",{});u(this,"shouldSkip",!1);u(this,"appliedProtocols",{});this.name=e,this.locale=r,this.fallbackLocale=a,this.locales=l,this.rules=f}get formattedName(){return this.name.toLowerCase()}get messages(){return this.locales[this.locale]||{}}get fallbackMessages(){return this.locales[this.fallbackLocale]||{}}get mandatoryRules(){return[this.required.name,this.string.name,this.array.name,this.equals.name,this.notEquals.name]}getMessage(e){return this.messages[e]||this.fallbackMessages[e]||(r=>`The ${r} field is invalid.`)}getRule(e){if(!(e in this.rules))throw new Error(`The "${e}" rule is not registered.`);return this.rules[e]}buildRuleFunction(e,r){return a=>{if(s(a)&&!this.mandatoryRules.includes(e))return!0;const l=this.getRule(e)(r)(a);return typeof l=="string"?l:l===!0?!0:this.buildRuleFunctionMessage(e,r,a)}}buildRuleFunctionMessage(e,r,a){const l=this.getMessage(e)(this.formattedName,r);if(typeof l=="object"){const f=N(a);if(!(f in l))throw new Error(`The message for the "${e}" rule of the "${f}" type is missing.`);return o(l[f])}return o(l)}pushRuleFunction(e,r){if(e in this.conditions&&!this.conditions[e])return this;const a=this.buildRuleFunction(e,r);return this.ruleFunctions[e]=a,this}getRuleFunctions(){return Object.values(this.ruleFunctions)}collect(){return this.shouldSkip?[]:this.getRuleFunctions()}validate(e){if(this.shouldSkip)return!0;const r=this.getRuleFunctions();for(const a of r){const l=a(e);if(typeof l=="string")return l}return!0}apply(e,r={}){return this.pushRuleFunction(e,r)}accepted(){return this.apply(this.accepted.name)}after(e,r,a,l=!0){return this.apply(this.after.name,{date:e,format:r,displayFormat:a,strict:l})}alpha(){return this.apply(this.alpha.name)}alphaDash(){return this.apply(this.alphaDash.name)}alphaDashDot(){return this.apply(this.alphaDashDot.name)}alphaNum(){return this.apply(this.alphaNum.name)}array(){return this.apply(this.array.name)}arrayLength(e){return this.apply(this.arrayLength.name,{length:e})}arrayLengthBetween(e,r){return this.apply(this.arrayLengthBetween.name,{min:e,max:r})}arrayLengthGt(e){return this.apply(this.arrayLengthGt.name,{length:e})}arrayLengthGte(e){return this.apply(this.arrayLengthGte.name,{length:e})}arrayLengthLt(e){return this.apply(this.arrayLengthLt.name,{length:e})}arrayLengthLte(e){return this.apply(this.arrayLengthLte.name,{length:e})}ascii(){return this.apply(this.ascii.name)}before(e,r,a,l=!0){return this.apply(this.before.name,{date:e,format:r,displayFormat:a,strict:l})}between(e,r){return this.apply(this.between.name,{min:e,max:r})}boolean(){return this.apply(this.boolean.name)}containsAll(e){return this.apply(this.containsAll.name,{values:e})}containsAny(e){return this.apply(this.containsAny.name,{values:e})}date(e,r=!0){return this.apply(this.date.name,{format:e,strict:r})}declined(){return this.apply(this.declined.name)}different(e,r){return this.apply(this.different.name,{field:e,value:r})}distinct(){return this.apply(this.distinct.name)}domain(){return this.apply(this.domain.name)}email(){return this.apply(this.email.name)}endsWith(e){return this.apply(this.endsWith.name,{value:e})}equals(e){return this.apply(this.equals.name,{value:e})}file(){return this.apply(this.file.name)}fileSize(e){return this.apply(this.fileSize.name,{size:e})}fileSizeBetween(e,r){return this.apply(this.fileSizeBetween.name,{min:e,max:r})}fileSizeGt(e){return this.apply(this.fileSizeGt.name,{size:e})}fileSizeGte(e){return this.apply(this.fileSizeGte.name,{size:e})}fileSizeLt(e){return this.apply(this.fileSizeLt.name,{size:e})}fileSizeLte(e){return this.apply(this.fileSizeLte.name,{size:e})}gt(e){return this.apply(this.gt.name,{value:e})}gte(e){return this.apply(this.gte.name,{value:e})}http(){return this.appliedProtocols[this.http.name]=!0,this.apply(this.http.name)}httpOrHttps(){return this.appliedProtocols[this.http.name]=!0,this.appliedProtocols[this.https.name]=!0,this.apply(this.httpOrHttps.name)}https(){return this.appliedProtocols[this.https.name]=!0,this.apply(this.https.name)}integer(){return this.apply(this.integer.name)}ip(){const e=Object.keys(this.appliedProtocols).length>0;return this.apply(this.ip.name,{includeProtocol:e})}ipv4(){const e=Object.keys(this.appliedProtocols).length>0;return this.apply(this.ipv4.name,{includeProtocol:e})}ipv6(){const e=Object.keys(this.appliedProtocols).length>0;return this.apply(this.ipv6.name,{includeProtocol:e})}iso8601(){return this.apply(this.iso8601.name)}json(){return this.apply(this.json.name)}jsonSchema(e){return this.apply(this.jsonSchema.name,{schema:e,locale:this.locale,field:this.name})}lowercase(){return this.apply(this.lowercase.name)}lt(e){return this.apply(this.lt.name,{value:e})}lte(e){return this.apply(this.lte.name,{value:e})}notContainsAll(e){return this.apply(this.notContainsAll.name,{values:e})}notContainsAny(e){return this.apply(this.notContainsAny.name,{values:e})}notEquals(e){return this.apply(this.notEquals.name,{value:e})}notOneOf(e){return this.apply(this.notOneOf.name,{values:e})}notSubsetOf(e){return this.apply(this.notSubsetOf.name,{values:e})}number(){return this.apply(this.number.name)}numeric(){return this.apply(this.numeric.name)}oneOf(e){return this.apply(this.oneOf.name,{values:e})}protocol(e){const r=Array.isArray(e)?e:[e];return r.forEach(a=>this.appliedProtocols[a]=!0),this.apply(this.protocol.name,{values:r})}regex(e){return this.apply(this.regex.name,{expression:e})}required(){return this.apply(this.required.name)}requiredWhen(e){return this.when({required:e}).required()}same(e,r){return this.apply(this.same.name,{field:e,value:r})}size(e){return this.apply(this.size.name,{size:e})}startsWith(e){return this.apply(this.startsWith.name,{value:e})}string(){return this.apply(this.string.name)}stringContainsAll(e){return this.apply(this.stringContainsAll.name,{values:e})}stringContainsAny(e){return this.apply(this.stringContainsAny.name,{values:e})}stringLength(e){return this.apply(this.stringLength.name,{length:e})}stringLengthBetween(e,r){return this.apply(this.stringLengthBetween.name,{min:e,max:r})}stringLengthGt(e){return this.apply(this.stringLengthGt.name,{length:e})}stringLengthGte(e){return this.apply(this.stringLengthGte.name,{length:e})}stringLengthLt(e){return this.apply(this.stringLengthLt.name,{length:e})}stringLengthLte(e){return this.apply(this.stringLengthLte.name,{length:e})}stringNotContainsAll(e){return this.apply(this.stringNotContainsAll.name,{values:e})}stringNotContainsAny(e){return this.apply(this.stringNotContainsAny.name,{values:e})}subsetOf(e){return this.apply(this.subsetOf.name,{values:e})}unique(e,r=[]){return this.apply(this.unique.name,{values:e,ignored:r})}uppercase(){return this.apply(this.uppercase.name)}url(){return this.apply(this.url.name)}when(e){return typeof e=="object"?(this.conditions=e,this):(e||(this.shouldSkip=!0),this)}}const P={en:{accepted:t=>`The ${t} field must be accepted.`,alpha:t=>`The ${t} field must only contain letters.`,alphaDash:t=>`The ${t} field must only contain letters, numbers, dashes and underscores.`,alphaDashDot:t=>`The ${t} field must only contain letters, numbers, dashes, underscores and dots.`,alphaNum:t=>`The ${t} field must only contain letters and numbers.`,array:t=>`The ${t} field must be an array.`,arrayLength:(t,e)=>{const{length:r}=e;return`The ${t} field must be ${n(r)} items.`},arrayLengthBetween:(t,e)=>{const{min:r,max:a}=e;return`The ${t} field must be between ${n(r)} and ${n(a)} items.`},arrayLengthGt:(t,e)=>{const{length:r}=e;return`The ${t} field must be greater than ${n(r)} items.`},arrayLengthGte:(t,e)=>{const{length:r}=e;return`The ${t} field must be greater than or equal to ${n(r)} items.`},arrayLengthLte:(t,e)=>{const{length:r}=e;return`The ${t} field must be less than or equal to ${n(r)} items.`},arrayLengthLt:(t,e)=>{const{length:r}=e;return`The ${t} field must be less than ${n(r)} items.`},ascii:t=>`The ${t} field must only contain ASCII characters and symbols.`,between:(t,e)=>{const{min:r,max:a}=e;return{number:`The ${t} field must be between ${n(r)} and ${n(a)}.`,array:`The ${t} field must contain items where each item is between ${n(r)} and ${n(a)}.`}},boolean:t=>`The ${t} field must be a boolean value.`,containsAll:(t,e)=>{const{values:r}=e;return`The ${t} field must contain all of the following values: ${r.map(i).join(", ")}.`},containsAny:(t,e)=>{const{values:r}=e;return`The ${t} field must contain at least one of the following values: ${r.map(i).join(", ")}.`},declined:t=>`The ${t} field must be declined.`,different:(t,e)=>{const{field:r}=e;return`The ${t} and ${r} fields must be different.`},distinct:t=>`The ${t} field must not contain duplicate values.`,domain:t=>`The ${t} field must be a valid domain.`,email:t=>`The ${t} field must be a valid email address.`,endsWith:(t,e)=>{const{value:r}=e;return`The ${t} field must end with ${r}.`},equals:(t,e)=>{const{value:r}=e;return`The ${t} field must be equal to ${r}.`},file:t=>`The ${t} field must be a file.`,fileSizeBetween:(t,e)=>{const{min:r,max:a}=e;return{file:`The ${t} field must be between ${n(r)} and ${n(a)} kilobytes.`,array:`The ${t} field must contain items where each item is between ${n(r)} and ${n(a)} kilobytes.`}},fileSizeGt:(t,e)=>{const{size:r}=e;return{file:`The ${t} field must be greater than ${n(r)} kilobytes.`,array:`The ${t} field must contain items where each item is greater than ${n(r)} kilobytes.`}},fileSizeGte:(t,e)=>{const{size:r}=e;return{file:`The ${t} field must be greater than or equal to ${n(r)} kilobytes.`,array:`The ${t} field must contain items where each item is greater than or equal to ${n(r)} kilobytes.`}},fileSizeLt:(t,e)=>{const{size:r}=e;return{file:`The ${t} field must be less than ${n(r)} kilobytes.`,array:`The ${t} field must contain items where each item is less than ${n(r)} kilobytes.`}},fileSizeLte:(t,e)=>{const{size:r}=e;return{file:`The ${t} field must be less than or equal to ${n(r)} kilobytes.`,array:`The ${t} field must contain items where each item is less than or equal to ${n(r)} kilobytes.`}},fileSize:(t,e)=>{const{size:r}=e;return{file:`The ${t} field must be ${n(r)} kilobytes.`,array:`The ${t} field must contain items where each item is ${n(r)} kilobytes.`}},http:t=>`The ${t} field must start with the "http://" protocol.`,httpOrHttps:t=>`The ${t} field must start with the "http://" or "https://" protocols.`,https:t=>`The ${t} field must start with the "https://" protocol.`,integer:t=>`The ${t} field must be an integer.`,ip:t=>`The ${t} field must be a valid IP address.`,ipv4:t=>`The ${t} field must be a valid IPv4 address.`,ipv6:t=>`The ${t} field must be a valid IPv6 address.`,json:t=>`The ${t} field must be a valid JSON string.`,lowercase:t=>`The ${t} field must be lowercase.`,lt:(t,e)=>{const{value:r}=e;return{number:`The ${t} field must be less than ${n(r)}.`,array:`The ${t} field must contain items where each item is less than ${n(r)}.`}},lte:(t,e)=>{const{value:r}=e;return{number:`The ${t} field must be less than or equal to ${n(r)}.`,array:`The ${t} field must contain items where each item is less than or equal to ${n(r)}.`}},gt:(t,e)=>{const{value:r}=e;return{number:`The ${t} field must be greater than ${n(r)}.`,array:`The ${t} field must contain items where each item is greater than ${n(r)}.`}},gte:(t,e)=>{const{value:r}=e;return{number:`The ${t} field must be greater than or equal to ${n(r)}.`,array:`The ${t} field must contain items where each item is greater than or equal to ${n(r)}.`}},notContainsAll:(t,e)=>{const{values:r}=e;return`The ${t} field must not contain all of the following values together: ${r.map(i).join(", ")}.`},notContainsAny:(t,e)=>{const{values:r}=e;return`The ${t} field must not contain any of the following values: ${r.map(i).join(", ")}.`},notEquals:(t,e)=>{const{value:r}=e;return`The ${t} field must not be equal to ${r}.`},notOneOf:(t,e)=>{const{values:r}=e;return`The ${t} field must not be one of the following values: ${r.map(i).join(", ")}.`},notSubsetOf:(t,e)=>{const{values:r}=e;return`The ${t} field must not be a subset of the following values: ${r.map(i).join(", ")}.`},number:t=>`The ${t} field must be a number.`,numeric:t=>`The ${t} field must be a number.`,oneOf:(t,e)=>{const{values:r}=e;return`The ${t} field must be one of the following values: ${r.map(i).join(", ")}.`},protocol:(t,e)=>{const{values:r}=e;if(r.length===1){const[a]=r;return`The ${t} field must start with the "${a}://" protocol.`}return`The ${t} field must start with one of the following protocols: ${r.map(a=>`${a}://`).map(i).join(", ")}.`},regex:t=>`The ${t} field must match the required format.`,required:t=>`The ${t} field is required.`,same:(t,e)=>{const{field:r}=e;return`The ${t} and ${r} fields must match.`},size:(t,e)=>{const{size:r}=e;return{number:`The ${t} field must be ${n(r)}.`,array:`The ${t} field must contain items where each item is ${n(r)}.`}},startsWith:(t,e)=>{const{value:r}=e;return`The ${t} field must start with ${r}.`},string:t=>`The ${t} field must be a string.`,stringContainsAll:(t,e)=>{const{values:r}=e;return`The ${t} field must contain all of the following text: ${r.map(i).join(", ")}.`},stringContainsAny:(t,e)=>{const{values:r}=e;return`The ${t} field must contain at least one of the following text: ${r.map(i).join(", ")}.`},stringLength:(t,e)=>{const{length:r}=e;return{string:`The ${t} field must be ${n(r)} characters.`,array:`The ${t} field must contain items where each item is ${n(r)} characters.`}},stringLengthBetween:(t,e)=>{const{min:r,max:a}=e;return{string:`The ${t} field must be between ${n(r)} and ${n(a)} characters.`,array:`The ${t} field must contain items where each item is between ${n(r)} and ${n(a)} characters.`}},stringLengthGt:(t,e)=>{const{length:r}=e;return{string:`The ${t} field must be greater than ${n(r)} characters.`,array:`The ${t} field must contain items where each item is greater than ${n(r)} characters.`}},stringLengthGte:(t,e)=>{const{length:r}=e;return{string:`The ${t} field must be greater than or equal to ${n(r)} characters.`,array:`The ${t} field must contain items where each item is greater than or equal to ${n(r)} characters.`}},stringLengthLt:(t,e)=>{const{length:r}=e;return{string:`The ${t} field must be less than ${n(r)} characters.`,array:`The ${t} field must contain items where each item is less than ${n(r)} characters.`}},stringLengthLte:(t,e)=>{const{length:r}=e;return{string:`The ${t} field must be less than or equal to ${n(r)} characters.`,array:`The ${t} field must contain items where each item is less than or equal to ${n(r)} characters.`}},stringNotContainsAll:(t,e)=>{const{values:r}=e;return`The ${t} field must not contain all of the following text together: ${r.map(i).join(", ")}.`},stringNotContainsAny:(t,e)=>{const{values:r}=e;return`The ${t} field must not contain any of the following text: ${r.map(i).join(", ")}.`},subsetOf:(t,e)=>{const{values:r}=e;return`The ${t} field must be a subset of the following values: ${r.map(i).join(", ")}.`},unique:t=>`The ${t} field has already been taken.`,uppercase:t=>`The ${t} field must be uppercase.`,url:t=>`The ${t} field must be a valid URL.`},"zh-TW":{accepted:()=>"此欄位必須被同意",alpha:()=>"此欄位只能包含字母",alphaDash:()=>"此欄位只能包含字母、數字、連接號和底線",alphaDashDot:()=>"此欄位只能包含字母、數字、連接號、底線和點",alphaNum:()=>"此欄位只能包含字母和數字",array:()=>"此欄位必須是一個陣列",arrayLength:(t,e)=>{const{length:r}=e;return`此欄位必須是${n(r)}個項目`},arrayLengthBetween:(t,e)=>{const{min:r,max:a}=e;return`此欄位必須介於${n(r)}到${n(a)}個項目之間`},arrayLengthGt:(t,e)=>{const{length:r}=e;return`此欄位必須大於${n(r)}個項目`},arrayLengthGte:(t,e)=>{const{length:r}=e;return`此欄位必須大於或等於${n(r)}個項目`},arrayLengthLt:(t,e)=>{const{length:r}=e;return`此欄位必須小於${n(r)}個項目`},arrayLengthLte:(t,e)=>{const{length:r}=e;return`此欄位必須小於或等於${n(r)}個項目`},ascii:()=>"此欄位只能包含 ASCII 字元和符號",between:(t,e)=>{const{min:r,max:a}=e;return{number:`此欄位必須介於${n(r)}到${n(a)}`,array:`此欄位中的每個項目都必須介於${n(r)}到${n(a)}`}},boolean:()=>"此欄位必須是一個布林值",containsAll:(t,e)=>{const{values:r}=e;return`此欄位必須包含以下所有項目:${r.map(i).join(", ")}`},containsAny:(t,e)=>{const{values:r}=e;return`此欄位必須包含以下其中一個項目:${r.map(i).join(", ")}`},declined:()=>"此欄位必須被拒絕",different:(t,e)=>{const{field:r}=e;return`此欄位必須和${r}欄位不同`},distinct:()=>"此欄位不能包含重複的值",domain:()=>"此欄位必須是有效的網域",email:()=>"此欄位必須是有效的電子郵件地址",endsWith:(t,e)=>{const{value:r}=e;return`此欄位必須以${r}結尾`},equals:(t,e)=>{const{value:r}=e;return`此欄位必須是${r}`},file:()=>"此欄位必須是檔案",fileSize:(t,e)=>{const{size:r}=e;return{file:`此欄位必須是${n(r)} KB`,array:`此欄位中的每個項目都必須是${n(r)} KB`}},fileSizeBetween:(t,e)=>{const{min:r,max:a}=e;return{file:`此欄位必須介於${n(r)}到${n(a)} KB 之間`,array:`此欄位中的每個項目都必須介於${n(r)}到${n(a)} KB 之間`}},fileSizeGt:(t,e)=>{const{size:r}=e;return{file:`此欄位必須大於${n(r)} KB`,array:`此欄位中的每個項目都必須大於${n(r)} KB`}},fileSizeGte:(t,e)=>{const{size:r}=e;return{file:`此欄位必須大於或等於${n(r)} KB`,array:`此欄位中的每個項目都必須大於或等於${n(r)} KB`}},fileSizeLt:(t,e)=>{const{size:r}=e;return{file:`此欄位必須小於${n(r)} KB`,array:`此欄位中的每個項目都必須小於${n(r)} KB`}},fileSizeLte:(t,e)=>{const{size:r}=e;return{file:`此欄位必須小於或等於${n(r)} KB`,array:`此欄位中的每個項目都必須小於或等於${n(r)} KB`}},gt:(t,e)=>{const{value:r}=e;return{number:`此欄位必須大於${n(r)}`,array:`此欄位中的每個項目都必須大於${n(r)}`}},gte:(t,e)=>{const{value:r}=e;return{number:`此欄位必須大於或等於${n(r)}`,array:`此欄位中的每個項目都必須大於或等於${n(r)}`}},http:()=>'此欄位必須以 "http://" 協議開頭',httpOrHttps:()=>'此欄位必須以 "http://" 或 "https://" 協議開頭',https:()=>'此欄位必須以 "https://" 協議開頭',integer:()=>"此欄位必須是整數",ip:()=>"此欄位必須是有效的 IP 位址",ipv4:()=>"此欄位必須是有效的 IPv4 位址",ipv6:()=>"此欄位必須是有效的 IPv6 位址",json:()=>"此欄位必須是有效的 JSON 字串",lowercase:()=>"此欄位必須是小寫",lt:(t,e)=>{const{value:r}=e;return{number:`此欄位必須小於${n(r)}`,array:`此欄位中的每個項目都必須小於${n(r)}`}},lte:(t,e)=>{const{value:r}=e;return{number:`此欄位必須小於或等於${n(r)}`,array:`此欄位中的每個項目都必須小於或等於${n(r)}`}},notContainsAll:(t,e)=>{const{values:r}=e;return`此欄位不能同時包含以下所有值:${r.map(i).join(", ")}`},notContainsAny:(t,e)=>{const{values:r}=e;return`此欄位不能包含以下任何值:${r.map(i).join(", ")}`},notEquals:(t,e)=>{const{value:r}=e;return`此欄位不能是${r}`},notOneOf:(t,e)=>{const{values:r}=e;return`此欄位不能是以下任何值:${r.map(i).join(", ")}`},notSubsetOf:(t,e)=>{const{values:r}=e;return`此欄位不能是以下項目的子集:${r.map(i).join(", ")}`},number:()=>"此欄位必須是數字",numeric:()=>"此欄位必須是數字",oneOf:(t,e)=>{const{values:r}=e;return`此欄位必須是以下其中一個值:${r.map(i).join(", ")}`},protocol:(t,e)=>{const{values:r}=e;if(r.length===1){const[a]=r;return`此欄位必須以 "${a}://" 協議開頭`}return`此欄位必須以以下其中一個協議開頭:${r.map(a=>`${a}://`).map(i).join(", ")}`},regex:()=>"此欄位必須符合所需的格式",required:()=>"此欄位為必填",same:(t,e)=>{const{field:r}=e;return`此欄位必須與${r}欄位相同`},size:(t,e)=>{const{size:r}=e;return{number:`此欄位必須是${n(r)}`,array:`此欄位中的每個項目都必須是${n(r)}`}},startsWith:(t,e)=>{const{value:r}=e;return`此欄位必須以${r}開頭`},string:()=>"此欄位必須是字串",stringContainsAll:(t,e)=>{const{values:r}=e;return`此欄位必須包含以下所有文字:${r.map(i).join(", ")}`},stringContainsAny:(t,e)=>{const{values:r}=e;return`此欄位必須包含以下其中一個文字:${r.map(i).join(", ")}`},stringLength:(t,e)=>{const{length:r}=e;return{string:`此欄位必須是${n(r)}個字元`,array:`此欄位中的每個項目都必須是${n(r)}個字元`}},stringLengthBetween:(t,e)=>{const{min:r,max:a}=e;return{string:`此欄位必須介於${n(r)}到${n(a)}個字元之間`,array:`此欄位中的每個項目都必須介於${n(r)}到${n(a)}個字元之間`}},stringLengthGt:(t,e)=>{const{length:r}=e;return{string:`此欄位必須大於${n(r)}個字元`,array:`此欄位中的每個項目都必須大於${n(r)}個字元`}},stringLengthGte:(t,e)=>{const{length:r}=e;return{string:`此欄位必須大於或等於${n(r)}個字元`,array:`此欄位中的每個項目都必須大於或等於${n(r)}個字元`}},stringLengthLt:(t,e)=>{const{length:r}=e;return{string:`此欄位必須小於${n(r)}個字元`,array:`此欄位中的每個項目都必須小於${n(r)}個字元`}},stringLengthLte:(t,e)=>{const{length:r}=e;return{string:`此欄位必須小於或等於${n(r)}個字元`,array:`此欄位中的每個項目都必須小於或等於${n(r)}個字元`}},stringNotContainsAll:(t,e)=>{const{values:r}=e;return`此欄位不能同時包含以下所有文字:${r.map(i).join(", ")}`},stringNotContainsAny:(t,e)=>{const{values:r}=e;return`此欄位不能包含以下任何文字:${r.map(i).join(", ")}`},subsetOf:(t,e)=>{const{values:r}=e;return`此欄位必須是以下項目的子集:${r.map(i).join(", ")}`},unique:()=>"此欄位已經存在",uppercase:()=>"此欄位必須是大寫",url:()=>"此欄位必須是有效的 URL"}},W=()=>t=>s(t)?!1:["y","yes","on","1","true"].includes(String(t).toLowerCase()),I=()=>t=>s(t)?!1:/^[a-zA-Z]+$/.test(String(t)),K=()=>t=>s(t)?!1:/^[a-zA-Z0-9-_]+$/.test(String(t)),Z=()=>t=>s(t)?!1:/^[a-zA-Z0-9-_.]+$/.test(String(t)),M=()=>t=>s(t)?!1:/^[a-zA-Z0-9]+$/.test(String(t)),H=()=>t=>Array.isArray(t),U=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length===t:!1,w=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length>=t:!1,v=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length<=t:!1,V=({min:t,max:e})=>r=>s(r)?!1:w({length:t})(r)&&v({length:e})(r),J=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length>t:!1,Q=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length<t:!1,X=()=>t=>s(t)?!1:/^[\x20-\x7E]+$/.test(String(t)),c=({value:t})=>e=>s(e)?!1:typeof e=="number"?e>=t:Array.isArray(e)?e.every(r=>c({value:t})(r)):!1,m=({value:t})=>e=>s(e)?!1:typeof e=="number"?e<=t:Array.isArray(e)?e.every(r=>m({value:t})(r)):!1,Y=({min:t,max:e})=>r=>s(r)?!1:c({value:t})(r)&&m({value:e})(r),ee=()=>t=>s(t)?!1:typeof t=="boolean",te=({values:t})=>e=>s(e)?!1:Array.isArray(e)?t.every(r=>e.includes(r)):!1,re=({values:t})=>e=>s(e)?!1:Array.isArray(e)?t.some(r=>e.includes(r)):!1,ne=()=>t=>s(t)?!1:["n","no","off","0","false"].includes(String(t).toLowerCase()),se=({value:t})=>e=>s(e)?!1:e!==t,ae=()=>t=>s(t)?!1:Array.isArray(t)?new Set(t).size===t.length:!0,ie=()=>t=>s(t)?!1:/^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(String(t)),le=()=>t=>s(t)?!1:/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(String(t)),oe=({value:t})=>e=>s(e)?!1:String(e).endsWith(t),ue=({value:t})=>e=>e===t,he=()=>t=>t instanceof File,R=({size:t})=>e=>{if(s(e))return!1;if(e instanceof File){const r=t*1024,a=(t+1)*1024;return e.size>=r&&e.size<a}return Array.isArray(e)?e.every(r=>R({size:t})(r)):!1},y=({size:t})=>e=>s(e)?!1:e instanceof File?e.size>=t*1024:Array.isArray(e)?e.every(r=>y({size:t})(r)):!1,g=({size:t})=>e=>s(e)?!1:e instanceof File?e.size<=t*1024:Array.isArray(e)?e.every(r=>g({size:t})(r)):!1,fe=({min:t,max:e})=>r=>s(r)?!1:y({size:t})(r)&&g({size:e})(r),S=({size:t})=>e=>s(e)?!1:e instanceof File?e.size>t*1024:Array.isArray(e)?e.every(r=>S({size:t})(r)):!1,z=({size:t})=>e=>s(e)?!1:e instanceof File?e.size<t*1024:Array.isArray(e)?e.every(r=>z({size:t})(r)):!1,F=({value:t})=>e=>s(e)?!1:typeof e=="number"?e>t:Array.isArray(e)?e.every(r=>F({value:t})(r)):!1,q=({value:t})=>e=>s(e)?!1:String(e).startsWith(t),$=({values:t})=>e=>s(e)?!1:t.map(r=>`${r}://`).some(r=>q({value:r})(e)),C=()=>t=>s(t)?!1:$({values:["http"]})(t),O=()=>t=>s(t)?!1:$({values:["https"]})(t),ce=()=>t=>s(t)?!1:C()(t)||O()(t),d=()=>t=>s(t)?!1:typeof t=="number",me=()=>t=>s(t)?!1:d()(t)&&Number.isInteger(t),p=({includeProtocol:t}={})=>e=>{if(s(e))return!1;if(t)try{const{host:r}=new URL(String(e));return p({})(r)}catch{return!1}return/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(:\d+)?$/.test(String(e))},b=({includeProtocol:t}={})=>e=>{if(s(e))return!1;if(t)try{const{host:r}=new URL(String(e));return b({})(r)}catch{return!1}return/(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/.test(String(e))},ye=({includeProtocol:t}={})=>e=>s(e)?!1:p({includeProtocol:t})(e)||b({includeProtocol:t})(e),ge=()=>t=>{if(s(t))return!1;try{return JSON.parse(String(t)),!0}catch{return!1}},$e=()=>t=>s(t)?!1:String(t)===String(t).toLowerCase(),_=({value:t})=>e=>s(e)?!1:typeof e=="number"?e<t:Array.isArray(e)?e.every(r=>_({value:t})(r)):!1,de=({values:t})=>e=>s(e)?!1:Array.isArray(e)?!t.every(r=>e.includes(r)):!1,pe=({values:t})=>e=>s(e)?!1:Array.isArray(e)?!t.some(r=>e.includes(r)):!1,be=({value:t})=>e=>e!==t,j=({values:t})=>e=>s(e)?!1:!t.includes(e),Ae=({values:t})=>e=>s(e)?!1:Array.isArray(e)?e.some(r=>!t.includes(r)):j({values:t})(e),G=()=>t=>typeof t=="string",Le=()=>t=>s(t)?!1:G()(t)?/^-?\d+(\.\d+)?$/.test(String(t)):d()(t),k=({values:t})=>e=>s(e)?!1:t.includes(e),Te=({expression:t})=>e=>{if(s(e))return!1;if(!(t instanceof RegExp))throw new TypeError("The expression provided is not a valid RegExp.");return t.test(String(e))},we=()=>t=>!s(t),ve=({value:t})=>e=>s(e)?!1:Array.isArray(e)?e.every(r=>r===t):e===t,x=({size:t})=>e=>s(e)?!1:typeof e=="number"?e===t:Array.isArray(e)?e.every(r=>x({size:t})(r)):!1,Re=({values:t})=>e=>s(e)?!1:typeof e=="string"?t.every(r=>e.includes(r)):!1,Se=({values:t})=>e=>s(e)?!1:typeof e=="string"?t.some(r=>e.includes(r)):!1,B=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length===t:Array.isArray(e)?e.every(r=>B({length:t})(r)):!1,A=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length>=t:Array.isArray(e)?e.every(r=>A({length:t})(r)):!1,L=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length<=t:Array.isArray(e)?e.every(r=>L({length:t})(r)):!1,ze=({min:t,max:e})=>r=>s(r)?!1:A({length:t})(r)&&L({length:e})(r),E=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length>t:Array.isArray(e)?e.every(r=>E({length:t})(r)):!1,D=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length<t:Array.isArray(e)?e.every(r=>D({length:t})(r)):!1,Fe={accepted:W,alpha:I,alphaDash:K,alphaDashDot:Z,alphaNum:M,array:H,arrayLength:U,arrayLengthBetween:V,arrayLengthGt:J,arrayLengthGte:w,arrayLengthLt:Q,arrayLengthLte:v,ascii:X,between:Y,boolean:ee,containsAll:te,containsAny:re,declined:ne,different:se,distinct:ae,domain:ie,email:le,endsWith:oe,equals:ue,file:he,fileSize:R,fileSizeBetween:fe,fileSizeGt:S,fileSizeGte:y,fileSizeLt:z,fileSizeLte:g,gt:F,gte:c,http:C,httpOrHttps:ce,https:O,integer:me,ip:ye,ipv4:p,ipv6:b,json:ge,lowercase:$e,lt:_,lte:m,notContainsAll:de,notContainsAny:pe,notEquals:be,notOneOf:j,notSubsetOf:Ae,number:d,numeric:Le,oneOf:k,protocol:$,regex:Te,required:we,same:ve,size:x,startsWith:q,string:G,stringContainsAll:Re,stringContainsAny:Se,stringLength:B,stringLengthBetween:ze,stringLengthGt:E,stringLengthGte:A,stringLengthLt:D,stringLengthLte:L,stringNotContainsAll:({values:t})=>e=>s(e)?!1:typeof e=="string"?!t.every(r=>e.includes(r)):!1,stringNotContainsAny:({values:t})=>e=>s(e)?!1:typeof e=="string"?!t.some(r=>e.includes(r)):!1,subsetOf:({values:t})=>e=>s(e)?!1:Array.isArray(e)?e.every(r=>t.includes(r)):k({values:t})(e),unique:({values:t,ignored:e=[]})=>r=>s(r)?!1:(Array.isArray(e)?e:[e]).some(a=>a===r)?!0:!t.some(a=>a===r),uppercase:()=>t=>s(t)?!1:String(t)===String(t).toUpperCase(),url:()=>t=>{if(s(t))return!1;try{return new URL(String(t)),!0}catch{return!1}}};class qe{constructor({fallbackLocale:e,locale:r,plugins:a}={}){u(this,"locale","en");u(this,"fallbackLocale","en");u(this,"locales",{});u(this,"rules",{});this.registerLocales(P),this.registerRules(Fe),e&&this.setFallbackLocale(e),r&&this.setLocale(r),a&&a.forEach(l=>this.registerPlugin(l))}getLocale(){return this.locale}getFallbackLocale(){return this.fallbackLocale}setLocale(e){if(!(e in this.locales))throw new Error(`The "${e}" locale is not registered.`);return this.locale=e,this}setFallbackLocale(e){if(!(e in this.locales))throw new Error(`The "${e}" fallback locale is not registered.`);return this.fallbackLocale=e,this}defineField(e){return new T({name:e,locale:this.locale,fallbackLocale:this.fallbackLocale,locales:this.locales,rules:this.rules})}registerLocales(e){return this.locales=Object.keys(e).reduce((r,a)=>(r[a]={...this.locales[a],...e[a]},r),{...this.locales}),this}registerRules(e){return this.rules={...this.rules,...e},this}registerPlugin(e){if(!e||!e.locales||!e.rules)throw new Error('The plugin must have "locales" and "rules" properties.');return this.registerLocales(e.locales).registerRules(e.rules)}}h.FieldValidator=T,h.FormValidator=qe,Object.defineProperty(h,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
(function(h,o){typeof exports=="object"&&typeof module<"u"?o(exports):typeof define=="function"&&define.amd?define(["exports"],o):(h=typeof globalThis<"u"?globalThis:h||self,o(h.Fortress={}))})(this,function(h){"use strict";var Ge=Object.defineProperty;var ke=(h,o,n)=>o in h?Ge(h,o,{enumerable:!0,configurable:!0,writable:!0,value:n}):h[o]=n;var u=(h,o,n)=>(ke(h,typeof o!="symbol"?o+"":o,n),n);const o=t=>{const e=",、;:!?。()《》「」『』【】〔〕",r="\\x20-\\x7E",a=new RegExp(`\\s*([${e}])`,"gu"),l=new RegExp(`([${e}])\\s*([${r}])`,"gu"),f=new RegExp(`([^${r}${e}])([${r}])`,"gu"),Oe=new RegExp(`([${r}])([^${r}${e}])`,"gu");return t.replace(a,"$1").replace(l,"$1$2").replace(f,"$1 $2").replace(Oe,"$1 $2").replace(/ +/g," ")},n=(t,e=0)=>new Intl.NumberFormat(void 0,{minimumFractionDigits:e,maximumFractionDigits:e}).format(t),N=t=>Object.prototype.toString.call(t).toLowerCase().slice(8,-1),s=t=>t==null||t===""||Array.isArray(t)&&t.length<1,i=t=>`"${t}"`;class T{constructor({name:e,locale:r,fallbackLocale:a,locales:l,rules:f}){u(this,"name");u(this,"locale");u(this,"fallbackLocale");u(this,"locales");u(this,"rules");u(this,"ruleFunctions",{});u(this,"conditions",{});u(this,"shouldSkip",!1);u(this,"appliedProtocols",{});this.name=e,this.locale=r,this.fallbackLocale=a,this.locales=l,this.rules=f}get formattedName(){return this.name.toLowerCase()}get messages(){return this.locales[this.locale]||{}}get fallbackMessages(){return this.locales[this.fallbackLocale]||{}}get mandatoryRules(){return[this.required.name,this.string.name,this.array.name,this.equals.name,this.notEquals.name]}getMessage(e){return this.messages[e]||this.fallbackMessages[e]||(r=>`The ${r} field is invalid.`)}getRule(e){if(!(e in this.rules))throw new Error(`The "${e}" rule is not registered.`);return this.rules[e]}buildRuleFunction(e,r){return a=>{if(s(a)&&!this.mandatoryRules.includes(e))return!0;const l=this.getRule(e)(r)(a);return typeof l=="string"?l:l===!0?!0:this.buildRuleFunctionMessage(e,r,a)}}buildRuleFunctionMessage(e,r,a){const l=this.getMessage(e)(this.formattedName,r);if(typeof l=="object"){const f=N(a);if(!(f in l))throw new Error(`The message for the "${e}" rule of the "${f}" type is missing.`);return o(l[f])}return o(l)}pushRuleFunction(e,r){if(e in this.conditions&&!this.conditions[e])return this;const a=this.buildRuleFunction(e,r);return this.ruleFunctions[e]=a,this}getRuleFunctions(){return Object.values(this.ruleFunctions)}collect(){return this.shouldSkip?[]:this.getRuleFunctions()}validate(e){if(this.shouldSkip)return!0;const r=this.getRuleFunctions();for(const a of r){const l=a(e);if(typeof l=="string")return l}return!0}apply(e,r={}){return this.pushRuleFunction(e,r)}accepted(){return this.apply(this.accepted.name)}after(e,r,a,l=!0){return this.apply(this.after.name,{date:e,format:r,displayFormat:a,strict:l})}alpha(){return this.apply(this.alpha.name)}alphaDash(){return this.apply(this.alphaDash.name)}alphaDashDot(){return this.apply(this.alphaDashDot.name)}alphaNum(){return this.apply(this.alphaNum.name)}array(){return this.apply(this.array.name)}arrayLength(e){return this.apply(this.arrayLength.name,{length:e})}arrayLengthBetween(e,r){return this.apply(this.arrayLengthBetween.name,{min:e,max:r})}arrayLengthGt(e){return this.apply(this.arrayLengthGt.name,{length:e})}arrayLengthGte(e){return this.apply(this.arrayLengthGte.name,{length:e})}arrayLengthLt(e){return this.apply(this.arrayLengthLt.name,{length:e})}arrayLengthLte(e){return this.apply(this.arrayLengthLte.name,{length:e})}ascii(){return this.apply(this.ascii.name)}before(e,r,a,l=!0){return this.apply(this.before.name,{date:e,format:r,displayFormat:a,strict:l})}between(e,r){return this.apply(this.between.name,{min:e,max:r})}boolean(){return this.apply(this.boolean.name)}containsAll(e){return this.apply(this.containsAll.name,{values:e})}containsAny(e){return this.apply(this.containsAny.name,{values:e})}date(e,r=!0){return this.apply(this.date.name,{format:e,strict:r})}declined(){return this.apply(this.declined.name)}different(e,r){return this.apply(this.different.name,{field:e,value:r})}distinct(){return this.apply(this.distinct.name)}domain(){return this.apply(this.domain.name)}email(){return this.apply(this.email.name)}endsWith(e){return this.apply(this.endsWith.name,{value:e})}equals(e){return this.apply(this.equals.name,{value:e})}file(){return this.apply(this.file.name)}fileSize(e){return this.apply(this.fileSize.name,{size:e})}fileSizeBetween(e,r){return this.apply(this.fileSizeBetween.name,{min:e,max:r})}fileSizeGt(e){return this.apply(this.fileSizeGt.name,{size:e})}fileSizeGte(e){return this.apply(this.fileSizeGte.name,{size:e})}fileSizeLt(e){return this.apply(this.fileSizeLt.name,{size:e})}fileSizeLte(e){return this.apply(this.fileSizeLte.name,{size:e})}gt(e){return this.apply(this.gt.name,{value:e})}gte(e){return this.apply(this.gte.name,{value:e})}http(){return this.appliedProtocols[this.http.name]=!0,this.apply(this.http.name)}httpOrHttps(){return this.appliedProtocols[this.http.name]=!0,this.appliedProtocols[this.https.name]=!0,this.apply(this.httpOrHttps.name)}https(){return this.appliedProtocols[this.https.name]=!0,this.apply(this.https.name)}integer(){return this.apply(this.integer.name)}ip(){const e=Object.keys(this.appliedProtocols).length>0;return this.apply(this.ip.name,{includeProtocol:e})}ipv4(){const e=Object.keys(this.appliedProtocols).length>0;return this.apply(this.ipv4.name,{includeProtocol:e})}ipv6(){const e=Object.keys(this.appliedProtocols).length>0;return this.apply(this.ipv6.name,{includeProtocol:e})}iso8601(){return this.apply(this.iso8601.name)}json(){return this.apply(this.json.name)}jsonSchema(e){return this.apply(this.jsonSchema.name,{schema:e,locale:this.locale,field:this.name})}lowercase(){return this.apply(this.lowercase.name)}lt(e){return this.apply(this.lt.name,{value:e})}lte(e){return this.apply(this.lte.name,{value:e})}notContainsAll(e){return this.apply(this.notContainsAll.name,{values:e})}notContainsAny(e){return this.apply(this.notContainsAny.name,{values:e})}notEndsWith(e){return this.apply(this.notEndsWith.name,{value:e})}notEquals(e){return this.apply(this.notEquals.name,{value:e})}notOneOf(e){return this.apply(this.notOneOf.name,{values:e})}notStartsWith(e){return this.apply(this.notStartsWith.name,{value:e})}notSubsetOf(e){return this.apply(this.notSubsetOf.name,{values:e})}number(){return this.apply(this.number.name)}numeric(){return this.apply(this.numeric.name)}object(){return this.apply(this.object.name)}oneOf(e){return this.apply(this.oneOf.name,{values:e})}protocol(e){const r=Array.isArray(e)?e:[e];return r.forEach(a=>this.appliedProtocols[a]=!0),this.apply(this.protocol.name,{values:r})}regex(e){return this.apply(this.regex.name,{expression:e})}required(){return this.apply(this.required.name)}requiredWhen(e){return this.when({required:e}).required()}same(e,r){return this.apply(this.same.name,{field:e,value:r})}size(e){return this.apply(this.size.name,{size:e})}startsWith(e){return this.apply(this.startsWith.name,{value:e})}string(){return this.apply(this.string.name)}stringContainsAll(e){return this.apply(this.stringContainsAll.name,{values:e})}stringContainsAny(e){return this.apply(this.stringContainsAny.name,{values:e})}stringLength(e){return this.apply(this.stringLength.name,{length:e})}stringLengthBetween(e,r){return this.apply(this.stringLengthBetween.name,{min:e,max:r})}stringLengthGt(e){return this.apply(this.stringLengthGt.name,{length:e})}stringLengthGte(e){return this.apply(this.stringLengthGte.name,{length:e})}stringLengthLt(e){return this.apply(this.stringLengthLt.name,{length:e})}stringLengthLte(e){return this.apply(this.stringLengthLte.name,{length:e})}stringNotContainsAll(e){return this.apply(this.stringNotContainsAll.name,{values:e})}stringNotContainsAny(e){return this.apply(this.stringNotContainsAny.name,{values:e})}subsetOf(e){return this.apply(this.subsetOf.name,{values:e})}unique(e,r=[]){return this.apply(this.unique.name,{values:e,ignored:r})}uppercase(){return this.apply(this.uppercase.name)}url(){return this.apply(this.url.name)}when(e){return typeof e=="object"?(this.conditions=e,this):(e||(this.shouldSkip=!0),this)}}const P={en:{accepted:t=>`The ${t} field must be accepted.`,alpha:t=>`The ${t} field must only contain letters.`,alphaDash:t=>`The ${t} field must only contain letters, numbers, dashes and underscores.`,alphaDashDot:t=>`The ${t} field must only contain letters, numbers, dashes, underscores and dots.`,alphaNum:t=>`The ${t} field must only contain letters and numbers.`,array:t=>`The ${t} field must be an array.`,arrayLength:(t,e)=>{const{length:r}=e;return`The ${t} field must be ${n(r)} items.`},arrayLengthBetween:(t,e)=>{const{min:r,max:a}=e;return`The ${t} field must be between ${n(r)} and ${n(a)} items.`},arrayLengthGt:(t,e)=>{const{length:r}=e;return`The ${t} field must be greater than ${n(r)} items.`},arrayLengthGte:(t,e)=>{const{length:r}=e;return`The ${t} field must be greater than or equal to ${n(r)} items.`},arrayLengthLte:(t,e)=>{const{length:r}=e;return`The ${t} field must be less than or equal to ${n(r)} items.`},arrayLengthLt:(t,e)=>{const{length:r}=e;return`The ${t} field must be less than ${n(r)} items.`},ascii:t=>`The ${t} field must only contain ASCII characters and symbols.`,between:(t,e)=>{const{min:r,max:a}=e;return{number:`The ${t} field must be between ${n(r)} and ${n(a)}.`,array:`The ${t} field must contain items where each item is between ${n(r)} and ${n(a)}.`}},boolean:t=>`The ${t} field must be a boolean value.`,containsAll:(t,e)=>{const{values:r}=e;return`The ${t} field must contain all of the following values: ${r.map(i).join(", ")}.`},containsAny:(t,e)=>{const{values:r}=e;return`The ${t} field must contain at least one of the following values: ${r.map(i).join(", ")}.`},declined:t=>`The ${t} field must be declined.`,different:(t,e)=>{const{field:r}=e;return`The ${t} and ${r} fields must be different.`},distinct:t=>`The ${t} field must not contain duplicate values.`,domain:t=>`The ${t} field must be a valid domain.`,email:t=>`The ${t} field must be a valid email address.`,endsWith:(t,e)=>{const{value:r}=e;return`The ${t} field must end with ${i(r)}.`},equals:(t,e)=>{const{value:r}=e;return`The ${t} field must be equal to ${r}.`},file:t=>`The ${t} field must be a file.`,fileSizeBetween:(t,e)=>{const{min:r,max:a}=e;return{file:`The ${t} field must be between ${n(r)} and ${n(a)} kilobytes.`,array:`The ${t} field must contain items where each item is between ${n(r)} and ${n(a)} kilobytes.`}},fileSizeGt:(t,e)=>{const{size:r}=e;return{file:`The ${t} field must be greater than ${n(r)} kilobytes.`,array:`The ${t} field must contain items where each item is greater than ${n(r)} kilobytes.`}},fileSizeGte:(t,e)=>{const{size:r}=e;return{file:`The ${t} field must be greater than or equal to ${n(r)} kilobytes.`,array:`The ${t} field must contain items where each item is greater than or equal to ${n(r)} kilobytes.`}},fileSizeLt:(t,e)=>{const{size:r}=e;return{file:`The ${t} field must be less than ${n(r)} kilobytes.`,array:`The ${t} field must contain items where each item is less than ${n(r)} kilobytes.`}},fileSizeLte:(t,e)=>{const{size:r}=e;return{file:`The ${t} field must be less than or equal to ${n(r)} kilobytes.`,array:`The ${t} field must contain items where each item is less than or equal to ${n(r)} kilobytes.`}},fileSize:(t,e)=>{const{size:r}=e;return{file:`The ${t} field must be ${n(r)} kilobytes.`,array:`The ${t} field must contain items where each item is ${n(r)} kilobytes.`}},http:t=>`The ${t} field must start with the "http://" protocol.`,httpOrHttps:t=>`The ${t} field must start with the "http://" or "https://" protocols.`,https:t=>`The ${t} field must start with the "https://" protocol.`,integer:t=>`The ${t} field must be an integer.`,ip:t=>`The ${t} field must be a valid IP address.`,ipv4:t=>`The ${t} field must be a valid IPv4 address.`,ipv6:t=>`The ${t} field must be a valid IPv6 address.`,json:t=>`The ${t} field must be a valid JSON string.`,lowercase:t=>`The ${t} field must be lowercase.`,lt:(t,e)=>{const{value:r}=e;return{number:`The ${t} field must be less than ${n(r)}.`,array:`The ${t} field must contain items where each item is less than ${n(r)}.`}},lte:(t,e)=>{const{value:r}=e;return{number:`The ${t} field must be less than or equal to ${n(r)}.`,array:`The ${t} field must contain items where each item is less than or equal to ${n(r)}.`}},gt:(t,e)=>{const{value:r}=e;return{number:`The ${t} field must be greater than ${n(r)}.`,array:`The ${t} field must contain items where each item is greater than ${n(r)}.`}},gte:(t,e)=>{const{value:r}=e;return{number:`The ${t} field must be greater than or equal to ${n(r)}.`,array:`The ${t} field must contain items where each item is greater than or equal to ${n(r)}.`}},notContainsAll:(t,e)=>{const{values:r}=e;return`The ${t} field must not contain all of the following values together: ${r.map(i).join(", ")}.`},notEndsWith:(t,e)=>{const{value:r}=e;return`The ${t} field must not end with ${i(r)}.`},notContainsAny:(t,e)=>{const{values:r}=e;return`The ${t} field must not contain any of the following values: ${r.map(i).join(", ")}.`},notEquals:(t,e)=>{const{value:r}=e;return`The ${t} field must not be equal to ${r}.`},notOneOf:(t,e)=>{const{values:r}=e;return`The ${t} field must not be one of the following values: ${r.map(i).join(", ")}.`},notStartsWith:(t,e)=>{const{value:r}=e;return`The ${t} field must not start with ${i(r)}.`},notSubsetOf:(t,e)=>{const{values:r}=e;return`The ${t} field must not be a subset of the following values: ${r.map(i).join(", ")}.`},number:t=>`The ${t} field must be a number.`,numeric:t=>`The ${t} field must be a number.`,object:t=>`The ${t} field must be an object.`,oneOf:(t,e)=>{const{values:r}=e;return`The ${t} field must be one of the following values: ${r.map(i).join(", ")}.`},protocol:(t,e)=>{const{values:r}=e;if(r.length===1){const[a]=r;return`The ${t} field must start with the "${a}://" protocol.`}return`The ${t} field must start with one of the following protocols: ${r.map(a=>`${a}://`).map(i).join(", ")}.`},regex:t=>`The ${t} field must match the required format.`,required:t=>`The ${t} field is required.`,same:(t,e)=>{const{field:r}=e;return`The ${t} and ${r} fields must match.`},size:(t,e)=>{const{size:r}=e;return{number:`The ${t} field must be ${n(r)}.`,array:`The ${t} field must contain items where each item is ${n(r)}.`}},startsWith:(t,e)=>{const{value:r}=e;return`The ${t} field must start with ${i(r)}.`},string:t=>`The ${t} field must be a string.`,stringContainsAll:(t,e)=>{const{values:r}=e;return`The ${t} field must contain all of the following text: ${r.map(i).join(", ")}.`},stringContainsAny:(t,e)=>{const{values:r}=e;return`The ${t} field must contain at least one of the following text: ${r.map(i).join(", ")}.`},stringLength:(t,e)=>{const{length:r}=e;return{string:`The ${t} field must be ${n(r)} characters.`,array:`The ${t} field must contain items where each item is ${n(r)} characters.`}},stringLengthBetween:(t,e)=>{const{min:r,max:a}=e;return{string:`The ${t} field must be between ${n(r)} and ${n(a)} characters.`,array:`The ${t} field must contain items where each item is between ${n(r)} and ${n(a)} characters.`}},stringLengthGt:(t,e)=>{const{length:r}=e;return{string:`The ${t} field must be greater than ${n(r)} characters.`,array:`The ${t} field must contain items where each item is greater than ${n(r)} characters.`}},stringLengthGte:(t,e)=>{const{length:r}=e;return{string:`The ${t} field must be greater than or equal to ${n(r)} characters.`,array:`The ${t} field must contain items where each item is greater than or equal to ${n(r)} characters.`}},stringLengthLt:(t,e)=>{const{length:r}=e;return{string:`The ${t} field must be less than ${n(r)} characters.`,array:`The ${t} field must contain items where each item is less than ${n(r)} characters.`}},stringLengthLte:(t,e)=>{const{length:r}=e;return{string:`The ${t} field must be less than or equal to ${n(r)} characters.`,array:`The ${t} field must contain items where each item is less than or equal to ${n(r)} characters.`}},stringNotContainsAll:(t,e)=>{const{values:r}=e;return`The ${t} field must not contain all of the following text together: ${r.map(i).join(", ")}.`},stringNotContainsAny:(t,e)=>{const{values:r}=e;return`The ${t} field must not contain any of the following text: ${r.map(i).join(", ")}.`},subsetOf:(t,e)=>{const{values:r}=e;return`The ${t} field must be a subset of the following values: ${r.map(i).join(", ")}.`},unique:t=>`The ${t} field has already been taken.`,uppercase:t=>`The ${t} field must be uppercase.`,url:t=>`The ${t} field must be a valid URL.`},"zh-TW":{accepted:()=>"此欄位必須被同意",alpha:()=>"此欄位只能包含字母",alphaDash:()=>"此欄位只能包含字母、數字、連接號和底線",alphaDashDot:()=>"此欄位只能包含字母、數字、連接號、底線和點",alphaNum:()=>"此欄位只能包含字母和數字",array:()=>"此欄位必須是一個陣列",arrayLength:(t,e)=>{const{length:r}=e;return`此欄位必須是${n(r)}個項目`},arrayLengthBetween:(t,e)=>{const{min:r,max:a}=e;return`此欄位必須介於${n(r)}到${n(a)}個項目之間`},arrayLengthGt:(t,e)=>{const{length:r}=e;return`此欄位必須大於${n(r)}個項目`},arrayLengthGte:(t,e)=>{const{length:r}=e;return`此欄位必須大於或等於${n(r)}個項目`},arrayLengthLt:(t,e)=>{const{length:r}=e;return`此欄位必須小於${n(r)}個項目`},arrayLengthLte:(t,e)=>{const{length:r}=e;return`此欄位必須小於或等於${n(r)}個項目`},ascii:()=>"此欄位只能包含 ASCII 字元和符號",between:(t,e)=>{const{min:r,max:a}=e;return{number:`此欄位必須介於${n(r)}到${n(a)}`,array:`此欄位中的每個項目都必須介於${n(r)}到${n(a)}`}},boolean:()=>"此欄位必須是一個布林值",containsAll:(t,e)=>{const{values:r}=e;return`此欄位必須包含以下所有項目:${r.map(i).join(", ")}`},containsAny:(t,e)=>{const{values:r}=e;return`此欄位必須包含以下其中一個項目:${r.map(i).join(", ")}`},declined:()=>"此欄位必須被拒絕",different:(t,e)=>{const{field:r}=e;return`此欄位必須和${r}欄位不同`},distinct:()=>"此欄位不能包含重複的值",domain:()=>"此欄位必須是有效的網域",email:()=>"此欄位必須是有效的電子郵件地址",endsWith:(t,e)=>{const{value:r}=e;return`此欄位必須以${i(r)}結尾`},equals:(t,e)=>{const{value:r}=e;return`此欄位必須是${r}`},file:()=>"此欄位必須是檔案",fileSize:(t,e)=>{const{size:r}=e;return{file:`此欄位必須是${n(r)} KB`,array:`此欄位中的每個項目都必須是${n(r)} KB`}},fileSizeBetween:(t,e)=>{const{min:r,max:a}=e;return{file:`此欄位必須介於${n(r)}到${n(a)} KB 之間`,array:`此欄位中的每個項目都必須介於${n(r)}到${n(a)} KB 之間`}},fileSizeGt:(t,e)=>{const{size:r}=e;return{file:`此欄位必須大於${n(r)} KB`,array:`此欄位中的每個項目都必須大於${n(r)} KB`}},fileSizeGte:(t,e)=>{const{size:r}=e;return{file:`此欄位必須大於或等於${n(r)} KB`,array:`此欄位中的每個項目都必須大於或等於${n(r)} KB`}},fileSizeLt:(t,e)=>{const{size:r}=e;return{file:`此欄位必須小於${n(r)} KB`,array:`此欄位中的每個項目都必須小於${n(r)} KB`}},fileSizeLte:(t,e)=>{const{size:r}=e;return{file:`此欄位必須小於或等於${n(r)} KB`,array:`此欄位中的每個項目都必須小於或等於${n(r)} KB`}},gt:(t,e)=>{const{value:r}=e;return{number:`此欄位必須大於${n(r)}`,array:`此欄位中的每個項目都必須大於${n(r)}`}},gte:(t,e)=>{const{value:r}=e;return{number:`此欄位必須大於或等於${n(r)}`,array:`此欄位中的每個項目都必須大於或等於${n(r)}`}},http:()=>'此欄位必須以 "http://" 協議開頭',httpOrHttps:()=>'此欄位必須以 "http://" 或 "https://" 協議開頭',https:()=>'此欄位必須以 "https://" 協議開頭',integer:()=>"此欄位必須是整數",ip:()=>"此欄位必須是有效的 IP 位址",ipv4:()=>"此欄位必須是有效的 IPv4 位址",ipv6:()=>"此欄位必須是有效的 IPv6 位址",json:()=>"此欄位必須是有效的 JSON 字串",lowercase:()=>"此欄位必須是小寫",lt:(t,e)=>{const{value:r}=e;return{number:`此欄位必須小於${n(r)}`,array:`此欄位中的每個項目都必須小於${n(r)}`}},lte:(t,e)=>{const{value:r}=e;return{number:`此欄位必須小於或等於${n(r)}`,array:`此欄位中的每個項目都必須小於或等於${n(r)}`}},notContainsAll:(t,e)=>{const{values:r}=e;return`此欄位不能同時包含以下所有值:${r.map(i).join(", ")}`},notEndsWith:(t,e)=>{const{value:r}=e;return`此欄位不能以${i(r)}結尾`},notContainsAny:(t,e)=>{const{values:r}=e;return`此欄位不能包含以下任何值:${r.map(i).join(", ")}`},notEquals:(t,e)=>{const{value:r}=e;return`此欄位不能是${r}`},notOneOf:(t,e)=>{const{values:r}=e;return`此欄位不能是以下任何值:${r.map(i).join(", ")}`},notStartsWith:(t,e)=>{const{value:r}=e;return`此欄位不能以${i(r)}開頭`},notSubsetOf:(t,e)=>{const{values:r}=e;return`此欄位不能是以下項目的子集:${r.map(i).join(", ")}`},number:()=>"此欄位必須是數字",numeric:()=>"此欄位必須是數字",object:()=>"此欄位必須是物件",oneOf:(t,e)=>{const{values:r}=e;return`此欄位必須是以下其中一個值:${r.map(i).join(", ")}`},protocol:(t,e)=>{const{values:r}=e;if(r.length===1){const[a]=r;return`此欄位必須以 "${a}://" 協議開頭`}return`此欄位必須以以下其中一個協議開頭:${r.map(a=>`${a}://`).map(i).join(", ")}`},regex:()=>"此欄位必須符合所需的格式",required:()=>"此欄位為必填",same:(t,e)=>{const{field:r}=e;return`此欄位必須與${r}欄位相同`},size:(t,e)=>{const{size:r}=e;return{number:`此欄位必須是${n(r)}`,array:`此欄位中的每個項目都必須是${n(r)}`}},startsWith:(t,e)=>{const{value:r}=e;return`此欄位必須以${i(r)}開頭`},string:()=>"此欄位必須是字串",stringContainsAll:(t,e)=>{const{values:r}=e;return`此欄位必須包含以下所有文字:${r.map(i).join(", ")}`},stringContainsAny:(t,e)=>{const{values:r}=e;return`此欄位必須包含以下其中一個文字:${r.map(i).join(", ")}`},stringLength:(t,e)=>{const{length:r}=e;return{string:`此欄位必須是${n(r)}個字元`,array:`此欄位中的每個項目都必須是${n(r)}個字元`}},stringLengthBetween:(t,e)=>{const{min:r,max:a}=e;return{string:`此欄位必須介於${n(r)}到${n(a)}個字元之間`,array:`此欄位中的每個項目都必須介於${n(r)}到${n(a)}個字元之間`}},stringLengthGt:(t,e)=>{const{length:r}=e;return{string:`此欄位必須大於${n(r)}個字元`,array:`此欄位中的每個項目都必須大於${n(r)}個字元`}},stringLengthGte:(t,e)=>{const{length:r}=e;return{string:`此欄位必須大於或等於${n(r)}個字元`,array:`此欄位中的每個項目都必須大於或等於${n(r)}個字元`}},stringLengthLt:(t,e)=>{const{length:r}=e;return{string:`此欄位必須小於${n(r)}個字元`,array:`此欄位中的每個項目都必須小於${n(r)}個字元`}},stringLengthLte:(t,e)=>{const{length:r}=e;return{string:`此欄位必須小於或等於${n(r)}個字元`,array:`此欄位中的每個項目都必須小於或等於${n(r)}個字元`}},stringNotContainsAll:(t,e)=>{const{values:r}=e;return`此欄位不能同時包含以下所有文字:${r.map(i).join(", ")}`},stringNotContainsAny:(t,e)=>{const{values:r}=e;return`此欄位不能包含以下任何文字:${r.map(i).join(", ")}`},subsetOf:(t,e)=>{const{values:r}=e;return`此欄位必須是以下項目的子集:${r.map(i).join(", ")}`},unique:()=>"此欄位已經存在",uppercase:()=>"此欄位必須是大寫",url:()=>"此欄位必須是有效的 URL"}},I=()=>t=>s(t)?!1:["y","yes","on","1","true"].includes(String(t).toLowerCase()),K=()=>t=>s(t)?!1:/^[a-zA-Z]+$/.test(String(t)),Z=()=>t=>s(t)?!1:/^[a-zA-Z0-9-_]+$/.test(String(t)),M=()=>t=>s(t)?!1:/^[a-zA-Z0-9-_.]+$/.test(String(t)),H=()=>t=>s(t)?!1:/^[a-zA-Z0-9]+$/.test(String(t)),U=()=>t=>Array.isArray(t),V=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length===t:!1,v=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length>=t:!1,R=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length<=t:!1,J=({min:t,max:e})=>r=>s(r)?!1:v({length:t})(r)&&R({length:e})(r),Q=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length>t:!1,X=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length<t:!1,Y=()=>t=>s(t)?!1:/^[\x20-\x7E]+$/.test(String(t)),c=({value:t})=>e=>s(e)?!1:typeof e=="number"?e>=t:Array.isArray(e)?e.every(r=>c({value:t})(r)):!1,m=({value:t})=>e=>s(e)?!1:typeof e=="number"?e<=t:Array.isArray(e)?e.every(r=>m({value:t})(r)):!1,ee=({min:t,max:e})=>r=>s(r)?!1:c({value:t})(r)&&m({value:e})(r),te=()=>t=>s(t)?!1:typeof t=="boolean",re=({values:t})=>e=>s(e)?!1:Array.isArray(e)?t.every(r=>e.includes(r)):!1,ne=({values:t})=>e=>s(e)?!1:Array.isArray(e)?t.some(r=>e.includes(r)):!1,se=()=>t=>s(t)?!1:["n","no","off","0","false"].includes(String(t).toLowerCase()),ae=({value:t})=>e=>s(e)?!1:e!==t,ie=()=>t=>s(t)?!1:Array.isArray(t)?new Set(t).size===t.length:!0,le=()=>t=>s(t)?!1:/^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(String(t)),oe=()=>t=>s(t)?!1:/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(String(t)),S=({value:t})=>e=>s(e)?!1:String(e).toLowerCase().endsWith(t.toLowerCase()),ue=({value:t})=>e=>e===t,he=()=>t=>t instanceof File,z=({size:t})=>e=>{if(s(e))return!1;if(e instanceof File){const r=t*1024,a=(t+1)*1024;return e.size>=r&&e.size<a}return Array.isArray(e)?e.every(r=>z({size:t})(r)):!1},y=({size:t})=>e=>s(e)?!1:e instanceof File?e.size>=t*1024:Array.isArray(e)?e.every(r=>y({size:t})(r)):!1,g=({size:t})=>e=>s(e)?!1:e instanceof File?e.size<=t*1024:Array.isArray(e)?e.every(r=>g({size:t})(r)):!1,fe=({min:t,max:e})=>r=>s(r)?!1:y({size:t})(r)&&g({size:e})(r),j=({size:t})=>e=>s(e)?!1:e instanceof File?e.size>t*1024:Array.isArray(e)?e.every(r=>j({size:t})(r)):!1,F=({size:t})=>e=>s(e)?!1:e instanceof File?e.size<t*1024:Array.isArray(e)?e.every(r=>F({size:t})(r)):!1,C=({value:t})=>e=>s(e)?!1:typeof e=="number"?e>t:Array.isArray(e)?e.every(r=>C({value:t})(r)):!1,$=({value:t})=>e=>s(e)?!1:String(e).toLowerCase().startsWith(t.toLowerCase()),d=({values:t})=>e=>s(e)?!1:t.map(r=>`${r}://`).some(r=>$({value:r})(e)),q=()=>t=>s(t)?!1:d({values:["http"]})(t),_=()=>t=>s(t)?!1:d({values:["https"]})(t),ce=()=>t=>s(t)?!1:q()(t)||_()(t),p=()=>t=>s(t)?!1:typeof t=="number",me=()=>t=>s(t)?!1:p()(t)&&Number.isInteger(t),b=({includeProtocol:t}={})=>e=>{if(s(e))return!1;if(t)try{const{host:r}=new URL(String(e));return b({})(r)}catch{return!1}return/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(:\d+)?$/.test(String(e))},A=({includeProtocol:t}={})=>e=>{if(s(e))return!1;if(t)try{const{host:r}=new URL(String(e));return A({})(r)}catch{return!1}return/(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/.test(String(e))},ye=({includeProtocol:t}={})=>e=>s(e)?!1:b({includeProtocol:t})(e)||A({includeProtocol:t})(e),ge=()=>t=>{if(s(t))return!1;try{return JSON.parse(String(t)),!0}catch{return!1}},$e=()=>t=>s(t)?!1:String(t)===String(t).toLowerCase(),O=({value:t})=>e=>s(e)?!1:typeof e=="number"?e<t:Array.isArray(e)?e.every(r=>O({value:t})(r)):!1,de=({values:t})=>e=>s(e)?!1:Array.isArray(e)?!t.every(r=>e.includes(r)):!1,pe=({values:t})=>e=>s(e)?!1:Array.isArray(e)?!t.some(r=>e.includes(r)):!1,be=({value:t})=>e=>s(e)?!1:!S({value:t})(e),Ae=({value:t})=>e=>e!==t,G=({values:t})=>e=>s(e)?!1:!t.includes(e),Le=({value:t})=>e=>s(e)?!1:!$({value:t})(e),we=({values:t})=>e=>s(e)?!1:Array.isArray(e)?e.some(r=>!t.includes(r)):G({values:t})(e),k=()=>t=>typeof t=="string",Te=()=>t=>s(t)?!1:k()(t)?/^-?\d+(\.\d+)?$/.test(String(t)):p()(t),ve=()=>t=>typeof t=="object"&&t!==null&&!Array.isArray(t),x=({values:t})=>e=>s(e)?!1:t.includes(e),Re=({expression:t})=>e=>{if(s(e))return!1;if(!(t instanceof RegExp))throw new TypeError("The expression provided is not a valid RegExp.");return t.test(String(e))},Se=()=>t=>!s(t),ze=({value:t})=>e=>s(e)?!1:Array.isArray(e)?e.every(r=>r===t):e===t,B=({size:t})=>e=>s(e)?!1:typeof e=="number"?e===t:Array.isArray(e)?e.every(r=>B({size:t})(r)):!1,je=({values:t})=>e=>s(e)?!1:typeof e=="string"?t.every(r=>e.includes(r)):!1,Fe=({values:t})=>e=>s(e)?!1:typeof e=="string"?t.some(r=>e.includes(r)):!1,W=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length===t:Array.isArray(e)?e.every(r=>W({length:t})(r)):!1,L=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length>=t:Array.isArray(e)?e.every(r=>L({length:t})(r)):!1,w=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length<=t:Array.isArray(e)?e.every(r=>w({length:t})(r)):!1,Ce=({min:t,max:e})=>r=>s(r)?!1:L({length:t})(r)&&w({length:e})(r),E=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length>t:Array.isArray(e)?e.every(r=>E({length:t})(r)):!1,D=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length<t:Array.isArray(e)?e.every(r=>D({length:t})(r)):!1,qe={accepted:I,alpha:K,alphaDash:Z,alphaDashDot:M,alphaNum:H,array:U,arrayLength:V,arrayLengthBetween:J,arrayLengthGt:Q,arrayLengthGte:v,arrayLengthLt:X,arrayLengthLte:R,ascii:Y,between:ee,boolean:te,containsAll:re,containsAny:ne,declined:se,different:ae,distinct:ie,domain:le,email:oe,endsWith:S,equals:ue,file:he,fileSize:z,fileSizeBetween:fe,fileSizeGt:j,fileSizeGte:y,fileSizeLt:F,fileSizeLte:g,gt:C,gte:c,http:q,httpOrHttps:ce,https:_,integer:me,ip:ye,ipv4:b,ipv6:A,json:ge,lowercase:$e,lt:O,lte:m,notContainsAll:de,notContainsAny:pe,notEndsWith:be,notEquals:Ae,notOneOf:G,notStartsWith:Le,notSubsetOf:we,number:p,numeric:Te,object:ve,oneOf:x,protocol:d,regex:Re,required:Se,same:ze,size:B,startsWith:$,string:k,stringContainsAll:je,stringContainsAny:Fe,stringLength:W,stringLengthBetween:Ce,stringLengthGt:E,stringLengthGte:L,stringLengthLt:D,stringLengthLte:w,stringNotContainsAll:({values:t})=>e=>s(e)?!1:typeof e=="string"?!t.every(r=>e.includes(r)):!1,stringNotContainsAny:({values:t})=>e=>s(e)?!1:typeof e=="string"?!t.some(r=>e.includes(r)):!1,subsetOf:({values:t})=>e=>s(e)?!1:Array.isArray(e)?e.every(r=>t.includes(r)):x({values:t})(e),unique:({values:t,ignored:e=[]})=>r=>s(r)?!1:(Array.isArray(e)?e:[e]).some(a=>a===r)?!0:!t.some(a=>a===r),uppercase:()=>t=>s(t)?!1:String(t)===String(t).toUpperCase(),url:()=>t=>{if(s(t))return!1;try{return new URL(String(t)),!0}catch{return!1}}};class _e{constructor({fallbackLocale:e,locale:r,plugins:a}={}){u(this,"locale","en");u(this,"fallbackLocale","en");u(this,"locales",{});u(this,"rules",{});this.registerLocales(P),this.registerRules(qe),e&&this.setFallbackLocale(e),r&&this.setLocale(r),a&&a.forEach(l=>this.registerPlugin(l))}getLocale(){return this.locale}getFallbackLocale(){return this.fallbackLocale}setLocale(e){if(!(e in this.locales))throw new Error(`The "${e}" locale is not registered.`);return this.locale=e,this}setFallbackLocale(e){if(!(e in this.locales))throw new Error(`The "${e}" fallback locale is not registered.`);return this.fallbackLocale=e,this}defineField(e){return new T({name:e,locale:this.locale,fallbackLocale:this.fallbackLocale,locales:this.locales,rules:this.rules})}registerLocales(e){return this.locales=Object.keys(e).reduce((r,a)=>(r[a]={...this.locales[a],...e[a]},r),{...this.locales}),this}registerRules(e){return this.rules={...this.rules,...e},this}registerPlugin(e){if(!e||!e.locales||!e.rules)throw new Error('The plugin must have "locales" and "rules" properties.');return this.registerLocales(e.locales).registerRules(e.rules)}}h.FieldValidator=T,h.FormValidator=_e,Object.defineProperty(h,Symbol.toStringTag,{value:"Module"})});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Rule, RuleArguments } from '@kklab/fortress-validator-types';
|
|
2
|
-
export interface
|
|
2
|
+
export interface StartsWithRuleArguments extends RuleArguments {
|
|
3
3
|
value: string;
|
|
4
4
|
}
|
|
5
|
-
declare const startsWithRule: Rule<
|
|
5
|
+
declare const startsWithRule: Rule<StartsWithRuleArguments>;
|
|
6
6
|
export default startsWithRule;
|