@hy_ong/zod-kit 0.2.1 → 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 (119) hide show
  1. package/dist/{chunk-TSHL7ZO2.js → chunk-2SWEVDFZ.js} +1 -1
  2. package/dist/{chunk-WWRFBLCR.cjs → chunk-32JI34CV.cjs} +3 -3
  3. package/dist/{chunk-PGSDXR2I.js → chunk-42C5OHRK.js} +1 -1
  4. package/dist/{chunk-B3U5G3AA.js → chunk-46VAH2BJ.js} +1 -1
  5. package/dist/{chunk-JZ2SHRGZ.js → chunk-5JGTDL3Y.js} +1 -1
  6. package/dist/{chunk-P2NONIMS.js → chunk-5LEXCVLX.js} +1 -1
  7. package/dist/{chunk-ZBOQCXD4.js → chunk-6AAP4LPF.js} +80 -0
  8. package/dist/{chunk-5GAZQDVS.cjs → chunk-B4EZYZOK.cjs} +13 -4
  9. package/dist/{chunk-EAU42EVH.js → chunk-COYKBWTI.js} +1 -1
  10. package/dist/{chunk-JBNCMS42.cjs → chunk-DFJZ3NS2.cjs} +3 -3
  11. package/dist/{chunk-MAQRXYE6.js → chunk-EDHT4LPO.js} +1 -1
  12. package/dist/{chunk-AANSHH2O.cjs → chunk-EGHL277K.cjs} +3 -3
  13. package/dist/{chunk-5ZEKWPSE.cjs → chunk-ERH4NIMU.cjs} +3 -3
  14. package/dist/{chunk-4LYZAO3P.js → chunk-FM3EZ72O.js} +1 -1
  15. package/dist/{chunk-VP5CCP5F.cjs → chunk-GJIRDBZJ.cjs} +3 -3
  16. package/dist/{chunk-KARFFIMP.js → chunk-H2XTEM4M.js} +1 -1
  17. package/dist/{chunk-LKPXHW5N.cjs → chunk-HMSM6FFA.cjs} +3 -3
  18. package/dist/{chunk-77KZUPPN.cjs → chunk-HTEHINI7.cjs} +3 -3
  19. package/dist/{chunk-OMFQ7Z63.cjs → chunk-JOLSGZGN.cjs} +3 -3
  20. package/dist/{chunk-MCDESS3T.js → chunk-JXY7APBU.js} +1 -1
  21. package/dist/{chunk-IJEEM3DI.js → chunk-K2UOY6TB.js} +1 -1
  22. package/dist/{chunk-P364KRO5.js → chunk-KFOHKTFD.js} +1 -1
  23. package/dist/{chunk-DRXPGQM6.cjs → chunk-L4HSIKTU.cjs} +3 -3
  24. package/dist/{chunk-36NWHESN.js → chunk-LH7ZB4BK.js} +1 -1
  25. package/dist/{chunk-I2RJMDXN.js → chunk-LL4ZWLGO.js} +1 -1
  26. package/dist/{chunk-CFFCBWYL.cjs → chunk-M6MTP3NY.cjs} +3 -3
  27. package/dist/{chunk-FC6VDOC7.js → chunk-MHJFYYGV.js} +11 -2
  28. package/dist/{chunk-6OGDPSWT.js → chunk-MINMXGW3.js} +1 -1
  29. package/dist/{chunk-5OGW2ERW.js → chunk-MM7IL2RG.js} +1 -1
  30. package/dist/{chunk-UFNVCUPQ.cjs → chunk-OPQJWHXN.cjs} +3 -3
  31. package/dist/{chunk-6X22I6NQ.cjs → chunk-ORFHDJII.cjs} +3 -3
  32. package/dist/{chunk-W2EWMV3A.cjs → chunk-ORVV4MCF.cjs} +3 -3
  33. package/dist/{chunk-OEK7QSQP.js → chunk-QICQ6YEY.js} +1 -1
  34. package/dist/{chunk-RKHX3DGH.js → chunk-RKUQREMW.js} +1 -1
  35. package/dist/{chunk-AWV2IT66.js → chunk-RO47DKQG.js} +1 -1
  36. package/dist/{chunk-VDOAPLA6.cjs → chunk-RRPXIRTQ.cjs} +3 -3
  37. package/dist/{chunk-YALLOVNO.cjs → chunk-RYFG2GKM.cjs} +3 -3
  38. package/dist/{chunk-OP4KV3BY.cjs → chunk-STNHTRG7.cjs} +3 -3
  39. package/dist/{chunk-YAU6JCYL.cjs → chunk-TFGS34VD.cjs} +3 -3
  40. package/dist/{chunk-PL2GERLG.cjs → chunk-TQXDUMML.cjs} +3 -3
  41. package/dist/{chunk-FVO4743A.cjs → chunk-UBK3VCVH.cjs} +3 -3
  42. package/dist/{chunk-YWV2BBXN.cjs → chunk-UCOXAZJF.cjs} +80 -0
  43. package/dist/{chunk-DPXRMSB2.js → chunk-UQZKFAFX.js} +1 -1
  44. package/dist/{chunk-AI72FMOF.cjs → chunk-VB2KV2ZM.cjs} +3 -3
  45. package/dist/{chunk-ZFQQXWNB.js → chunk-WABKPFPK.js} +1 -1
  46. package/dist/{chunk-LIQSVJLS.js → chunk-WDI4QJMQ.js} +1 -1
  47. package/dist/{chunk-5LS4DSRQ.cjs → chunk-YDH3L27K.cjs} +3 -3
  48. package/dist/{chunk-NKCYXBGX.js → chunk-YIM3D2AD.js} +1 -1
  49. package/dist/{chunk-MG25BEV4.cjs → chunk-YPSEIDUR.cjs} +3 -3
  50. package/dist/{chunk-R5G4V7C6.cjs → chunk-ZNJLWJX3.cjs} +3 -3
  51. package/dist/{chunk-G6DV7LX7.cjs → chunk-ZTFCJCPO.cjs} +3 -3
  52. package/dist/{chunk-VCRKYMJM.js → chunk-ZXUMK2RR.js} +1 -1
  53. package/dist/common/boolean.cjs +3 -3
  54. package/dist/common/boolean.js +2 -2
  55. package/dist/common/color.cjs +3 -3
  56. package/dist/common/color.js +2 -2
  57. package/dist/common/coordinate.cjs +3 -3
  58. package/dist/common/coordinate.js +2 -2
  59. package/dist/common/credit-card.cjs +3 -3
  60. package/dist/common/credit-card.js +2 -2
  61. package/dist/common/date.cjs +3 -3
  62. package/dist/common/date.js +2 -2
  63. package/dist/common/datetime.cjs +3 -3
  64. package/dist/common/datetime.js +2 -2
  65. package/dist/common/email.cjs +3 -3
  66. package/dist/common/email.js +2 -2
  67. package/dist/common/file.cjs +3 -3
  68. package/dist/common/file.js +2 -2
  69. package/dist/common/id.cjs +3 -3
  70. package/dist/common/id.d.cts +34 -8
  71. package/dist/common/id.d.ts +34 -8
  72. package/dist/common/id.js +2 -2
  73. package/dist/common/ip.cjs +3 -3
  74. package/dist/common/ip.js +2 -2
  75. package/dist/common/number.cjs +3 -3
  76. package/dist/common/number.js +2 -2
  77. package/dist/common/password.cjs +3 -3
  78. package/dist/common/password.js +2 -2
  79. package/dist/common/text.cjs +3 -3
  80. package/dist/common/text.js +2 -2
  81. package/dist/common/time.cjs +3 -3
  82. package/dist/common/time.js +2 -2
  83. package/dist/common/url.cjs +3 -3
  84. package/dist/common/url.js +2 -2
  85. package/dist/index.cjs +27 -27
  86. package/dist/index.js +26 -26
  87. package/dist/taiwan/bank-account.cjs +3 -3
  88. package/dist/taiwan/bank-account.js +2 -2
  89. package/dist/taiwan/business-id.cjs +3 -3
  90. package/dist/taiwan/business-id.js +2 -2
  91. package/dist/taiwan/fax.cjs +3 -3
  92. package/dist/taiwan/fax.js +2 -2
  93. package/dist/taiwan/invoice.cjs +3 -3
  94. package/dist/taiwan/invoice.js +2 -2
  95. package/dist/taiwan/license-plate.cjs +3 -3
  96. package/dist/taiwan/license-plate.js +2 -2
  97. package/dist/taiwan/mobile.cjs +3 -3
  98. package/dist/taiwan/mobile.js +2 -2
  99. package/dist/taiwan/national-id.cjs +3 -3
  100. package/dist/taiwan/national-id.js +2 -2
  101. package/dist/taiwan/passport.cjs +3 -3
  102. package/dist/taiwan/passport.js +2 -2
  103. package/dist/taiwan/postal-code.cjs +3 -3
  104. package/dist/taiwan/postal-code.js +2 -2
  105. package/dist/taiwan/tel.cjs +3 -3
  106. package/dist/taiwan/tel.js +2 -2
  107. package/package.json +5 -5
  108. package/src/i18n/locales/en-GB.json +8 -0
  109. package/src/i18n/locales/en-US.json +9 -1
  110. package/src/i18n/locales/id-ID.json +8 -0
  111. package/src/i18n/locales/ja-JP.json +8 -0
  112. package/src/i18n/locales/ko-KR.json +8 -0
  113. package/src/i18n/locales/ms-MY.json +8 -0
  114. package/src/i18n/locales/th-TH.json +8 -0
  115. package/src/i18n/locales/vi-VN.json +8 -0
  116. package/src/i18n/locales/zh-CN.json +8 -0
  117. package/src/i18n/locales/zh-TW.json +8 -0
  118. package/src/validators/common/id.ts +45 -3
  119. package/tests/common/id.test.ts +68 -3
