@hy_ong/zod-kit 0.1.16 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/.github/workflows/ci.yml +24 -0
  2. package/CLAUDE.md +184 -0
  3. package/dist/chunk-36NWHESN.js +124 -0
  4. package/dist/chunk-4LYZAO3P.js +165 -0
  5. package/dist/chunk-5GAZQDVS.cjs +206 -0
  6. package/dist/chunk-5LS4DSRQ.cjs +127 -0
  7. package/dist/chunk-5OGW2ERW.js +181 -0
  8. package/dist/chunk-5ZEKWPSE.cjs +69 -0
  9. package/dist/chunk-6OGDPSWT.js +135 -0
  10. package/dist/chunk-6X22I6NQ.cjs +136 -0
  11. package/dist/chunk-77KZUPPN.cjs +177 -0
  12. package/dist/chunk-AANSHH2O.cjs +165 -0
  13. package/dist/chunk-AI72FMOF.cjs +130 -0
  14. package/dist/chunk-AWV2IT66.js +146 -0
  15. package/dist/chunk-B3U5G3AA.js +160 -0
  16. package/dist/chunk-CFFCBWYL.cjs +99 -0
  17. package/dist/chunk-DPXRMSB2.js +130 -0
  18. package/dist/chunk-DRXPGQM6.cjs +135 -0
  19. package/dist/chunk-EAU42EVH.js +161 -0
  20. package/dist/chunk-FC6VDOC7.js +206 -0
  21. package/dist/chunk-FVO4743A.cjs +134 -0
  22. package/dist/chunk-G6DV7LX7.cjs +161 -0
  23. package/dist/chunk-I2RJMDXN.js +90 -0
  24. package/dist/chunk-IJEEM3DI.js +136 -0
  25. package/dist/chunk-JBNCMS42.cjs +151 -0
  26. package/dist/chunk-JZ2SHRGZ.js +87 -0
  27. package/dist/chunk-KARFFIMP.js +696 -0
  28. package/dist/chunk-LIQSVJLS.js +177 -0
  29. package/dist/chunk-LKPXHW5N.cjs +181 -0
  30. package/dist/chunk-MAQRXYE6.js +118 -0
  31. package/dist/chunk-MCDESS3T.js +69 -0
  32. package/dist/chunk-MG25BEV4.cjs +160 -0
  33. package/dist/chunk-NKCYXBGX.js +99 -0
  34. package/dist/chunk-OEK7QSQP.js +75 -0
  35. package/dist/chunk-OMFQ7Z63.cjs +696 -0
  36. package/dist/chunk-OP4KV3BY.cjs +124 -0
  37. package/dist/chunk-P2NONIMS.js +257 -0
  38. package/dist/chunk-P364KRO5.js +61 -0
  39. package/dist/chunk-PGSDXR2I.js +71 -0
  40. package/dist/chunk-PL2GERLG.cjs +61 -0
  41. package/dist/chunk-R5G4V7C6.cjs +75 -0
  42. package/dist/chunk-RKHX3DGH.js +127 -0
  43. package/dist/chunk-TSHL7ZO2.js +134 -0
  44. package/dist/chunk-UFNVCUPQ.cjs +301 -0
  45. package/dist/chunk-VCRKYMJM.js +301 -0
  46. package/dist/chunk-VDOAPLA6.cjs +257 -0
  47. package/dist/chunk-VP5CCP5F.cjs +90 -0
  48. package/dist/chunk-W2EWMV3A.cjs +87 -0
  49. package/dist/chunk-WWRFBLCR.cjs +146 -0
  50. package/dist/chunk-YALLOVNO.cjs +118 -0
  51. package/dist/chunk-YAU6JCYL.cjs +71 -0
  52. package/dist/chunk-YWV2BBXN.cjs +2526 -0
  53. package/dist/chunk-ZBOQCXD4.js +2526 -0
  54. package/dist/chunk-ZFQQXWNB.js +151 -0
  55. package/dist/common/boolean.cjs +7 -0
  56. package/dist/common/boolean.d.cts +119 -0
  57. package/dist/common/boolean.d.ts +119 -0
  58. package/dist/common/boolean.js +7 -0
  59. package/dist/common/color.cjs +9 -0
  60. package/dist/common/color.d.cts +26 -0
  61. package/dist/common/color.d.ts +26 -0
  62. package/dist/common/color.js +9 -0
  63. package/dist/common/coordinate.cjs +11 -0
  64. package/dist/common/coordinate.d.cts +23 -0
  65. package/dist/common/coordinate.d.ts +23 -0
  66. package/dist/common/coordinate.js +11 -0
  67. package/dist/common/credit-card.cjs +11 -0
  68. package/dist/common/credit-card.d.cts +22 -0
  69. package/dist/common/credit-card.d.ts +22 -0
  70. package/dist/common/credit-card.js +11 -0
  71. package/dist/common/date.cjs +7 -0
  72. package/dist/common/date.d.cts +174 -0
  73. package/dist/common/date.d.ts +174 -0
  74. package/dist/common/date.js +7 -0
  75. package/dist/common/datetime.cjs +15 -0
  76. package/dist/common/datetime.d.cts +301 -0
  77. package/dist/common/datetime.d.ts +301 -0
  78. package/dist/common/datetime.js +15 -0
  79. package/dist/common/email.cjs +7 -0
  80. package/dist/common/email.d.cts +149 -0
  81. package/dist/common/email.d.ts +149 -0
  82. package/dist/common/email.js +7 -0
  83. package/dist/common/file.cjs +7 -0
  84. package/dist/common/file.d.cts +178 -0
  85. package/dist/common/file.d.ts +178 -0
  86. package/dist/common/file.js +7 -0
  87. package/dist/common/id.cjs +13 -0
  88. package/dist/common/id.d.cts +262 -0
  89. package/dist/common/id.d.ts +262 -0
  90. package/dist/common/id.js +13 -0
  91. package/dist/common/ip.cjs +11 -0
  92. package/dist/common/ip.d.cts +25 -0
  93. package/dist/common/ip.d.ts +25 -0
  94. package/dist/common/ip.js +11 -0
  95. package/dist/common/number.cjs +7 -0
  96. package/dist/common/number.d.cts +167 -0
  97. package/dist/common/number.d.ts +167 -0
  98. package/dist/common/number.js +7 -0
  99. package/dist/common/password.cjs +7 -0
  100. package/dist/common/password.d.cts +192 -0
  101. package/dist/common/password.d.ts +192 -0
  102. package/dist/common/password.js +7 -0
  103. package/dist/common/text.cjs +7 -0
  104. package/dist/common/text.d.cts +156 -0
  105. package/dist/common/text.d.ts +156 -0
  106. package/dist/common/text.js +7 -0
  107. package/dist/common/time.cjs +15 -0
  108. package/dist/common/time.d.cts +268 -0
  109. package/dist/common/time.d.ts +268 -0
  110. package/dist/common/time.js +15 -0
  111. package/dist/common/url.cjs +7 -0
  112. package/dist/common/url.d.cts +196 -0
  113. package/dist/common/url.d.ts +196 -0
  114. package/dist/common/url.js +7 -0
  115. package/dist/config-CABSSvAp.d.cts +5 -0
  116. package/dist/config-CABSSvAp.d.ts +5 -0
  117. package/dist/index.cjs +180 -3599
  118. package/dist/index.d.cts +28 -3150
  119. package/dist/index.d.ts +28 -3150
  120. package/dist/index.js +135 -3475
  121. package/dist/taiwan/bank-account.cjs +11 -0
  122. package/dist/taiwan/bank-account.d.cts +22 -0
  123. package/dist/taiwan/bank-account.d.ts +22 -0
  124. package/dist/taiwan/bank-account.js +11 -0
  125. package/dist/taiwan/business-id.cjs +9 -0
  126. package/dist/taiwan/business-id.d.cts +133 -0
  127. package/dist/taiwan/business-id.d.ts +133 -0
  128. package/dist/taiwan/business-id.js +9 -0
  129. package/dist/taiwan/fax.cjs +9 -0
  130. package/dist/taiwan/fax.d.cts +157 -0
  131. package/dist/taiwan/fax.d.ts +157 -0
  132. package/dist/taiwan/fax.js +9 -0
  133. package/dist/taiwan/invoice.cjs +9 -0
  134. package/dist/taiwan/invoice.d.cts +17 -0
  135. package/dist/taiwan/invoice.d.ts +17 -0
  136. package/dist/taiwan/invoice.js +9 -0
  137. package/dist/taiwan/license-plate.cjs +9 -0
  138. package/dist/taiwan/license-plate.d.cts +19 -0
  139. package/dist/taiwan/license-plate.d.ts +19 -0
  140. package/dist/taiwan/license-plate.js +9 -0
  141. package/dist/taiwan/mobile.cjs +9 -0
  142. package/dist/taiwan/mobile.d.cts +146 -0
  143. package/dist/taiwan/mobile.d.ts +146 -0
  144. package/dist/taiwan/mobile.js +9 -0
  145. package/dist/taiwan/national-id.cjs +15 -0
  146. package/dist/taiwan/national-id.d.cts +214 -0
  147. package/dist/taiwan/national-id.d.ts +214 -0
  148. package/dist/taiwan/national-id.js +15 -0
  149. package/dist/taiwan/passport.cjs +9 -0
  150. package/dist/taiwan/passport.d.cts +19 -0
  151. package/dist/taiwan/passport.d.ts +19 -0
  152. package/dist/taiwan/passport.js +9 -0
  153. package/dist/taiwan/postal-code.cjs +17 -0
  154. package/dist/taiwan/postal-code.d.cts +237 -0
  155. package/dist/taiwan/postal-code.d.ts +237 -0
  156. package/dist/taiwan/postal-code.js +17 -0
  157. package/dist/taiwan/tel.cjs +9 -0
  158. package/dist/taiwan/tel.d.cts +162 -0
  159. package/dist/taiwan/tel.d.ts +162 -0
  160. package/dist/taiwan/tel.js +9 -0
  161. package/package.json +128 -2
  162. package/src/config.ts +2 -2
  163. package/src/i18n/index.ts +18 -2
  164. package/src/i18n/locales/en-GB.json +247 -0
  165. package/src/i18n/locales/{en.json → en-US.json} +43 -0
  166. package/src/i18n/locales/id-ID.json +247 -0
  167. package/src/i18n/locales/ja-JP.json +247 -0
  168. package/src/i18n/locales/ko-KR.json +247 -0
  169. package/src/i18n/locales/ms-MY.json +247 -0
  170. package/src/i18n/locales/th-TH.json +247 -0
  171. package/src/i18n/locales/vi-VN.json +247 -0
  172. package/src/i18n/locales/zh-CN.json +247 -0
  173. package/src/i18n/locales/zh-TW.json +43 -0
  174. package/src/index.ts +10 -2
  175. package/src/validators/common/boolean.ts +1 -1
  176. package/src/validators/common/color.ts +192 -0
  177. package/src/validators/common/coordinate.ts +159 -0
  178. package/src/validators/common/credit-card.ts +134 -0
  179. package/src/validators/common/date.ts +1 -1
  180. package/src/validators/common/datetime.ts +1 -1
  181. package/src/validators/common/email.ts +1 -1
  182. package/src/validators/common/file.ts +1 -1
  183. package/src/validators/common/id.ts +1 -1
  184. package/src/validators/common/ip.ts +210 -0
  185. package/src/validators/common/number.ts +1 -1
  186. package/src/validators/common/password.ts +1 -1
  187. package/src/validators/common/text.ts +1 -1
  188. package/src/validators/common/time.ts +1 -1
  189. package/src/validators/common/url.ts +1 -1
  190. package/src/validators/taiwan/bank-account.ts +176 -0
  191. package/src/validators/taiwan/business-id.ts +1 -1
  192. package/src/validators/taiwan/fax.ts +1 -1
  193. package/src/validators/taiwan/invoice.ts +84 -0
  194. package/src/validators/taiwan/license-plate.ts +110 -0
  195. package/src/validators/taiwan/mobile.ts +1 -1
  196. package/src/validators/taiwan/national-id.ts +1 -1
  197. package/src/validators/taiwan/passport.ts +103 -0
  198. package/src/validators/taiwan/postal-code.ts +1 -1
  199. package/src/validators/taiwan/tel.ts +1 -1
  200. package/tests/common/boolean.test.ts +6 -6
  201. package/tests/common/color.test.ts +587 -0
  202. package/tests/common/coordinate.test.ts +345 -0
  203. package/tests/common/credit-card.test.ts +378 -0
  204. package/tests/common/date.test.ts +8 -8
  205. package/tests/common/datetime.test.ts +7 -7
  206. package/tests/common/email.test.ts +6 -6
  207. package/tests/common/file.test.ts +6 -6
  208. package/tests/common/id.test.ts +5 -5
  209. package/tests/common/ip.test.ts +419 -0
  210. package/tests/common/number.test.ts +6 -6
  211. package/tests/common/password.test.ts +5 -5
  212. package/tests/common/text.test.ts +7 -7
  213. package/tests/common/time.test.ts +7 -7
  214. package/tests/common/url.test.ts +10 -10
  215. package/tests/taiwan/bank-account.test.ts +286 -0
  216. package/tests/taiwan/business-id.test.ts +4 -4
  217. package/tests/taiwan/fax.test.ts +7 -7
  218. package/tests/taiwan/invoice.test.ts +227 -0
  219. package/tests/taiwan/license-plate.test.ts +280 -0
  220. package/tests/taiwan/mobile.test.ts +7 -7
  221. package/tests/taiwan/national-id.test.ts +4 -4
  222. package/tests/taiwan/passport.test.ts +277 -0
  223. package/tests/taiwan/postal-code.test.ts +6 -6
  224. package/tests/taiwan/tel.test.ts +7 -7
  225. package/tsup.config.ts +36 -0
