@hy_ong/zod-kit 0.2.0 → 0.2.2

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 (191) hide show
  1. package/.github/workflows/ci.yml +24 -0
  2. package/CLAUDE.md +64 -22
  3. package/dist/chunk-2SWEVDFZ.js +134 -0
  4. package/dist/chunk-32JI34CV.cjs +146 -0
  5. package/dist/chunk-42C5OHRK.js +71 -0
  6. package/dist/chunk-46VAH2BJ.js +160 -0
  7. package/dist/chunk-5JGTDL3Y.js +87 -0
  8. package/dist/chunk-5LEXCVLX.js +257 -0
  9. package/dist/chunk-6AAP4LPF.js +2606 -0
  10. package/dist/chunk-B4EZYZOK.cjs +215 -0
  11. package/dist/chunk-COYKBWTI.js +161 -0
  12. package/dist/chunk-DFJZ3NS2.cjs +151 -0
  13. package/dist/chunk-EDHT4LPO.js +118 -0
  14. package/dist/chunk-EGHL277K.cjs +165 -0
  15. package/dist/chunk-ERH4NIMU.cjs +69 -0
  16. package/dist/chunk-FM3EZ72O.js +165 -0
  17. package/dist/chunk-GJIRDBZJ.cjs +90 -0
  18. package/dist/chunk-H2XTEM4M.js +696 -0
  19. package/dist/chunk-HMSM6FFA.cjs +181 -0
  20. package/dist/chunk-HTEHINI7.cjs +177 -0
  21. package/dist/chunk-JOLSGZGN.cjs +696 -0
  22. package/dist/chunk-JXY7APBU.js +69 -0
  23. package/dist/chunk-K2UOY6TB.js +136 -0
  24. package/dist/chunk-KFOHKTFD.js +61 -0
  25. package/dist/chunk-L4HSIKTU.cjs +135 -0
  26. package/dist/chunk-LH7ZB4BK.js +124 -0
  27. package/dist/chunk-LL4ZWLGO.js +90 -0
  28. package/dist/chunk-M6MTP3NY.cjs +99 -0
  29. package/dist/chunk-MHJFYYGV.js +215 -0
  30. package/dist/chunk-MINMXGW3.js +135 -0
  31. package/dist/chunk-MM7IL2RG.js +181 -0
  32. package/dist/chunk-OPQJWHXN.cjs +301 -0
  33. package/dist/chunk-ORFHDJII.cjs +136 -0
  34. package/dist/chunk-ORVV4MCF.cjs +87 -0
  35. package/dist/chunk-QICQ6YEY.js +75 -0
  36. package/dist/chunk-RKUQREMW.js +127 -0
  37. package/dist/chunk-RO47DKQG.js +146 -0
  38. package/dist/chunk-RRPXIRTQ.cjs +257 -0
  39. package/dist/chunk-RYFG2GKM.cjs +118 -0
  40. package/dist/chunk-STNHTRG7.cjs +124 -0
  41. package/dist/chunk-TFGS34VD.cjs +71 -0
  42. package/dist/chunk-TQXDUMML.cjs +61 -0
  43. package/dist/chunk-UBK3VCVH.cjs +134 -0
  44. package/dist/chunk-UCOXAZJF.cjs +2606 -0
  45. package/dist/chunk-UQZKFAFX.js +130 -0
  46. package/dist/chunk-VB2KV2ZM.cjs +130 -0
  47. package/dist/chunk-WABKPFPK.js +151 -0
  48. package/dist/chunk-WDI4QJMQ.js +177 -0
  49. package/dist/chunk-YDH3L27K.cjs +127 -0
  50. package/dist/chunk-YIM3D2AD.js +99 -0
  51. package/dist/chunk-YPSEIDUR.cjs +160 -0
  52. package/dist/chunk-ZNJLWJX3.cjs +75 -0
  53. package/dist/chunk-ZTFCJCPO.cjs +161 -0
  54. package/dist/chunk-ZXUMK2RR.js +301 -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 +288 -0
  89. package/dist/common/id.d.ts +288 -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 -5255
  118. package/dist/index.d.cts +28 -3150
  119. package/dist/index.d.ts +28 -3150
  120. package/dist/index.js +135 -5131
  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 +132 -6
  162. package/src/i18n/locales/en-GB.json +51 -0
  163. package/src/i18n/locales/en-US.json +52 -1
  164. package/src/i18n/locales/id-ID.json +51 -0
  165. package/src/i18n/locales/ja-JP.json +51 -0
  166. package/src/i18n/locales/ko-KR.json +51 -0
  167. package/src/i18n/locales/ms-MY.json +51 -0
  168. package/src/i18n/locales/th-TH.json +51 -0
  169. package/src/i18n/locales/vi-VN.json +51 -0
  170. package/src/i18n/locales/zh-CN.json +51 -0
  171. package/src/i18n/locales/zh-TW.json +51 -0
  172. package/src/index.ts +10 -2
  173. package/src/validators/common/color.ts +192 -0
  174. package/src/validators/common/coordinate.ts +159 -0
  175. package/src/validators/common/credit-card.ts +134 -0
  176. package/src/validators/common/id.ts +45 -3
  177. package/src/validators/common/ip.ts +210 -0
  178. package/src/validators/taiwan/bank-account.ts +176 -0
  179. package/src/validators/taiwan/invoice.ts +84 -0
  180. package/src/validators/taiwan/license-plate.ts +110 -0
  181. package/src/validators/taiwan/passport.ts +103 -0
  182. package/tests/common/color.test.ts +587 -0
  183. package/tests/common/coordinate.test.ts +345 -0
  184. package/tests/common/credit-card.test.ts +378 -0
  185. package/tests/common/id.test.ts +68 -3
  186. package/tests/common/ip.test.ts +419 -0
  187. package/tests/taiwan/bank-account.test.ts +286 -0
  188. package/tests/taiwan/invoice.test.ts +227 -0
  189. package/tests/taiwan/license-plate.test.ts +280 -0
  190. package/tests/taiwan/passport.test.ts +277 -0
  191. package/tsup.config.ts +36 -0