@@ -75,6 +75,14 @@
75
75
  "maxLength": "Harus maksimal ${maxLength} karakter",
76
76
  "numeric": "Harus berupa ID numerik",
77
77
  "uuid": "Harus berupa UUID yang valid",
78
+ "uuidv1": "Harus berupa UUID v1 yang valid",
79
+ "uuidv2": "Harus berupa UUID v2 yang valid",
80
+ "uuidv3": "Harus berupa UUID v3 yang valid",
81
+ "uuidv4": "Harus berupa UUID v4 yang valid",
82
+ "uuidv5": "Harus berupa UUID v5 yang valid",
83
+ "uuidv6": "Harus berupa UUID v6 yang valid",
84
+ "uuidv7": "Harus berupa UUID v7 yang valid",
85
+ "uuidv8": "Harus berupa UUID v8 yang valid",
78
86
  "objectId": "Harus berupa MongoDB ObjectId yang valid",
79
87
  "nanoid": "Harus berupa Nano ID yang valid",
80
88
  "snowflake": "Harus berupa Snowflake ID yang valid",
@@ -75,6 +75,14 @@
75
75
  "maxLength": "${maxLength}文字以下で入力してください",
76
76
  "numeric": "数値IDである必要があります",
77
77
  "uuid": "有効なUUIDである必要があります",
