@kklab/fortress-validator 1.0.19 → 1.0.20

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.
@@ -14,6 +14,7 @@ declare class FieldValidator {
14
14
  get formattedName(): string;
15
15
  get messages(): Messages;
16
16
  get fallbackMessages(): Messages;
17
+ get defaultMessages(): Messages;
17
18
  get mandatoryRules(): string[];
18
19
  getMessage(ruleName: string): Message;
19
20
  getRule(name: string): Rule<unknown>;
package/dist/index.js CHANGED
@@ -40,6 +40,9 @@ class Z {
40
40
  get fallbackMessages() {
41
41
  return this.locales[this.fallbackLocale] || {};
42
42
  }
43
+ get defaultMessages() {
44
+ return this.locales.en;
45
+ }
43
46
  get mandatoryRules() {
44
47
  return [
45
48
  this.required.name,
@@ -50,7 +53,7 @@ class Z {
50
53
  ];
51
54
  }
52
55
  getMessage(e) {
53
- return this.messages[e] || this.fallbackMessages[e] || ((r) => `The ${r} field is invalid.`);
56
+ return this.messages[e] || this.fallbackMessages[e] || this.defaultMessages[e] || ((r) => `The ${r} field is invalid.`);
54
57
  }
55
58
  getRule(e) {
56
59
  if (!(e in this.rules))
@@ -646,10 +649,10 @@ class Z {
646
649
  * Determines whether to apply or skip validation based on the provided conditions.
647
650
  */
648
651
  when(e) {
649
- return typeof e == "object" ? (this.conditions = e, this) : (e || (this.shouldSkip = !0), this);
652
+ return typeof e == "object" ? (this.conditions = { ...this.conditions, ...e }, this) : (e || (this.shouldSkip = !0), this);
650
653
  }
651
654
  }
652
- const H = {
655
+ const M = {
653
656
  accepted: (t) => `The ${t} field must be accepted.`,
654
657
  alpha: (t) => `The ${t} field must only contain letters.`,
655
658
  alphaDash: (t) => `The ${t} field must only contain letters, numbers, dashes and underscores.`,
@@ -937,7 +940,7 @@ const H = {
937
940
  unique: (t) => `The ${t} field has already been taken.`,
938
941
  uppercase: (t) => `The ${t} field must be uppercase.`,
939
942
  url: (t) => `The ${t} field must be a valid URL.`
940
- }, M = {
943
+ }, H = {
941
944
  accepted: () => "此欄位必須被同意",
942
945
  alpha: () => "此欄位只能包含字母",
943
946
  alphaDash: () => "此欄位只能包含字母、數字、連接號和底線",
@@ -1226,9 +1229,9 @@ const H = {
1226
1229
  uppercase: () => "此欄位必須是大寫",
1227
1230
  url: () => "此欄位必須是有效的 URL"
1228
1231
  }, U = {
1229
- en: H,
1230
- "zh-TW": M
1231
- }, J = () => (t) => s(t) ? !1 : ["y", "yes", "on", "1", "true"].includes(String(t).toLowerCase()), V = () => (t) => s(t) ? !1 : /^[a-zA-Z]+$/.test(String(t)), Q = () => (t) => s(t) ? !1 : /^[a-zA-Z0-9-_]+$/.test(String(t)), X = () => (t) => s(t) ? !1 : /^[a-zA-Z0-9-_.]+$/.test(String(t)), Y = () => (t) => s(t) ? !1 : /^[a-zA-Z0-9]+$/.test(String(t)), ee = () => (t) => Array.isArray(t), te = ({ 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, w = ({ length: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.length <= t : !1, re = ({ min: t, max: e }) => (r) => s(r) ? !1 : v({ length: t })(r) && w({ length: e })(r), ne = ({ length: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.length > t : !1, se = ({ length: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.length < t : !1, ae = () => (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, ie = ({ min: t, max: e }) => (r) => s(r) ? !1 : h({ value: t })(r) && f({ value: e })(r), le = () => (t) => s(t) ? !1 : typeof t == "boolean", oe = ({ value: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.includes(t) : !1, ue = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? t.every((r) => e.includes(r)) : !1, he = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? t.some((r) => e.includes(r)) : !1, fe = () => (t) => s(t) ? !1 : ["n", "no", "off", "0", "false"].includes(String(t).toLowerCase()), ce = ({ value: t }) => (e) => s(e) ? !1 : e !== t, me = () => (t) => s(t) ? !1 : Array.isArray(t) ? new Set(t).size === t.length : !0, ye = () => (t) => s(t) ? !1 : /^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(String(t)), ge = () => (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()), $e = ({ value: t }) => (e) => e === t, de = () => (t) => t instanceof File, R = ({ size: t }) => (e) => {
1232
+ en: M,
1233
+ "zh-TW": H
1234
+ }, J = () => (t) => s(t) ? !1 : ["y", "yes", "on", "1", "true"].includes(String(t).toLowerCase()), V = () => (t) => s(t) ? !1 : /^[a-zA-Z]+$/.test(String(t)), Q = () => (t) => s(t) ? !1 : /^[a-zA-Z0-9-_]+$/.test(String(t)), X = () => (t) => s(t) ? !1 : /^[a-zA-Z0-9-_.]+$/.test(String(t)), Y = () => (t) => s(t) ? !1 : /^[a-zA-Z0-9]+$/.test(String(t)), ee = () => (t) => Array.isArray(t), te = ({ 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, T = ({ length: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.length <= t : !1, re = ({ min: t, max: e }) => (r) => s(r) ? !1 : v({ length: t })(r) && T({ length: e })(r), ne = ({ length: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.length > t : !1, se = ({ length: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.length < t : !1, ae = () => (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, ie = ({ min: t, max: e }) => (r) => s(r) ? !1 : h({ value: t })(r) && f({ value: e })(r), le = () => (t) => s(t) ? !1 : typeof t == "boolean", oe = ({ value: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.includes(t) : !1, ue = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? t.every((r) => e.includes(r)) : !1, he = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? t.some((r) => e.includes(r)) : !1, fe = () => (t) => s(t) ? !1 : ["n", "no", "off", "0", "false"].includes(String(t).toLowerCase()), ce = ({ value: t }) => (e) => s(e) ? !1 : e !== t, me = () => (t) => s(t) ? !1 : Array.isArray(t) ? new Set(t).size === t.length : !0, ge = () => (t) => s(t) ? !1 : /^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(String(t)), ye = () => (t) => s(t) ? !1 : /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(String(t)), w = ({ value: t }) => (e) => s(e) ? !1 : String(e).toLowerCase().endsWith(t.toLowerCase()), $e = ({ value: t }) => (e) => e === t, de = () => (t) => t instanceof File, R = ({ size: t }) => (e) => {
1232
1235
  if (s(e))
1233
1236
  return !1;
1234
1237
  if (e instanceof File) {
@@ -1236,7 +1239,7 @@ const H = {
1236
1239
  return e.size >= r && e.size < a;
1237
1240
  }
1238
1241
  return Array.isArray(e) ? e.every((r) => R({ size: t })(r)) : !1;
1239
- }, 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, pe = ({ 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, C = ({ value: t }) => (e) => s(e) ? !1 : typeof e == "number" ? e > t : Array.isArray(e) ? e.every((r) => C({ 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)), _ = () => (t) => s(t) ? !1 : g({ values: ["http"] })(t), j = () => (t) => s(t) ? !1 : g({ values: ["https"] })(t), be = () => (t) => s(t) ? !1 : _()(t) || j()(t), $ = () => (t) => s(t) ? !1 : typeof t == "number", Ae = () => (t) => s(t) ? !1 : $()(t) && Number.isInteger(t), d = ({ includeProtocol: t } = {}) => (e) => {
1242
+ }, 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, pe = ({ 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, C = ({ value: t }) => (e) => s(e) ? !1 : typeof e == "number" ? e > t : Array.isArray(e) ? e.every((r) => C({ value: t })(r)) : !1, g = ({ value: t }) => (e) => s(e) ? !1 : String(e).toLowerCase().startsWith(t.toLowerCase()), y = ({ values: t }) => (e) => s(e) ? !1 : t.map((r) => `${r}://`).some((r) => g({ value: r })(e)), _ = () => (t) => s(t) ? !1 : y({ values: ["http"] })(t), j = () => (t) => s(t) ? !1 : y({ values: ["https"] })(t), be = () => (t) => s(t) ? !1 : _()(t) || j()(t), $ = () => (t) => s(t) ? !1 : typeof t == "number", Ae = () => (t) => s(t) ? !1 : $()(t) && Number.isInteger(t), d = ({ includeProtocol: t } = {}) => (e) => {
1240
1243
  if (s(e))
1241
1244
  return !1;
1242
1245
  if (t)
@@ -1266,13 +1269,13 @@ const H = {
1266
1269
  } catch {
1267
1270
  return !1;
1268
1271
  }
1269
- }, we = () => (t) => s(t) ? !1 : String(t) === String(t).toLowerCase(), F = ({ value: t }) => (e) => s(e) ? !1 : typeof e == "number" ? e < t : Array.isArray(e) ? e.every((r) => F({ value: t })(r)) : !1, Te = ({ value: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? !e.includes(t) : !1, Re = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? !t.every((r) => e.includes(r)) : !1, Se = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? !t.some((r) => e.includes(r)) : !1, ze = ({ value: t }) => (e) => s(e) ? !1 : !T({ value: t })(e), Ce = ({ value: t }) => (e) => e !== t, q = ({ values: t }) => (e) => s(e) ? !1 : !t.includes(e), _e = ({ value: t }) => (e) => s(e) ? !1 : !y({ value: t })(e), O = () => (t) => s(t) ? !1 : /^\d/.test(String(t)), je = () => (t) => s(t) ? !1 : !O()(t), Fe = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.some((r) => !t.includes(r)) : q({ values: t })(e), W = () => (t) => typeof t == "string", qe = () => (t) => s(t) ? !1 : W()(t) ? /^-?\d+(\.\d+)?$/.test(String(t)) : $()(t), Oe = () => (t) => typeof t == "object" && t !== null && !Array.isArray(t), G = ({ values: t }) => (e) => s(e) ? !1 : t.includes(e), We = ({ expression: t }) => (e) => {
1272
+ }, Te = () => (t) => s(t) ? !1 : String(t) === String(t).toLowerCase(), F = ({ value: t }) => (e) => s(e) ? !1 : typeof e == "number" ? e < t : Array.isArray(e) ? e.every((r) => F({ value: t })(r)) : !1, we = ({ value: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? !e.includes(t) : !1, Re = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? !t.every((r) => e.includes(r)) : !1, Se = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? !t.some((r) => e.includes(r)) : !1, ze = ({ value: t }) => (e) => s(e) ? !1 : !w({ value: t })(e), Ce = ({ value: t }) => (e) => e !== t, q = ({ values: t }) => (e) => s(e) ? !1 : !t.includes(e), _e = ({ value: t }) => (e) => s(e) ? !1 : !g({ value: t })(e), O = () => (t) => s(t) ? !1 : /^\d/.test(String(t)), je = () => (t) => s(t) ? !1 : !O()(t), Fe = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.some((r) => !t.includes(r)) : q({ values: t })(e), W = () => (t) => typeof t == "string", qe = () => (t) => s(t) ? !1 : W()(t) ? /^-?\d+(\.\d+)?$/.test(String(t)) : $()(t), Oe = () => (t) => typeof t == "object" && t !== null && !Array.isArray(t), G = ({ values: t }) => (e) => s(e) ? !1 : t.includes(e), We = ({ expression: t }) => (e) => {
1270
1273
  if (s(e))
1271
1274
  return !1;
1272
1275
  if (!(t instanceof RegExp))
1273
1276
  throw new TypeError("The expression provided is not a valid RegExp.");
1274
1277
  return t.test(String(e));
1275
- }, Ge = () => (t) => !s(t), Ne = ({ value: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.every((r) => r === t) : e === t, N = ({ size: t }) => (e) => s(e) ? !1 : typeof e == "number" ? e === t : Array.isArray(e) ? e.every((r) => N({ size: t })(r)) : !1, k = ({ value: t }) => (e) => s(e) ? !1 : typeof e == "string" ? e.includes(t) : !1, ke = ({ values: t }) => (e) => s(e) ? !1 : typeof e == "string" ? t.every((r) => k({ value: r })(e)) : !1, xe = ({ 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, Be = ({ 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, E = ({ length: t }) => (e) => s(e) ? !1 : typeof e == "string" ? e.length < t : Array.isArray(e) ? e.every((r) => E({ length: t })(r)) : !1, Ee = ({ value: t }) => (e) => s(e) ? !1 : typeof e == "string" ? !e.includes(t) : !1, De = ({ values: t }) => (e) => s(e) ? !1 : typeof e == "string" ? !t.every((r) => e.includes(r)) : !1, Pe = ({ values: t }) => (e) => s(e) ? !1 : typeof e == "string" ? !t.some((r) => e.includes(r)) : !1, Ie = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.every((r) => t.includes(r)) : G({ values: t })(e), Ke = ({ values: t, ignored: e = [] }) => (r) => s(r) ? !1 : (Array.isArray(e) ? e : [e]).some((a) => a === r) ? !0 : !t.some((a) => a === r), Ze = () => (t) => s(t) ? !1 : String(t) === String(t).toUpperCase(), He = () => (t) => {
1278
+ }, Ge = () => (t) => !s(t), Ne = ({ value: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.every((r) => r === t) : e === t, N = ({ size: t }) => (e) => s(e) ? !1 : typeof e == "number" ? e === t : Array.isArray(e) ? e.every((r) => N({ size: t })(r)) : !1, k = ({ value: t }) => (e) => s(e) ? !1 : typeof e == "string" ? e.includes(t) : !1, ke = ({ values: t }) => (e) => s(e) ? !1 : typeof e == "string" ? t.every((r) => k({ value: r })(e)) : !1, xe = ({ 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, Be = ({ 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, E = ({ length: t }) => (e) => s(e) ? !1 : typeof e == "string" ? e.length < t : Array.isArray(e) ? e.every((r) => E({ length: t })(r)) : !1, Ee = ({ value: t }) => (e) => s(e) ? !1 : typeof e == "string" ? !e.includes(t) : !1, De = ({ values: t }) => (e) => s(e) ? !1 : typeof e == "string" ? !t.every((r) => e.includes(r)) : !1, Pe = ({ values: t }) => (e) => s(e) ? !1 : typeof e == "string" ? !t.some((r) => e.includes(r)) : !1, Ie = ({ values: t }) => (e) => s(e) ? !1 : Array.isArray(e) ? e.every((r) => t.includes(r)) : G({ values: t })(e), Ke = ({ values: t, ignored: e = [] }) => (r) => s(r) ? !1 : (Array.isArray(e) ? e : [e]).some((a) => a === r) ? !0 : !t.some((a) => a === r), Ze = () => (t) => s(t) ? !1 : String(t) === String(t).toUpperCase(), Me = () => (t) => {
1276
1279
  if (s(t))
1277
1280
  return !1;
1278
1281
  try {
@@ -1280,7 +1283,7 @@ const H = {
1280
1283
  } catch {
1281
1284
  return !1;
1282
1285
  }
1283
- }, Me = {
1286
+ }, He = {
1284
1287
  accepted: J,
1285
1288
  alpha: V,
1286
1289
  alphaDash: Q,
@@ -1292,7 +1295,7 @@ const H = {
1292
1295
  arrayLengthGt: ne,
1293
1296
  arrayLengthGte: v,
1294
1297
  arrayLengthLt: se,
1295
- arrayLengthLte: w,
1298
+ arrayLengthLte: T,
1296
1299
  ascii: ae,
1297
1300
  between: ie,
1298
1301
  boolean: le,
@@ -1302,9 +1305,9 @@ const H = {
1302
1305
  declined: fe,
1303
1306
  different: ce,
1304
1307
  distinct: me,
1305
- domain: ye,
1306
- email: ge,
1307
- endsWith: T,
1308
+ domain: ge,
1309
+ email: ye,
1310
+ endsWith: w,
1308
1311
  equals: $e,
1309
1312
  file: de,
1310
1313
  fileSize: R,
@@ -1323,10 +1326,10 @@ const H = {
1323
1326
  ipv4: d,
1324
1327
  ipv6: p,
1325
1328
  json: ve,
1326
- lowercase: we,
1329
+ lowercase: Te,
1327
1330
  lt: F,
1328
1331
  lte: f,
1329
- notContains: Te,
1332
+ notContains: we,
1330
1333
  notContainsAll: Re,
1331
1334
  notContainsAny: Se,
1332
1335
  notEndsWith: ze,
@@ -1339,12 +1342,12 @@ const H = {
1339
1342
  numeric: qe,
1340
1343
  object: Oe,
1341
1344
  oneOf: G,
1342
- protocol: g,
1345
+ protocol: y,
1343
1346
  regex: We,
1344
1347
  required: Ge,
1345
1348
  same: Ne,
1346
1349
  size: N,
1347
- startsWith: y,
1350
+ startsWith: g,
1348
1351
  startsWithNumber: O,
1349
1352
  string: W,
1350
1353
  stringContains: k,
@@ -1362,7 +1365,7 @@ const H = {
1362
1365
  subsetOf: Ie,
1363
1366
  unique: Ke,
1364
1367
  uppercase: Ze,
1365
- url: He
1368
+ url: Me
1366
1369
  };
1367
1370
  class Je {
1368
1371
  constructor({
@@ -1374,7 +1377,7 @@ class Je {
1374
1377
  o(this, "fallbackLocale", "en");
1375
1378
  o(this, "locales", {});
1376
1379
  o(this, "rules", {});
1377
- this.registerLocales(U), this.registerRules(Me), e && this.setFallbackLocale(e), r && this.setLocale(r), a && a.forEach((l) => this.registerPlugin(l));
1380
+ this.registerLocales(U), this.registerRules(He), e && this.setFallbackLocale(e), r && this.setLocale(r), a && a.forEach((l) => this.registerPlugin(l));
1378
1381
  }
1379
1382
  getLocale() {
1380
1383
  return this.locale;
@@ -1383,14 +1386,10 @@ class Je {
1383
1386
  return this.fallbackLocale;
1384
1387
  }
1385
1388
  setLocale(e) {
1386
- if (!(e in this.locales))
1387
- throw new Error(`The "${e}" locale is not registered.`);
1388
- return this.locale = e, this;
1389
+ return e in this.locales || console.warn(`The "${e}" locale is not registered.`), this.locale = e, this;
1389
1390
  }
1390
1391
  setFallbackLocale(e) {
1391
- if (!(e in this.locales))
1392
- throw new Error(`The "${e}" fallback locale is not registered.`);
1393
- return this.fallbackLocale = e, this;
1392
+ return e in this.locales || console.warn(`The "${e}" fallback locale is not registered.`), this.fallbackLocale = e, this;
1394
1393
  }
1395
1394
  defineField(e) {
1396
1395
  return new Z({
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 Be=Object.defineProperty;var Ee=(h,o,n)=>o in h?Be(h,o,{enumerable:!0,configurable:!0,writable:!0,value:n}):h[o]=n;var u=(h,o,n)=>(Ee(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"),xe=new RegExp(`([${r}])([^${r}${e}])`,"gu");return t.replace(a,"$1").replace(l,"$1$2").replace(f,"$1 $2").replace(xe,"$1 $2").replace(/ +/g," ")},n=(t,e)=>{var r;const a=e??((r=t.toString().split(".").at(1))==null?void 0:r.length)??0;return new Intl.NumberFormat(void 0,{minimumFractionDigits:a,maximumFractionDigits:a}).format(t)},I=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=I(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)}contains(e){return this.apply(this.contains.name,{value:e})}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})}notContains(e){return this.apply(this.notContains.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})}notStartsWithNumber(){return this.apply(this.notStartsWithNumber.name)}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})}startsWithNumber(){return this.apply(this.startsWithNumber.name)}string(){return this.apply(this.string.name)}stringContains(e){return this.apply(this.stringContains.name,{value:e})}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})}stringNotContains(e){return this.apply(this.stringNotContains.name,{value: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 K={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.`},arrayLengthLt:(t,e)=>{const{length:r}=e;return`The ${t} field must be less than ${n(r)} items.`},arrayLengthLte:(t,e)=>{const{length:r}=e;return`The ${t} field must be less than or equal to ${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.`,contains:(t,e)=>{const{value:r}=e;return`The ${t} field must contain ${i(r)}.`},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.`,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.`}},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.`}},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)}.`}},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)}.`}},notContains:(t,e)=>{const{value:r}=e;return`The ${t} field must not contain ${i(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(", ")}.`},notEndsWith:(t,e)=>{const{value:r}=e;return`The ${t} field must not end with ${i(r)}.`},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)}.`},notStartsWithNumber:t=>`The ${t} field must not start with a number.`,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)}.`},startsWithNumber:t=>`The ${t} field must start with a number.`,string:t=>`The ${t} field must be a string.`,stringContains:(t,e)=>{const{value:r}=e;return`The ${t} field must contain ${i(r)}.`},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.`}},stringNotContains:(t,e)=>{const{value:r}=e;return`The ${t} field must not contain ${i(r)}.`},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:()=>"此欄位必須是一個布林值",contains:(t,e)=>{const{value:r}=e;return`此欄位必須包含${i(r)}`},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)}`}},notContains:(t,e)=>{const{values:r}=e;return`此欄位不能包含${i(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(", ")}`},notEndsWith:(t,e)=>{const{value:r}=e;return`此欄位不能以${i(r)}結尾`},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)}開頭`},notStartsWithNumber:()=>"此欄位不能以數字開頭",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)}開頭`},startsWithNumber:()=>"此欄位必須以數字開頭",string:()=>"此欄位必須是字串",stringContains:(t,e)=>{const{value:r}=e;return`此欄位必須包含${i(r)}`},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)}個字元`}},stringNotContains:(t,e)=>{const{value:r}=e;return`此欄位不能包含${i(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"}},Z=()=>t=>s(t)?!1:["y","yes","on","1","true"].includes(String(t).toLowerCase()),M=()=>t=>s(t)?!1:/^[a-zA-Z]+$/.test(String(t)),H=()=>t=>s(t)?!1:/^[a-zA-Z0-9-_]+$/.test(String(t)),U=()=>t=>s(t)?!1:/^[a-zA-Z0-9-_.]+$/.test(String(t)),V=()=>t=>s(t)?!1:/^[a-zA-Z0-9]+$/.test(String(t)),J=()=>t=>Array.isArray(t),Q=({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,R=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length<=t:!1,X=({min:t,max:e})=>r=>s(r)?!1:w({length:t})(r)&&R({length:e})(r),Y=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length>t:!1,ee=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length<t:!1,te=()=>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,re=({min:t,max:e})=>r=>s(r)?!1:c({value:t})(r)&&m({value:e})(r),ne=()=>t=>s(t)?!1:typeof t=="boolean",se=({value:t})=>e=>s(e)?!1:Array.isArray(e)?e.includes(t):!1,ae=({values:t})=>e=>s(e)?!1:Array.isArray(e)?t.every(r=>e.includes(r)):!1,ie=({values:t})=>e=>s(e)?!1:Array.isArray(e)?t.some(r=>e.includes(r)):!1,le=()=>t=>s(t)?!1:["n","no","off","0","false"].includes(String(t).toLowerCase()),oe=({value:t})=>e=>s(e)?!1:e!==t,ue=()=>t=>s(t)?!1:Array.isArray(t)?new Set(t).size===t.length:!0,he=()=>t=>s(t)?!1:/^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(String(t)),fe=()=>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()),ce=({value:t})=>e=>e===t,me=()=>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,ye=({min:t,max:e})=>r=>s(r)?!1:y({size:t})(r)&&g({size:e})(r),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,_=({size:t})=>e=>s(e)?!1:e instanceof File?e.size<t*1024:Array.isArray(e)?e.every(r=>_({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,$=({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)),F=()=>t=>s(t)?!1:d({values:["http"]})(t),q=()=>t=>s(t)?!1:d({values:["https"]})(t),ge=()=>t=>s(t)?!1:F()(t)||q()(t),p=()=>t=>s(t)?!1:typeof t=="number",$e=()=>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))},de=({includeProtocol:t}={})=>e=>s(e)?!1:b({includeProtocol:t})(e)||A({includeProtocol:t})(e),pe=()=>t=>{if(s(t))return!1;try{return JSON.parse(String(t)),!0}catch{return!1}},be=()=>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,Ae=({value:t})=>e=>s(e)?!1:Array.isArray(e)?!e.includes(t):!1,Le=({values:t})=>e=>s(e)?!1:Array.isArray(e)?!t.every(r=>e.includes(r)):!1,ve=({values:t})=>e=>s(e)?!1:Array.isArray(e)?!t.some(r=>e.includes(r)):!1,Te=({value:t})=>e=>s(e)?!1:!S({value:t})(e),we=({value:t})=>e=>e!==t,W=({values:t})=>e=>s(e)?!1:!t.includes(e),Re=({value:t})=>e=>s(e)?!1:!$({value:t})(e),N=()=>t=>s(t)?!1:/^\d/.test(String(t)),Se=()=>t=>s(t)?!1:!N()(t),ze=({values:t})=>e=>s(e)?!1:Array.isArray(e)?e.some(r=>!t.includes(r)):W({values:t})(e),G=()=>t=>typeof t=="string",Ce=()=>t=>s(t)?!1:G()(t)?/^-?\d+(\.\d+)?$/.test(String(t)):p()(t),_e=()=>t=>typeof t=="object"&&t!==null&&!Array.isArray(t),k=({values:t})=>e=>s(e)?!1:t.includes(e),je=({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))},Fe=()=>t=>!s(t),qe=({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,B=({value:t})=>e=>s(e)?!1:typeof e=="string"?e.includes(t):!1,Oe=({values:t})=>e=>s(e)?!1:typeof e=="string"?t.every(r=>B({value:r})(e)):!1,We=({values:t})=>e=>s(e)?!1:typeof e=="string"?t.some(r=>e.includes(r)):!1,E=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length===t:Array.isArray(e)?e.every(r=>E({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,v=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length<=t:Array.isArray(e)?e.every(r=>v({length:t})(r)):!1,Ne=({min:t,max:e})=>r=>s(r)?!1:L({length:t})(r)&&v({length:e})(r),D=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length>t:Array.isArray(e)?e.every(r=>D({length:t})(r)):!1,P=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length<t:Array.isArray(e)?e.every(r=>P({length:t})(r)):!1,Ge={accepted:Z,alpha:M,alphaDash:H,alphaDashDot:U,alphaNum:V,array:J,arrayLength:Q,arrayLengthBetween:X,arrayLengthGt:Y,arrayLengthGte:w,arrayLengthLt:ee,arrayLengthLte:R,ascii:te,between:re,boolean:ne,contains:se,containsAll:ae,containsAny:ie,declined:le,different:oe,distinct:ue,domain:he,email:fe,endsWith:S,equals:ce,file:me,fileSize:z,fileSizeBetween:ye,fileSizeGt:C,fileSizeGte:y,fileSizeLt:_,fileSizeLte:g,gt:j,gte:c,http:F,httpOrHttps:ge,https:q,integer:$e,ip:de,ipv4:b,ipv6:A,json:pe,lowercase:be,lt:O,lte:m,notContains:Ae,notContainsAll:Le,notContainsAny:ve,notEndsWith:Te,notEquals:we,notOneOf:W,notStartsWith:Re,notStartsWithNumber:Se,notSubsetOf:ze,number:p,numeric:Ce,object:_e,oneOf:k,protocol:d,regex:je,required:Fe,same:qe,size:x,startsWith:$,startsWithNumber:N,string:G,stringContains:B,stringContainsAll:Oe,stringContainsAny:We,stringLength:E,stringLengthBetween:Ne,stringLengthGt:D,stringLengthGte:L,stringLengthLt:P,stringLengthLte:v,stringNotContains:({value:t})=>e=>s(e)?!1:typeof e=="string"?!e.includes(t):!1,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 ke{constructor({fallbackLocale:e,locale:r,plugins:a}={}){u(this,"locale","en");u(this,"fallbackLocale","en");u(this,"locales",{});u(this,"rules",{});this.registerLocales(K),this.registerRules(Ge),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=ke,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 Be=Object.defineProperty;var Ee=(h,o,n)=>o in h?Be(h,o,{enumerable:!0,configurable:!0,writable:!0,value:n}):h[o]=n;var u=(h,o,n)=>(Ee(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"),xe=new RegExp(`([${r}])([^${r}${e}])`,"gu");return t.replace(a,"$1").replace(l,"$1$2").replace(f,"$1 $2").replace(xe,"$1 $2").replace(/ +/g," ")},n=(t,e)=>{var r;const a=e??((r=t.toString().split(".").at(1))==null?void 0:r.length)??0;return new Intl.NumberFormat(void 0,{minimumFractionDigits:a,maximumFractionDigits:a}).format(t)},I=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 defaultMessages(){return this.locales.en}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]||this.defaultMessages[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=I(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)}contains(e){return this.apply(this.contains.name,{value:e})}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})}notContains(e){return this.apply(this.notContains.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})}notStartsWithNumber(){return this.apply(this.notStartsWithNumber.name)}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})}startsWithNumber(){return this.apply(this.startsWithNumber.name)}string(){return this.apply(this.string.name)}stringContains(e){return this.apply(this.stringContains.name,{value:e})}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})}stringNotContains(e){return this.apply(this.stringNotContains.name,{value: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={...this.conditions,...e},this):(e||(this.shouldSkip=!0),this)}}const K={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.`},arrayLengthLt:(t,e)=>{const{length:r}=e;return`The ${t} field must be less than ${n(r)} items.`},arrayLengthLte:(t,e)=>{const{length:r}=e;return`The ${t} field must be less than or equal to ${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.`,contains:(t,e)=>{const{value:r}=e;return`The ${t} field must contain ${i(r)}.`},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.`,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.`}},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.`}},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)}.`}},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)}.`}},notContains:(t,e)=>{const{value:r}=e;return`The ${t} field must not contain ${i(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(", ")}.`},notEndsWith:(t,e)=>{const{value:r}=e;return`The ${t} field must not end with ${i(r)}.`},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)}.`},notStartsWithNumber:t=>`The ${t} field must not start with a number.`,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)}.`},startsWithNumber:t=>`The ${t} field must start with a number.`,string:t=>`The ${t} field must be a string.`,stringContains:(t,e)=>{const{value:r}=e;return`The ${t} field must contain ${i(r)}.`},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.`}},stringNotContains:(t,e)=>{const{value:r}=e;return`The ${t} field must not contain ${i(r)}.`},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:()=>"此欄位必須是一個布林值",contains:(t,e)=>{const{value:r}=e;return`此欄位必須包含${i(r)}`},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)}`}},notContains:(t,e)=>{const{values:r}=e;return`此欄位不能包含${i(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(", ")}`},notEndsWith:(t,e)=>{const{value:r}=e;return`此欄位不能以${i(r)}結尾`},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)}開頭`},notStartsWithNumber:()=>"此欄位不能以數字開頭",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)}開頭`},startsWithNumber:()=>"此欄位必須以數字開頭",string:()=>"此欄位必須是字串",stringContains:(t,e)=>{const{value:r}=e;return`此欄位必須包含${i(r)}`},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)}個字元`}},stringNotContains:(t,e)=>{const{value:r}=e;return`此欄位不能包含${i(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"}},Z=()=>t=>s(t)?!1:["y","yes","on","1","true"].includes(String(t).toLowerCase()),M=()=>t=>s(t)?!1:/^[a-zA-Z]+$/.test(String(t)),H=()=>t=>s(t)?!1:/^[a-zA-Z0-9-_]+$/.test(String(t)),U=()=>t=>s(t)?!1:/^[a-zA-Z0-9-_.]+$/.test(String(t)),V=()=>t=>s(t)?!1:/^[a-zA-Z0-9]+$/.test(String(t)),J=()=>t=>Array.isArray(t),Q=({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,w=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length<=t:!1,X=({min:t,max:e})=>r=>s(r)?!1:R({length:t})(r)&&w({length:e})(r),Y=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length>t:!1,ee=({length:t})=>e=>s(e)?!1:Array.isArray(e)?e.length<t:!1,te=()=>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,re=({min:t,max:e})=>r=>s(r)?!1:c({value:t})(r)&&m({value:e})(r),ne=()=>t=>s(t)?!1:typeof t=="boolean",se=({value:t})=>e=>s(e)?!1:Array.isArray(e)?e.includes(t):!1,ae=({values:t})=>e=>s(e)?!1:Array.isArray(e)?t.every(r=>e.includes(r)):!1,ie=({values:t})=>e=>s(e)?!1:Array.isArray(e)?t.some(r=>e.includes(r)):!1,le=()=>t=>s(t)?!1:["n","no","off","0","false"].includes(String(t).toLowerCase()),oe=({value:t})=>e=>s(e)?!1:e!==t,ue=()=>t=>s(t)?!1:Array.isArray(t)?new Set(t).size===t.length:!0,he=()=>t=>s(t)?!1:/^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(String(t)),fe=()=>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()),ce=({value:t})=>e=>e===t,me=()=>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},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,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,ge=({min:t,max:e})=>r=>s(r)?!1:g({size:t})(r)&&y({size:e})(r),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,_=({size:t})=>e=>s(e)?!1:e instanceof File?e.size<t*1024:Array.isArray(e)?e.every(r=>_({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,$=({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)),F=()=>t=>s(t)?!1:d({values:["http"]})(t),q=()=>t=>s(t)?!1:d({values:["https"]})(t),ye=()=>t=>s(t)?!1:F()(t)||q()(t),p=()=>t=>s(t)?!1:typeof t=="number",$e=()=>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))},de=({includeProtocol:t}={})=>e=>s(e)?!1:b({includeProtocol:t})(e)||A({includeProtocol:t})(e),pe=()=>t=>{if(s(t))return!1;try{return JSON.parse(String(t)),!0}catch{return!1}},be=()=>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,Ae=({value:t})=>e=>s(e)?!1:Array.isArray(e)?!e.includes(t):!1,Le=({values:t})=>e=>s(e)?!1:Array.isArray(e)?!t.every(r=>e.includes(r)):!1,ve=({values:t})=>e=>s(e)?!1:Array.isArray(e)?!t.some(r=>e.includes(r)):!1,Te=({value:t})=>e=>s(e)?!1:!S({value:t})(e),Re=({value:t})=>e=>e!==t,W=({values:t})=>e=>s(e)?!1:!t.includes(e),we=({value:t})=>e=>s(e)?!1:!$({value:t})(e),N=()=>t=>s(t)?!1:/^\d/.test(String(t)),Se=()=>t=>s(t)?!1:!N()(t),ze=({values:t})=>e=>s(e)?!1:Array.isArray(e)?e.some(r=>!t.includes(r)):W({values:t})(e),G=()=>t=>typeof t=="string",Ce=()=>t=>s(t)?!1:G()(t)?/^-?\d+(\.\d+)?$/.test(String(t)):p()(t),_e=()=>t=>typeof t=="object"&&t!==null&&!Array.isArray(t),k=({values:t})=>e=>s(e)?!1:t.includes(e),je=({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))},Fe=()=>t=>!s(t),qe=({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,B=({value:t})=>e=>s(e)?!1:typeof e=="string"?e.includes(t):!1,Oe=({values:t})=>e=>s(e)?!1:typeof e=="string"?t.every(r=>B({value:r})(e)):!1,We=({values:t})=>e=>s(e)?!1:typeof e=="string"?t.some(r=>e.includes(r)):!1,E=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length===t:Array.isArray(e)?e.every(r=>E({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,v=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length<=t:Array.isArray(e)?e.every(r=>v({length:t})(r)):!1,Ne=({min:t,max:e})=>r=>s(r)?!1:L({length:t})(r)&&v({length:e})(r),D=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length>t:Array.isArray(e)?e.every(r=>D({length:t})(r)):!1,P=({length:t})=>e=>s(e)?!1:typeof e=="string"?e.length<t:Array.isArray(e)?e.every(r=>P({length:t})(r)):!1,Ge={accepted:Z,alpha:M,alphaDash:H,alphaDashDot:U,alphaNum:V,array:J,arrayLength:Q,arrayLengthBetween:X,arrayLengthGt:Y,arrayLengthGte:R,arrayLengthLt:ee,arrayLengthLte:w,ascii:te,between:re,boolean:ne,contains:se,containsAll:ae,containsAny:ie,declined:le,different:oe,distinct:ue,domain:he,email:fe,endsWith:S,equals:ce,file:me,fileSize:z,fileSizeBetween:ge,fileSizeGt:C,fileSizeGte:g,fileSizeLt:_,fileSizeLte:y,gt:j,gte:c,http:F,httpOrHttps:ye,https:q,integer:$e,ip:de,ipv4:b,ipv6:A,json:pe,lowercase:be,lt:O,lte:m,notContains:Ae,notContainsAll:Le,notContainsAny:ve,notEndsWith:Te,notEquals:Re,notOneOf:W,notStartsWith:we,notStartsWithNumber:Se,notSubsetOf:ze,number:p,numeric:Ce,object:_e,oneOf:k,protocol:d,regex:je,required:Fe,same:qe,size:x,startsWith:$,startsWithNumber:N,string:G,stringContains:B,stringContainsAll:Oe,stringContainsAny:We,stringLength:E,stringLengthBetween:Ne,stringLengthGt:D,stringLengthGte:L,stringLengthLt:P,stringLengthLte:v,stringNotContains:({value:t})=>e=>s(e)?!1:typeof e=="string"?!e.includes(t):!1,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 ke{constructor({fallbackLocale:e,locale:r,plugins:a}={}){u(this,"locale","en");u(this,"fallbackLocale","en");u(this,"locales",{});u(this,"rules",{});this.registerLocales(K),this.registerRules(Ge),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){return e in this.locales||console.warn(`The "${e}" locale is not registered.`),this.locale=e,this}setFallbackLocale(e){return e in this.locales||console.warn(`The "${e}" fallback locale is not registered.`),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=ke,Object.defineProperty(h,Symbol.toStringTag,{value:"Module"})});
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kklab/fortress-validator",
3
3
  "private": false,
4
- "version": "1.0.19",
4
+ "version": "1.0.20",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",