@@ -0,0 +1,124 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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 _chunkUCOXAZJFcjs = require('./chunk-UCOXAZJF.cjs');
5
+
6
+ // src/validators/common/date.ts
7
+ var _zod = require('zod');
8
+ var _dayjs = require('dayjs'); var _dayjs2 = _interopRequireDefault(_dayjs);
9
+ var _customParseFormat = require('dayjs/plugin/customParseFormat'); var _customParseFormat2 = _interopRequireDefault(_customParseFormat);
10
+ var _isSameOrAfter = require('dayjs/plugin/isSameOrAfter'); var _isSameOrAfter2 = _interopRequireDefault(_isSameOrAfter);
11
+ var _isSameOrBefore = require('dayjs/plugin/isSameOrBefore'); var _isSameOrBefore2 = _interopRequireDefault(_isSameOrBefore);
12
+ var _isToday = require('dayjs/plugin/isToday'); var _isToday2 = _interopRequireDefault(_isToday);
13
+ var _weekday = require('dayjs/plugin/weekday'); var _weekday2 = _interopRequireDefault(_weekday);
14
+ _dayjs2.default.extend(_isSameOrAfter2.default);
15
+ _dayjs2.default.extend(_isSameOrBefore2.default);
16
+ _dayjs2.default.extend(_customParseFormat2.default);
17
+ _dayjs2.default.extend(_isToday2.default);
18
+ _dayjs2.default.extend(_weekday2.default);
19
+ function date(required, options) {
20
+ const {
21
+ min,
22
+ max,
23
+ format = "YYYY-MM-DD",
24
+ includes,
25
+ excludes,
26
+ mustBePast,
27
+ mustBeFuture,
28
+ mustBeToday,
29
+ mustNotBeToday,
30
+ weekdaysOnly,
31
+ weekendsOnly,
32
+ transform,
33
+ defaultValue = null,
34
+ i18n
35
+ } = _nullishCoalesce(options, () => ( {}));
36
+ const isRequired = _nullishCoalesce(required, () => ( false));
37
+ const actualDefaultValue = _nullishCoalesce(defaultValue, () => ( (isRequired ? "" : null)));
38
+ const getMessage = (key, params) => {
39
+ if (i18n) {
40
+ const currentLocale = _chunkUCOXAZJFcjs.getLocale.call(void 0, );
41
+ const customMessages = i18n[currentLocale];
42
+ if (customMessages && customMessages[key]) {
43
+ const template = customMessages[key];
44
+ return template.replace(/\$\{(\w+)}/g, (_, k) => _nullishCoalesce(_optionalChain([params, 'optionalAccess', _2 => _2[k]]), () => ( "")));
45
+ }
46
+ }
47
+ return _chunkUCOXAZJFcjs.t.call(void 0, `common.date.${key}`, params);
48
+ };
49
+ const preprocessFn = (val) => {
50
+ if (val === "" || val === null || val === void 0) {
51
+ return actualDefaultValue;
52
+ }
53
+ let processed = String(val).trim();
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({ code: "custom", message: getMessage("required") });
64
+ return;
65
+ }
66
+ if (val !== null && !_dayjs2.default.call(void 0, val, format, true).isValid()) {
67
+ ctx.addIssue({ code: "custom", message: getMessage("format", { format }) });
68
+ return;
69
+ }
70
+ const dateObj = _dayjs2.default.call(void 0, val, format);
71
+ if (val !== null && min !== void 0 && !dateObj.isSameOrAfter(_dayjs2.default.call(void 0, min, format))) {
72
+ ctx.addIssue({ code: "custom", message: getMessage("min", { min }) });
73
+ return;
74
+ }
75
+ if (val !== null && max !== void 0 && !dateObj.isSameOrBefore(_dayjs2.default.call(void 0, max, format))) {
76
+ ctx.addIssue({ code: "custom", message: getMessage("max", { max }) });
77
+ return;
78
+ }
79
+ if (val !== null && includes !== void 0 && !val.includes(includes)) {
80
+ ctx.addIssue({ code: "custom", message: getMessage("includes", { includes }) });
81
+ return;
82
+ }
83
+ if (val !== null && excludes !== void 0) {
84
+ const excludeList = Array.isArray(excludes) ? excludes : [excludes];
85
+ for (const exclude of excludeList) {
86
+ if (val.includes(exclude)) {
87
+ ctx.addIssue({ code: "custom", message: getMessage("excludes", { excludes: exclude }) });
88
+ return;
89
+ }
90
+ }
91
+ }
92
+ const today = _dayjs2.default.call(void 0, ).startOf("day");
93
+ const targetDate = dateObj.startOf("day");
94
+ if (val !== null && mustBePast && !targetDate.isBefore(today)) {
95
+ ctx.addIssue({ code: "custom", message: getMessage("past") });
96
+ return;
97
+ }
98
+ if (val !== null && mustBeFuture && !targetDate.isAfter(today)) {
99
+ ctx.addIssue({ code: "custom", message: getMessage("future") });
100
+ return;
101
+ }
102
+ if (val !== null && mustBeToday && !targetDate.isSame(today)) {
103
+ ctx.addIssue({ code: "custom", message: getMessage("today") });
104
+ return;
105
+ }
106
+ if (val !== null && mustNotBeToday && targetDate.isSame(today)) {
107
+ ctx.addIssue({ code: "custom", message: getMessage("notToday") });
108
+ return;
109
+ }
110
+ if (val !== null && weekdaysOnly && (dateObj.day() === 0 || dateObj.day() === 6)) {
111
+ ctx.addIssue({ code: "custom", message: getMessage("weekday") });
112
+ return;
113
+ }
114
+ if (val !== null && weekendsOnly && dateObj.day() !== 0 && dateObj.day() !== 6) {
115
+ ctx.addIssue({ code: "custom", message: getMessage("weekend") });
116
+ return;
117
+ }
118
+ });
119
+ return schema;
120
+ }
121
+
122
+
123
+
124
+ exports.date = date;
@@ -0,0 +1,71 @@
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 _chunkUCOXAZJFcjs = require('./chunk-UCOXAZJF.cjs');
5
+
6
+ // src/validators/common/boolean.ts
7
+ var _zod = require('zod');
8
+ function boolean(required, options) {
9
+ const {
10
+ defaultValue = null,
11
+ shouldBe,
12
+ truthyValues = [true, "true", 1, "1", "yes", "on"],
13
+ falsyValues = [false, "false", 0, "0", "no", "off"],
14
+ strict = false,
15
+ transform,
16
+ i18n
17
+ } = _nullishCoalesce(options, () => ( {}));
18
+ const isRequired = _nullishCoalesce(required, () => ( false));
19
+ const getMessage = (key, params) => {
20
+ if (i18n) {
21
+ const currentLocale = _chunkUCOXAZJFcjs.getLocale.call(void 0, );
22
+ const customMessages = i18n[currentLocale];
23
+ if (customMessages && customMessages[key]) {
24
+ const template = customMessages[key];
25
+ return template.replace(/\$\{(\w+)}/g, (_, k) => _nullishCoalesce(_optionalChain([params, 'optionalAccess', _2 => _2[k]]), () => ( "")));
26
+ }
27
+ }
28
+ return _chunkUCOXAZJFcjs.t.call(void 0, `common.boolean.${key}`, params);
29
+ };
30
+ let result = _zod.z.preprocess(
31
+ (val) => {
32
+ if (val === "" || val === void 0 || val === null) return defaultValue;
33
+ if (strict && typeof val !== "boolean" && val !== null) {
34
+ return val;
35
+ }
36
+ if (truthyValues.includes(val)) {
37
+ let processed = true;
38
+ if (transform) processed = transform(processed);
39
+ return processed;
40
+ }
41
+ if (falsyValues.includes(val)) {
42
+ let processed = false;
43
+ if (transform) processed = transform(processed);
44
+ return processed;
45
+ }
46
+ return val;
47
+ },
48
+ _zod.z.union([_zod.z.literal(true), _zod.z.literal(false), _zod.z.literal(null)])
49
+ );
50
+ if (isRequired && defaultValue === null) {
51
+ result = result.refine((val) => val !== null, { message: getMessage("required") });
52
+ }
53
+ if (shouldBe === true) {
54
+ result = result.refine((val) => val === true, { message: getMessage("shouldBeTrue") });
55
+ } else if (shouldBe === false) {
56
+ result = result.refine((val) => val === false, { message: getMessage("shouldBeFalse") });
57
+ }
58
+ if (strict) {
59
+ result = result.refine(
60
+ (val) => {
61
+ return val === null || typeof val === "boolean";
62
+ },
63
+ { message: getMessage("invalid") }
64
+ );
65
+ }
66
+ return result;
67
+ }
68
+
69
+
70
+
71
+ exports.boolean = boolean;
@@ -0,0 +1,61 @@
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 _chunkUCOXAZJFcjs = require('./chunk-UCOXAZJF.cjs');
5
+
6
+ // src/validators/taiwan/invoice.ts
7
+ var _zod = require('zod');
8
+ var INVOICE_PATTERN = /^[A-Z]{2}\d{8}$/;
9
+ var validateTaiwanInvoice = (value) => {
10
+ const cleaned = value.replace(/-/g, "");
11
+ return INVOICE_PATTERN.test(cleaned);
12
+ };
13
+ function twInvoice(required, options) {
14
+ const { transform, defaultValue, i18n } = _nullishCoalesce(options, () => ( {}));
15
+ const isRequired = _nullishCoalesce(required, () => ( false));
16
+ const actualDefaultValue = _nullishCoalesce(defaultValue, () => ( (isRequired ? "" : null)));
17
+ const getMessage = (key, params) => {
18
+ if (i18n) {
19
+ const currentLocale = _chunkUCOXAZJFcjs.getLocale.call(void 0, );
20
+ const customMessages = i18n[currentLocale];
21
+ if (customMessages && customMessages[key]) {
22
+ const template = customMessages[key];
23
+ return template.replace(/\$\{(\w+)}/g, (_, k) => _nullishCoalesce(_optionalChain([params, 'optionalAccess', _2 => _2[k]]), () => ( "")));
24
+ }
25
+ }
26
+ return _chunkUCOXAZJFcjs.t.call(void 0, `taiwan.invoice.${key}`, params);
27
+ };
28
+ const preprocessFn = (val) => {
29
+ if (val === "" || val === null || val === void 0) {
30
+ return actualDefaultValue;
31
+ }
32
+ let processed = String(val).trim().toUpperCase().replace(/-/g, "");
33
+ if (processed === "" && !required) {
34
+ return null;
35
+ }
36
+ if (transform) {
37
+ processed = transform(processed);
38
+ }
39
+ return processed;
40
+ };
41
+ const baseSchema = isRequired ? _zod.z.preprocess(preprocessFn, _zod.z.string()) : _zod.z.preprocess(preprocessFn, _zod.z.string().nullable());
42
+ const schema = baseSchema.superRefine((val, ctx) => {
43
+ if (val === null) return;
44
+ if (isRequired && (val === "" || val === "null" || val === "undefined")) {
45
+ ctx.addIssue({ code: "custom", message: getMessage("required") });
46
+ return;
47
+ }
48
+ if (val === null) return;
49
+ if (!isRequired && val === "") return;
50
+ if (!validateTaiwanInvoice(val)) {
51
+ ctx.addIssue({ code: "custom", message: getMessage("invalid") });
52
+ return;
53
+ }
54
+ });
55
+ return schema;
56
+ }
57
+
58
+
59
+
60
+
61
+ exports.validateTaiwanInvoice = validateTaiwanInvoice; exports.twInvoice = twInvoice;
@@ -0,0 +1,134 @@
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 _chunkUCOXAZJFcjs = require('./chunk-UCOXAZJF.cjs');
5
+
6
+ // src/validators/common/color.ts
7
+ var _zod = require('zod');
8
+ var HEX_RGB = /^#[0-9a-f]{3}$/i;
9
+ var HEX_RRGGBB = /^#[0-9a-f]{6}$/i;
10
+ var HEX_RRGGBBAA = /^#[0-9a-f]{8}$/i;
11
+ function isValidByte(n) {
12
+ return Number.isInteger(n) && n >= 0 && n <= 255;
13
+ }
14
+ function isValidAlpha(n) {
15
+ return n >= 0 && n <= 1;
16
+ }
17
+ function isValidHue(n) {
18
+ return n >= 0 && n <= 360;
19
+ }
20
+ function isValidPercentage(n) {
21
+ return n >= 0 && n <= 100;
22
+ }
23
+ function validateHex(value, allowAlpha) {
24
+ if (HEX_RGB.test(value) || HEX_RRGGBB.test(value)) return true;
25
+ if (allowAlpha && HEX_RRGGBBAA.test(value)) return true;
26
+ return false;
27
+ }
28
+ function validateRgb(value, allowAlpha) {
29
+ const rgbaMatch = value.match(/^rgba?\(\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)\s*(?:,\s*(-?\d+(?:\.\d+)?))?\s*\)$/);
30
+ if (!rgbaMatch) return false;
31
+ const r = Number(rgbaMatch[1]);
32
+ const g = Number(rgbaMatch[2]);
33
+ const b = Number(rgbaMatch[3]);
34
+ const a = rgbaMatch[4] !== void 0 ? Number(rgbaMatch[4]) : void 0;
35
+ if (!isValidByte(r) || !isValidByte(g) || !isValidByte(b)) return false;
36
+ if (a !== void 0) {
37
+ if (!allowAlpha) return false;
38
+ if (!isValidAlpha(a)) return false;
39
+ }
40
+ if (value.startsWith("rgba(") && a === void 0) return false;
41
+ if (value.startsWith("rgb(") && a !== void 0) return false;
42
+ return true;
43
+ }
44
+ function validateHsl(value, allowAlpha) {
45
+ const hslaMatch = value.match(/^hsla?\(\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*(?:,\s*(-?\d+(?:\.\d+)?))?\s*\)$/);
46
+ if (!hslaMatch) return false;
47
+ const h = Number(hslaMatch[1]);
48
+ const s = Number(hslaMatch[2]);
49
+ const l = Number(hslaMatch[3]);
50
+ const a = hslaMatch[4] !== void 0 ? Number(hslaMatch[4]) : void 0;
51
+ if (!isValidHue(h) || !isValidPercentage(s) || !isValidPercentage(l)) return false;
52
+ if (a !== void 0) {
53
+ if (!allowAlpha) return false;
54
+ if (!isValidAlpha(a)) return false;
55
+ }
56
+ if (value.startsWith("hsla(") && a === void 0) return false;
57
+ if (value.startsWith("hsl(") && a !== void 0) return false;
58
+ return true;
59
+ }
60
+ function validateColor(value, formats, allowAlpha) {
61
+ const hasAny = formats.includes("any");
62
+ if (hasAny) {
63
+ if (validateHex(value, allowAlpha)) return { valid: true };
64
+ if (validateRgb(value, allowAlpha)) return { valid: true };
65
+ if (validateHsl(value, allowAlpha)) return { valid: true };
66
+ return { valid: false };
67
+ }
68
+ for (const format of formats) {
69
+ if (format === "hex" && validateHex(value, allowAlpha)) return { valid: true };
70
+ if (format === "rgb" && validateRgb(value, allowAlpha)) return { valid: true };
71
+ if (format === "hsl" && validateHsl(value, allowAlpha)) return { valid: true };
72
+ }
73
+ if (formats.length === 1) {
74
+ return { valid: false, failedFormat: formats[0] };
75
+ }
76
+ return { valid: false };
77
+ }
78
+ function color(required, options) {
79
+ const { format = "any", allowAlpha = true, transform, defaultValue, i18n } = _nullishCoalesce(options, () => ( {}));
80
+ const isRequired = _nullishCoalesce(required, () => ( false));
81
+ const actualDefaultValue = _nullishCoalesce(defaultValue, () => ( (isRequired ? "" : null)));
82
+ const formats = Array.isArray(format) ? format : [format];
83
+ const getMessage = (key, params) => {
84
+ if (i18n) {
85
+ const currentLocale = _chunkUCOXAZJFcjs.getLocale.call(void 0, );
86
+ const customMessages = i18n[currentLocale];
87
+ if (customMessages && customMessages[key]) {
88
+ const template = customMessages[key];
89
+ return template.replace(/\$\{(\w+)}/g, (_, k) => _nullishCoalesce(_optionalChain([params, 'optionalAccess', _2 => _2[k]]), () => ( "")));
90
+ }
91
+ }
92
+ return _chunkUCOXAZJFcjs.t.call(void 0, `common.color.${key}`, params);
93
+ };
94
+ const preprocessFn = (val) => {
95
+ if (val === "" || val === null || val === void 0) {
96
+ return actualDefaultValue;
97
+ }
98
+ let processed = String(val).trim();
99
+ if (processed === "" && !required) {
100
+ return null;
101
+ }
102
+ if (transform) {
103
+ processed = transform(processed);
104
+ }
105
+ return processed;
106
+ };
107
+ const baseSchema = isRequired ? _zod.z.preprocess(preprocessFn, _zod.z.string()) : _zod.z.preprocess(preprocessFn, _zod.z.string().nullable());
108
+ const schema = baseSchema.superRefine((val, ctx) => {
109
+ if (val === null) return;
110
+ if (isRequired && (val === "" || val === "null" || val === "undefined")) {
111
+ ctx.addIssue({ code: "custom", message: getMessage("required") });
112
+ return;
113
+ }
114
+ if (!isRequired && val === "") return;
115
+ const result = validateColor(val, formats, allowAlpha);
116
+ if (!result.valid) {
117
+ const formatMessageMap = {
118
+ hex: "notHex",
119
+ rgb: "notRgb",
120
+ hsl: "notHsl",
121
+ any: "invalid"
122
+ };
123
+ const messageKey = result.failedFormat ? formatMessageMap[result.failedFormat] : "invalid";
124
+ ctx.addIssue({ code: "custom", message: getMessage(messageKey) });
125
+ return;
126
+ }
127
+ });
128
+ return schema;
129
+ }
130
+
131
+
132
+
133
+
134
+ exports.validateColor = validateColor; exports.color = color;