@@ -0,0 +1,135 @@
1
+ import {
2
+ getLocale,
3
+ t
4
+ } from "./chunk-ZBOQCXD4.js";
5
+
6
+ // src/validators/taiwan/bank-account.ts
7
+ import { z } from "zod";
8
+ var TAIWAN_BANK_CODES = {
9
+ "004": "\u53F0\u7063\u9280\u884C",
10
+ "005": "\u571F\u5730\u9280\u884C",
11
+ "006": "\u5408\u5EAB",
12
+ "007": "\u7B2C\u4E00\u9280\u884C",
13
+ "008": "\u83EF\u5357",
14
+ "009": "\u5F70\u5316",
15
+ "011": "\u4E0A\u6D77",
16
+ "012": "\u53F0\u5317\u5BCC\u90A6",
17
+ "013": "\u570B\u6CF0\u4E16\u83EF",
18
+ "017": "\u5146\u8C50",
19
+ "021": "\u82B1\u65D7",
20
+ "048": "\u738B\u9053",
21
+ "050": "\u53F0\u7063\u4F01\u9280",
22
+ "052": "\u6E23\u6253",
23
+ "053": "\u53F0\u4E2D\u9280\u884C",
24
+ "054": "\u4EAC\u57CE",
25
+ "081": "\u6ED9\u8C50",
26
+ "103": "\u65B0\u5149",
27
+ "108": "\u967D\u4FE1",
28
+ "118": "\u677F\u4FE1",
29
+ "147": "\u4E09\u4FE1",
30
+ "700": "\u4E2D\u83EF\u90F5\u653F",
31
+ "803": "\u806F\u90A6",
32
+ "805": "\u9060\u6771",
33
+ "806": "\u5143\u5927",
34
+ "807": "\u6C38\u8C50",
35
+ "808": "\u7389\u5C71",
36
+ "809": "\u51F1\u57FA",
37
+ "810": "\u661F\u5C55",
38
+ "812": "\u53F0\u65B0",
39
+ "816": "\u5B89\u6CF0",
40
+ "822": "\u4E2D\u4FE1"
41
+ };
42
+ var validateTaiwanBankAccount = (value, validateBankCode = true) => {
43
+ let bankCode;
44
+ let accountNumber;
45
+ if (value.includes("-")) {
46
+ const parts = value.split("-");
47
+ if (parts.length !== 2) return false;
48
+ bankCode = parts[0];
49
+ accountNumber = parts[1];
50
+ } else {
51
+ accountNumber = value;
52
+ }
53
+ if (bankCode !== void 0) {
54
+ if (!/^\d{3}$/.test(bankCode)) return false;
55
+ if (validateBankCode && !(bankCode in TAIWAN_BANK_CODES)) return false;
56
+ }
57
+ if (!/^\d{10,16}$/.test(accountNumber)) return false;
58
+ return true;
59
+ };
60
+ function twBankAccount(required, options) {
61
+ const { validateBankCode = true, bankCode, transform, defaultValue, i18n } = options ?? {};
62
+ const isRequired = required ?? false;
63
+ const actualDefaultValue = defaultValue ?? (isRequired ? "" : null);
64
+ const getMessage = (key, params) => {
65
+ if (i18n) {
66
+ const currentLocale = getLocale();
67
+ const customMessages = i18n[currentLocale];
68
+ if (customMessages && customMessages[key]) {
69
+ const template = customMessages[key];
70
+ return template.replace(/\$\{(\w+)}/g, (_, k) => params?.[k] ?? "");
71
+ }
72
+ }
73
+ return t(`taiwan.bankAccount.${key}`, params);
74
+ };
75
+ const preprocessFn = (val) => {
76
+ if (val === "" || val === null || val === void 0) {
77
+ return actualDefaultValue;
78
+ }
79
+ let processed = String(val).trim().replace(/\s/g, "");
80
+ if (processed === "" && !required) {
81
+ return null;
82
+ }
83
+ if (transform) {
84
+ processed = transform(processed);
85
+ }
86
+ if (bankCode && !processed.includes("-")) {
87
+ processed = `${bankCode}-${processed}`;
88
+ }
89
+ return processed;
90
+ };
91
+ const baseSchema = isRequired ? z.preprocess(preprocessFn, z.string()) : z.preprocess(preprocessFn, z.string().nullable());
92
+ const schema = baseSchema.superRefine((val, ctx) => {
93
+ if (val === null) return;
94
+ if (isRequired && (val === "" || val === "null" || val === "undefined")) {
95
+ ctx.addIssue({ code: "custom", message: getMessage("required") });
96
+ return;
97
+ }
98
+ if (val === null) return;
99
+ if (!isRequired && val === "") return;
100
+ let parsedBankCode;
101
+ let accountNumber;
102
+ if (val.includes("-")) {
103
+ const parts = val.split("-");
104
+ if (parts.length !== 2) {
105
+ ctx.addIssue({ code: "custom", message: getMessage("invalid") });
106
+ return;
107
+ }
108
+ parsedBankCode = parts[0];
109
+ accountNumber = parts[1];
110
+ } else {
111
+ accountNumber = val;
112
+ }
113
+ if (parsedBankCode !== void 0) {
114
+ if (!/^\d{3}$/.test(parsedBankCode)) {
115
+ ctx.addIssue({ code: "custom", message: getMessage("invalidBankCode") });
116
+ return;
117
+ }
118
+ if (validateBankCode && !(parsedBankCode in TAIWAN_BANK_CODES)) {
119
+ ctx.addIssue({ code: "custom", message: getMessage("invalidBankCode") });
120
+ return;
121
+ }
122
+ }
123
+ if (!/^\d{10,16}$/.test(accountNumber)) {
124
+ ctx.addIssue({ code: "custom", message: getMessage("invalidAccountNumber") });
125
+ return;
126
+ }
127
+ });
128
+ return schema;
129
+ }
130
+
131
+ export {
132
+ TAIWAN_BANK_CODES,
133
+ validateTaiwanBankAccount,
134
+ twBankAccount
135
+ };
@@ -0,0 +1,136 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+
4
+ var _chunkYWV2BBXNcjs = require('./chunk-YWV2BBXN.cjs');
5
+
6
+ // src/validators/common/text.ts
7
+ var _zod = require('zod');
8
+ function text(required, options) {
9
+ const { minLength, maxLength, startsWith, endsWith, includes, excludes, regex, trimMode = "trim", casing = "none", transform, notEmpty, defaultValue, i18n } = _nullishCoalesce(options, () => ( {}));
10
+ const isRequired = _nullishCoalesce(required, () => ( false));
11
+ const actualDefaultValue = _nullishCoalesce(defaultValue, () => ( (isRequired ? "" : null)));
12
+ const getMessage = (key, params) => {
13
+ if (i18n) {
14
+ const currentLocale = _chunkYWV2BBXNcjs.getLocale.call(void 0, );
15
+ const customMessages = i18n[currentLocale];
16
+ if (customMessages && customMessages[key]) {
17
+ const template = customMessages[key];
18
+ return template.replace(/\$\{(\w+)}/g, (_, k) => _nullishCoalesce(_optionalChain([params, 'optionalAccess', _2 => _2[k]]), () => ( "")));
19
+ }
20
+ }
21
+ return _chunkYWV2BBXNcjs.t.call(void 0, `common.text.${key}`, params);
22
+ };
23
+ const applyTrim = (str) => {
24
+ switch (trimMode) {
25
+ case "trimStart":
26
+ return str.trimStart();
27
+ case "trimEnd":
28
+ return str.trimEnd();
29
+ case "none":
30
+ return str;
31
+ default:
32
+ return str.trim();
33
+ }
34
+ };
35
+ const applyCasing = (str) => {
36
+ switch (casing) {
37
+ case "upper":
38
+ return str.toUpperCase();
39
+ case "lower":
40
+ return str.toLowerCase();
41
+ case "title":
42
+ return str.replace(/\w\S*/g, (txt) => txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase());
43
+ default:
44
+ return str;
45
+ }
46
+ };
47
+ const preprocessFn = (val) => {
48
+ if (val === "" || val === null || val === void 0) {
49
+ return actualDefaultValue;
50
+ }
51
+ let processed = String(val);
52
+ processed = applyTrim(processed);
53
+ processed = applyCasing(processed);
54
+ if (transform) {
55
+ processed = transform(processed);
56
+ }
57
+ return processed;
58
+ };
59
+ const baseSchema = isRequired ? _zod.z.preprocess(preprocessFn, _zod.z.string()) : _zod.z.preprocess(preprocessFn, _zod.z.string().nullable());
60
+ const schema = baseSchema.superRefine((val, ctx) => {
61
+ if (val === null) return;
62
+ if (isRequired && (val === "" || val === "null" || val === "undefined")) {
63
+ ctx.addIssue({
64
+ code: "custom",
65
+ message: getMessage("required")
66
+ });
67
+ return;
68
+ }
69
+ if (notEmpty && val !== null && val.trim() === "") {
70
+ ctx.addIssue({
71
+ code: "custom",
72
+ message: getMessage("notEmpty")
73
+ });
74
+ return;
75
+ }
76
+ if (val !== null && minLength !== void 0 && val.length < minLength) {
77
+ ctx.addIssue({
78
+ code: "custom",
79
+ message: getMessage("minLength", { minLength })
80
+ });
81
+ return;
82
+ }
83
+ if (val !== null && maxLength !== void 0 && val.length > maxLength) {
84
+ ctx.addIssue({
85
+ code: "custom",
86
+ message: getMessage("maxLength", { maxLength })
87
+ });
88
+ return;
89
+ }
90
+ if (val !== null && startsWith !== void 0 && !val.startsWith(startsWith)) {
91
+ ctx.addIssue({
92
+ code: "custom",
93
+ message: getMessage("startsWith", { startsWith })
94
+ });
95
+ return;
96
+ }
97
+ if (val !== null && endsWith !== void 0 && !val.endsWith(endsWith)) {
98
+ ctx.addIssue({
99
+ code: "custom",
100
+ message: getMessage("endsWith", { endsWith })
101
+ });
102
+ return;
103
+ }
104
+ if (val !== null && includes !== void 0 && !val.includes(includes)) {
105
+ ctx.addIssue({
106
+ code: "custom",
107
+ message: getMessage("includes", { includes })
108
+ });
109
+ return;
110
+ }
111
+ if (val !== null && excludes !== void 0) {
112
+ const excludeList = Array.isArray(excludes) ? excludes : [excludes];
113
+ for (const exclude of excludeList) {
114
+ if (val.includes(exclude)) {
115
+ ctx.addIssue({
116
+ code: "custom",
117
+ message: getMessage("excludes", { excludes: exclude })
118
+ });
119
+ return;
120
+ }
121
+ }
122
+ }
123
+ if (val !== null && regex !== void 0 && !regex.test(val)) {
124
+ ctx.addIssue({
125
+ code: "custom",
126
+ message: getMessage("invalid", { regex })
127
+ });
128
+ return;
129
+ }
130
+ });
131
+ return schema;
132
+ }
133
+
134
+
135
+
136
+ exports.text = text;
@@ -0,0 +1,177 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+
4
+ var _chunkYWV2BBXNcjs = require('./chunk-YWV2BBXN.cjs');
5
+
6
+ // src/validators/common/file.ts
7
+ var _zod = require('zod');
8
+ function file(required, options) {
9
+ const {
10
+ maxSize,
11
+ minSize,
12
+ type,
13
+ typeBlacklist,
14
+ extension,
15
+ extensionBlacklist,
16
+ namePattern,
17
+ nameBlacklist,
18
+ imageOnly = false,
19
+ documentOnly = false,
20
+ videoOnly = false,
21
+ audioOnly = false,
22
+ archiveOnly = false,
23
+ caseSensitive = false,
24
+ transform,
25
+ defaultValue,
26
+ i18n
27
+ } = _nullishCoalesce(options, () => ( {}));
28
+ const isRequired = _nullishCoalesce(required, () => ( false));
29
+ const getMessage = (key, params) => {
30
+ if (i18n) {
31
+ const currentLocale = _chunkYWV2BBXNcjs.getLocale.call(void 0, );
32
+ const customMessages = i18n[currentLocale];
33
+ if (customMessages && customMessages[key]) {
34
+ const template = customMessages[key];
35
+ return template.replace(/\$\{(\w+)}/g, (_, k) => _nullishCoalesce(_optionalChain([params, 'optionalAccess', _2 => _2[k]]), () => ( "")));
36
+ }
37
+ }
38
+ return _chunkYWV2BBXNcjs.t.call(void 0, `common.file.${key}`, params);
39
+ };
40
+ const imageTypes = ["image/jpeg", "image/jpg", "image/png", "image/gif", "image/webp", "image/svg+xml", "image/bmp", "image/tiff"];
41
+ const documentTypes = [
42
+ "application/pdf",
43
+ "application/msword",
44
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
45
+ "application/vnd.ms-excel",
46
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
47
+ "application/vnd.ms-powerpoint",
48
+ "application/vnd.openxmlformats-officedocument.presentationml.presentation",
49
+ "text/plain",
50
+ "text/csv"
51
+ ];
52
+ const videoTypes = ["video/mp4", "video/mpeg", "video/quicktime", "video/x-msvideo", "video/x-ms-wmv", "video/webm", "video/ogg"];
53
+ const audioTypes = ["audio/mpeg", "audio/wav", "audio/ogg", "audio/aac", "audio/webm", "audio/mp3", "audio/x-wav"];
54
+ const archiveTypes = ["application/zip", "application/x-rar-compressed", "application/x-7z-compressed", "application/x-tar", "application/gzip"];
55
+ const actualDefaultValue = _nullishCoalesce(defaultValue, () => ( null));
56
+ const fileOrNullSchema = _zod.z.union([_zod.z.instanceof(File), _zod.z.null()]);
57
+ const baseSchema = _zod.z.preprocess((val) => {
58
+ if (val === "" || val === null || val === void 0) {
59
+ return actualDefaultValue;
60
+ }
61
+ if (!(val instanceof File)) {
62
+ return val;
63
+ }
64
+ let processed = val;
65
+ if (transform) {
66
+ processed = transform(processed);
67
+ }
68
+ return processed;
69
+ }, fileOrNullSchema);
70
+ const schema = baseSchema.refine((val) => !isRequired || val !== null, {
71
+ message: getMessage("required")
72
+ }).refine((val) => val === null || val instanceof File, {
73
+ message: getMessage("invalid")
74
+ }).refine((val) => val === null || minSize === void 0 || val.size >= minSize, {
75
+ message: getMessage("minSize", { minSize: formatFileSize(minSize || 0) })
76
+ }).refine((val) => val === null || maxSize === void 0 || val.size <= maxSize, {
77
+ message: getMessage("maxSize", { maxSize: formatFileSize(maxSize || 0) })
78
+ }).refine((val) => val === null || !imageOnly || imageTypes.includes(val.type), {
79
+ message: getMessage("imageOnly")
80
+ }).refine((val) => val === null || !documentOnly || documentTypes.includes(val.type), {
81
+ message: getMessage("documentOnly")
82
+ }).refine((val) => val === null || !videoOnly || videoTypes.includes(val.type), {
83
+ message: getMessage("videoOnly")
84
+ }).refine((val) => val === null || !audioOnly || audioTypes.includes(val.type), {
85
+ message: getMessage("audioOnly")
86
+ }).refine((val) => val === null || !archiveOnly || archiveTypes.includes(val.type), {
87
+ message: getMessage("archiveOnly")
88
+ }).refine(
89
+ (val) => {
90
+ if (val === null || !typeBlacklist || typeBlacklist.length === 0) return true;
91
+ return !typeBlacklist.includes(val.type);
92
+ },
93
+ {
94
+ message: getMessage("type", { type: _optionalChain([typeBlacklist, 'optionalAccess', _3 => _3.join, 'call', _4 => _4(", ")]) || "" })
95
+ }
96
+ ).refine(
97
+ (val) => {
98
+ if (val === null || type === void 0) return true;
99
+ const allowedTypes = Array.isArray(type) ? type : [type];
100
+ return allowedTypes.includes(val.type);
101
+ },
102
+ {
103
+ message: getMessage("type", { type: Array.isArray(type) ? type.join(", ") : type || "" })
104
+ }
105
+ ).refine(
106
+ (val) => {
107
+ if (val === null || extensionBlacklist === void 0 || extensionBlacklist.length === 0) return true;
108
+ const fileExtension = getFileExtension(val.name, caseSensitive);
109
+ const normalizedBlacklist = extensionBlacklist.map((ext) => normalizeExtension(ext, caseSensitive));
110
+ return !normalizedBlacklist.includes(fileExtension);
111
+ },
112
+ {
113
+ message: getMessage("extensionBlacklist", { extension: _optionalChain([extensionBlacklist, 'optionalAccess', _5 => _5.join, 'call', _6 => _6(", ")]) || "" })
114
+ }
115
+ ).refine(
116
+ (val) => {
117
+ if (val === null || extension === void 0) return true;
118
+ const fileName = val.name;
119
+ const fileExtension = getFileExtension(fileName, caseSensitive);
120
+ const allowedExtensions = Array.isArray(extension) ? extension : [extension];
121
+ const normalizedExtensions = allowedExtensions.map((ext) => normalizeExtension(ext, caseSensitive));
122
+ return normalizedExtensions.includes(fileExtension);
123
+ },
124
+ {
125
+ message: getMessage("extension", { extension: Array.isArray(extension) ? extension.join(", ") : extension || "" })
126
+ }
127
+ ).refine(
128
+ (val) => {
129
+ if (val === null || namePattern === void 0) return true;
130
+ const pattern = typeof namePattern === "string" ? new RegExp(namePattern) : namePattern;
131
+ return pattern.test(val.name);
132
+ },
133
+ {
134
+ message: getMessage("name", { pattern: _optionalChain([namePattern, 'optionalAccess', _7 => _7.toString, 'call', _8 => _8()]) || "" })
135
+ }
136
+ ).refine(
137
+ (val) => {
138
+ if (val === null || nameBlacklist === void 0) return true;
139
+ const blacklistPatterns = Array.isArray(nameBlacklist) ? nameBlacklist : [nameBlacklist];
140
+ for (const blacklistPattern of blacklistPatterns) {
141
+ const pattern = typeof blacklistPattern === "string" ? new RegExp(blacklistPattern) : blacklistPattern;
142
+ if (pattern.test(val.name)) {
143
+ return false;
144
+ }
145
+ }
146
+ return true;
147
+ },
148
+ {
149
+ message: getMessage("nameBlacklist", { pattern: "" })
150
+ }
151
+ );
152
+ return schema;
153
+ }
154
+ function getFileExtension(fileName, caseSensitive) {
155
+ const lastDotIndex = fileName.lastIndexOf(".");
156
+ if (lastDotIndex === -1) return "";
157
+ const extension = fileName.substring(lastDotIndex);
158
+ return caseSensitive ? extension : extension.toLowerCase();
159
+ }
160
+ function normalizeExtension(extension, caseSensitive) {
161
+ const normalized = extension.startsWith(".") ? extension : `.${extension}`;
162
+ return caseSensitive ? normalized : normalized.toLowerCase();
163
+ }
164
+ function formatFileSize(bytes) {
165
+ const units = ["B", "KB", "MB", "GB", "TB"];
166
+ let size = bytes;
167
+ let unitIndex = 0;
168
+ while (size >= 1024 && unitIndex < units.length - 1) {
169
+ size /= 1024;
170
+ unitIndex++;
171
+ }
172
+ return `${Math.round(size * 100) / 100} ${units[unitIndex]}`;
173
+ }
174
+
175
+
176
+
177
+ exports.file = file;
@@ -0,0 +1,165 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+
4
+ var _chunkYWV2BBXNcjs = require('./chunk-YWV2BBXN.cjs');
5
+
6
+ // src/validators/common/number.ts
7
+ var _zod = require('zod');
8
+ function number(required, options) {
9
+ const { min, max, defaultValue, type = "both", positive, negative, nonNegative, nonPositive, multipleOf, precision, finite = true, transform, parseCommas = false, i18n } = _nullishCoalesce(options, () => ( {}));
10
+ const isRequired = _nullishCoalesce(required, () => ( false));
11
+ const getMessage = (key, params) => {
12
+ if (i18n) {
13
+ const currentLocale = _chunkYWV2BBXNcjs.getLocale.call(void 0, );
14
+ const customMessages = i18n[currentLocale];
15
+ if (customMessages && customMessages[key]) {
16
+ const template = customMessages[key];
17
+ return template.replace(/\$\{(\w+)}/g, (_, k) => _nullishCoalesce(_optionalChain([params, 'optionalAccess', _2 => _2[k]]), () => ( "")));
18
+ }
19
+ }
20
+ return _chunkYWV2BBXNcjs.t.call(void 0, `common.number.${key}`, params);
21
+ };
22
+ const actualDefaultValue = _nullishCoalesce(defaultValue, () => ( null));
23
+ const schema = _zod.z.preprocess(
24
+ (val) => {
25
+ if (val === "" || val === void 0 || val === null) {
26
+ return actualDefaultValue;
27
+ }
28
+ if (typeof val === "string") {
29
+ let processedVal = val.trim();
30
+ if (parseCommas) {
31
+ processedVal = processedVal.replace(/,/g, "");
32
+ }
33
+ const parsed = Number(processedVal);
34
+ if (isNaN(parsed)) {
35
+ return parsed;
36
+ }
37
+ if (transform) {
38
+ return transform(parsed);
39
+ }
40
+ return parsed;
41
+ }
42
+ if (typeof val === "number") {
43
+ if (transform && Number.isFinite(val)) {
44
+ return transform(val);
45
+ }
46
+ return val;
47
+ }
48
+ return val;
49
+ },
50
+ _zod.z.union([_zod.z.number(), _zod.z.null(), _zod.z.nan(), _zod.z.custom((val) => val === Infinity || val === -Infinity)])
51
+ ).superRefine((val, ctx) => {
52
+ if (isRequired && val === null) {
53
+ ctx.addIssue({
54
+ code: "custom",
55
+ message: getMessage("required")
56
+ });
57
+ return;
58
+ }
59
+ if (val === null) return;
60
+ if (isNaN(val)) {
61
+ if (type === "integer") {
62
+ ctx.addIssue({
63
+ code: "custom",
64
+ message: getMessage("integer")
65
+ });
66
+ } else if (type === "float") {
67
+ ctx.addIssue({
68
+ code: "custom",
69
+ message: getMessage("float")
70
+ });
71
+ } else {
72
+ ctx.addIssue({
73
+ code: "custom",
74
+ message: getMessage("invalid")
75
+ });
76
+ }
77
+ return;
78
+ }
79
+ if (finite && !Number.isFinite(val)) {
80
+ ctx.addIssue({
81
+ code: "custom",
82
+ message: getMessage("finite")
83
+ });
84
+ return;
85
+ }
86
+ if (type === "integer" && !Number.isInteger(val)) {
87
+ ctx.addIssue({
88
+ code: "custom",
89
+ message: getMessage("integer")
90
+ });
91
+ return;
92
+ }
93
+ if (type === "float" && Number.isInteger(val)) {
94
+ ctx.addIssue({
95
+ code: "custom",
96
+ message: getMessage("float")
97
+ });
98
+ return;
99
+ }
100
+ if (positive && val <= 0) {
101
+ ctx.addIssue({
102
+ code: "custom",
103
+ message: getMessage("positive")
104
+ });
105
+ return;
106
+ }
107
+ if (negative && val >= 0) {
108
+ ctx.addIssue({
109
+ code: "custom",
110
+ message: getMessage("negative")
111
+ });
112
+ return;
113
+ }
114
+ if (nonNegative && val < 0) {
115
+ ctx.addIssue({
116
+ code: "custom",
117
+ message: getMessage("nonNegative")
118
+ });
119
+ return;
120
+ }
121
+ if (nonPositive && val > 0) {
122
+ ctx.addIssue({
123
+ code: "custom",
124
+ message: getMessage("nonPositive")
125
+ });
126
+ return;
127
+ }
128
+ if (min !== void 0 && val < min) {
129
+ ctx.addIssue({
130
+ code: "custom",
131
+ message: getMessage("min", { min })
132
+ });
133
+ return;
134
+ }
135
+ if (max !== void 0 && val > max) {
136
+ ctx.addIssue({
137
+ code: "custom",
138
+ message: getMessage("max", { max })
139
+ });
140
+ return;
141
+ }
142
+ if (multipleOf !== void 0 && val % multipleOf !== 0) {
143
+ ctx.addIssue({
144
+ code: "custom",
145
+ message: getMessage("multipleOf", { multipleOf })
146
+ });
147
+ return;
148
+ }
149
+ if (precision !== void 0) {
150
+ const decimalPlaces = (val.toString().split(".")[1] || "").length;
151
+ if (decimalPlaces > precision) {
152
+ ctx.addIssue({
153
+ code: "custom",
154
+ message: getMessage("precision", { precision })
155
+ });
156
+ return;
157
+ }
158
+ }
159
+ });
160
+ return schema;
161
+ }
162
+
163
+
164
+
165
+ exports.number = number;