78
+ "uuidv1": "有効なUUID v1である必要があります",
79
+ "uuidv2": "有効なUUID v2である必要があります",
80
+ "uuidv3": "有効なUUID v3である必要があります",
81
+ "uuidv4": "有効なUUID v4である必要があります",
82
+ "uuidv5": "有効なUUID v5である必要があります",
83
+ "uuidv6": "有効なUUID v6である必要があります",
84
+ "uuidv7": "有効なUUID v7である必要があります",
85
+ "uuidv8": "有効なUUID v8である必要があります",
78
86
  "objectId": "有効なMongoDB ObjectIdである必要があります",
79
87
  "nanoid": "有効なNano IDである必要があります",
80
88
  "snowflake": "有効なSnowflake IDである必要があります",
@@ -75,6 +75,14 @@
75
75
  "maxLength": "최대 ${maxLength}자 이하여야 합니다",
76
76
  "numeric": "숫자 ID여야 합니다",
77
77
  "uuid": "유효한 UUID여야 합니다",
78
+ "uuidv1": "유효한 UUID v1이어야 합니다",
79
+ "uuidv2": "유효한 UUID v2이어야 합니다",
80
+ "uuidv3": "유효한 UUID v3이어야 합니다",
81
+ "uuidv4": "유효한 UUID v4이어야 합니다",
82
+ "uuidv5": "유효한 UUID v5이어야 합니다",
83
+ "uuidv6": "유효한 UUID v6이어야 합니다",
84
+ "uuidv7": "유효한 UUID v7이어야 합니다",
85
+ "uuidv8": "유효한 UUID v8이어야 합니다",
78
86
  "objectId": "유효한 MongoDB ObjectId여야 합니다",
