@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.
- package/.github/workflows/ci.yml +24 -0
- package/CLAUDE.md +64 -22
- package/dist/chunk-2SWEVDFZ.js +134 -0
- package/dist/chunk-32JI34CV.cjs +146 -0
- package/dist/chunk-42C5OHRK.js +71 -0
- package/dist/chunk-46VAH2BJ.js +160 -0
- package/dist/chunk-5JGTDL3Y.js +87 -0
- package/dist/chunk-5LEXCVLX.js +257 -0
- package/dist/chunk-6AAP4LPF.js +2606 -0
- package/dist/chunk-B4EZYZOK.cjs +215 -0
- package/dist/chunk-COYKBWTI.js +161 -0
- package/dist/chunk-DFJZ3NS2.cjs +151 -0
- package/dist/chunk-EDHT4LPO.js +118 -0
- package/dist/chunk-EGHL277K.cjs +165 -0
- package/dist/chunk-ERH4NIMU.cjs +69 -0
- package/dist/chunk-FM3EZ72O.js +165 -0
- package/dist/chunk-GJIRDBZJ.cjs +90 -0
- package/dist/chunk-H2XTEM4M.js +696 -0
- package/dist/chunk-HMSM6FFA.cjs +181 -0
- package/dist/chunk-HTEHINI7.cjs +177 -0
- package/dist/chunk-JOLSGZGN.cjs +696 -0
- package/dist/chunk-JXY7APBU.js +69 -0
- package/dist/chunk-K2UOY6TB.js +136 -0
- package/dist/chunk-KFOHKTFD.js +61 -0
- package/dist/chunk-L4HSIKTU.cjs +135 -0
- package/dist/chunk-LH7ZB4BK.js +124 -0
- package/dist/chunk-LL4ZWLGO.js +90 -0
- package/dist/chunk-M6MTP3NY.cjs +99 -0
- package/dist/chunk-MHJFYYGV.js +215 -0
- package/dist/chunk-MINMXGW3.js +135 -0
- package/dist/chunk-MM7IL2RG.js +181 -0
- package/dist/chunk-OPQJWHXN.cjs +301 -0
- package/dist/chunk-ORFHDJII.cjs +136 -0
- package/dist/chunk-ORVV4MCF.cjs +87 -0
- package/dist/chunk-QICQ6YEY.js +75 -0
- package/dist/chunk-RKUQREMW.js +127 -0
- package/dist/chunk-RO47DKQG.js +146 -0
- package/dist/chunk-RRPXIRTQ.cjs +257 -0
- package/dist/chunk-RYFG2GKM.cjs +118 -0
- package/dist/chunk-STNHTRG7.cjs +124 -0
- package/dist/chunk-TFGS34VD.cjs +71 -0
- package/dist/chunk-TQXDUMML.cjs +61 -0
- package/dist/chunk-UBK3VCVH.cjs +134 -0
- package/dist/chunk-UCOXAZJF.cjs +2606 -0
- package/dist/chunk-UQZKFAFX.js +130 -0
- package/dist/chunk-VB2KV2ZM.cjs +130 -0
- package/dist/chunk-WABKPFPK.js +151 -0
- package/dist/chunk-WDI4QJMQ.js +177 -0
- package/dist/chunk-YDH3L27K.cjs +127 -0
- package/dist/chunk-YIM3D2AD.js +99 -0
- package/dist/chunk-YPSEIDUR.cjs +160 -0
- package/dist/chunk-ZNJLWJX3.cjs +75 -0
- package/dist/chunk-ZTFCJCPO.cjs +161 -0
- package/dist/chunk-ZXUMK2RR.js +301 -0
- package/dist/common/boolean.cjs +7 -0
- package/dist/common/boolean.d.cts +119 -0
- package/dist/common/boolean.d.ts +119 -0
- package/dist/common/boolean.js +7 -0
- package/dist/common/color.cjs +9 -0
- package/dist/common/color.d.cts +26 -0
- package/dist/common/color.d.ts +26 -0
- package/dist/common/color.js +9 -0
- package/dist/common/coordinate.cjs +11 -0
- package/dist/common/coordinate.d.cts +23 -0
- package/dist/common/coordinate.d.ts +23 -0
- package/dist/common/coordinate.js +11 -0
- package/dist/common/credit-card.cjs +11 -0
- package/dist/common/credit-card.d.cts +22 -0
- package/dist/common/credit-card.d.ts +22 -0
- package/dist/common/credit-card.js +11 -0
- package/dist/common/date.cjs +7 -0
- package/dist/common/date.d.cts +174 -0
- package/dist/common/date.d.ts +174 -0
- package/dist/common/date.js +7 -0
- package/dist/common/datetime.cjs +15 -0
- package/dist/common/datetime.d.cts +301 -0
- package/dist/common/datetime.d.ts +301 -0
- package/dist/common/datetime.js +15 -0
- package/dist/common/email.cjs +7 -0
- package/dist/common/email.d.cts +149 -0
- package/dist/common/email.d.ts +149 -0
- package/dist/common/email.js +7 -0
- package/dist/common/file.cjs +7 -0
- package/dist/common/file.d.cts +178 -0
- package/dist/common/file.d.ts +178 -0
- package/dist/common/file.js +7 -0
- package/dist/common/id.cjs +13 -0
- package/dist/common/id.d.cts +288 -0
- package/dist/common/id.d.ts +288 -0
- package/dist/common/id.js +13 -0
- package/dist/common/ip.cjs +11 -0
- package/dist/common/ip.d.cts +25 -0
- package/dist/common/ip.d.ts +25 -0
- package/dist/common/ip.js +11 -0
- package/dist/common/number.cjs +7 -0
- package/dist/common/number.d.cts +167 -0
- package/dist/common/number.d.ts +167 -0
- package/dist/common/number.js +7 -0
- package/dist/common/password.cjs +7 -0
- package/dist/common/password.d.cts +192 -0
- package/dist/common/password.d.ts +192 -0
- package/dist/common/password.js +7 -0
- package/dist/common/text.cjs +7 -0
- package/dist/common/text.d.cts +156 -0
- package/dist/common/text.d.ts +156 -0
- package/dist/common/text.js +7 -0
- package/dist/common/time.cjs +15 -0
- package/dist/common/time.d.cts +268 -0
- package/dist/common/time.d.ts +268 -0
- package/dist/common/time.js +15 -0
- package/dist/common/url.cjs +7 -0
- package/dist/common/url.d.cts +196 -0
- package/dist/common/url.d.ts +196 -0
- package/dist/common/url.js +7 -0
- package/dist/config-CABSSvAp.d.cts +5 -0
- package/dist/config-CABSSvAp.d.ts +5 -0
- package/dist/index.cjs +180 -5255
- package/dist/index.d.cts +28 -3150
- package/dist/index.d.ts +28 -3150
- package/dist/index.js +135 -5131
- package/dist/taiwan/bank-account.cjs +11 -0
- package/dist/taiwan/bank-account.d.cts +22 -0
- package/dist/taiwan/bank-account.d.ts +22 -0
- package/dist/taiwan/bank-account.js +11 -0
- package/dist/taiwan/business-id.cjs +9 -0
- package/dist/taiwan/business-id.d.cts +133 -0
- package/dist/taiwan/business-id.d.ts +133 -0
- package/dist/taiwan/business-id.js +9 -0
- package/dist/taiwan/fax.cjs +9 -0
- package/dist/taiwan/fax.d.cts +157 -0
- package/dist/taiwan/fax.d.ts +157 -0
- package/dist/taiwan/fax.js +9 -0
- package/dist/taiwan/invoice.cjs +9 -0
- package/dist/taiwan/invoice.d.cts +17 -0
- package/dist/taiwan/invoice.d.ts +17 -0
- package/dist/taiwan/invoice.js +9 -0
- package/dist/taiwan/license-plate.cjs +9 -0
- package/dist/taiwan/license-plate.d.cts +19 -0
- package/dist/taiwan/license-plate.d.ts +19 -0
- package/dist/taiwan/license-plate.js +9 -0
- package/dist/taiwan/mobile.cjs +9 -0
- package/dist/taiwan/mobile.d.cts +146 -0
- package/dist/taiwan/mobile.d.ts +146 -0
- package/dist/taiwan/mobile.js +9 -0
- package/dist/taiwan/national-id.cjs +15 -0
- package/dist/taiwan/national-id.d.cts +214 -0
- package/dist/taiwan/national-id.d.ts +214 -0
- package/dist/taiwan/national-id.js +15 -0
- package/dist/taiwan/passport.cjs +9 -0
- package/dist/taiwan/passport.d.cts +19 -0
- package/dist/taiwan/passport.d.ts +19 -0
- package/dist/taiwan/passport.js +9 -0
- package/dist/taiwan/postal-code.cjs +17 -0
- package/dist/taiwan/postal-code.d.cts +237 -0
- package/dist/taiwan/postal-code.d.ts +237 -0
- package/dist/taiwan/postal-code.js +17 -0
- package/dist/taiwan/tel.cjs +9 -0
- package/dist/taiwan/tel.d.cts +162 -0
- package/dist/taiwan/tel.d.ts +162 -0
- package/dist/taiwan/tel.js +9 -0
- package/package.json +132 -6
- package/src/i18n/locales/en-GB.json +51 -0
- package/src/i18n/locales/en-US.json +52 -1
- package/src/i18n/locales/id-ID.json +51 -0
- package/src/i18n/locales/ja-JP.json +51 -0
- package/src/i18n/locales/ko-KR.json +51 -0
- package/src/i18n/locales/ms-MY.json +51 -0
- package/src/i18n/locales/th-TH.json +51 -0
- package/src/i18n/locales/vi-VN.json +51 -0
- package/src/i18n/locales/zh-CN.json +51 -0
- package/src/i18n/locales/zh-TW.json +51 -0
- package/src/index.ts +10 -2
- package/src/validators/common/color.ts +192 -0
- package/src/validators/common/coordinate.ts +159 -0
- package/src/validators/common/credit-card.ts +134 -0
- package/src/validators/common/id.ts +45 -3
- package/src/validators/common/ip.ts +210 -0
- package/src/validators/taiwan/bank-account.ts +176 -0
- package/src/validators/taiwan/invoice.ts +84 -0
- package/src/validators/taiwan/license-plate.ts +110 -0
- package/src/validators/taiwan/passport.ts +103 -0
- package/tests/common/color.test.ts +587 -0
- package/tests/common/coordinate.test.ts +345 -0
- package/tests/common/credit-card.test.ts +378 -0
- package/tests/common/id.test.ts +68 -3
- package/tests/common/ip.test.ts +419 -0
- package/tests/taiwan/bank-account.test.ts +286 -0
- package/tests/taiwan/invoice.test.ts +227 -0
- package/tests/taiwan/license-plate.test.ts +280 -0
- package/tests/taiwan/passport.test.ts +277 -0
- package/tsup.config.ts +36 -0
|
@@ -0,0 +1,301 @@
|
|
|
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/datetime.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
|
+
var _timezone = require('dayjs/plugin/timezone'); var _timezone2 = _interopRequireDefault(_timezone);
|
|
15
|
+
var _utc = require('dayjs/plugin/utc'); var _utc2 = _interopRequireDefault(_utc);
|
|
16
|
+
_dayjs2.default.extend(_isSameOrAfter2.default);
|
|
17
|
+
_dayjs2.default.extend(_isSameOrBefore2.default);
|
|
18
|
+
_dayjs2.default.extend(_customParseFormat2.default);
|
|
19
|
+
_dayjs2.default.extend(_isToday2.default);
|
|
20
|
+
_dayjs2.default.extend(_weekday2.default);
|
|
21
|
+
_dayjs2.default.extend(_timezone2.default);
|
|
22
|
+
_dayjs2.default.extend(_utc2.default);
|
|
23
|
+
var DATETIME_PATTERNS = {
|
|
24
|
+
"YYYY-MM-DD HH:mm": /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/,
|
|
25
|
+
"YYYY-MM-DD HH:mm:ss": /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/,
|
|
26
|
+
"YYYY-MM-DD hh:mm A": /^\d{4}-\d{2}-\d{2} \d{1,2}:\d{2} (AM|PM)$/i,
|
|
27
|
+
"YYYY-MM-DD hh:mm:ss A": /^\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2} (AM|PM)$/i,
|
|
28
|
+
"DD/MM/YYYY HH:mm": /^\d{1,2}\/\d{1,2}\/\d{4} \d{2}:\d{2}$/,
|
|
29
|
+
"DD/MM/YYYY HH:mm:ss": /^\d{1,2}\/\d{1,2}\/\d{4} \d{2}:\d{2}:\d{2}$/,
|
|
30
|
+
"DD/MM/YYYY hh:mm A": /^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2} (AM|PM)$/i,
|
|
31
|
+
"MM/DD/YYYY HH:mm": /^\d{1,2}\/\d{1,2}\/\d{4} \d{2}:\d{2}$/,
|
|
32
|
+
"MM/DD/YYYY hh:mm A": /^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2} (AM|PM)$/i,
|
|
33
|
+
"YYYY/MM/DD HH:mm": /^\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}$/,
|
|
34
|
+
"DD-MM-YYYY HH:mm": /^\d{1,2}-\d{1,2}-\d{4} \d{2}:\d{2}$/,
|
|
35
|
+
"MM-DD-YYYY HH:mm": /^\d{1,2}-\d{1,2}-\d{4} \d{2}:\d{2}$/,
|
|
36
|
+
ISO: /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?$/,
|
|
37
|
+
RFC: /^[A-Za-z]{3}, \d{1,2} [A-Za-z]{3} \d{4} \d{2}:\d{2}:\d{2} [A-Z]{3}$/,
|
|
38
|
+
UNIX: /^\d{10}$/
|
|
39
|
+
};
|
|
40
|
+
var validateDateTimeFormat = (value, format) => {
|
|
41
|
+
const pattern = DATETIME_PATTERNS[format];
|
|
42
|
+
if (!pattern.test(value.trim())) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
const parsed = parseDateTimeValue(value, format);
|
|
46
|
+
return parsed !== null;
|
|
47
|
+
};
|
|
48
|
+
var parseDateTimeValue = (value, format, timezone2) => {
|
|
49
|
+
try {
|
|
50
|
+
const cleanValue = value.trim();
|
|
51
|
+
let parsed;
|
|
52
|
+
switch (format) {
|
|
53
|
+
case "ISO":
|
|
54
|
+
parsed = _dayjs2.default.call(void 0, cleanValue);
|
|
55
|
+
break;
|
|
56
|
+
case "RFC":
|
|
57
|
+
parsed = _dayjs2.default.call(void 0, cleanValue);
|
|
58
|
+
break;
|
|
59
|
+
case "UNIX":
|
|
60
|
+
parsed = _dayjs2.default.unix(parseInt(cleanValue, 10));
|
|
61
|
+
break;
|
|
62
|
+
default:
|
|
63
|
+
parsed = _dayjs2.default.call(void 0, cleanValue, format, true);
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
if (!parsed.isValid()) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
if (timezone2) {
|
|
70
|
+
parsed = parsed.tz(timezone2);
|
|
71
|
+
}
|
|
72
|
+
return parsed;
|
|
73
|
+
} catch (e) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
var normalizeDateTimeValue = (value, format, timezone2) => {
|
|
78
|
+
const parsed = parseDateTimeValue(value, format, timezone2);
|
|
79
|
+
if (!parsed) return null;
|
|
80
|
+
switch (format) {
|
|
81
|
+
case "ISO":
|
|
82
|
+
return parsed.toISOString();
|
|
83
|
+
case "RFC":
|
|
84
|
+
return parsed.format("ddd, DD MMM YYYY HH:mm:ss [GMT]");
|
|
85
|
+
case "UNIX":
|
|
86
|
+
return parsed.unix().toString();
|
|
87
|
+
default:
|
|
88
|
+
return parsed.format(format);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
function datetime(required, options) {
|
|
92
|
+
const {
|
|
93
|
+
format = "YYYY-MM-DD HH:mm",
|
|
94
|
+
min,
|
|
95
|
+
max,
|
|
96
|
+
minHour,
|
|
97
|
+
maxHour,
|
|
98
|
+
allowedHours,
|
|
99
|
+
minuteStep,
|
|
100
|
+
timezone: timezone2,
|
|
101
|
+
includes,
|
|
102
|
+
excludes,
|
|
103
|
+
regex,
|
|
104
|
+
trimMode = "trim",
|
|
105
|
+
casing = "none",
|
|
106
|
+
mustBePast,
|
|
107
|
+
mustBeFuture,
|
|
108
|
+
mustBeToday,
|
|
109
|
+
mustNotBeToday,
|
|
110
|
+
weekdaysOnly,
|
|
111
|
+
weekendsOnly,
|
|
112
|
+
whitelist,
|
|
113
|
+
whitelistOnly = false,
|
|
114
|
+
transform,
|
|
115
|
+
defaultValue,
|
|
116
|
+
i18n
|
|
117
|
+
} = _nullishCoalesce(options, () => ( {}));
|
|
118
|
+
const isRequired = _nullishCoalesce(required, () => ( false));
|
|
119
|
+
const actualDefaultValue = _nullishCoalesce(defaultValue, () => ( (isRequired ? "" : null)));
|
|
120
|
+
const getMessage = (key, params) => {
|
|
121
|
+
if (i18n) {
|
|
122
|
+
const currentLocale = _chunkUCOXAZJFcjs.getLocale.call(void 0, );
|
|
123
|
+
const customMessages = i18n[currentLocale];
|
|
124
|
+
if (customMessages && customMessages[key]) {
|
|
125
|
+
const template = customMessages[key];
|
|
126
|
+
return template.replace(/\$\{(\w+)}/g, (_, k) => _nullishCoalesce(_optionalChain([params, 'optionalAccess', _2 => _2[k]]), () => ( "")));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return _chunkUCOXAZJFcjs.t.call(void 0, `common.datetime.${key}`, params);
|
|
130
|
+
};
|
|
131
|
+
const preprocessFn = (val) => {
|
|
132
|
+
if (val === null || val === void 0) {
|
|
133
|
+
return actualDefaultValue;
|
|
134
|
+
}
|
|
135
|
+
let processed = String(val);
|
|
136
|
+
switch (trimMode) {
|
|
137
|
+
case "trim":
|
|
138
|
+
processed = processed.trim();
|
|
139
|
+
break;
|
|
140
|
+
case "trimStart":
|
|
141
|
+
processed = processed.trimStart();
|
|
142
|
+
break;
|
|
143
|
+
case "trimEnd":
|
|
144
|
+
processed = processed.trimEnd();
|
|
145
|
+
break;
|
|
146
|
+
case "none":
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
if (processed === "") {
|
|
150
|
+
if (whitelist && whitelist.includes("")) {
|
|
151
|
+
return "";
|
|
152
|
+
}
|
|
153
|
+
if (!isRequired) {
|
|
154
|
+
return actualDefaultValue;
|
|
155
|
+
}
|
|
156
|
+
return actualDefaultValue;
|
|
157
|
+
}
|
|
158
|
+
switch (casing) {
|
|
159
|
+
case "upper":
|
|
160
|
+
processed = processed.toUpperCase();
|
|
161
|
+
break;
|
|
162
|
+
case "lower":
|
|
163
|
+
processed = processed.toLowerCase();
|
|
164
|
+
break;
|
|
165
|
+
case "none":
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
if (transform) {
|
|
169
|
+
processed = transform(processed);
|
|
170
|
+
}
|
|
171
|
+
return processed;
|
|
172
|
+
};
|
|
173
|
+
const baseSchema = isRequired ? _zod.z.preprocess(preprocessFn, _zod.z.string()) : _zod.z.preprocess(preprocessFn, _zod.z.string().nullable());
|
|
174
|
+
const schema = baseSchema.superRefine((val, ctx) => {
|
|
175
|
+
if (val === null) return;
|
|
176
|
+
if (isRequired && (val === "" || val === "null" || val === "undefined")) {
|
|
177
|
+
ctx.addIssue({ code: "custom", message: getMessage("required") });
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (val === null) return;
|
|
181
|
+
if (!isRequired && val === "") return;
|
|
182
|
+
if (whitelist && whitelist.length > 0) {
|
|
183
|
+
if (whitelist.includes(val)) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (whitelistOnly) {
|
|
187
|
+
ctx.addIssue({ code: "custom", message: getMessage("notInWhitelist") });
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (regex) {
|
|
192
|
+
if (!regex.test(val)) {
|
|
193
|
+
ctx.addIssue({ code: "custom", message: getMessage("customRegex") });
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
} else {
|
|
197
|
+
if (!validateDateTimeFormat(val, format)) {
|
|
198
|
+
ctx.addIssue({ code: "custom", message: getMessage("format", { format }) });
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (includes && !val.includes(includes)) {
|
|
203
|
+
ctx.addIssue({ code: "custom", message: getMessage("includes", { includes }) });
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
if (excludes) {
|
|
207
|
+
const excludeList = Array.isArray(excludes) ? excludes : [excludes];
|
|
208
|
+
for (const exclude of excludeList) {
|
|
209
|
+
if (val.includes(exclude)) {
|
|
210
|
+
ctx.addIssue({ code: "custom", message: getMessage("excludes", { excludes: exclude }) });
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (regex) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const parsed = parseDateTimeValue(val, format, timezone2);
|
|
219
|
+
if (!parsed) {
|
|
220
|
+
const pattern = DATETIME_PATTERNS[format];
|
|
221
|
+
if (!pattern.test(val.trim())) {
|
|
222
|
+
ctx.addIssue({ code: "custom", message: getMessage("format", { format }) });
|
|
223
|
+
return;
|
|
224
|
+
} else {
|
|
225
|
+
ctx.addIssue({ code: "custom", message: getMessage("invalid") });
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
const hour = parsed.hour();
|
|
230
|
+
if (minHour !== void 0 && hour < minHour) {
|
|
231
|
+
ctx.addIssue({ code: "custom", message: getMessage("hour", { minHour, maxHour: _nullishCoalesce(maxHour, () => ( 23)) }) });
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
if (maxHour !== void 0 && hour > maxHour) {
|
|
235
|
+
ctx.addIssue({ code: "custom", message: getMessage("hour", { minHour: _nullishCoalesce(minHour, () => ( 0)), maxHour }) });
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
if (allowedHours && allowedHours.length > 0) {
|
|
239
|
+
if (!allowedHours.includes(hour)) {
|
|
240
|
+
ctx.addIssue({ code: "custom", message: getMessage("hour", { allowedHours: allowedHours.join(", ") }) });
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
const minute = parsed.minute();
|
|
245
|
+
if (minuteStep !== void 0 && minute % minuteStep !== 0) {
|
|
246
|
+
ctx.addIssue({ code: "custom", message: getMessage("minute", { minuteStep }) });
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (min) {
|
|
250
|
+
const minParsed = typeof min === "string" ? parseDateTimeValue(min, format, timezone2) : _dayjs2.default.call(void 0, min);
|
|
251
|
+
if (minParsed && parsed.isBefore(minParsed)) {
|
|
252
|
+
const minFormatted = typeof min === "string" ? min : minParsed.format(format);
|
|
253
|
+
ctx.addIssue({ code: "custom", message: getMessage("min", { min: minFormatted }) });
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (max) {
|
|
258
|
+
const maxParsed = typeof max === "string" ? parseDateTimeValue(max, format, timezone2) : _dayjs2.default.call(void 0, max);
|
|
259
|
+
if (maxParsed && parsed.isAfter(maxParsed)) {
|
|
260
|
+
const maxFormatted = typeof max === "string" ? max : maxParsed.format(format);
|
|
261
|
+
ctx.addIssue({ code: "custom", message: getMessage("max", { max: maxFormatted }) });
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
const now = timezone2 ? _dayjs2.default.call(void 0, ).tz(timezone2) : _dayjs2.default.call(void 0, );
|
|
266
|
+
if (mustBePast && !parsed.isBefore(now)) {
|
|
267
|
+
ctx.addIssue({ code: "custom", message: getMessage("past") });
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
if (mustBeFuture && !parsed.isAfter(now)) {
|
|
271
|
+
ctx.addIssue({ code: "custom", message: getMessage("future") });
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (mustBeToday && !parsed.isSame(now, "day")) {
|
|
275
|
+
ctx.addIssue({ code: "custom", message: getMessage("today") });
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
if (mustNotBeToday && parsed.isSame(now, "day")) {
|
|
279
|
+
ctx.addIssue({ code: "custom", message: getMessage("notToday") });
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
const dayOfWeek = parsed.day();
|
|
283
|
+
if (weekdaysOnly && (dayOfWeek === 0 || dayOfWeek === 6)) {
|
|
284
|
+
ctx.addIssue({ code: "custom", message: getMessage("weekday") });
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (weekendsOnly && dayOfWeek !== 0 && dayOfWeek !== 6) {
|
|
288
|
+
ctx.addIssue({ code: "custom", message: getMessage("weekend") });
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
return schema;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
exports.DATETIME_PATTERNS = DATETIME_PATTERNS; exports.validateDateTimeFormat = validateDateTimeFormat; exports.parseDateTimeValue = parseDateTimeValue; exports.normalizeDateTimeValue = normalizeDateTimeValue; exports.datetime = datetime;
|
|
@@ -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 _chunkUCOXAZJFcjs = require('./chunk-UCOXAZJF.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 = _chunkUCOXAZJFcjs.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 _chunkUCOXAZJFcjs.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,87 @@
|
|
|
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/business-id.ts
|
|
7
|
+
var _zod = require('zod');
|
|
8
|
+
var validateTaiwanBusinessId = (value) => {
|
|
9
|
+
if (!/^\d{8}$/.test(value)) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const digits = value.split("").map(Number);
|
|
13
|
+
const coefficients = [1, 2, 1, 2, 1, 2, 4];
|
|
14
|
+
let sum = 0;
|
|
15
|
+
for (let i = 0; i < 7; i++) {
|
|
16
|
+
const product = digits[i] * coefficients[i];
|
|
17
|
+
sum += Math.floor(product / 10) + product % 10;
|
|
18
|
+
}
|
|
19
|
+
sum += digits[7];
|
|
20
|
+
if (sum % 5 === 0) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
if (sum % 10 === 0) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
if (digits[6] === 7) {
|
|
27
|
+
let altSum = 0;
|
|
28
|
+
for (let i = 0; i < 7; i++) {
|
|
29
|
+
const product = digits[i] * coefficients[i];
|
|
30
|
+
altSum += Math.floor(product / 10) + product % 10;
|
|
31
|
+
}
|
|
32
|
+
altSum += 1 + digits[7];
|
|
33
|
+
if (altSum % 5 === 0 || altSum % 10 === 0) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
};
|
|
39
|
+
function twBusinessId(required, options) {
|
|
40
|
+
const { transform, defaultValue, i18n } = _nullishCoalesce(options, () => ( {}));
|
|
41
|
+
const isRequired = _nullishCoalesce(required, () => ( false));
|
|
42
|
+
const actualDefaultValue = _nullishCoalesce(defaultValue, () => ( (isRequired ? "" : null)));
|
|
43
|
+
const getMessage = (key, params) => {
|
|
44
|
+
if (i18n) {
|
|
45
|
+
const currentLocale = _chunkUCOXAZJFcjs.getLocale.call(void 0, );
|
|
46
|
+
const customMessages = i18n[currentLocale];
|
|
47
|
+
if (customMessages && customMessages[key]) {
|
|
48
|
+
const template = customMessages[key];
|
|
49
|
+
return template.replace(/\$\{(\w+)}/g, (_, k) => _nullishCoalesce(_optionalChain([params, 'optionalAccess', _2 => _2[k]]), () => ( "")));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return _chunkUCOXAZJFcjs.t.call(void 0, `taiwan.businessId.${key}`, params);
|
|
53
|
+
};
|
|
54
|
+
const preprocessFn = (val) => {
|
|
55
|
+
if (val === "" || val === null || val === void 0) {
|
|
56
|
+
return actualDefaultValue;
|
|
57
|
+
}
|
|
58
|
+
let processed = String(val).trim();
|
|
59
|
+
if (processed === "" && !required) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
if (transform) {
|
|
63
|
+
processed = transform(processed);
|
|
64
|
+
}
|
|
65
|
+
return processed;
|
|
66
|
+
};
|
|
67
|
+
const baseSchema = isRequired ? _zod.z.preprocess(preprocessFn, _zod.z.string()) : _zod.z.preprocess(preprocessFn, _zod.z.string().nullable());
|
|
68
|
+
const schema = baseSchema.superRefine((val, ctx) => {
|
|
69
|
+
if (val === null) return;
|
|
70
|
+
if (isRequired && (val === "" || val === "null" || val === "undefined")) {
|
|
71
|
+
ctx.addIssue({ code: "custom", message: getMessage("required") });
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (val === null) return;
|
|
75
|
+
if (!isRequired && val === "") return;
|
|
76
|
+
if (!validateTaiwanBusinessId(val)) {
|
|
77
|
+
ctx.addIssue({ code: "custom", message: getMessage("invalid") });
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
return schema;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
exports.validateTaiwanBusinessId = validateTaiwanBusinessId; exports.twBusinessId = twBusinessId;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getLocale,
|
|
3
|
+
t
|
|
4
|
+
} from "./chunk-6AAP4LPF.js";
|
|
5
|
+
|
|
6
|
+
// src/validators/taiwan/passport.ts
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
var PASSPORT_TYPE_DIGIT = {
|
|
9
|
+
diplomatic: "0",
|
|
10
|
+
official: "1",
|
|
11
|
+
ordinary: "2",
|
|
12
|
+
travel: "3"
|
|
13
|
+
};
|
|
14
|
+
var validateTaiwanPassport = (value) => {
|
|
15
|
+
if (!/^\d{9}$/.test(value)) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const firstDigit = parseInt(value[0], 10);
|
|
19
|
+
return firstDigit >= 0 && firstDigit <= 3;
|
|
20
|
+
};
|
|
21
|
+
function twPassport(required, options) {
|
|
22
|
+
const { passportType = "any", transform, defaultValue, i18n } = options ?? {};
|
|
23
|
+
const isRequired = required ?? false;
|
|
24
|
+
const actualDefaultValue = defaultValue ?? (isRequired ? "" : null);
|
|
25
|
+
const getMessage = (key, params) => {
|
|
26
|
+
if (i18n) {
|
|
27
|
+
const currentLocale = getLocale();
|
|
28
|
+
const customMessages = i18n[currentLocale];
|
|
29
|
+
if (customMessages && customMessages[key]) {
|
|
30
|
+
const template = customMessages[key];
|
|
31
|
+
return template.replace(/\$\{(\w+)}/g, (_, k) => params?.[k] ?? "");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return t(`taiwan.passport.${key}`, params);
|
|
35
|
+
};
|
|
36
|
+
const preprocessFn = (val) => {
|
|
37
|
+
if (val === "" || val === null || val === void 0) {
|
|
38
|
+
return actualDefaultValue;
|
|
39
|
+
}
|
|
40
|
+
let processed = String(val).trim();
|
|
41
|
+
if (processed === "" && !required) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
if (transform) {
|
|
45
|
+
processed = transform(processed);
|
|
46
|
+
}
|
|
47
|
+
return processed;
|
|
48
|
+
};
|
|
49
|
+
const baseSchema = isRequired ? z.preprocess(preprocessFn, z.string()) : z.preprocess(preprocessFn, z.string().nullable());
|
|
50
|
+
const schema = baseSchema.superRefine((val, ctx) => {
|
|
51
|
+
if (val === null) return;
|
|
52
|
+
if (isRequired && (val === "" || val === "null" || val === "undefined")) {
|
|
53
|
+
ctx.addIssue({ code: "custom", message: getMessage("required") });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (!isRequired && val === "") return;
|
|
57
|
+
if (!validateTaiwanPassport(val)) {
|
|
58
|
+
ctx.addIssue({ code: "custom", message: getMessage("invalid") });
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (passportType !== "any") {
|
|
62
|
+
const expectedDigit = PASSPORT_TYPE_DIGIT[passportType];
|
|
63
|
+
if (val[0] !== expectedDigit) {
|
|
64
|
+
ctx.addIssue({ code: "custom", message: getMessage("invalid") });
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
return schema;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export {
|
|
73
|
+
validateTaiwanPassport,
|
|
74
|
+
twPassport
|
|
75
|
+
};
|