@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.
- package/.github/workflows/ci.yml +24 -0
- package/CLAUDE.md +184 -0
- package/dist/chunk-36NWHESN.js +124 -0
- package/dist/chunk-4LYZAO3P.js +165 -0
- package/dist/chunk-5GAZQDVS.cjs +206 -0
- package/dist/chunk-5LS4DSRQ.cjs +127 -0
- package/dist/chunk-5OGW2ERW.js +181 -0
- package/dist/chunk-5ZEKWPSE.cjs +69 -0
- package/dist/chunk-6OGDPSWT.js +135 -0
- package/dist/chunk-6X22I6NQ.cjs +136 -0
- package/dist/chunk-77KZUPPN.cjs +177 -0
- package/dist/chunk-AANSHH2O.cjs +165 -0
- package/dist/chunk-AI72FMOF.cjs +130 -0
- package/dist/chunk-AWV2IT66.js +146 -0
- package/dist/chunk-B3U5G3AA.js +160 -0
- package/dist/chunk-CFFCBWYL.cjs +99 -0
- package/dist/chunk-DPXRMSB2.js +130 -0
- package/dist/chunk-DRXPGQM6.cjs +135 -0
- package/dist/chunk-EAU42EVH.js +161 -0
- package/dist/chunk-FC6VDOC7.js +206 -0
- package/dist/chunk-FVO4743A.cjs +134 -0
- package/dist/chunk-G6DV7LX7.cjs +161 -0
- package/dist/chunk-I2RJMDXN.js +90 -0
- package/dist/chunk-IJEEM3DI.js +136 -0
- package/dist/chunk-JBNCMS42.cjs +151 -0
- package/dist/chunk-JZ2SHRGZ.js +87 -0
- package/dist/chunk-KARFFIMP.js +696 -0
- package/dist/chunk-LIQSVJLS.js +177 -0
- package/dist/chunk-LKPXHW5N.cjs +181 -0
- package/dist/chunk-MAQRXYE6.js +118 -0
- package/dist/chunk-MCDESS3T.js +69 -0
- package/dist/chunk-MG25BEV4.cjs +160 -0
- package/dist/chunk-NKCYXBGX.js +99 -0
- package/dist/chunk-OEK7QSQP.js +75 -0
- package/dist/chunk-OMFQ7Z63.cjs +696 -0
- package/dist/chunk-OP4KV3BY.cjs +124 -0
- package/dist/chunk-P2NONIMS.js +257 -0
- package/dist/chunk-P364KRO5.js +61 -0
- package/dist/chunk-PGSDXR2I.js +71 -0
- package/dist/chunk-PL2GERLG.cjs +61 -0
- package/dist/chunk-R5G4V7C6.cjs +75 -0
- package/dist/chunk-RKHX3DGH.js +127 -0
- package/dist/chunk-TSHL7ZO2.js +134 -0
- package/dist/chunk-UFNVCUPQ.cjs +301 -0
- package/dist/chunk-VCRKYMJM.js +301 -0
- package/dist/chunk-VDOAPLA6.cjs +257 -0
- package/dist/chunk-VP5CCP5F.cjs +90 -0
- package/dist/chunk-W2EWMV3A.cjs +87 -0
- package/dist/chunk-WWRFBLCR.cjs +146 -0
- package/dist/chunk-YALLOVNO.cjs +118 -0
- package/dist/chunk-YAU6JCYL.cjs +71 -0
- package/dist/chunk-YWV2BBXN.cjs +2526 -0
- package/dist/chunk-ZBOQCXD4.js +2526 -0
- package/dist/chunk-ZFQQXWNB.js +151 -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 +262 -0
- package/dist/common/id.d.ts +262 -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 -3599
- package/dist/index.d.cts +28 -3150
- package/dist/index.d.ts +28 -3150
- package/dist/index.js +135 -3475
- 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 +128 -2
- package/src/config.ts +2 -2
- package/src/i18n/index.ts +18 -2
- package/src/i18n/locales/en-GB.json +247 -0
- package/src/i18n/locales/{en.json → en-US.json} +43 -0
- package/src/i18n/locales/id-ID.json +247 -0
- package/src/i18n/locales/ja-JP.json +247 -0
- package/src/i18n/locales/ko-KR.json +247 -0
- package/src/i18n/locales/ms-MY.json +247 -0
- package/src/i18n/locales/th-TH.json +247 -0
- package/src/i18n/locales/vi-VN.json +247 -0
- package/src/i18n/locales/zh-CN.json +247 -0
- package/src/i18n/locales/zh-TW.json +43 -0
- package/src/index.ts +10 -2
- package/src/validators/common/boolean.ts +1 -1
- 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/date.ts +1 -1
- package/src/validators/common/datetime.ts +1 -1
- package/src/validators/common/email.ts +1 -1
- package/src/validators/common/file.ts +1 -1
- package/src/validators/common/id.ts +1 -1
- package/src/validators/common/ip.ts +210 -0
- package/src/validators/common/number.ts +1 -1
- package/src/validators/common/password.ts +1 -1
- package/src/validators/common/text.ts +1 -1
- package/src/validators/common/time.ts +1 -1
- package/src/validators/common/url.ts +1 -1
- package/src/validators/taiwan/bank-account.ts +176 -0
- package/src/validators/taiwan/business-id.ts +1 -1
- package/src/validators/taiwan/fax.ts +1 -1
- package/src/validators/taiwan/invoice.ts +84 -0
- package/src/validators/taiwan/license-plate.ts +110 -0
- package/src/validators/taiwan/mobile.ts +1 -1
- package/src/validators/taiwan/national-id.ts +1 -1
- package/src/validators/taiwan/passport.ts +103 -0
- package/src/validators/taiwan/postal-code.ts +1 -1
- package/src/validators/taiwan/tel.ts +1 -1
- package/tests/common/boolean.test.ts +6 -6
- 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/date.test.ts +8 -8
- package/tests/common/datetime.test.ts +7 -7
- package/tests/common/email.test.ts +6 -6
- package/tests/common/file.test.ts +6 -6
- package/tests/common/id.test.ts +5 -5
- package/tests/common/ip.test.ts +419 -0
- package/tests/common/number.test.ts +6 -6
- package/tests/common/password.test.ts +5 -5
- package/tests/common/text.test.ts +7 -7
- package/tests/common/time.test.ts +7 -7
- package/tests/common/url.test.ts +10 -10
- package/tests/taiwan/bank-account.test.ts +286 -0
- package/tests/taiwan/business-id.test.ts +4 -4
- package/tests/taiwan/fax.test.ts +7 -7
- package/tests/taiwan/invoice.test.ts +227 -0
- package/tests/taiwan/license-plate.test.ts +280 -0
- package/tests/taiwan/mobile.test.ts +7 -7
- package/tests/taiwan/national-id.test.ts +4 -4
- package/tests/taiwan/passport.test.ts +277 -0
- package/tests/taiwan/postal-code.test.ts +6 -6
- package/tests/taiwan/tel.test.ts +7 -7
- package/tsup.config.ts +36 -0
|
@@ -0,0 +1,206 @@
|
|
|
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/id.ts
|
|
7
|
+
var _zod = require('zod');
|
|
8
|
+
var ID_PATTERNS = {
|
|
9
|
+
numeric: /^\d+$/,
|
|
10
|
+
uuid: /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
|
|
11
|
+
objectId: /^[0-9a-f]{24}$/i,
|
|
12
|
+
nanoid: /^[A-Za-z0-9_-]{21}$/,
|
|
13
|
+
snowflake: /^\d{19}$/,
|
|
14
|
+
cuid: /^c[a-z0-9]{24}$/,
|
|
15
|
+
ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,
|
|
16
|
+
shortid: /^[A-Za-z0-9_-]{7,14}$/
|
|
17
|
+
};
|
|
18
|
+
var detectIdType = (value) => {
|
|
19
|
+
const orderedTypes = [
|
|
20
|
+
["uuid", ID_PATTERNS.uuid],
|
|
21
|
+
["objectId", ID_PATTERNS.objectId],
|
|
22
|
+
["snowflake", ID_PATTERNS.snowflake],
|
|
23
|
+
["cuid", ID_PATTERNS.cuid],
|
|
24
|
+
["ulid", ID_PATTERNS.ulid],
|
|
25
|
+
["nanoid", ID_PATTERNS.nanoid],
|
|
26
|
+
["numeric", ID_PATTERNS.numeric],
|
|
27
|
+
["shortid", ID_PATTERNS.shortid]
|
|
28
|
+
// 放最後,因為最通用
|
|
29
|
+
];
|
|
30
|
+
for (const [type, pattern] of orderedTypes) {
|
|
31
|
+
if (pattern.test(value)) {
|
|
32
|
+
return type;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
};
|
|
37
|
+
var validateIdType = (value, type) => {
|
|
38
|
+
if (type === "auto") {
|
|
39
|
+
return detectIdType(value) !== null;
|
|
40
|
+
}
|
|
41
|
+
const pattern = ID_PATTERNS[type];
|
|
42
|
+
return pattern ? pattern.test(value) : false;
|
|
43
|
+
};
|
|
44
|
+
function id(required, options) {
|
|
45
|
+
const { type = "auto", minLength, maxLength, allowedTypes, customRegex, includes, excludes, startsWith, endsWith, caseSensitive = true, transform, defaultValue, i18n } = _nullishCoalesce(options, () => ( {}));
|
|
46
|
+
const isRequired = _nullishCoalesce(required, () => ( false));
|
|
47
|
+
const isNumericType = type === "numeric";
|
|
48
|
+
const actualDefaultValue = defaultValue !== void 0 ? defaultValue : isRequired ? isNumericType ? NaN : "" : null;
|
|
49
|
+
const getMessage = (key, params) => {
|
|
50
|
+
if (i18n) {
|
|
51
|
+
const currentLocale = _chunkYWV2BBXNcjs.getLocale.call(void 0, );
|
|
52
|
+
const customMessages = i18n[currentLocale];
|
|
53
|
+
if (customMessages && customMessages[key]) {
|
|
54
|
+
const template = customMessages[key];
|
|
55
|
+
return template.replace(/\$\{(\w+)}/g, (_match, k) => _nullishCoalesce(_optionalChain([params, 'optionalAccess', _ => _[k]]), () => ( "")));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return _chunkYWV2BBXNcjs.t.call(void 0, `common.id.${key}`, params);
|
|
59
|
+
};
|
|
60
|
+
const preprocessNumericFn = (val) => {
|
|
61
|
+
if (val === "" || val === null || val === void 0) {
|
|
62
|
+
if (isRequired && defaultValue === void 0) {
|
|
63
|
+
return void 0;
|
|
64
|
+
}
|
|
65
|
+
return actualDefaultValue;
|
|
66
|
+
}
|
|
67
|
+
return Number(val);
|
|
68
|
+
};
|
|
69
|
+
const preprocessStringFn = (val) => {
|
|
70
|
+
if (val === "" || val === null || val === void 0) {
|
|
71
|
+
return actualDefaultValue;
|
|
72
|
+
}
|
|
73
|
+
let processed = String(val);
|
|
74
|
+
if (transform) {
|
|
75
|
+
processed = transform(processed);
|
|
76
|
+
}
|
|
77
|
+
return processed;
|
|
78
|
+
};
|
|
79
|
+
if (isNumericType) {
|
|
80
|
+
const numericSchema = _zod.z.preprocess(preprocessNumericFn, _zod.z.any()).superRefine((val, ctx) => {
|
|
81
|
+
if (!isRequired && val === null) return;
|
|
82
|
+
if (val === void 0 || isRequired && val === null) {
|
|
83
|
+
ctx.addIssue({ code: "custom", message: getMessage("required") });
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (typeof val !== "number" || isNaN(val)) {
|
|
87
|
+
ctx.addIssue({ code: "custom", message: getMessage("numeric") });
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const strVal = String(val);
|
|
91
|
+
if (!ID_PATTERNS.numeric.test(strVal)) {
|
|
92
|
+
ctx.addIssue({ code: "custom", message: getMessage("numeric") });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (minLength !== void 0 && strVal.length < minLength) {
|
|
96
|
+
ctx.addIssue({ code: "custom", message: getMessage("minLength", { minLength }) });
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (maxLength !== void 0 && strVal.length > maxLength) {
|
|
100
|
+
ctx.addIssue({ code: "custom", message: getMessage("maxLength", { maxLength }) });
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
return numericSchema;
|
|
105
|
+
}
|
|
106
|
+
const baseSchema = isRequired ? _zod.z.preprocess(preprocessStringFn, _zod.z.string()) : _zod.z.preprocess(preprocessStringFn, _zod.z.string().nullable());
|
|
107
|
+
const schema = baseSchema.superRefine((val, ctx) => {
|
|
108
|
+
if (val === null) return;
|
|
109
|
+
if (isRequired && (val === "" || val === "null" || val === "undefined")) {
|
|
110
|
+
ctx.addIssue({ code: "custom", message: getMessage("required") });
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const comparisonVal = !caseSensitive ? val.toLowerCase() : val;
|
|
114
|
+
if (val !== null && minLength !== void 0 && val.length < minLength) {
|
|
115
|
+
ctx.addIssue({ code: "custom", message: getMessage("minLength", { minLength }) });
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (val !== null && maxLength !== void 0 && val.length > maxLength) {
|
|
119
|
+
ctx.addIssue({ code: "custom", message: getMessage("maxLength", { maxLength }) });
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const hasContentValidations = customRegex !== void 0 || startsWith !== void 0 || endsWith !== void 0 || includes !== void 0 || excludes !== void 0;
|
|
123
|
+
if (val !== null && customRegex !== void 0) {
|
|
124
|
+
if (!customRegex.test(val)) {
|
|
125
|
+
ctx.addIssue({ code: "custom", message: getMessage("customFormat") });
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
} else if (val !== null && !hasContentValidations) {
|
|
129
|
+
let isValidId;
|
|
130
|
+
if (allowedTypes && allowedTypes.length > 0) {
|
|
131
|
+
isValidId = allowedTypes.some((allowedType) => validateIdType(val, allowedType));
|
|
132
|
+
if (!isValidId) {
|
|
133
|
+
const typeNames = allowedTypes.join(", ");
|
|
134
|
+
ctx.addIssue({ code: "custom", message: getMessage("invalid") + ` (allowed types: ${typeNames})` });
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
} else if (type && type !== "auto") {
|
|
138
|
+
isValidId = validateIdType(val, type);
|
|
139
|
+
if (!isValidId) {
|
|
140
|
+
ctx.addIssue({ code: "custom", message: getMessage(type) || getMessage("invalid") });
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
} else {
|
|
144
|
+
isValidId = detectIdType(val) !== null;
|
|
145
|
+
if (!isValidId) {
|
|
146
|
+
ctx.addIssue({ code: "custom", message: getMessage("invalid") });
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
} else if (val !== null && hasContentValidations && type && type !== "auto" && !customRegex) {
|
|
151
|
+
if (allowedTypes && allowedTypes.length > 0) {
|
|
152
|
+
const isValidType = allowedTypes.some((allowedType) => validateIdType(val, allowedType));
|
|
153
|
+
if (!isValidType) {
|
|
154
|
+
const typeNames = allowedTypes.join(", ");
|
|
155
|
+
ctx.addIssue({ code: "custom", message: getMessage("invalid") + ` (allowed types: ${typeNames})` });
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
} else {
|
|
159
|
+
if (!validateIdType(val, type)) {
|
|
160
|
+
ctx.addIssue({ code: "custom", message: getMessage(type) || getMessage("invalid") });
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const searchStartsWith = !caseSensitive && startsWith ? startsWith.toLowerCase() : startsWith;
|
|
166
|
+
const searchEndsWith = !caseSensitive && endsWith ? endsWith.toLowerCase() : endsWith;
|
|
167
|
+
const searchIncludes = !caseSensitive && includes ? includes.toLowerCase() : includes;
|
|
168
|
+
if (val !== null && startsWith !== void 0 && !comparisonVal.startsWith(searchStartsWith)) {
|
|
169
|
+
ctx.addIssue({ code: "custom", message: getMessage("startsWith", { startsWith }) });
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
if (val !== null && endsWith !== void 0 && !comparisonVal.endsWith(searchEndsWith)) {
|
|
173
|
+
ctx.addIssue({ code: "custom", message: getMessage("endsWith", { endsWith }) });
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (val !== null && includes !== void 0 && !comparisonVal.includes(searchIncludes)) {
|
|
177
|
+
ctx.addIssue({ code: "custom", message: getMessage("includes", { includes }) });
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (val !== null && excludes !== void 0) {
|
|
181
|
+
const excludeList = Array.isArray(excludes) ? excludes : [excludes];
|
|
182
|
+
for (const exclude of excludeList) {
|
|
183
|
+
const searchExclude = !caseSensitive ? exclude.toLowerCase() : exclude;
|
|
184
|
+
if (comparisonVal.includes(searchExclude)) {
|
|
185
|
+
ctx.addIssue({ code: "custom", message: getMessage("excludes", { excludes: exclude }) });
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}).transform((val) => {
|
|
191
|
+
if (val === null) return val;
|
|
192
|
+
const shouldPreserveCase = type === "uuid" || type === "objectId";
|
|
193
|
+
if (!caseSensitive && !shouldPreserveCase) {
|
|
194
|
+
return val.toLowerCase();
|
|
195
|
+
}
|
|
196
|
+
return val;
|
|
197
|
+
});
|
|
198
|
+
return schema;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
exports.ID_PATTERNS = ID_PATTERNS; exports.detectIdType = detectIdType; exports.validateIdType = validateIdType; exports.id = id;
|
|
@@ -0,0 +1,127 @@
|
|
|
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/taiwan/fax.ts
|
|
7
|
+
var _zod = require('zod');
|
|
8
|
+
var validateTaiwanFax = (value) => {
|
|
9
|
+
const cleanValue = value.replace(/[-\s]/g, "");
|
|
10
|
+
if (!/^0\d{7,10}$/.test(cleanValue)) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
const areaCode4 = cleanValue.substring(0, 4);
|
|
14
|
+
if (areaCode4 === "0836") {
|
|
15
|
+
return cleanValue.length === 9 && /^0836\d{5}$/.test(cleanValue);
|
|
16
|
+
}
|
|
17
|
+
const areaCode3 = cleanValue.substring(0, 3);
|
|
18
|
+
if (areaCode3 === "037") {
|
|
19
|
+
const firstDigit = cleanValue[3];
|
|
20
|
+
if (firstDigit === "0" || firstDigit === "1") {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return (cleanValue.length === 9 || cleanValue.length === 10) && /^037[2-9]\d{5,6}$/.test(cleanValue);
|
|
24
|
+
}
|
|
25
|
+
if (areaCode3 === "049") {
|
|
26
|
+
return cleanValue.length === 10 && /^049\d{7}$/.test(cleanValue);
|
|
27
|
+
}
|
|
28
|
+
if (areaCode3 === "082") {
|
|
29
|
+
return cleanValue.length === 9 && /^082\d{6}$/.test(cleanValue);
|
|
30
|
+
}
|
|
31
|
+
if (areaCode3 === "089") {
|
|
32
|
+
return cleanValue.length === 9 && /^089\d{6}$/.test(cleanValue);
|
|
33
|
+
}
|
|
34
|
+
const areaCode2 = cleanValue.substring(0, 2);
|
|
35
|
+
if (areaCode2 === "02") {
|
|
36
|
+
const firstDigit = cleanValue[2];
|
|
37
|
+
if (firstDigit === "0" || firstDigit === "1") {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return cleanValue.length === 10 && /^02[2-9]\d{7}$/.test(cleanValue);
|
|
41
|
+
}
|
|
42
|
+
if (areaCode2 === "03") {
|
|
43
|
+
return (cleanValue.length === 9 || cleanValue.length === 10) && /^03\d{7,8}$/.test(cleanValue);
|
|
44
|
+
}
|
|
45
|
+
if (areaCode2 === "04") {
|
|
46
|
+
return (cleanValue.length === 9 || cleanValue.length === 10) && /^04\d{7,8}$/.test(cleanValue);
|
|
47
|
+
}
|
|
48
|
+
if (areaCode2 === "05") {
|
|
49
|
+
return cleanValue.length === 9 && /^05\d{7}$/.test(cleanValue);
|
|
50
|
+
}
|
|
51
|
+
if (areaCode2 === "06") {
|
|
52
|
+
return cleanValue.length === 9 && /^06\d{7}$/.test(cleanValue);
|
|
53
|
+
}
|
|
54
|
+
if (areaCode2 === "07") {
|
|
55
|
+
const firstDigit = cleanValue[2];
|
|
56
|
+
if (firstDigit === "0" || firstDigit === "1") {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return cleanValue.length === 9 && /^07[2-9]\d{6}$/.test(cleanValue);
|
|
60
|
+
}
|
|
61
|
+
if (areaCode2 === "08") {
|
|
62
|
+
const firstDigit = cleanValue[2];
|
|
63
|
+
if (firstDigit !== "4" && firstDigit !== "7" && firstDigit !== "8") {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return cleanValue.length === 9 && /^08[478]\d{6}$/.test(cleanValue);
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
};
|
|
70
|
+
function twFax(required, options) {
|
|
71
|
+
const { whitelist, transform, defaultValue, i18n } = _nullishCoalesce(options, () => ( {}));
|
|
72
|
+
const isRequired = _nullishCoalesce(required, () => ( false));
|
|
73
|
+
const actualDefaultValue = _nullishCoalesce(defaultValue, () => ( (isRequired ? "" : null)));
|
|
74
|
+
const getMessage = (key, params) => {
|
|
75
|
+
if (i18n) {
|
|
76
|
+
const currentLocale = _chunkYWV2BBXNcjs.getLocale.call(void 0, );
|
|
77
|
+
const customMessages = i18n[currentLocale];
|
|
78
|
+
if (customMessages && customMessages[key]) {
|
|
79
|
+
const template = customMessages[key];
|
|
80
|
+
return template.replace(/\$\{(\w+)}/g, (_, k) => _nullishCoalesce(_optionalChain([params, 'optionalAccess', _2 => _2[k]]), () => ( "")));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return _chunkYWV2BBXNcjs.t.call(void 0, `taiwan.fax.${key}`, params);
|
|
84
|
+
};
|
|
85
|
+
const preprocessFn = (val) => {
|
|
86
|
+
if (val === null || val === void 0) {
|
|
87
|
+
return actualDefaultValue;
|
|
88
|
+
}
|
|
89
|
+
let processed = String(val).trim();
|
|
90
|
+
if (processed === "") {
|
|
91
|
+
if (whitelist && whitelist.includes("")) {
|
|
92
|
+
return "";
|
|
93
|
+
}
|
|
94
|
+
if (!isRequired) {
|
|
95
|
+
return actualDefaultValue;
|
|
96
|
+
}
|
|
97
|
+
return actualDefaultValue;
|
|
98
|
+
}
|
|
99
|
+
if (transform) {
|
|
100
|
+
processed = transform(processed);
|
|
101
|
+
}
|
|
102
|
+
return processed;
|
|
103
|
+
};
|
|
104
|
+
const baseSchema = isRequired ? _zod.z.preprocess(preprocessFn, _zod.z.string()) : _zod.z.preprocess(preprocessFn, _zod.z.string().nullable());
|
|
105
|
+
const schema = baseSchema.superRefine((val, ctx) => {
|
|
106
|
+
if (val === null) return;
|
|
107
|
+
if (isRequired && (val === "" || val === "null" || val === "undefined")) {
|
|
108
|
+
ctx.addIssue({ code: "custom", message: getMessage("required") });
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (val === null) return;
|
|
112
|
+
if (!isRequired && val === "") return;
|
|
113
|
+
if (whitelist && whitelist.length > 0 && whitelist.includes(val)) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (!validateTaiwanFax(val)) {
|
|
117
|
+
ctx.addIssue({ code: "custom", message: getMessage("invalid") });
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
return schema;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
exports.validateTaiwanFax = validateTaiwanFax; exports.twFax = twFax;
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getLocale,
|
|
3
|
+
t
|
|
4
|
+
} from "./chunk-ZBOQCXD4.js";
|
|
5
|
+
|
|
6
|
+
// src/validators/common/email.ts
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
function email(required, options) {
|
|
9
|
+
const {
|
|
10
|
+
domain,
|
|
11
|
+
domainBlacklist,
|
|
12
|
+
minLength,
|
|
13
|
+
maxLength,
|
|
14
|
+
includes,
|
|
15
|
+
excludes,
|
|
16
|
+
allowSubdomains = true,
|
|
17
|
+
businessOnly = false,
|
|
18
|
+
noDisposable = false,
|
|
19
|
+
lowercase = true,
|
|
20
|
+
transform,
|
|
21
|
+
defaultValue,
|
|
22
|
+
i18n
|
|
23
|
+
} = options ?? {};
|
|
24
|
+
const isRequired = required ?? false;
|
|
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(`common.email.${key}`, params);
|
|
35
|
+
};
|
|
36
|
+
const disposableDomains = ["10minutemail.com", "tempmail.org", "guerrillamail.com", "mailinator.com", "yopmail.com", "temp-mail.org", "throwaway.email", "getnada.com", "maildrop.cc"];
|
|
37
|
+
const freeEmailDomains = ["gmail.com", "yahoo.com", "hotmail.com", "outlook.com", "icloud.com", "aol.com", "protonmail.com", "zoho.com"];
|
|
38
|
+
const actualDefaultValue = defaultValue ?? null;
|
|
39
|
+
const baseSchema = z.preprocess(
|
|
40
|
+
(val) => {
|
|
41
|
+
if (val === "" || val === null || val === void 0) {
|
|
42
|
+
return actualDefaultValue;
|
|
43
|
+
}
|
|
44
|
+
let processed = String(val).trim();
|
|
45
|
+
if (lowercase) {
|
|
46
|
+
processed = processed.toLowerCase();
|
|
47
|
+
}
|
|
48
|
+
if (transform) {
|
|
49
|
+
processed = transform(processed);
|
|
50
|
+
}
|
|
51
|
+
return processed;
|
|
52
|
+
},
|
|
53
|
+
z.union([z.string().email(), z.null()])
|
|
54
|
+
);
|
|
55
|
+
const schema = baseSchema.superRefine((val, ctx) => {
|
|
56
|
+
if (isRequired && val === null) {
|
|
57
|
+
ctx.addIssue({
|
|
58
|
+
code: "custom",
|
|
59
|
+
message: getMessage("required")
|
|
60
|
+
});
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (val === null) return;
|
|
64
|
+
if (typeof val !== "string") {
|
|
65
|
+
ctx.addIssue({
|
|
66
|
+
code: "custom",
|
|
67
|
+
message: getMessage("invalid")
|
|
68
|
+
});
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (minLength !== void 0 && val.length < minLength) {
|
|
72
|
+
ctx.addIssue({
|
|
73
|
+
code: "custom",
|
|
74
|
+
message: getMessage("minLength", { minLength })
|
|
75
|
+
});
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (maxLength !== void 0 && val.length > maxLength) {
|
|
79
|
+
ctx.addIssue({
|
|
80
|
+
code: "custom",
|
|
81
|
+
message: getMessage("maxLength", { maxLength })
|
|
82
|
+
});
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (includes !== void 0 && !val.includes(includes)) {
|
|
86
|
+
ctx.addIssue({
|
|
87
|
+
code: "custom",
|
|
88
|
+
message: getMessage("includes", { includes })
|
|
89
|
+
});
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (excludes !== void 0) {
|
|
93
|
+
const excludeList = Array.isArray(excludes) ? excludes : [excludes];
|
|
94
|
+
for (const exclude of excludeList) {
|
|
95
|
+
if (val.includes(exclude)) {
|
|
96
|
+
ctx.addIssue({
|
|
97
|
+
code: "custom",
|
|
98
|
+
message: getMessage("includes", { includes: exclude })
|
|
99
|
+
});
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const emailDomain = val.split("@")[1]?.toLowerCase();
|
|
105
|
+
if (!emailDomain) {
|
|
106
|
+
ctx.addIssue({
|
|
107
|
+
code: "custom",
|
|
108
|
+
message: getMessage("invalid")
|
|
109
|
+
});
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (businessOnly) {
|
|
113
|
+
const isFreeProvider = freeEmailDomains.some((freeDomain) => {
|
|
114
|
+
if (allowSubdomains) {
|
|
115
|
+
return emailDomain === freeDomain || emailDomain.endsWith("." + freeDomain);
|
|
116
|
+
}
|
|
117
|
+
return emailDomain === freeDomain;
|
|
118
|
+
});
|
|
119
|
+
if (isFreeProvider) {
|
|
120
|
+
ctx.addIssue({
|
|
121
|
+
code: "custom",
|
|
122
|
+
message: getMessage("businessOnly")
|
|
123
|
+
});
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (domainBlacklist && domainBlacklist.length > 0) {
|
|
128
|
+
const isBlacklisted = domainBlacklist.some((blacklistedDomain) => {
|
|
129
|
+
const lowerDomain = blacklistedDomain.toLowerCase();
|
|
130
|
+
if (allowSubdomains) {
|
|
131
|
+
return emailDomain === lowerDomain || emailDomain.endsWith("." + lowerDomain);
|
|
132
|
+
}
|
|
133
|
+
return emailDomain === lowerDomain;
|
|
134
|
+
});
|
|
135
|
+
if (isBlacklisted) {
|
|
136
|
+
ctx.addIssue({
|
|
137
|
+
code: "custom",
|
|
138
|
+
message: getMessage("domainBlacklist", { domain: emailDomain })
|
|
139
|
+
});
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (domain !== void 0) {
|
|
144
|
+
const allowedDomains = Array.isArray(domain) ? domain : [domain];
|
|
145
|
+
const isAllowed = allowedDomains.some((allowedDomain) => {
|
|
146
|
+
const lowerDomain = allowedDomain.toLowerCase();
|
|
147
|
+
if (allowSubdomains) {
|
|
148
|
+
return emailDomain === lowerDomain || emailDomain.endsWith("." + lowerDomain);
|
|
149
|
+
}
|
|
150
|
+
return emailDomain === lowerDomain;
|
|
151
|
+
});
|
|
152
|
+
if (!isAllowed) {
|
|
153
|
+
ctx.addIssue({
|
|
154
|
+
code: "custom",
|
|
155
|
+
message: getMessage("domain", { domain: Array.isArray(domain) ? domain.join(", ") : domain })
|
|
156
|
+
});
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (noDisposable) {
|
|
161
|
+
const isDisposable = disposableDomains.some((disposableDomain) => {
|
|
162
|
+
if (allowSubdomains) {
|
|
163
|
+
return emailDomain === disposableDomain || emailDomain.endsWith("." + disposableDomain);
|
|
164
|
+
}
|
|
165
|
+
return emailDomain === disposableDomain;
|
|
166
|
+
});
|
|
167
|
+
if (isDisposable) {
|
|
168
|
+
ctx.addIssue({
|
|
169
|
+
code: "custom",
|
|
170
|
+
message: getMessage("noDisposable")
|
|
171
|
+
});
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
return schema;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export {
|
|
180
|
+
email
|
|
181
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
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/taiwan/mobile.ts
|
|
7
|
+
var _zod = require('zod');
|
|
8
|
+
var validateTaiwanMobile = (value) => {
|
|
9
|
+
const cleanValue = value.replace(/[-\s]/g, "");
|
|
10
|
+
return /^09[0-9]\d{7}$/.test(cleanValue);
|
|
11
|
+
};
|
|
12
|
+
function twMobile(required, options) {
|
|
13
|
+
const { whitelist, transform, defaultValue, i18n } = _nullishCoalesce(options, () => ( {}));
|
|
14
|
+
const isRequired = _nullishCoalesce(required, () => ( false));
|
|
15
|
+
const actualDefaultValue = _nullishCoalesce(defaultValue, () => ( (isRequired ? "" : null)));
|
|
16
|
+
const getMessage = (key, params) => {
|
|
17
|
+
if (i18n) {
|
|
18
|
+
const currentLocale = _chunkYWV2BBXNcjs.getLocale.call(void 0, );
|
|
19
|
+
const customMessages = i18n[currentLocale];
|
|
20
|
+
if (customMessages && customMessages[key]) {
|
|
21
|
+
const template = customMessages[key];
|
|
22
|
+
return template.replace(/\$\{(\w+)}/g, (_, k) => _nullishCoalesce(_optionalChain([params, 'optionalAccess', _2 => _2[k]]), () => ( "")));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return _chunkYWV2BBXNcjs.t.call(void 0, `taiwan.mobile.${key}`, params);
|
|
26
|
+
};
|
|
27
|
+
const preprocessFn = (val) => {
|
|
28
|
+
if (val === null || val === void 0) {
|
|
29
|
+
return actualDefaultValue;
|
|
30
|
+
}
|
|
31
|
+
let processed = String(val).trim();
|
|
32
|
+
if (processed === "") {
|
|
33
|
+
if (whitelist && whitelist.includes("")) {
|
|
34
|
+
return "";
|
|
35
|
+
}
|
|
36
|
+
if (!isRequired) {
|
|
37
|
+
return actualDefaultValue;
|
|
38
|
+
}
|
|
39
|
+
return actualDefaultValue;
|
|
40
|
+
}
|
|
41
|
+
if (transform) {
|
|
42
|
+
processed = transform(processed);
|
|
43
|
+
}
|
|
44
|
+
return processed;
|
|
45
|
+
};
|
|
46
|
+
const baseSchema = isRequired ? _zod.z.preprocess(preprocessFn, _zod.z.string()) : _zod.z.preprocess(preprocessFn, _zod.z.string().nullable());
|
|
47
|
+
const schema = baseSchema.superRefine((val, ctx) => {
|
|
48
|
+
if (val === null) return;
|
|
49
|
+
if (isRequired && (val === "" || val === "null" || val === "undefined")) {
|
|
50
|
+
ctx.addIssue({ code: "custom", message: getMessage("required") });
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (val === null) return;
|
|
54
|
+
if (!isRequired && val === "") return;
|
|
55
|
+
if (whitelist && whitelist.length > 0 && whitelist.includes(val)) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (!validateTaiwanMobile(val)) {
|
|
59
|
+
ctx.addIssue({ code: "custom", message: getMessage("invalid") });
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
return schema;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
exports.validateTaiwanMobile = validateTaiwanMobile; exports.twMobile = twMobile;
|