79
87
  "nanoid": "유효한 Nano ID여야 합니다",
80
88
  "snowflake": "유효한 Snowflake ID여야 합니다",
@@ -75,6 +75,14 @@
75
75
  "maxLength": "Mesti tidak melebihi ${maxLength} aksara",
76
76
  "numeric": "Mesti ID numerik",
77
77
  "uuid": "Mesti UUID yang sah",
78
+ "uuidv1": "Mesti UUID v1 yang sah",
79
+ "uuidv2": "Mesti UUID v2 yang sah",
80
+ "uuidv3": "Mesti UUID v3 yang sah",
81
+ "uuidv4": "Mesti UUID v4 yang sah",
82
+ "uuidv5": "Mesti UUID v5 yang sah",
83
+ "uuidv6": "Mesti UUID v6 yang sah",
84
+ "uuidv7": "Mesti UUID v7 yang sah",
85
+ "uuidv8": "Mesti UUID v8 yang sah",
78
86
  "objectId": "Mesti MongoDB ObjectId yang sah",
79
87
  "nanoid": "Mesti Nano ID yang sah",
80
88
  "snowflake": "Mesti Snowflake ID yang sah",
@@ -75,6 +75,14 @@
75
75
  "maxLength": "ต้องไม่เกิน ${maxLength} ตัวอักษร",
76
76
  "numeric": "ต้องเป็น ID ตัวเลข",
77
77
  "uuid": "ต้องเป็น UUID ที่ถูกต้อง",
78
+ "uuidv1": "ต้องเป็น UUID v1 ที่ถูกต้อง",
79
+ "uuidv2": "ต้องเป็น UUID v2 ที่ถูกต้อง",
80
+ "uuidv3": "ต้องเป็น UUID v3 ที่ถูกต้อง",
81
+ "uuidv4": "ต้องเป็น UUID v4 ที่ถูกต้อง",
82
+ "uuidv5": "ต้องเป็น UUID v5 ที่ถูกต้อง",
83
+ "uuidv6": "ต้องเป็น UUID v6 ที่ถูกต้อง",
84
+ "uuidv7": "ต้องเป็น UUID v7 ที่ถูกต้อง",
85
+ "uuidv8": "ต้องเป็น UUID v8 ที่ถูกต้อง",
78
86
  "objectId": "ต้องเป็น MongoDB ObjectId ที่ถูกต้อง",
79
87
  "nanoid": "ต้องเป็น Nano ID ที่ถูกต้อง",
80
88
  "snowflake": "ต้องเป็น Snowflake ID ที่ถูกต้อง",
