@hy_ong/zod-kit 0.2.6 → 0.2.8

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.
@@ -18,6 +18,9 @@ var validateTaiwanTel = (value) => {
18
18
  return (cleanValue.length === 9 || cleanValue.length === 10) && /^0836\d{5,6}$/.test(cleanValue);
19
19
  }
20
20
  const areaCode3 = cleanValue.substring(0, 3);
21
+ if (areaCode3 === "070") {
22
+ return cleanValue.length === 11 && /^070\d{8}$/.test(cleanValue);
23
+ }
21
24
  if (areaCode3 === "037") {
22
25
  const firstDigit = cleanValue[3];
23
26
  if (firstDigit === "0" || firstDigit === "1") {
@@ -18,6 +18,9 @@ var validateTaiwanTel = (value) => {
18
18
  return (cleanValue.length === 9 || cleanValue.length === 10) && /^0836\d{5,6}$/.test(cleanValue);
19
19
  }
20
20
  const areaCode3 = cleanValue.substring(0, 3);
21
+ if (areaCode3 === "070") {
22
+ return cleanValue.length === 11 && /^070\d{8}$/.test(cleanValue);
23
+ }
21
24
  if (areaCode3 === "037") {
22
25
  const firstDigit = cleanValue[3];
23
26
  if (firstDigit === "0" || firstDigit === "1") {
package/dist/index.cjs CHANGED
@@ -50,7 +50,7 @@ var _chunkFP4O2ICMcjs = require('./chunk-FP4O2ICM.cjs');
50
50
 
51
51
 
52
52
 
53
- var _chunkVKBNKPFOcjs = require('./chunk-VKBNKPFO.cjs');
53
+ var _chunk7EUHTSMFcjs = require('./chunk-7EUHTSMF.cjs');
54
54
 
55
55
 
56
56
 
@@ -185,4 +185,4 @@ var _chunkQ7TUNJD4cjs = require('./chunk-Q7TUNJD4.cjs');
185
185
 
186
186
 
187
187
 
188
- exports.DATETIME_PATTERNS = _chunk53EEWALQcjs.DATETIME_PATTERNS; exports.ID_PATTERNS = _chunkJZEF5Q3Wcjs.ID_PATTERNS; exports.TAIWAN_BANK_CODES = _chunkQQWX3ICKcjs.TAIWAN_BANK_CODES; exports.TIME_PATTERNS = _chunkEDTNS2XLcjs.TIME_PATTERNS; exports.VALID_3_DIGIT_PREFIXES = _chunkFP4O2ICMcjs.VALID_3_DIGIT_PREFIXES; exports.boolean = _chunkLNWEJED7cjs.boolean; exports.color = _chunkA2GAEU4Ocjs.color; exports.coordinate = _chunkFEL432I2cjs.coordinate; exports.creditCard = _chunkZCX22PY4cjs.creditCard; exports.date = _chunk4AQB4RSUcjs.date; exports.datetime = _chunk53EEWALQcjs.datetime; exports.detectCardType = _chunkZCX22PY4cjs.detectCardType; exports.detectIdType = _chunkJZEF5Q3Wcjs.detectIdType; exports.email = _chunkH25N5GP6cjs.email; exports.file = _chunkKIUO2HIRcjs.file; exports.getLocale = _chunkQ7TUNJD4cjs.getLocale; exports.id = _chunkJZEF5Q3Wcjs.id; exports.ip = _chunkLXFRQLH4cjs.ip; exports.manyOf = _chunk5U5ERV2Pcjs.manyOf; exports.normalizeDateTimeValue = _chunk53EEWALQcjs.normalizeDateTimeValue; exports.normalizeTime = _chunkEDTNS2XLcjs.normalizeTime; exports.number = _chunkG747FHUZcjs.number; exports.oneOf = _chunk5NBWPAHCcjs.oneOf; exports.parseDateTimeValue = _chunk53EEWALQcjs.parseDateTimeValue; exports.parseTimeToMinutes = _chunkEDTNS2XLcjs.parseTimeToMinutes; exports.password = _chunkQ24GYUTOcjs.password; exports.setLocale = _chunkQ7TUNJD4cjs.setLocale; exports.text = _chunkHZ2WESSLcjs.text; exports.time = _chunkEDTNS2XLcjs.time; exports.twBankAccount = _chunkQQWX3ICKcjs.twBankAccount; exports.twBusinessId = _chunkIWR3H7IHcjs.twBusinessId; exports.twFax = _chunkBZSPJJYTcjs.twFax; exports.twInvoice = _chunkV2KKGSKQcjs.twInvoice; exports.twLicensePlate = _chunkTPXRQT2Hcjs.twLicensePlate; exports.twMobile = _chunkAYCXAJRAcjs.twMobile; exports.twNationalId = _chunkUCPKW43Kcjs.twNationalId; exports.twPassport = _chunk5ZMTAI4Gcjs.twPassport; exports.twPostalCode = _chunkFP4O2ICMcjs.twPostalCode; exports.twTel = _chunkVKBNKPFOcjs.twTel; exports.url = _chunkTDEXEIHHcjs.url; exports.validate3DigitPostalCode = _chunkFP4O2ICMcjs.validate3DigitPostalCode; exports.validate5DigitPostalCode = _chunkFP4O2ICMcjs.validate5DigitPostalCode; exports.validate6DigitPostalCode = _chunkFP4O2ICMcjs.validate6DigitPostalCode; exports.validateCitizenId = _chunkUCPKW43Kcjs.validateCitizenId; exports.validateColor = _chunkA2GAEU4Ocjs.validateColor; exports.validateCreditCard = _chunkZCX22PY4cjs.validateCreditCard; exports.validateDateTimeFormat = _chunk53EEWALQcjs.validateDateTimeFormat; exports.validateIPv4 = _chunkLXFRQLH4cjs.validateIPv4; exports.validateIPv6 = _chunkLXFRQLH4cjs.validateIPv6; exports.validateIdType = _chunkJZEF5Q3Wcjs.validateIdType; exports.validateLatitude = _chunkFEL432I2cjs.validateLatitude; exports.validateLongitude = _chunkFEL432I2cjs.validateLongitude; exports.validateNewResidentId = _chunkUCPKW43Kcjs.validateNewResidentId; exports.validateOldResidentId = _chunkUCPKW43Kcjs.validateOldResidentId; exports.validateTaiwanBankAccount = _chunkQQWX3ICKcjs.validateTaiwanBankAccount; exports.validateTaiwanBusinessId = _chunkIWR3H7IHcjs.validateTaiwanBusinessId; exports.validateTaiwanFax = _chunkBZSPJJYTcjs.validateTaiwanFax; exports.validateTaiwanInvoice = _chunkV2KKGSKQcjs.validateTaiwanInvoice; exports.validateTaiwanLicensePlate = _chunkTPXRQT2Hcjs.validateTaiwanLicensePlate; exports.validateTaiwanMobile = _chunkAYCXAJRAcjs.validateTaiwanMobile; exports.validateTaiwanNationalId = _chunkUCPKW43Kcjs.validateTaiwanNationalId; exports.validateTaiwanPassport = _chunk5ZMTAI4Gcjs.validateTaiwanPassport; exports.validateTaiwanPostalCode = _chunkFP4O2ICMcjs.validateTaiwanPostalCode; exports.validateTaiwanTel = _chunkVKBNKPFOcjs.validateTaiwanTel; exports.validateTimeFormat = _chunkEDTNS2XLcjs.validateTimeFormat;
188
+ exports.DATETIME_PATTERNS = _chunk53EEWALQcjs.DATETIME_PATTERNS; exports.ID_PATTERNS = _chunkJZEF5Q3Wcjs.ID_PATTERNS; exports.TAIWAN_BANK_CODES = _chunkQQWX3ICKcjs.TAIWAN_BANK_CODES; exports.TIME_PATTERNS = _chunkEDTNS2XLcjs.TIME_PATTERNS; exports.VALID_3_DIGIT_PREFIXES = _chunkFP4O2ICMcjs.VALID_3_DIGIT_PREFIXES; exports.boolean = _chunkLNWEJED7cjs.boolean; exports.color = _chunkA2GAEU4Ocjs.color; exports.coordinate = _chunkFEL432I2cjs.coordinate; exports.creditCard = _chunkZCX22PY4cjs.creditCard; exports.date = _chunk4AQB4RSUcjs.date; exports.datetime = _chunk53EEWALQcjs.datetime; exports.detectCardType = _chunkZCX22PY4cjs.detectCardType; exports.detectIdType = _chunkJZEF5Q3Wcjs.detectIdType; exports.email = _chunkH25N5GP6cjs.email; exports.file = _chunkKIUO2HIRcjs.file; exports.getLocale = _chunkQ7TUNJD4cjs.getLocale; exports.id = _chunkJZEF5Q3Wcjs.id; exports.ip = _chunkLXFRQLH4cjs.ip; exports.manyOf = _chunk5U5ERV2Pcjs.manyOf; exports.normalizeDateTimeValue = _chunk53EEWALQcjs.normalizeDateTimeValue; exports.normalizeTime = _chunkEDTNS2XLcjs.normalizeTime; exports.number = _chunkG747FHUZcjs.number; exports.oneOf = _chunk5NBWPAHCcjs.oneOf; exports.parseDateTimeValue = _chunk53EEWALQcjs.parseDateTimeValue; exports.parseTimeToMinutes = _chunkEDTNS2XLcjs.parseTimeToMinutes; exports.password = _chunkQ24GYUTOcjs.password; exports.setLocale = _chunkQ7TUNJD4cjs.setLocale; exports.text = _chunkHZ2WESSLcjs.text; exports.time = _chunkEDTNS2XLcjs.time; exports.twBankAccount = _chunkQQWX3ICKcjs.twBankAccount; exports.twBusinessId = _chunkIWR3H7IHcjs.twBusinessId; exports.twFax = _chunkBZSPJJYTcjs.twFax; exports.twInvoice = _chunkV2KKGSKQcjs.twInvoice; exports.twLicensePlate = _chunkTPXRQT2Hcjs.twLicensePlate; exports.twMobile = _chunkAYCXAJRAcjs.twMobile; exports.twNationalId = _chunkUCPKW43Kcjs.twNationalId; exports.twPassport = _chunk5ZMTAI4Gcjs.twPassport; exports.twPostalCode = _chunkFP4O2ICMcjs.twPostalCode; exports.twTel = _chunk7EUHTSMFcjs.twTel; exports.url = _chunkTDEXEIHHcjs.url; exports.validate3DigitPostalCode = _chunkFP4O2ICMcjs.validate3DigitPostalCode; exports.validate5DigitPostalCode = _chunkFP4O2ICMcjs.validate5DigitPostalCode; exports.validate6DigitPostalCode = _chunkFP4O2ICMcjs.validate6DigitPostalCode; exports.validateCitizenId = _chunkUCPKW43Kcjs.validateCitizenId; exports.validateColor = _chunkA2GAEU4Ocjs.validateColor; exports.validateCreditCard = _chunkZCX22PY4cjs.validateCreditCard; exports.validateDateTimeFormat = _chunk53EEWALQcjs.validateDateTimeFormat; exports.validateIPv4 = _chunkLXFRQLH4cjs.validateIPv4; exports.validateIPv6 = _chunkLXFRQLH4cjs.validateIPv6; exports.validateIdType = _chunkJZEF5Q3Wcjs.validateIdType; exports.validateLatitude = _chunkFEL432I2cjs.validateLatitude; exports.validateLongitude = _chunkFEL432I2cjs.validateLongitude; exports.validateNewResidentId = _chunkUCPKW43Kcjs.validateNewResidentId; exports.validateOldResidentId = _chunkUCPKW43Kcjs.validateOldResidentId; exports.validateTaiwanBankAccount = _chunkQQWX3ICKcjs.validateTaiwanBankAccount; exports.validateTaiwanBusinessId = _chunkIWR3H7IHcjs.validateTaiwanBusinessId; exports.validateTaiwanFax = _chunkBZSPJJYTcjs.validateTaiwanFax; exports.validateTaiwanInvoice = _chunkV2KKGSKQcjs.validateTaiwanInvoice; exports.validateTaiwanLicensePlate = _chunkTPXRQT2Hcjs.validateTaiwanLicensePlate; exports.validateTaiwanMobile = _chunkAYCXAJRAcjs.validateTaiwanMobile; exports.validateTaiwanNationalId = _chunkUCPKW43Kcjs.validateTaiwanNationalId; exports.validateTaiwanPassport = _chunk5ZMTAI4Gcjs.validateTaiwanPassport; exports.validateTaiwanPostalCode = _chunkFP4O2ICMcjs.validateTaiwanPostalCode; exports.validateTaiwanTel = _chunk7EUHTSMFcjs.validateTaiwanTel; exports.validateTimeFormat = _chunkEDTNS2XLcjs.validateTimeFormat;
package/dist/index.js CHANGED
@@ -50,7 +50,7 @@ import {
50
50
  import {
51
51
  twTel,
52
52
  validateTaiwanTel
53
- } from "./chunk-TRQMRHFM.js";
53
+ } from "./chunk-ADKXVZHH.js";
54
54
  import {
55
55
  twFax,
56
56
  validateTaiwanFax
@@ -1,9 +1,9 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
3
 
4
- var _chunkVKBNKPFOcjs = require('../chunk-VKBNKPFO.cjs');
4
+ var _chunk7EUHTSMFcjs = require('../chunk-7EUHTSMF.cjs');
5
5
  require('../chunk-Q7TUNJD4.cjs');
6
6
 
7
7
 
8
8
 
9
- exports.twTel = _chunkVKBNKPFOcjs.twTel; exports.validateTaiwanTel = _chunkVKBNKPFOcjs.validateTaiwanTel;
9
+ exports.twTel = _chunk7EUHTSMFcjs.twTel; exports.validateTaiwanTel = _chunk7EUHTSMFcjs.validateTaiwanTel;
@@ -71,6 +71,7 @@ type TwTelSchema<IsRequired extends boolean> = IsRequired extends true ? ZodStri
71
71
  * - 06: Tainan - 7 digits
72
72
  * - 07: Kaohsiung - 7-8 digits
73
73
  * - 08: Pingtung - 7 digits
74
+ * - 070: VoIP / Internet Telephony (網路電話) - 8 digits (11 total)
74
75
  * - 0800: Toll-free - 6 digits
75
76
  * - 0809: Toll-free - 6 digits
76
77
  * - 082: Kinmen - 6 digits
@@ -71,6 +71,7 @@ type TwTelSchema<IsRequired extends boolean> = IsRequired extends true ? ZodStri
71
71
  * - 06: Tainan - 7 digits
72
72
  * - 07: Kaohsiung - 7-8 digits
73
73
  * - 08: Pingtung - 7 digits
74
+ * - 070: VoIP / Internet Telephony (網路電話) - 8 digits (11 total)
74
75
  * - 0800: Toll-free - 6 digits
75
76
  * - 0809: Toll-free - 6 digits
76
77
  * - 082: Kinmen - 6 digits
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  twTel,
3
3
  validateTaiwanTel
4
- } from "../chunk-TRQMRHFM.js";
4
+ } from "../chunk-ADKXVZHH.js";
5
5
  import "../chunk-POIDES2L.js";
6
6
  export {
7
7
  twTel,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hy_ong/zod-kit",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "description": "A comprehensive TypeScript library providing pre-built Zod validation schemas with full internationalization support for common data types and Taiwan-specific formats",
5
5
  "keywords": [
6
6
  "zod",
@@ -75,6 +75,7 @@ export type TwTelSchema<IsRequired extends boolean> = IsRequired extends true ?
75
75
  * - 06: Tainan - 7 digits
76
76
  * - 07: Kaohsiung - 7-8 digits
77
77
  * - 08: Pingtung - 7 digits
78
+ * - 070: VoIP / Internet Telephony (網路電話) - 8 digits (11 total)
78
79
  * - 0800: Toll-free - 6 digits
79
80
  * - 0809: Toll-free - 6 digits
80
81
  * - 082: Kinmen - 6 digits
@@ -101,6 +102,7 @@ const validateTaiwanTel = (value: string): boolean => {
101
102
  // 06: Tainan - 7 digits
102
103
  // 07: Kaohsiung - 7-8 digits
103
104
  // 08: Pingtung - 7 digits
105
+ // 070: VoIP / Internet Telephony (網路電話) - 8 digits (11 total)
104
106
  // 0800/0809: Toll-free - 6 digits
105
107
  // 082: Kinmen - 6 digits
106
108
  // 0836: Matsu - 5-6 digits
@@ -127,6 +129,10 @@ const validateTaiwanTel = (value: string): boolean => {
127
129
 
128
130
  // Check 3-digit area codes
129
131
  const areaCode3 = cleanValue.substring(0, 3)
132
+ if (areaCode3 === "070") {
133
+ // VoIP / Internet Telephony (網路電話): 070 + 8 digits, total 11 digits
134
+ return cleanValue.length === 11 && /^070\d{8}$/.test(cleanValue)
135
+ }
130
136
  if (areaCode3 === "037") {
131
137
  // Miaoli: 037 + 6-7 digits, total 9-10 digits
132
138
  // User number must start with 2-9 (not 0 or 1)
@@ -41,6 +41,10 @@ describe("Taiwan twTel(true) validator", () => {
41
41
  expect(schema.parse("082661234")).toBe("082661234") // 0826-61234 (9 digits, Wuqiu)
42
42
  expect(schema.parse("083621234")).toBe("083621234") // 0836-21234 (9 digits, Matsu)
43
43
 
44
+ // VoIP numbers (070)
45
+ expect(schema.parse("07012345678")).toBe("07012345678") // 070-1234-5678 (11 digits)
46
+ expect(schema.parse("070-1234-5678")).toBe("070-1234-5678") // with separators
47
+
44
48
  // Toll-free numbers
45
49
  expect(schema.parse("0800123456")).toBe("0800123456") // 0800-123-456 (10 digits)
46
50
  expect(schema.parse("0809123456")).toBe("0809123456") // 0809-123-456 (10 digits)
@@ -256,6 +260,11 @@ describe("Taiwan twTel(true) validator", () => {
256
260
  expect(validateTaiwanTel("083621234")).toBe(true) // Matsu 9 digits
257
261
  expect(validateTaiwanTel("0836212345")).toBe(true) // Matsu 10 digits
258
262
 
263
+ // VoIP numbers (070)
264
+ expect(validateTaiwanTel("07012345678")).toBe(true) // 070 VoIP (11 digits)
265
+ expect(validateTaiwanTel("070-1234-5678")).toBe(true) // 070 with separators
266
+ expect(validateTaiwanTel("07001234567")).toBe(true) // 070 starting with 0 (valid VoIP)
267
+
259
268
  // Toll-free numbers
260
269
  expect(validateTaiwanTel("0800123456")).toBe(true) // 0800
261
270
  expect(validateTaiwanTel("0809123456")).toBe(true) // 0809
@@ -280,6 +289,9 @@ describe("Taiwan twTel(true) validator", () => {
280
289
  expect(validateTaiwanTel("071234567")).toBe(false) // Invalid first digit for 07
281
290
  expect(validateTaiwanTel("037134567")).toBe(false) // Invalid first digit for 037
282
291
  expect(validateTaiwanTel("081234567")).toBe(false) // Invalid first digit for 08
292
+ expect(validateTaiwanTel("0701234567")).toBe(false) // 070 too short (10 digits)
293
+ expect(validateTaiwanTel("070123456789")).toBe(false) // 070 too long (12 digits)
294
+ expect(validateTaiwanTel("0700123456")).toBe(false) // 070 + 7 digits = 10 digits (too short)
283
295
  expect(validateTaiwanTel("080012345")).toBe(false) // 0800 too short (9 digits)
284
296
  expect(validateTaiwanTel("08001234567")).toBe(false) // 0800 too long (11 digits)
285
297
  expect(validateTaiwanTel("0801123456")).toBe(false) // 0801 not valid toll-free prefix
@@ -380,6 +392,7 @@ describe("Taiwan twTel(true) validator", () => {
380
392
  { code: "08", numbers: ["084234567"] }, // Pingtung (9 digits, first digit 4) - from utility test ✓
381
393
  { code: "082", numbers: ["082234567"] }, // Kinmen (9 digits, first digit 2) - from utility test ✓
382
394
  { code: "089", numbers: ["089234567"] }, // Taitung (9 digits, first digit 2) - from utility test ✓
395
+ { code: "070", numbers: ["07012345678"] }, // VoIP (11 digits)
383
396
  { code: "0800", numbers: ["0800123456"] }, // Toll-free (10 digits)
384
397
  { code: "0809", numbers: ["0809123456"] }, // Toll-free (10 digits)
385
398
  { code: "0826", numbers: ["082661234"] }, // Wuqiu (9 digits, first digit 6) - from utility test ✓