@@ -75,6 +75,14 @@
75
75
  "maxLength": "Phải có tối đa ${maxLength} ký tự",
76
76
  "numeric": "Phải là ID dạng số",
77
77
  "uuid": "Phải là UUID hợp lệ",
78
+ "uuidv1": "Phải là UUID v1 hợp lệ",
79
+ "uuidv2": "Phải là UUID v2 hợp lệ",
80
+ "uuidv3": "Phải là UUID v3 hợp lệ",
81
+ "uuidv4": "Phải là UUID v4 hợp lệ",
82
+ "uuidv5": "Phải là UUID v5 hợp lệ",
83
+ "uuidv6": "Phải là UUID v6 hợp lệ",
84
+ "uuidv7": "Phải là UUID v7 hợp lệ",
85
+ "uuidv8": "Phải là UUID v8 hợp lệ",
78
86
  "objectId": "Phải là MongoDB ObjectId hợp lệ",
79
87
  "nanoid": "Phải là Nano ID hợp lệ",
80
88
  "snowflake": "Phải là Snowflake ID hợp lệ",
@@ -75,6 +75,14 @@
75
75
  "maxLength": "长度最多 ${maxLength} 个字符",
76
76
  "numeric": "必须为数字 ID",
77
77
  "uuid": "必须为有效的 UUID",
78
+ "uuidv1": "必须为有效的 UUID v1",
79
+ "uuidv2": "必须为有效的 UUID v2",
80
+ "uuidv3": "必须为有效的 UUID v3",
81
+ "uuidv4": "必须为有效的 UUID v4",
82
+ "uuidv5": "必须为有效的 UUID v5",
83
+ "uuidv6": "必须为有效的 UUID v6",
84
+ "uuidv7": "必须为有效的 UUID v7",
85
+ "uuidv8": "必须为有效的 UUID v8",
78
86
  "objectId": "必须为有效的 MongoDB ObjectId",
79
87
  "nanoid": "必须为有效的 Nano ID",
80
88
  "snowflake": "必须为有效的 Snowflake ID",
@@ -75,6 +75,14 @@
75
75
  "maxLength": "長度最多 ${maxLength} 字元",
76
76
  "numeric": "必須為數字 ID",
77
77
  "uuid": "必須為有效的 UUID",
78
+ "uuidv1": "必須為有效的 UUID v1",
79
+ "uuidv2": "必須為有效的 UUID v2",
80
+ "uuidv3": "必須為有效的 UUID v3",
81
+ "uuidv4": "必須為有效的 UUID v4",
82
+ "uuidv5": "必須為有效的 UUID v5",
83
+ "uuidv6": "必須為有效的 UUID v6",
84
+ "uuidv7": "必須為有效的 UUID v7",
85
+ "uuidv8": "必須為有效的 UUID v8",
78
86
  "objectId": "必須為有效的 MongoDB ObjectId",
79
87
  "nanoid": "必須為有效的 Nano ID",
80
88
  "snowflake": "必須為有效的 Snowflake ID",
@@ -22,6 +22,14 @@ import { getLocale, type Locale } from "../../config"
22
22
  * @property {string} [maxLength] - Message when ID is too long
23
23
  * @property {string} [numeric] - Message when numeric ID format is invalid
24
24
  * @property {string} [uuid] - Message when UUID format is invalid
25
+ * @property {string} [uuidv1] - Message when UUID v1 format is invalid
26
+ * @property {string} [uuidv2] - Message when UUID v2 format is invalid
27
+ * @property {string} [uuidv3] - Message when UUID v3 format is invalid
28
+ * @property {string} [uuidv4] - Message when UUID v4 format is invalid
29
+ * @property {string} [uuidv5] - Message when UUID v5 format is invalid
30
+ * @property {string} [uuidv6] - Message when UUID v6 format is invalid
31
+ * @property {string} [uuidv7] - Message when UUID v7 format is invalid
32
+ * @property {string} [uuidv8] - Message when UUID v8 format is invalid
25
33
  * @property {string} [objectId] - Message when MongoDB ObjectId format is invalid
26
34
  * @property {string} [nanoid] - Message when Nano ID format is invalid
27
35
  * @property {string} [snowflake] - Message when Snowflake ID format is invalid
@@ -41,6 +49,14 @@ export type IdMessages = {
41
49
  maxLength?: string
42
50
  numeric?: string
43
51
  uuid?: string
52
+ uuidv1?: string
53
+ uuidv2?: string
54
+ uuidv3?: string
55
+ uuidv4?: string
56
+ uuidv5?: string
57
+ uuidv6?: string
58
+ uuidv7?: string
59
+ uuidv8?: string
44
60
  objectId?: string
45
61
  nanoid?: string
46
62
  snowflake?: string
@@ -61,7 +77,15 @@ export type IdMessages = {
61
77
  *
62
78
  * Available types:
63
79
  * - numeric: Pure numeric IDs (1, 123, 999999)
64
- * - uuid: UUID v4 format (xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx)
80
+ * - uuid: UUID any version (v1–v8)
81
+ * - uuidv1: UUID v1 (timestamp-based)
82
+ * - uuidv2: UUID v2 (DCE security)
83
+ * - uuidv3: UUID v3 (MD5 name-based)
84
+ * - uuidv4: UUID v4 (random)
85
+ * - uuidv5: UUID v5 (SHA-1 name-based)
86
+ * - uuidv6: UUID v6 (reordered timestamp, RFC 9562)
87
+ * - uuidv7: UUID v7 (Unix timestamp, sortable, RFC 9562)
88
+ * - uuidv8: UUID v8 (custom, RFC 9562)
65
89
  * - objectId: MongoDB ObjectId (24-character hexadecimal)
66
90
  * - nanoid: Nano ID format (21-character URL-safe)
67
91
  * - snowflake: Twitter Snowflake (19-digit number)
@@ -72,7 +96,15 @@ export type IdMessages = {
72
96
  */
73
97
  export type IdType =
74
98
  | "numeric" // Pure numeric IDs (1, 123, 999999)
75
- | "uuid" // UUID v4 format
99
+ | "uuid" // UUID any version (v1–v8)
100
+ | "uuidv1" // UUID v1 (timestamp-based)
101
+ | "uuidv2" // UUID v2 (DCE security)
102
+ | "uuidv3" // UUID v3 (MD5 name-based)
103
+ | "uuidv4" // UUID v4 (random)
104
+ | "uuidv5" // UUID v5 (SHA-1 name-based)
105
+ | "uuidv6" // UUID v6 (reordered timestamp, RFC 9562)
106
+ | "uuidv7" // UUID v7 (Unix timestamp, sortable, RFC 9562)
107
+ | "uuidv8" // UUID v8 (custom, RFC 9562)
76
108
  | "objectId" // MongoDB ObjectId (24-character hexadecimal)
77
109
  | "nanoid" // Nano ID
78
110
  | "snowflake" // Twitter Snowflake (19-digit number)
@@ -143,9 +175,19 @@ export type IdSchema<IsRequired extends boolean, Type extends IdType | undefined
143
175
  * @constant {Record<string, RegExp>} ID_PATTERNS
144
176
  * @description Maps each ID type to its corresponding regex pattern
145
177
  */
178
+ const UUID_BASE = (version: string) => new RegExp(`^[0-9a-f]{8}-[0-9a-f]{4}-${version}[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$`, "i")
179
+
146
180
  const ID_PATTERNS = {
147
181
  numeric: /^\d+$/,
148
- 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,
182
+ uuid: /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
183
+ uuidv1: UUID_BASE("1"),
184
+ uuidv2: UUID_BASE("2"),
185
+ uuidv3: UUID_BASE("3"),
186
+ uuidv4: UUID_BASE("4"),
187
+ uuidv5: UUID_BASE("5"),
188
+ uuidv6: UUID_BASE("6"),
189
+ uuidv7: UUID_BASE("7"),
190
+ uuidv8: UUID_BASE("8"),
149
191
  objectId: /^[0-9a-f]{24}$/i,
150
192
  nanoid: /^[A-Za-z0-9_-]{21}$/,
151
193
  snowflake: /^\d{19}$/,
@@ -11,6 +11,9 @@ const locales = [
11
11
  maxLength: "Must be at most 10 characters",
12
12
  numeric: "Must be a numeric ID",
13
13
  uuid: "Must be a valid UUID",
14
+ uuidv1: "Must be a valid UUID v1",
15
+ uuidv4: "Must be a valid UUID v4",
16
+ uuidv7: "Must be a valid UUID v7",
14
17
  objectId: "Must be a valid MongoDB ObjectId",
15
18
  nanoid: "Must be a valid Nano ID",
16
19
  snowflake: "Must be a valid Snowflake ID",
@@ -33,6 +36,9 @@ const locales = [
33
36
  maxLength: "長度最多 10 字元",
34
37
  numeric: "必須為數字 ID",
35
38
  uuid: "必須為有效的 UUID",
39
+ uuidv1: "必須為有效的 UUID v1",
40
+ uuidv4: "必須為有效的 UUID v4",
41
+ uuidv7: "必須為有效的 UUID v7",
36
42
  objectId: "必須為有效的 MongoDB ObjectId",
37
43
  nanoid: "必須為有效的 Nano ID",
38
44
  snowflake: "必須為有效的 Snowflake ID",
@@ -51,7 +57,20 @@ const locales = [
51
57
  // Valid test IDs for different formats
52
58
  const validIds = {
53
59
  numeric: ["1", "123", "999999", "0"],
54
- uuid: ["550e8400-e29b-41d4-a716-446655440000", "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "f47ac10b-58cc-4372-a567-0e02b2c3d479"],
60
+ uuid: [
61
+ "550e8400-e29b-41d4-a716-446655440000", // v4
62
+ "6ba7b810-9dad-11d1-80b4-00c04fd430c8", // v1
63
+ "f47ac10b-58cc-4372-a567-0e02b2c3d479", // v4
64
+ "01939fee-4b0b-7da3-a9e4-79fb4c267eb8", // v7
65
+ "320c3d4d-cc00-875b-8ec9-32d5f69181c0", // v8
66
+ ],
67
+ uuidv1: ["6ba7b810-9dad-11d1-80b4-00c04fd430c8", "f47ac10b-58cc-1372-a567-0e02b2c3d479"],
68
+ uuidv3: ["a3bb189e-8bf9-3888-9912-ace4e6543002"],
69
+ uuidv4: ["550e8400-e29b-41d4-a716-446655440000", "f47ac10b-58cc-4372-a567-0e02b2c3d479"],
70
+ uuidv5: ["886313e1-3b8a-5372-9b90-0c9aee199e5d"],
71
+ uuidv6: ["1ef21d2f-1207-6b90-8b50-a2e4100c5480"],
72
+ uuidv7: ["01939fee-4b0b-7da3-a9e4-79fb4c267eb8", "018fce07-42dc-7dc0-ba2c-9f7e777caee3"],
73
+ uuidv8: ["320c3d4d-cc00-875b-8ec9-32d5f69181c0"],
55
74
  objectId: ["507f1f77bcf86cd799439011", "507f191e810c19729de860ea", "5a9427648b0beebeb69579cc"],
56
75
  nanoid: ["V1StGXR8_Z5jdHi6B-myT", "3IBBoOd_b1YSlnKdvQ8fK", "9_xnJ2QZt8vKl3_Kj5f7N"],
57
76
  snowflake: ["1234567890123456789", "9876543210987654321", "5555555555555555555"],
@@ -65,11 +84,19 @@ const invalidIds = {
65
84
  numeric: ["abc", "12a", ""],
66
85
  uuid: [
67
86
  "550e8400-e29b-41d4-a716-44665544000", // too short
68
- "550e8400-e29b-41d4-a716-44665544000g", // too long
69
- "550e8400-e29b-61d4-a716-446655440000", // wrong version (6 instead of 1-5)
87
+ "550e8400-e29b-41d4-a716-44665544000g", // invalid character
88
+ "550e8400-e29b-91d4-a716-446655440000", // wrong version (9)
70
89
  "550e8400-e29b-41d4-c716-446655440000", // wrong variant (c instead of 8,9,a,b)
71
90
  "not-a-uuid-at-all",
72
91
  ],
92
+ uuidv4: [
93
+ "6ba7b810-9dad-11d1-80b4-00c04fd430c8", // v1, not v4
94
+ "01939fee-4b0b-7da3-a9e4-79fb4c267eb8", // v7, not v4
95
+ ],
96
+ uuidv7: [
97
+ "550e8400-e29b-41d4-a716-446655440000", // v4, not v7
98
+ "6ba7b810-9dad-11d1-80b4-00c04fd430c8", // v1, not v7
99
+ ],
73
100
  objectId: [
74
101
  "507f1f77bcf86cd79943901", // too short
75
102
  "507f1f77bcf86cd799439011g", // invalid character
@@ -192,6 +219,44 @@ describe.each(locales)("id(true) locale: $locale", ({ locale, messages }) => {
192
219
  })
193
220
  })
194
221
 
222
+ describe("UUID version-specific validation", () => {
223
+ it("should accept valid UUIDv4 and reject other versions", () => {
224
+ const schema = id(true, { type: "uuidv4" })
225
+ validIds.uuidv4.forEach((v) => expect(schema.parse(v)).toBe(v))
226
+ invalidIds.uuidv4.forEach((v) => expect(() => schema.parse(v)).toThrow(messages.uuidv4))
227
+ })
228
+
229
+ it("should accept valid UUIDv7 and reject other versions", () => {
230
+ const schema = id(true, { type: "uuidv7" })
231
+ validIds.uuidv7.forEach((v) => expect(schema.parse(v)).toBe(v))
232
+ invalidIds.uuidv7.forEach((v) => expect(() => schema.parse(v)).toThrow(messages.uuidv7))
233
+ })
234
+
235
+ it("should accept valid UUIDv1", () => {
236
+ const schema = id(true, { type: "uuidv1" })
237
+ validIds.uuidv1.forEach((v) => expect(schema.parse(v)).toBe(v))
238
+ })
239
+
240
+ it("should accept valid UUIDv6", () => {
241
+ const schema = id(true, { type: "uuidv6" })
242
+ validIds.uuidv6.forEach((v) => expect(schema.parse(v)).toBe(v))
243
+ })
244
+
245
+ it("should accept any version with generic uuid type", () => {
246
+ const schema = id(true, { type: "uuid" })
247
+ // All version-specific IDs should pass generic uuid validation
248
+ ;[...validIds.uuidv1, ...validIds.uuidv4, ...validIds.uuidv7, ...validIds.uuidv8].forEach((v) => expect(schema.parse(v)).toBe(v))
249
+ })
250
+
251
+ it("should work with allowedTypes for specific versions", () => {
252
+ const schema = id(true, { allowedTypes: ["uuidv4", "uuidv7"] })
253
+ validIds.uuidv4.forEach((v) => expect(schema.parse(v)).toBe(v))
254
+ validIds.uuidv7.forEach((v) => expect(schema.parse(v)).toBe(v))
255
+ // v1 should be rejected
256
+ expect(() => schema.parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8")).toThrow()
257
+ })
258
+ })
259
+
195
260
  describe("ObjectId validation", () => {
196
261
  it("should accept valid ObjectIds", () => {
197
262
  const schema = id(true, { type: "objectId" })