@archi-code/validation 0.0.0-stage → 3.0.0-alpha.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 (548) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +345 -2
  3. package/dist/cjs/canBe/array.d.ts +1 -0
  4. package/dist/cjs/canBe/array.js +7 -0
  5. package/dist/cjs/canBe/boolean.d.ts +1 -0
  6. package/dist/cjs/canBe/boolean.js +7 -0
  7. package/dist/cjs/canBe/date.d.ts +1 -0
  8. package/dist/cjs/canBe/date.js +7 -0
  9. package/dist/cjs/canBe/enum.d.ts +1 -0
  10. package/dist/cjs/canBe/enum.js +7 -0
  11. package/dist/cjs/canBe/float.d.ts +1 -0
  12. package/dist/cjs/canBe/float.js +7 -0
  13. package/dist/cjs/canBe/index.d.ts +8 -0
  14. package/dist/cjs/canBe/index.js +20 -0
  15. package/dist/cjs/canBe/integer.d.ts +1 -0
  16. package/dist/cjs/canBe/integer.js +7 -0
  17. package/dist/cjs/canBe/json.d.ts +2 -0
  18. package/dist/cjs/canBe/json.js +9 -0
  19. package/dist/cjs/canBe/string.d.ts +1 -0
  20. package/dist/cjs/canBe/string.js +7 -0
  21. package/dist/cjs/convert/any-to-string.d.ts +1 -0
  22. package/dist/cjs/convert/any-to-string.js +64 -0
  23. package/dist/cjs/convert/array.d.ts +2 -0
  24. package/dist/cjs/convert/array.js +25 -0
  25. package/dist/cjs/convert/boolean.d.ts +5 -0
  26. package/dist/cjs/convert/boolean.js +30 -0
  27. package/dist/cjs/convert/date.d.ts +11 -0
  28. package/dist/cjs/convert/date.js +162 -0
  29. package/dist/cjs/convert/enum.d.ts +2 -0
  30. package/dist/cjs/convert/enum.js +11 -0
  31. package/dist/cjs/convert/float.d.ts +6 -0
  32. package/dist/cjs/convert/float.js +46 -0
  33. package/dist/cjs/convert/index.d.ts +16 -0
  34. package/dist/cjs/convert/index.js +24 -0
  35. package/dist/cjs/convert/integer.d.ts +6 -0
  36. package/dist/cjs/convert/integer.js +41 -0
  37. package/dist/cjs/convert/json.d.ts +7 -0
  38. package/dist/cjs/convert/json.js +81 -0
  39. package/dist/cjs/convert/result.d.ts +26 -0
  40. package/dist/cjs/convert/result.js +23 -0
  41. package/dist/cjs/convert/string.d.ts +2 -0
  42. package/dist/cjs/convert/string.js +13 -0
  43. package/dist/cjs/decorator/validate.d.ts +23 -0
  44. package/dist/cjs/decorator/validate.js +62 -0
  45. package/dist/cjs/decorator/validations.d.ts +35 -0
  46. package/dist/cjs/decorator/validations.js +75 -0
  47. package/dist/cjs/helpers/algorithms.d.ts +1 -0
  48. package/dist/cjs/helpers/algorithms.js +10 -0
  49. package/dist/cjs/helpers/analyzePassword.d.ts +9 -0
  50. package/dist/cjs/helpers/analyzePassword.js +41 -0
  51. package/dist/cjs/helpers/assertString.d.ts +1 -0
  52. package/dist/cjs/helpers/assertString.js +9 -0
  53. package/dist/cjs/helpers/boundedCache.d.ts +9 -0
  54. package/dist/cjs/helpers/boundedCache.js +33 -0
  55. package/dist/cjs/helpers/checkHost.d.ts +2 -0
  56. package/dist/cjs/helpers/checkHost.js +36 -0
  57. package/dist/cjs/helpers/config.d.ts +10 -0
  58. package/dist/cjs/helpers/config.js +34 -0
  59. package/dist/cjs/helpers/errors.d.ts +3 -0
  60. package/dist/cjs/helpers/errors.js +10 -0
  61. package/dist/cjs/helpers/escapeRegExp.d.ts +1 -0
  62. package/dist/cjs/helpers/escapeRegExp.js +6 -0
  63. package/dist/cjs/helpers/hasOwn.d.ts +1 -0
  64. package/dist/cjs/helpers/hasOwn.js +6 -0
  65. package/dist/cjs/helpers/merge.d.ts +1 -0
  66. package/dist/cjs/helpers/merge.js +15 -0
  67. package/dist/cjs/helpers/scorePassword.d.ts +9 -0
  68. package/dist/cjs/helpers/scorePassword.js +37 -0
  69. package/dist/cjs/index.d.ts +103 -0
  70. package/dist/cjs/index.js +220 -0
  71. package/dist/cjs/sanitizer/blacklist.d.ts +1 -0
  72. package/dist/cjs/sanitizer/blacklist.js +11 -0
  73. package/dist/cjs/sanitizer/escape.d.ts +1 -0
  74. package/dist/cjs/sanitizer/escape.js +16 -0
  75. package/dist/cjs/sanitizer/index.d.ts +10 -0
  76. package/dist/cjs/sanitizer/index.js +21 -0
  77. package/dist/cjs/sanitizer/ltrim.d.ts +1 -0
  78. package/dist/cjs/sanitizer/ltrim.js +13 -0
  79. package/dist/cjs/sanitizer/normalizeEmail.d.ts +16 -0
  80. package/dist/cjs/sanitizer/normalizeEmail.js +194 -0
  81. package/dist/cjs/sanitizer/rtrim.d.ts +1 -0
  82. package/dist/cjs/sanitizer/rtrim.js +21 -0
  83. package/dist/cjs/sanitizer/stripLow.d.ts +1 -0
  84. package/dist/cjs/sanitizer/stripLow.js +10 -0
  85. package/dist/cjs/sanitizer/trim.d.ts +1 -0
  86. package/dist/cjs/sanitizer/trim.js +14 -0
  87. package/dist/cjs/sanitizer/unescape.d.ts +1 -0
  88. package/dist/cjs/sanitizer/unescape.js +16 -0
  89. package/dist/cjs/sanitizer/whitelist.d.ts +1 -0
  90. package/dist/cjs/sanitizer/whitelist.js +11 -0
  91. package/dist/cjs/validators/alpha.d.ts +105 -0
  92. package/dist/cjs/validators/alpha.js +202 -0
  93. package/dist/cjs/validators/contains.d.ts +6 -0
  94. package/dist/cjs/validators/contains.js +27 -0
  95. package/dist/cjs/validators/equals.d.ts +4 -0
  96. package/dist/cjs/validators/equals.js +14 -0
  97. package/dist/cjs/validators/index.d.ts +242 -0
  98. package/dist/cjs/validators/index.js +193 -0
  99. package/dist/cjs/validators/isAbaRouting.d.ts +1 -0
  100. package/dist/cjs/validators/isAbaRouting.js +24 -0
  101. package/dist/cjs/validators/isAfter.d.ts +4 -0
  102. package/dist/cjs/validators/isAfter.js +15 -0
  103. package/dist/cjs/validators/isAlpha.d.ts +8 -0
  104. package/dist/cjs/validators/isAlpha.js +35 -0
  105. package/dist/cjs/validators/isAlphanumeric.d.ts +8 -0
  106. package/dist/cjs/validators/isAlphanumeric.js +35 -0
  107. package/dist/cjs/validators/isAscii.d.ts +1 -0
  108. package/dist/cjs/validators/isAscii.js +13 -0
  109. package/dist/cjs/validators/isBIC.d.ts +1 -0
  110. package/dist/cjs/validators/isBIC.js +18 -0
  111. package/dist/cjs/validators/isBase32.d.ts +4 -0
  112. package/dist/cjs/validators/isBase32.js +21 -0
  113. package/dist/cjs/validators/isBase58.d.ts +1 -0
  114. package/dist/cjs/validators/isBase58.js +13 -0
  115. package/dist/cjs/validators/isBase64.d.ts +5 -0
  116. package/dist/cjs/validators/isBase64.js +28 -0
  117. package/dist/cjs/validators/isBefore.d.ts +4 -0
  118. package/dist/cjs/validators/isBefore.js +15 -0
  119. package/dist/cjs/validators/isBoolean.d.ts +4 -0
  120. package/dist/cjs/validators/isBoolean.js +7 -0
  121. package/dist/cjs/validators/isBtcAddress.d.ts +1 -0
  122. package/dist/cjs/validators/isBtcAddress.js +14 -0
  123. package/dist/cjs/validators/isByteLength.d.ts +5 -0
  124. package/dist/cjs/validators/isByteLength.js +36 -0
  125. package/dist/cjs/validators/isCreditCard.d.ts +15 -0
  126. package/dist/cjs/validators/isCreditCard.js +50 -0
  127. package/dist/cjs/validators/isCurrency.d.ts +18 -0
  128. package/dist/cjs/validators/isCurrency.js +114 -0
  129. package/dist/cjs/validators/isDataURI.d.ts +1 -0
  130. package/dist/cjs/validators/isDataURI.js +39 -0
  131. package/dist/cjs/validators/isDate.d.ts +7 -0
  132. package/dist/cjs/validators/isDate.js +8 -0
  133. package/dist/cjs/validators/isDecimal.d.ts +6 -0
  134. package/dist/cjs/validators/isDecimal.js +46 -0
  135. package/dist/cjs/validators/isDivisibleBy.d.ts +4 -0
  136. package/dist/cjs/validators/isDivisibleBy.js +15 -0
  137. package/dist/cjs/validators/isEAN.d.ts +1 -0
  138. package/dist/cjs/validators/isEAN.js +31 -0
  139. package/dist/cjs/validators/isEmail.d.ts +14 -0
  140. package/dist/cjs/validators/isEmail.js +153 -0
  141. package/dist/cjs/validators/isEmpty.d.ts +4 -0
  142. package/dist/cjs/validators/isEmpty.js +17 -0
  143. package/dist/cjs/validators/isEthereumAddress.d.ts +1 -0
  144. package/dist/cjs/validators/isEthereumAddress.js +13 -0
  145. package/dist/cjs/validators/isFQDN.d.ts +9 -0
  146. package/dist/cjs/validators/isFQDN.js +68 -0
  147. package/dist/cjs/validators/isFloat.d.ts +9 -0
  148. package/dist/cjs/validators/isFloat.js +30 -0
  149. package/dist/cjs/validators/isFullWidth.d.ts +2 -0
  150. package/dist/cjs/validators/isFullWidth.js +14 -0
  151. package/dist/cjs/validators/isHSL.d.ts +1 -0
  152. package/dist/cjs/validators/isHSL.js +18 -0
  153. package/dist/cjs/validators/isHalfWidth.d.ts +2 -0
  154. package/dist/cjs/validators/isHalfWidth.js +14 -0
  155. package/dist/cjs/validators/isHash.d.ts +21 -0
  156. package/dist/cjs/validators/isHash.js +34 -0
  157. package/dist/cjs/validators/isHexColor.d.ts +4 -0
  158. package/dist/cjs/validators/isHexColor.js +20 -0
  159. package/dist/cjs/validators/isHexadecimal.d.ts +1 -0
  160. package/dist/cjs/validators/isHexadecimal.js +13 -0
  161. package/dist/cjs/validators/isIBAN.d.ts +6 -0
  162. package/dist/cjs/validators/isIBAN.js +145 -0
  163. package/dist/cjs/validators/isIMEI.d.ts +4 -0
  164. package/dist/cjs/validators/isIMEI.js +45 -0
  165. package/dist/cjs/validators/isIP.d.ts +5 -0
  166. package/dist/cjs/validators/isIP.js +38 -0
  167. package/dist/cjs/validators/isIPRange.d.ts +5 -0
  168. package/dist/cjs/validators/isIPRange.js +43 -0
  169. package/dist/cjs/validators/isISBN.d.ts +5 -0
  170. package/dist/cjs/validators/isISBN.js +51 -0
  171. package/dist/cjs/validators/isISIN.d.ts +1 -0
  172. package/dist/cjs/validators/isISIN.js +55 -0
  173. package/dist/cjs/validators/isISO15924.d.ts +2 -0
  174. package/dist/cjs/validators/isISO15924.js +287 -0
  175. package/dist/cjs/validators/isISO31661Alpha2.d.ts +5 -0
  176. package/dist/cjs/validators/isISO31661Alpha2.js +277 -0
  177. package/dist/cjs/validators/isISO31661Alpha3.d.ts +4 -0
  178. package/dist/cjs/validators/isISO31661Alpha3.js +275 -0
  179. package/dist/cjs/validators/isISO31661Numeric.d.ts +1 -0
  180. package/dist/cjs/validators/isISO31661Numeric.js +263 -0
  181. package/dist/cjs/validators/isISO4217.d.ts +2 -0
  182. package/dist/cjs/validators/isISO4217.js +195 -0
  183. package/dist/cjs/validators/isISO6346.d.ts +2 -0
  184. package/dist/cjs/validators/isISO6346.js +43 -0
  185. package/dist/cjs/validators/isISO6391.d.ts +1 -0
  186. package/dist/cjs/validators/isISO6391.js +199 -0
  187. package/dist/cjs/validators/isISO8601.d.ts +5 -0
  188. package/dist/cjs/validators/isISO8601.js +42 -0
  189. package/dist/cjs/validators/isISRC.d.ts +1 -0
  190. package/dist/cjs/validators/isISRC.js +13 -0
  191. package/dist/cjs/validators/isISSN.d.ts +5 -0
  192. package/dist/cjs/validators/isISSN.js +27 -0
  193. package/dist/cjs/validators/isIdentityCard.d.ts +24 -0
  194. package/dist/cjs/validators/isIdentityCard.js +442 -0
  195. package/dist/cjs/validators/isIn.d.ts +4 -0
  196. package/dist/cjs/validators/isIn.js +36 -0
  197. package/dist/cjs/validators/isInt.d.ts +8 -0
  198. package/dist/cjs/validators/isInt.js +29 -0
  199. package/dist/cjs/validators/isJSON.d.ts +5 -0
  200. package/dist/cjs/validators/isJSON.js +10 -0
  201. package/dist/cjs/validators/isJWT.d.ts +1 -0
  202. package/dist/cjs/validators/isJWT.js +23 -0
  203. package/dist/cjs/validators/isLatLong.d.ts +4 -0
  204. package/dist/cjs/validators/isLatLong.js +29 -0
  205. package/dist/cjs/validators/isLength.d.ts +7 -0
  206. package/dist/cjs/validators/isLength.js +28 -0
  207. package/dist/cjs/validators/isLicensePlate.d.ts +21 -0
  208. package/dist/cjs/validators/isLicensePlate.js +43 -0
  209. package/dist/cjs/validators/isLocale.d.ts +1 -0
  210. package/dist/cjs/validators/isLocale.js +29 -0
  211. package/dist/cjs/validators/isLowercase.d.ts +1 -0
  212. package/dist/cjs/validators/isLowercase.js +12 -0
  213. package/dist/cjs/validators/isLuhnNumber.d.ts +1 -0
  214. package/dist/cjs/validators/isLuhnNumber.js +37 -0
  215. package/dist/cjs/validators/isMACAddress.d.ts +6 -0
  216. package/dist/cjs/validators/isMACAddress.js +34 -0
  217. package/dist/cjs/validators/isMD5.d.ts +1 -0
  218. package/dist/cjs/validators/isMD5.js +13 -0
  219. package/dist/cjs/validators/isMagnetURI.d.ts +1 -0
  220. package/dist/cjs/validators/isMagnetURI.js +16 -0
  221. package/dist/cjs/validators/isMailtoURI.d.ts +4 -0
  222. package/dist/cjs/validators/isMailtoURI.js +53 -0
  223. package/dist/cjs/validators/isMimeType.d.ts +1 -0
  224. package/dist/cjs/validators/isMimeType.js +15 -0
  225. package/dist/cjs/validators/isMobilePhone.d.ts +171 -0
  226. package/dist/cjs/validators/isMobilePhone.js +212 -0
  227. package/dist/cjs/validators/isMongoId.d.ts +1 -0
  228. package/dist/cjs/validators/isMongoId.js +11 -0
  229. package/dist/cjs/validators/isMultibyte.d.ts +1 -0
  230. package/dist/cjs/validators/isMultibyte.js +13 -0
  231. package/dist/cjs/validators/isNotEmpty.d.ts +1 -0
  232. package/dist/cjs/validators/isNotEmpty.js +10 -0
  233. package/dist/cjs/validators/isNumeric.d.ts +5 -0
  234. package/dist/cjs/validators/isNumeric.js +34 -0
  235. package/dist/cjs/validators/isOctal.d.ts +1 -0
  236. package/dist/cjs/validators/isOctal.js +13 -0
  237. package/dist/cjs/validators/isPassportNumber.d.ts +69 -0
  238. package/dist/cjs/validators/isPassportNumber.js +84 -0
  239. package/dist/cjs/validators/isPort.d.ts +1 -0
  240. package/dist/cjs/validators/isPort.js +7 -0
  241. package/dist/cjs/validators/isPostalCode.d.ts +79 -0
  242. package/dist/cjs/validators/isPostalCode.js +108 -0
  243. package/dist/cjs/validators/isRFC3339.d.ts +1 -0
  244. package/dist/cjs/validators/isRFC3339.js +28 -0
  245. package/dist/cjs/validators/isRequired.d.ts +1 -0
  246. package/dist/cjs/validators/isRequired.js +6 -0
  247. package/dist/cjs/validators/isRgbColor.d.ts +5 -0
  248. package/dist/cjs/validators/isRgbColor.js +38 -0
  249. package/dist/cjs/validators/isSemVer.d.ts +1 -0
  250. package/dist/cjs/validators/isSemVer.js +15 -0
  251. package/dist/cjs/validators/isSlug.d.ts +1 -0
  252. package/dist/cjs/validators/isSlug.js +13 -0
  253. package/dist/cjs/validators/isStrongPassword.d.ts +8 -0
  254. package/dist/cjs/validators/isStrongPassword.js +25 -0
  255. package/dist/cjs/validators/isSurrogatePair.d.ts +1 -0
  256. package/dist/cjs/validators/isSurrogatePair.js +13 -0
  257. package/dist/cjs/validators/isTime.d.ts +5 -0
  258. package/dist/cjs/validators/isTime.js +37 -0
  259. package/dist/cjs/validators/isULID.d.ts +1 -0
  260. package/dist/cjs/validators/isULID.js +12 -0
  261. package/dist/cjs/validators/isURL.d.ts +22 -0
  262. package/dist/cjs/validators/isURL.js +215 -0
  263. package/dist/cjs/validators/isUUID.d.ts +5 -0
  264. package/dist/cjs/validators/isUUID.js +31 -0
  265. package/dist/cjs/validators/isUppercase.d.ts +1 -0
  266. package/dist/cjs/validators/isUppercase.js +12 -0
  267. package/dist/cjs/validators/isVAT.d.ts +75 -0
  268. package/dist/cjs/validators/isVAT.js +134 -0
  269. package/dist/cjs/validators/isVariableWidth.d.ts +1 -0
  270. package/dist/cjs/validators/isVariableWidth.js +14 -0
  271. package/dist/cjs/validators/isWhitelisted.d.ts +4 -0
  272. package/dist/cjs/validators/isWhitelisted.js +23 -0
  273. package/dist/cjs/validators/matches.d.ts +5 -0
  274. package/dist/cjs/validators/matches.js +29 -0
  275. package/dist/esm/canBe/array.d.ts +1 -0
  276. package/dist/esm/canBe/array.js +4 -0
  277. package/dist/esm/canBe/boolean.d.ts +1 -0
  278. package/dist/esm/canBe/boolean.js +4 -0
  279. package/dist/esm/canBe/date.d.ts +1 -0
  280. package/dist/esm/canBe/date.js +4 -0
  281. package/dist/esm/canBe/enum.d.ts +1 -0
  282. package/dist/esm/canBe/enum.js +4 -0
  283. package/dist/esm/canBe/float.d.ts +1 -0
  284. package/dist/esm/canBe/float.js +4 -0
  285. package/dist/esm/canBe/index.d.ts +8 -0
  286. package/dist/esm/canBe/index.js +8 -0
  287. package/dist/esm/canBe/integer.d.ts +1 -0
  288. package/dist/esm/canBe/integer.js +4 -0
  289. package/dist/esm/canBe/json.d.ts +2 -0
  290. package/dist/esm/canBe/json.js +5 -0
  291. package/dist/esm/canBe/string.d.ts +1 -0
  292. package/dist/esm/canBe/string.js +4 -0
  293. package/dist/esm/convert/any-to-string.d.ts +1 -0
  294. package/dist/esm/convert/any-to-string.js +61 -0
  295. package/dist/esm/convert/array.d.ts +2 -0
  296. package/dist/esm/convert/array.js +22 -0
  297. package/dist/esm/convert/boolean.d.ts +5 -0
  298. package/dist/esm/convert/boolean.js +27 -0
  299. package/dist/esm/convert/date.d.ts +11 -0
  300. package/dist/esm/convert/date.js +158 -0
  301. package/dist/esm/convert/enum.d.ts +2 -0
  302. package/dist/esm/convert/enum.js +8 -0
  303. package/dist/esm/convert/float.d.ts +6 -0
  304. package/dist/esm/convert/float.js +43 -0
  305. package/dist/esm/convert/index.d.ts +16 -0
  306. package/dist/esm/convert/index.js +10 -0
  307. package/dist/esm/convert/integer.d.ts +6 -0
  308. package/dist/esm/convert/integer.js +38 -0
  309. package/dist/esm/convert/json.d.ts +7 -0
  310. package/dist/esm/convert/json.js +77 -0
  311. package/dist/esm/convert/result.d.ts +26 -0
  312. package/dist/esm/convert/result.js +18 -0
  313. package/dist/esm/convert/string.d.ts +2 -0
  314. package/dist/esm/convert/string.js +10 -0
  315. package/dist/esm/decorator/validate.d.ts +23 -0
  316. package/dist/esm/decorator/validate.js +59 -0
  317. package/dist/esm/decorator/validations.d.ts +35 -0
  318. package/dist/esm/decorator/validations.js +68 -0
  319. package/dist/esm/helpers/algorithms.d.ts +1 -0
  320. package/dist/esm/helpers/algorithms.js +7 -0
  321. package/dist/esm/helpers/analyzePassword.d.ts +9 -0
  322. package/dist/esm/helpers/analyzePassword.js +38 -0
  323. package/dist/esm/helpers/assertString.d.ts +1 -0
  324. package/dist/esm/helpers/assertString.js +6 -0
  325. package/dist/esm/helpers/boundedCache.d.ts +9 -0
  326. package/dist/esm/helpers/boundedCache.js +29 -0
  327. package/dist/esm/helpers/checkHost.d.ts +2 -0
  328. package/dist/esm/helpers/checkHost.js +32 -0
  329. package/dist/esm/helpers/config.d.ts +10 -0
  330. package/dist/esm/helpers/config.js +29 -0
  331. package/dist/esm/helpers/errors.d.ts +3 -0
  332. package/dist/esm/helpers/errors.js +6 -0
  333. package/dist/esm/helpers/escapeRegExp.d.ts +1 -0
  334. package/dist/esm/helpers/escapeRegExp.js +3 -0
  335. package/dist/esm/helpers/hasOwn.d.ts +1 -0
  336. package/dist/esm/helpers/hasOwn.js +3 -0
  337. package/dist/esm/helpers/merge.d.ts +1 -0
  338. package/dist/esm/helpers/merge.js +12 -0
  339. package/dist/esm/helpers/scorePassword.d.ts +9 -0
  340. package/dist/esm/helpers/scorePassword.js +34 -0
  341. package/dist/esm/index.d.ts +103 -0
  342. package/dist/esm/index.js +98 -0
  343. package/dist/esm/package.json +3 -0
  344. package/dist/esm/sanitizer/blacklist.d.ts +1 -0
  345. package/dist/esm/sanitizer/blacklist.js +8 -0
  346. package/dist/esm/sanitizer/escape.d.ts +1 -0
  347. package/dist/esm/sanitizer/escape.js +13 -0
  348. package/dist/esm/sanitizer/index.d.ts +10 -0
  349. package/dist/esm/sanitizer/index.js +9 -0
  350. package/dist/esm/sanitizer/ltrim.d.ts +1 -0
  351. package/dist/esm/sanitizer/ltrim.js +10 -0
  352. package/dist/esm/sanitizer/normalizeEmail.d.ts +16 -0
  353. package/dist/esm/sanitizer/normalizeEmail.js +191 -0
  354. package/dist/esm/sanitizer/rtrim.d.ts +1 -0
  355. package/dist/esm/sanitizer/rtrim.js +18 -0
  356. package/dist/esm/sanitizer/stripLow.d.ts +1 -0
  357. package/dist/esm/sanitizer/stripLow.js +7 -0
  358. package/dist/esm/sanitizer/trim.d.ts +1 -0
  359. package/dist/esm/sanitizer/trim.js +11 -0
  360. package/dist/esm/sanitizer/unescape.d.ts +1 -0
  361. package/dist/esm/sanitizer/unescape.js +13 -0
  362. package/dist/esm/sanitizer/whitelist.d.ts +1 -0
  363. package/dist/esm/sanitizer/whitelist.js +8 -0
  364. package/dist/esm/validators/alpha.d.ts +105 -0
  365. package/dist/esm/validators/alpha.js +199 -0
  366. package/dist/esm/validators/contains.d.ts +6 -0
  367. package/dist/esm/validators/contains.js +24 -0
  368. package/dist/esm/validators/equals.d.ts +4 -0
  369. package/dist/esm/validators/equals.js +11 -0
  370. package/dist/esm/validators/index.d.ts +242 -0
  371. package/dist/esm/validators/index.js +190 -0
  372. package/dist/esm/validators/isAbaRouting.d.ts +1 -0
  373. package/dist/esm/validators/isAbaRouting.js +21 -0
  374. package/dist/esm/validators/isAfter.d.ts +4 -0
  375. package/dist/esm/validators/isAfter.js +12 -0
  376. package/dist/esm/validators/isAlpha.d.ts +8 -0
  377. package/dist/esm/validators/isAlpha.js +31 -0
  378. package/dist/esm/validators/isAlphanumeric.d.ts +8 -0
  379. package/dist/esm/validators/isAlphanumeric.js +31 -0
  380. package/dist/esm/validators/isAscii.d.ts +1 -0
  381. package/dist/esm/validators/isAscii.js +10 -0
  382. package/dist/esm/validators/isBIC.d.ts +1 -0
  383. package/dist/esm/validators/isBIC.js +15 -0
  384. package/dist/esm/validators/isBase32.d.ts +4 -0
  385. package/dist/esm/validators/isBase32.js +18 -0
  386. package/dist/esm/validators/isBase58.d.ts +1 -0
  387. package/dist/esm/validators/isBase58.js +10 -0
  388. package/dist/esm/validators/isBase64.d.ts +5 -0
  389. package/dist/esm/validators/isBase64.js +25 -0
  390. package/dist/esm/validators/isBefore.d.ts +4 -0
  391. package/dist/esm/validators/isBefore.js +12 -0
  392. package/dist/esm/validators/isBoolean.d.ts +4 -0
  393. package/dist/esm/validators/isBoolean.js +4 -0
  394. package/dist/esm/validators/isBtcAddress.d.ts +1 -0
  395. package/dist/esm/validators/isBtcAddress.js +11 -0
  396. package/dist/esm/validators/isByteLength.d.ts +5 -0
  397. package/dist/esm/validators/isByteLength.js +33 -0
  398. package/dist/esm/validators/isCreditCard.d.ts +15 -0
  399. package/dist/esm/validators/isCreditCard.js +47 -0
  400. package/dist/esm/validators/isCurrency.d.ts +18 -0
  401. package/dist/esm/validators/isCurrency.js +111 -0
  402. package/dist/esm/validators/isDataURI.d.ts +1 -0
  403. package/dist/esm/validators/isDataURI.js +36 -0
  404. package/dist/esm/validators/isDate.d.ts +7 -0
  405. package/dist/esm/validators/isDate.js +5 -0
  406. package/dist/esm/validators/isDecimal.d.ts +6 -0
  407. package/dist/esm/validators/isDecimal.js +43 -0
  408. package/dist/esm/validators/isDivisibleBy.d.ts +4 -0
  409. package/dist/esm/validators/isDivisibleBy.js +12 -0
  410. package/dist/esm/validators/isEAN.d.ts +1 -0
  411. package/dist/esm/validators/isEAN.js +28 -0
  412. package/dist/esm/validators/isEmail.d.ts +14 -0
  413. package/dist/esm/validators/isEmail.js +150 -0
  414. package/dist/esm/validators/isEmpty.d.ts +4 -0
  415. package/dist/esm/validators/isEmpty.js +14 -0
  416. package/dist/esm/validators/isEthereumAddress.d.ts +1 -0
  417. package/dist/esm/validators/isEthereumAddress.js +10 -0
  418. package/dist/esm/validators/isFQDN.d.ts +9 -0
  419. package/dist/esm/validators/isFQDN.js +65 -0
  420. package/dist/esm/validators/isFloat.d.ts +9 -0
  421. package/dist/esm/validators/isFloat.js +26 -0
  422. package/dist/esm/validators/isFullWidth.d.ts +2 -0
  423. package/dist/esm/validators/isFullWidth.js +10 -0
  424. package/dist/esm/validators/isHSL.d.ts +1 -0
  425. package/dist/esm/validators/isHSL.js +15 -0
  426. package/dist/esm/validators/isHalfWidth.d.ts +2 -0
  427. package/dist/esm/validators/isHalfWidth.js +10 -0
  428. package/dist/esm/validators/isHash.d.ts +21 -0
  429. package/dist/esm/validators/isHash.js +31 -0
  430. package/dist/esm/validators/isHexColor.d.ts +4 -0
  431. package/dist/esm/validators/isHexColor.js +17 -0
  432. package/dist/esm/validators/isHexadecimal.d.ts +1 -0
  433. package/dist/esm/validators/isHexadecimal.js +10 -0
  434. package/dist/esm/validators/isIBAN.d.ts +6 -0
  435. package/dist/esm/validators/isIBAN.js +141 -0
  436. package/dist/esm/validators/isIMEI.d.ts +4 -0
  437. package/dist/esm/validators/isIMEI.js +42 -0
  438. package/dist/esm/validators/isIP.d.ts +5 -0
  439. package/dist/esm/validators/isIP.js +35 -0
  440. package/dist/esm/validators/isIPRange.d.ts +5 -0
  441. package/dist/esm/validators/isIPRange.js +40 -0
  442. package/dist/esm/validators/isISBN.d.ts +5 -0
  443. package/dist/esm/validators/isISBN.js +48 -0
  444. package/dist/esm/validators/isISIN.d.ts +1 -0
  445. package/dist/esm/validators/isISIN.js +52 -0
  446. package/dist/esm/validators/isISO15924.d.ts +2 -0
  447. package/dist/esm/validators/isISO15924.js +283 -0
  448. package/dist/esm/validators/isISO31661Alpha2.d.ts +5 -0
  449. package/dist/esm/validators/isISO31661Alpha2.js +273 -0
  450. package/dist/esm/validators/isISO31661Alpha3.d.ts +4 -0
  451. package/dist/esm/validators/isISO31661Alpha3.js +272 -0
  452. package/dist/esm/validators/isISO31661Numeric.d.ts +1 -0
  453. package/dist/esm/validators/isISO31661Numeric.js +260 -0
  454. package/dist/esm/validators/isISO4217.d.ts +2 -0
  455. package/dist/esm/validators/isISO4217.js +191 -0
  456. package/dist/esm/validators/isISO6346.d.ts +2 -0
  457. package/dist/esm/validators/isISO6346.js +39 -0
  458. package/dist/esm/validators/isISO6391.d.ts +1 -0
  459. package/dist/esm/validators/isISO6391.js +196 -0
  460. package/dist/esm/validators/isISO8601.d.ts +5 -0
  461. package/dist/esm/validators/isISO8601.js +39 -0
  462. package/dist/esm/validators/isISRC.d.ts +1 -0
  463. package/dist/esm/validators/isISRC.js +10 -0
  464. package/dist/esm/validators/isISSN.d.ts +5 -0
  465. package/dist/esm/validators/isISSN.js +24 -0
  466. package/dist/esm/validators/isIdentityCard.d.ts +24 -0
  467. package/dist/esm/validators/isIdentityCard.js +439 -0
  468. package/dist/esm/validators/isIn.d.ts +4 -0
  469. package/dist/esm/validators/isIn.js +33 -0
  470. package/dist/esm/validators/isInt.d.ts +8 -0
  471. package/dist/esm/validators/isInt.js +26 -0
  472. package/dist/esm/validators/isJSON.d.ts +5 -0
  473. package/dist/esm/validators/isJSON.js +7 -0
  474. package/dist/esm/validators/isJWT.d.ts +1 -0
  475. package/dist/esm/validators/isJWT.js +20 -0
  476. package/dist/esm/validators/isLatLong.d.ts +4 -0
  477. package/dist/esm/validators/isLatLong.js +26 -0
  478. package/dist/esm/validators/isLength.d.ts +7 -0
  479. package/dist/esm/validators/isLength.js +25 -0
  480. package/dist/esm/validators/isLicensePlate.d.ts +21 -0
  481. package/dist/esm/validators/isLicensePlate.js +40 -0
  482. package/dist/esm/validators/isLocale.d.ts +1 -0
  483. package/dist/esm/validators/isLocale.js +26 -0
  484. package/dist/esm/validators/isLowercase.d.ts +1 -0
  485. package/dist/esm/validators/isLowercase.js +9 -0
  486. package/dist/esm/validators/isLuhnNumber.d.ts +1 -0
  487. package/dist/esm/validators/isLuhnNumber.js +34 -0
  488. package/dist/esm/validators/isMACAddress.d.ts +6 -0
  489. package/dist/esm/validators/isMACAddress.js +31 -0
  490. package/dist/esm/validators/isMD5.d.ts +1 -0
  491. package/dist/esm/validators/isMD5.js +10 -0
  492. package/dist/esm/validators/isMagnetURI.d.ts +1 -0
  493. package/dist/esm/validators/isMagnetURI.js +13 -0
  494. package/dist/esm/validators/isMailtoURI.d.ts +4 -0
  495. package/dist/esm/validators/isMailtoURI.js +50 -0
  496. package/dist/esm/validators/isMimeType.d.ts +1 -0
  497. package/dist/esm/validators/isMimeType.js +12 -0
  498. package/dist/esm/validators/isMobilePhone.d.ts +171 -0
  499. package/dist/esm/validators/isMobilePhone.js +208 -0
  500. package/dist/esm/validators/isMongoId.d.ts +1 -0
  501. package/dist/esm/validators/isMongoId.js +8 -0
  502. package/dist/esm/validators/isMultibyte.d.ts +1 -0
  503. package/dist/esm/validators/isMultibyte.js +10 -0
  504. package/dist/esm/validators/isNotEmpty.d.ts +1 -0
  505. package/dist/esm/validators/isNotEmpty.js +7 -0
  506. package/dist/esm/validators/isNumeric.d.ts +5 -0
  507. package/dist/esm/validators/isNumeric.js +31 -0
  508. package/dist/esm/validators/isOctal.d.ts +1 -0
  509. package/dist/esm/validators/isOctal.js +10 -0
  510. package/dist/esm/validators/isPassportNumber.d.ts +69 -0
  511. package/dist/esm/validators/isPassportNumber.js +80 -0
  512. package/dist/esm/validators/isPort.d.ts +1 -0
  513. package/dist/esm/validators/isPort.js +4 -0
  514. package/dist/esm/validators/isPostalCode.d.ts +79 -0
  515. package/dist/esm/validators/isPostalCode.js +104 -0
  516. package/dist/esm/validators/isRFC3339.d.ts +1 -0
  517. package/dist/esm/validators/isRFC3339.js +25 -0
  518. package/dist/esm/validators/isRequired.d.ts +1 -0
  519. package/dist/esm/validators/isRequired.js +3 -0
  520. package/dist/esm/validators/isRgbColor.d.ts +5 -0
  521. package/dist/esm/validators/isRgbColor.js +35 -0
  522. package/dist/esm/validators/isSemVer.d.ts +1 -0
  523. package/dist/esm/validators/isSemVer.js +12 -0
  524. package/dist/esm/validators/isSlug.d.ts +1 -0
  525. package/dist/esm/validators/isSlug.js +10 -0
  526. package/dist/esm/validators/isStrongPassword.d.ts +8 -0
  527. package/dist/esm/validators/isStrongPassword.js +22 -0
  528. package/dist/esm/validators/isSurrogatePair.d.ts +1 -0
  529. package/dist/esm/validators/isSurrogatePair.js +10 -0
  530. package/dist/esm/validators/isTime.d.ts +5 -0
  531. package/dist/esm/validators/isTime.js +34 -0
  532. package/dist/esm/validators/isULID.d.ts +1 -0
  533. package/dist/esm/validators/isULID.js +9 -0
  534. package/dist/esm/validators/isURL.d.ts +22 -0
  535. package/dist/esm/validators/isURL.js +212 -0
  536. package/dist/esm/validators/isUUID.d.ts +5 -0
  537. package/dist/esm/validators/isUUID.js +28 -0
  538. package/dist/esm/validators/isUppercase.d.ts +1 -0
  539. package/dist/esm/validators/isUppercase.js +9 -0
  540. package/dist/esm/validators/isVAT.d.ts +75 -0
  541. package/dist/esm/validators/isVAT.js +130 -0
  542. package/dist/esm/validators/isVariableWidth.d.ts +1 -0
  543. package/dist/esm/validators/isVariableWidth.js +11 -0
  544. package/dist/esm/validators/isWhitelisted.d.ts +4 -0
  545. package/dist/esm/validators/isWhitelisted.js +20 -0
  546. package/dist/esm/validators/matches.d.ts +5 -0
  547. package/dist/esm/validators/matches.js +26 -0
  548. package/package.json +110 -4
package/LICENSE ADDED
@@ -0,0 +1,28 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jose Guillermo
4
+
5
+ This package contains code derived from validator.js
6
+ (https://github.com/validatorjs/validator.js, forked from version 13.15.26 or earlier),
7
+ distributed under the MIT License:
8
+
9
+ Copyright (c) 2018 Chris O'Hara <cohara87@gmail.com>
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining
12
+ a copy of this software and associated documentation files (the
13
+ "Software"), to deal in the Software without restriction, including
14
+ without limitation the rights to use, copy, modify, merge, publish,
15
+ distribute, sublicense, and/or sell copies of the Software, and to
16
+ permit persons to whom the Software is furnished to do so, subject to
17
+ the following conditions:
18
+
19
+ The above copyright notice and this permission notice shall be
20
+ included in all copies or substantial portions of the Software.
21
+
22
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,346 @@
1
- # Temporary Holding Version
1
+ # @archi-code/validation
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ String validators, type converters and sanitizers for TypeScript, in a single package. The
4
+ validators are a hardened port of [validator.js](https://github.com/validatorjs/validator.js).
5
+ There are no runtime dependencies, and the package ships dual CJS and ESM builds that also run
6
+ in the browser.
7
+
8
+ ```bash
9
+ npm install @archi-code/validation
10
+ ```
11
+
12
+ ## Three tools
13
+
14
+ | Tool | Question it answers | Returns |
15
+ | --------------------------------------------- | --------------------------------------------------- | ---------------------------------- |
16
+ | `isX(value, options?)` (also `validator.isX`) | Is this value a valid X? (email, URL, IBAN, phone…) | `boolean` |
17
+ | `toX(value, options?)` | Convert this value to type X. | `{ ok, value, error }` |
18
+ | `canBeX(value)` | Can this value be converted to type X? | `boolean` (always `toX(value).ok`) |
19
+
20
+ `convert/` is the only place where type rules live. `canBe` and the validators build on it and
21
+ never duplicate it, so `canBeX(v) === toX(v).ok` holds by construction.
22
+
23
+ ```ts
24
+ import {
25
+ isEmail,
26
+ isIBAN,
27
+ isMobilePhone,
28
+ toInteger,
29
+ canBeDate,
30
+ sanitizer,
31
+ } from '@archi-code/validation';
32
+
33
+ isEmail('ana@example.com'); // true
34
+ isIBAN('DE89 3704 0044 0532 0130 00'); // true
35
+ isMobilePhone('+34612345678', { locale: 'es-ES' }); // true
36
+
37
+ const n = toInteger(' 42 ');
38
+ if (n.ok) n.value; // 42 (narrowed to number)
39
+ toInteger('abc'); // { ok: false, value: null, error: 'Value is not an integer' }
40
+
41
+ canBeDate('2024-01-31'); // true
42
+ sanitizer.escape('<a>'); // '&lt;a&gt;'
43
+ ```
44
+
45
+ ## Validator signatures
46
+
47
+ Every validator takes the value and, at most, one options object. There are three forms:
48
+
49
+ ```ts
50
+ isPort(value); // only the value
51
+ isAlpha(value, options?); // every option is optional
52
+ isVAT(value, options); // the options object has at least one required property
53
+ ```
54
+
55
+ - `value` is always `unknown`: the validator reads it and returns `false` when it is not valid.
56
+ - `options` is typed by the `<Validator>Options` interface exported next to the validator
57
+ (`IsVATOptions`, `IsAlphaOptions`, `MatchesOptions`…). A missing optional property takes the
58
+ validator's default.
59
+ - There are no positional parameters or shorthand forms: `isLength(v, 2, 10)`,
60
+ `isIP(v, 4)` or `isAfter(v, '2024-01-01')` are configuration errors. Use
61
+ `isLength(v, { min: 2, max: 10 })`, `isIP(v, { version: 4 })` and
62
+ `isAfter(v, { comparisonDate: '2024-01-01' })`.
63
+
64
+ ```ts
65
+ import { isAlpha, isHash, isVAT } from '@archi-code/validation';
66
+ import type { IsAlphaOptions } from '@archi-code/validation';
67
+
68
+ const spanish: IsAlphaOptions = { locale: 'es-ES', ignore: ' ' };
69
+ isAlpha('año nuevo', spanish); // true
70
+ isAlpha('abc'); // true (locale defaults to 'en-US')
71
+ isHash('d41d8cd98f00b204e9800998ecf8427e', { algorithm: 'md5' }); // true
72
+ isVAT('GB999 9999 00', { countryCode: 'GB' }); // true
73
+ ```
74
+
75
+ ### Validators with required options
76
+
77
+ | Validator | Options | Required | Optional |
78
+ | ------------------ | ------------------------- | ------------- | -------------------------------------------------------------- |
79
+ | `contains` | `ContainsOptions` | `elem` | `ignoreCase` (default `false`), `minOccurrences` (default `1`) |
80
+ | `equals` | `EqualsOptions` | `comparison` | — |
81
+ | `isDivisibleBy` | `IsDivisibleByOptions` | `num` | — |
82
+ | `isHash` | `IsHashOptions` | `algorithm` | — |
83
+ | `isIn` | `IsInOptions` | `values` | — |
84
+ | `isLicensePlate` | `IsLicensePlateOptions` | `locale` | — |
85
+ | `isPassportNumber` | `IsPassportNumberOptions` | `countryCode` | — |
86
+ | `isPostalCode` | `IsPostalCodeOptions` | `locale` | — |
87
+ | `isVAT` | `IsVATOptions` | `countryCode` | — |
88
+ | `isWhitelisted` | `IsWhitelistedOptions` | `chars` | — |
89
+ | `matches` | `MatchesOptions` | `pattern` | `modifiers` |
90
+
91
+ ### Validators with optional options
92
+
93
+ | Validator | Options | Properties |
94
+ | ------------------ | ------------------------- | -------------------------------------------------------------------------------------------------------------------- |
95
+ | `isAfter` | `IsAfterOptions` | `comparisonDate` (default: now) |
96
+ | `isAlpha` | `IsAlphaOptions` | `locale` (default `'en-US'`), `ignore` |
97
+ | `isAlphanumeric` | `IsAlphanumericOptions` | `locale` (default `'en-US'`), `ignore` |
98
+ | `isBase32` | `IsBase32Options` | `crockford` |
99
+ | `isBase64` | `IsBase64Options` | `urlSafe`, `padding` |
100
+ | `isBefore` | `IsBeforeOptions` | `comparisonDate` (default: now) |
101
+ | `isBoolean` | `IsBooleanOptions` | `loose` (default `false`) |
102
+ | `isByteLength` | `IsByteLengthOptions` | `min` (default `0`), `max` |
103
+ | `isCreditCard` | `IsCreditCardOptions` | `provider` |
104
+ | `isCurrency` | `IsCurrencyOptions` | `symbol`, `require_symbol`, `thousands_separator`, `decimal_separator`… (15 options) |
105
+ | `isDate` | `IsDateOptions` | `format` (default `'YYYY/MM/DD'`), `strictMode`, `delimiters`, `twoDigitYearPivot` |
106
+ | `isDecimal` | `IsDecimalOptions` | `force_decimal`, `decimal_digits`, `locale` |
107
+ | `isEmail` | `IsEmailOptions` | `allow_display_name`, `require_tld`, `host_whitelist`, `host_blacklist`… (11 options) |
108
+ | `isEmpty` | `IsEmptyOptions` | `ignore_whitespace` |
109
+ | `isFQDN` | `IsFQDNOptions` | `require_tld`, `allow_underscores`, `allow_trailing_dot`, `allow_numeric_tld`, `allow_wildcard`, `ignore_max_length` |
110
+ | `isFloat` | `IsFloatOptions` | `min`, `max`, `lt`, `gt`, `locale` |
111
+ | `isHexColor` | `IsHexColorOptions` | `require_hashtag` |
112
+ | `isIBAN` | `IsIBANOptions` | `whitelist`, `blacklist` |
113
+ | `isIdentityCard` | `IsIdentityCardOptions` | `locale` (default `'any'`) |
114
+ | `isIMEI` | `IsIMEIOptions` | `allow_hyphens` |
115
+ | `isInt` | `IsIntOptions` | `min`, `max`, `lt`, `gt`, `allow_leading_zeroes` |
116
+ | `isIP` | `IsIPOptions` | `version` (default: 4 or 6) |
117
+ | `isIPRange` | `IsIPRangeOptions` | `version` (default: 4 or 6) |
118
+ | `isISBN` | `IsISBNOptions` | `version` (default: 10 or 13) |
119
+ | `isISO31661Alpha2` | `IsISO31661Alpha2Options` | `userAssignedCodes` |
120
+ | `isISO31661Alpha3` | `IsISO31661Alpha3Options` | `userAssignedCodes` |
121
+ | `isISO8601` | `IsISO8601Options` | `strict`, `strictSeparator` |
122
+ | `isISSN` | `IsISSNOptions` | `case_sensitive`, `require_hyphen` |
123
+ | `isJSON` | `IsJSONOptions` | `allow_primitives`, `allow_any_value` |
124
+ | `isLatLong` | `IsLatLongOptions` | `checkDMS` |
125
+ | `isLength` | `IsLengthOptions` | `min` (default `0`), `max`, `discreteLengths`, `graphemes` |
126
+ | `isMACAddress` | `IsMACAddressOptions` | `no_separators`, `no_colons`, `eui` |
127
+ | `isMailtoURI` | `IsMailtoURIOptions` | the `isEmail` options, applied to every address |
128
+ | `isMobilePhone` | `IsMobilePhoneOptions` | `locale` (one, a list, or `'any'`; default: any), `strictMode` |
129
+ | `isNumeric` | `IsNumericOptions` | `no_symbols`, `locale` |
130
+ | `isRgbColor` | `IsRgbColorOptions` | `includePercentValues`, `allowSpaces` |
131
+ | `isStrongPassword` | `IsStrongPasswordOptions` | `minLength`, `minLowercase`, `minUppercase`, `minNumbers`, `minSymbols` |
132
+ | `isTime` | `IsTimeOptions` | `hourFormat`, `mode` |
133
+ | `isURL` | `IsURLOptions` | `protocols`, `require_tld`, `require_protocol`, `host_whitelist`… (19 options) |
134
+ | `isUUID` | `IsUUIDOptions` | `version` (default `'all'`) |
135
+
136
+ The full list of each validator's options, with their documentation, is in its interface: the
137
+ editor autocompletes them and flags unknown ones.
138
+
139
+ ### Validators that only take the value
140
+
141
+ `isAbaRouting`, `isAscii`, `isBase58`, `isBIC`, `isBtcAddress`, `isDataURI`, `isEAN`,
142
+ `isEthereumAddress`, `isFullWidth`, `isHalfWidth`, `isHexadecimal`, `isHSL`, `isISIN`,
143
+ `isISO15924`, `isISO31661Numeric`, `isISO4217`, `isISO6346` (also `isFreightContainerID`),
144
+ `isISO6391`, `isISRC`, `isJWT`, `isLocale`, `isLowercase`, `isLuhnNumber`, `isMagnetURI`, `isMD5`,
145
+ `isMimeType`, `isMongoId`, `isMultibyte`, `isNotEmpty`, `isOctal`, `isPort`, `isRequired`, `isRFC3339`, `isSemVer`, `isSlug`,
146
+ `isSurrogatePair`, `isULID`, `isUppercase`, `isVariableWidth`.
147
+
148
+ ## Tree-shaking: prefer named imports
149
+
150
+ Every validator is also exported on its own and is the very same function as its registry
151
+ member (`isEmail === validator.isEmail`). The package declares `"sideEffects": false`, so
152
+ bundlers keep only what you import:
153
+
154
+ ```ts
155
+ import { isEmail } from '@archi-code/validation'; // isEmail + its helpers (~16 KB of ESM source)
156
+ import { validator } from '@archi-code/validation'; // every validator and locale table (~176 KB)
157
+ ```
158
+
159
+ The sizes are unminified ESM source reachable from the import. Use `validator` when you need
160
+ dynamic access (`validator[name]`), and named imports everywhere else.
161
+
162
+ ## Contract
163
+
164
+ - **A validator never throws because of the value.** `null`, objects, Symbols, huge strings and
165
+ unpaired surrogates all return `false`.
166
+ - **Invalid configuration throws `ValidationConfigError`, and only that.** This covers unknown
167
+ locales, country codes, algorithms or providers; a bad `decimal_digits`; a `host_blacklist`
168
+ that is not an array; a pattern that is not a valid RegExp; and similar cases. The error is
169
+ never a raw `TypeError` or `SyntaxError`.
170
+ - **One options object.** Every validator takes the value and, at most, one options object (see
171
+ [Validator signatures](#validator-signatures)). A string or a number in place of the object is
172
+ a configuration error.
173
+ - **`null` options mean "no options"**, exactly like `undefined`.
174
+ - **Converters never throw.** They always return `{ ok: true, value, error: null }` or
175
+ `{ ok: false, value: null, error }`. `error` is one of the fixed `ConvertMessages` and never
176
+ contains the value. A successful numeric result is always a finite number.
177
+ - **Non-string input.** Validators read their input with `toString`: strings are used as-is,
178
+ finite numbers are converted with `String()`, and booleans become `'true'`/`'false'`. For
179
+ example, `validator.isInt(5)` is `true`, and `validator.isAlpha(true)` is `true` because
180
+ `'true'` is alphabetic.
181
+
182
+ ## Converters and their options
183
+
184
+ | Function | Default rule | Notable options |
185
+ | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
186
+ | `toString` | Strings, booleans and finite numbers | — |
187
+ | `toBoolean` | `true`/`false`, `1`/`0`, and trimmed, case-insensitive `'true'`/`'false'`/`'1'`/`'0'` | `mode: 'strict' \| 'loose'` (`'loose'` also accepts `'yes'`/`'no'`) |
188
+ | `toInteger` | Safe integers, as numbers or trimmed `-?\d+` strings (`INTEGER_OVERFLOW` beyond ±2^53) | `syntax: 'validator'` (the isInt rule) |
189
+ | `toFloat` | Finite numbers, or trimmed strings in plain decimal notation (no `0x`/`0b`/`0o`) | `syntax: 'validator'`, `decimalSeparator` |
190
+ | `toDate` | `YYYY/MM/DD` with `/` or `-` as delimiter; the result is that day at 00:00 UTC | `format`, `delimiters`, `strictMode`, `iso: true`, `lax: true` |
191
+ | `toJson` | A non-empty plain JSON object, as JSON text or as an object that survives a JSON round trip (plain objects/arrays with string, boolean, finite number or null leaves — no functions, Dates, class instances…) | — |
192
+ | `toJsonValue` | Any JSON text that parses to an object or array | `allowPrimitives`, `allowAnyValue` |
193
+ | `toArray` | Arrays, or JSON text holding an array | — |
194
+ | `toEnum` | A string, number or boolean whose text form is one of the options | — |
195
+
196
+ > ISO date-times need the ISO rule: `canBeDate('2024-01-31T10:00:00Z')` is `false`, while
197
+ > `toDate('2024-01-31T10:00:00Z', { iso: true })` is `ok`.
198
+
199
+ `anyToString(value)` gives a readable description of any value, for logs and error messages. It
200
+ never throws.
201
+
202
+ ## Validations decorator
203
+
204
+ Declare a class's validations with `@Validations` and run them with `runValidations(Class, value)`.
205
+ A built-in validation names its `validator` and gives its parameters as a single `properties`
206
+ object (required when the validator needs something, not allowed when it takes nothing). A custom validation names itself with `custom` and brings its own `fn`.
207
+
208
+ ```ts
209
+ import { Validations, runValidations } from '@archi-code/validation';
210
+
211
+ @Validations([{ validator: 'isInt', properties: { min: 0 } }])
212
+ class Quantity {}
213
+
214
+ @Validations([
215
+ { validator: 'isInt', properties: { min: 5 } }, // replaces the parent's isInt
216
+ { custom: 'isEven', fn: (v) => Number(v) % 2 === 0, message: 'Must be even' },
217
+ ])
218
+ class Pairs extends Quantity {}
219
+
220
+ // Pairs runs isInt { min: 5 }, then isEven — parent first, in declaration order
221
+ runValidations(Pairs, '3');
222
+ // { ok: false, value: '3', errors: [
223
+ // { validator: 'isInt', message: 'Value does not satisfy isInt' },
224
+ // { custom: 'isEven', message: 'Must be even' } ] }
225
+ ```
226
+
227
+ `properties` is the validator's options object, passed as is:
228
+ `{ validator: 'isVAT', properties: { countryCode: 'ES' } }` runs `isVAT(value, { countryCode: 'ES' })`.
229
+
230
+ A built-in and a custom with the same name are different validations: neither replaces the other.
231
+ A subclass, or a later `@Validations` on the same class, replaces a matching validation in its
232
+ place. With a value (not `null` nor `undefined`), every validation runs, whether `isRequired` is declared or not. Without a value, only `isRequired` runs when it is declared (and fails); when it is not, the value is optional, no validation runs and the result is ok. A failure does not stop the rest, and `runValidations` returns `{ ok, value, errors }`:
233
+ `ok` is true when `errors` is empty. The declaration is checked when the class is decorated: an unknown validator, a
234
+ custom without its `fn`, a validation with both `validator` and `custom`, or the same validation
235
+ declared twice in one list throws `ValidationConfigError` right there, not on the first `runValidations`.
236
+
237
+ Full guide — when each part runs, inheritance, every check and pitfalls:
238
+ [docs/decorator.md](docs/decorator.md).
239
+
240
+ ## Differences from validator.js
241
+
242
+ This package deliberately diverges from validator.js wherever the original accepted unsafe or
243
+ wrong input.
244
+
245
+ **Signatures**
246
+
247
+ validator.js passes some parameters positionally and accepts shorthand forms. Here they are
248
+ all properties of the options object:
249
+
250
+ | validator.js | @archi-code/validation |
251
+ | ------------------------------------------ | --------------------------------------------------------------------------- |
252
+ | `isAlpha(v, locale, { ignore })` | `isAlpha(v, { locale, ignore })` (same for `isAlphanumeric`) |
253
+ | `isMobilePhone(v, locale, { strictMode })` | `isMobilePhone(v, { locale, strictMode })` |
254
+ | `contains(v, elem, options)` | `contains(v, { elem, ignoreCase, minOccurrences })` |
255
+ | `matches(v, pattern, modifiers)` | `matches(v, { pattern, modifiers })` |
256
+ | `equals(v, comparison)` | `equals(v, { comparison })` |
257
+ | `isDivisibleBy(v, num)` | `isDivisibleBy(v, { num })` |
258
+ | `isHash(v, algorithm)` | `isHash(v, { algorithm })` |
259
+ | `isIn(v, values)` | `isIn(v, { values })` |
260
+ | `isWhitelisted(v, chars)` | `isWhitelisted(v, { chars })` |
261
+ | `isPostalCode(v, locale)` | `isPostalCode(v, { locale })` (same for `isLicensePlate`, `isIdentityCard`) |
262
+ | `isVAT(v, countryCode)` | `isVAT(v, { countryCode })` (same for `isPassportNumber`) |
263
+ | `isUUID(v, version)` | `isUUID(v, { version })` (same for `isIPRange`) |
264
+ | `isIP(v, version)` | `isIP(v, { version })` (same for `isISBN`) |
265
+ | `isLength(v, min, max)` | `isLength(v, { min, max })` (same for `isByteLength`) |
266
+ | `isDate(v, format)` | `isDate(v, { format })` |
267
+ | `isAfter(v, date)` | `isAfter(v, { comparisonDate })` (same for `isBefore`) |
268
+
269
+ **Security**
270
+
271
+ - **`isURL`** rejects a backslash in the authority. `http://evil.com\@good.com` is `false`
272
+ because browsers treat `\` as `/`.
273
+ - **`isURL`** never reads a code-executing scheme as a user name: `javascript:foo@example.com`
274
+ (also `vbscript:` and `data:`) is `false` unless `require_valid_protocol: false`. User and
275
+ password must use RFC 3986 userinfo characters, and C0 controls or DEL anywhere in the URL are
276
+ rejected.
277
+ - **`isURL` and `isEmail` host lists** compare hosts case-insensitively and ignore a trailing
278
+ dot. A bracketed IPv6 host is checked against the whitelist by its address.
279
+ - **`isEmail`**: the quoted local part rejects CR, LF, DEL and other control characters (header
280
+ injection), the local part rejects invisible characters (zero-width, bidi, BOM, non-ASCII
281
+ spaces), and a display name requires the closing `>`.
282
+ - **`isFQDN`**, and therefore `isURL` and `isEmail`, rejects invisible characters, bidi
283
+ controls, Unicode separators and unpaired surrogates in host names.
284
+
285
+ **Anchoring and syntax**
286
+
287
+ - `isCreditCard` (Mastercard), `isISO6346`, `isLicensePlate` (`pt-BR`, `fi-FI`),
288
+ `isPassportNumber` (`MZ`, `PH`), `isLatLong` and several `isVAT` rules now reject leading or
289
+ trailing garbage.
290
+ - `isMongoId` rejects a `0x`/`0h` prefix.
291
+ - `isVAT('', { countryCode: 'HN' })` is `false`.
292
+
293
+ **Numbers**
294
+
295
+ - `isFloat` rejects `'.e5'`, `'e5'` and values beyond the number range such as `'1e400'`, and it
296
+ reads the locale's decimal separator correctly.
297
+ - `isInt` compares bounds exactly beyond `Number.MAX_SAFE_INTEGER`, using BigInt on the
298
+ original text.
299
+
300
+ **Dates**
301
+
302
+ - `isISO8601(…, { strict: true })` accepts years 0000–0099.
303
+ - `isAfter` and `isBefore` parse dates deterministically, independent of the machine's time
304
+ zone. They accept ISO dates (including reduced precision such as `'2024'` or `'2024-03'`) and
305
+ the output of `Date#toString()` and `Date#toUTCString()`, but not engine-dependent formats
306
+ such as `'2030/01/01'` or `'Jan 1 2030'`.
307
+
308
+ **Other differences**
309
+
310
+ - `isAlpha` and `isAlphanumeric` take every character of `ignore` literally.
311
+ - `isIdentityCard` defaults to the `'any'` locale.
312
+ - `isJWT` rejects an empty header or payload.
313
+ - Unknown locales inside an `isMobilePhone` array throw instead of being skipped.
314
+ - `isTaxID` is not included.
315
+ - `isNotEmpty` is new: `true` for a string with at least one non-whitespace character or a
316
+ finite number; `false` for `''`, whitespace only (spaces, tabs, line breaks, Unicode spaces),
317
+ `null`, `undefined`, `NaN`, `Infinity`, booleans and any other value.
318
+ - `isRequired` is new: `false` only for `null` and `undefined`.
319
+
320
+ ## Package setup
321
+
322
+ This package follows the monorepo package standard (`.claude/rules/packages.md`) with these
323
+ allowed extensions:
324
+
325
+ - **Web build.** `browser` field and `browser` export condition point to the ESM build, and
326
+ `check:dist` also runs `check-web.js` (no bare imports, no Node-only globals, the build runs in a
327
+ realm without Node APIs) plus the `web` checks of `test/dist/dist.check.js`. `exports["."]` adds
328
+ a `node` condition, so Node always takes the `import`/`require` entries with their own types and
329
+ never the `browser` one, and a last `default` to the ESM build for resolvers that match no
330
+ condition.
331
+ - **`sideEffects: false`**, so bundlers can drop unused validators (see Tree-shaking above).
332
+ - **`tsconfig.json`** sets `target` `ES2020` and adds `ES2022.Intl` to `lib` for `Intl.Segmenter`
333
+ (grapheme counting in `isLength`).
334
+ - **`tsconfig.spec.json`** (used by ts-jest) enables `esModuleInterop` for the default imports of
335
+ the ported specs (`assert`, `timezone-mock`) and turns off incremental builds.
336
+ - **`jest.injectGlobals: true`**, because the specs ported from validator.js (`test/validators`,
337
+ `test/sanitizer`, `test/helpers`) use Jest globals and are not edited. New specs import from
338
+ `@jest/globals`.
339
+ - **`benchmark/`** (tinybench, see `benchmark/README.md`): Prettier and ESLint cover it,
340
+ `check:types` type-checks `benchmark/tsconfig.json` and `npm run benchmark` runs it. Its local
341
+ best scores (`benchmark/best-scores.json`) are ignored in `.gitignore`.
342
+ - **`docs/`**: Prettier covers its Markdown.
343
+
344
+ ## License
345
+
346
+ MIT
@@ -0,0 +1 @@
1
+ export declare function canBeArray(v: unknown): boolean;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canBeArray = canBeArray;
4
+ const array_1 = require("../convert/array");
5
+ function canBeArray(v) {
6
+ return (0, array_1.toArray)(v).ok;
7
+ }
@@ -0,0 +1 @@
1
+ export declare function canBeBoolean(v: unknown): boolean;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canBeBoolean = canBeBoolean;
4
+ const boolean_1 = require("../convert/boolean");
5
+ function canBeBoolean(v) {
6
+ return (0, boolean_1.toBoolean)(v).ok;
7
+ }
@@ -0,0 +1 @@
1
+ export declare function canBeDate(v: unknown): boolean;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canBeDate = canBeDate;
4
+ const date_1 = require("../convert/date");
5
+ function canBeDate(v) {
6
+ return (0, date_1.toDate)(v).ok;
7
+ }
@@ -0,0 +1 @@
1
+ export declare function canBeEnum(v: unknown, options: readonly string[]): boolean;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canBeEnum = canBeEnum;
4
+ const enum_1 = require("../convert/enum");
5
+ function canBeEnum(v, options) {
6
+ return (0, enum_1.toEnum)(v, options).ok;
7
+ }
@@ -0,0 +1 @@
1
+ export declare function canBeFloat(v: unknown): boolean;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canBeFloat = canBeFloat;
4
+ const float_1 = require("../convert/float");
5
+ function canBeFloat(v) {
6
+ return (0, float_1.toFloat)(v).ok;
7
+ }
@@ -0,0 +1,8 @@
1
+ export { canBeString } from './string';
2
+ export { canBeBoolean } from './boolean';
3
+ export { canBeInteger } from './integer';
4
+ export { canBeFloat } from './float';
5
+ export { canBeDate } from './date';
6
+ export { canBeJson, canBeJsonObject } from './json';
7
+ export { canBeArray } from './array';
8
+ export { canBeEnum } from './enum';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canBeEnum = exports.canBeArray = exports.canBeJsonObject = exports.canBeJson = exports.canBeDate = exports.canBeFloat = exports.canBeInteger = exports.canBeBoolean = exports.canBeString = void 0;
4
+ var string_1 = require("./string");
5
+ Object.defineProperty(exports, "canBeString", { enumerable: true, get: function () { return string_1.canBeString; } });
6
+ var boolean_1 = require("./boolean");
7
+ Object.defineProperty(exports, "canBeBoolean", { enumerable: true, get: function () { return boolean_1.canBeBoolean; } });
8
+ var integer_1 = require("./integer");
9
+ Object.defineProperty(exports, "canBeInteger", { enumerable: true, get: function () { return integer_1.canBeInteger; } });
10
+ var float_1 = require("./float");
11
+ Object.defineProperty(exports, "canBeFloat", { enumerable: true, get: function () { return float_1.canBeFloat; } });
12
+ var date_1 = require("./date");
13
+ Object.defineProperty(exports, "canBeDate", { enumerable: true, get: function () { return date_1.canBeDate; } });
14
+ var json_1 = require("./json");
15
+ Object.defineProperty(exports, "canBeJson", { enumerable: true, get: function () { return json_1.canBeJson; } });
16
+ Object.defineProperty(exports, "canBeJsonObject", { enumerable: true, get: function () { return json_1.canBeJsonObject; } });
17
+ var array_1 = require("./array");
18
+ Object.defineProperty(exports, "canBeArray", { enumerable: true, get: function () { return array_1.canBeArray; } });
19
+ var enum_1 = require("./enum");
20
+ Object.defineProperty(exports, "canBeEnum", { enumerable: true, get: function () { return enum_1.canBeEnum; } });
@@ -0,0 +1 @@
1
+ export declare function canBeInteger(v: unknown): boolean;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canBeInteger = canBeInteger;
4
+ const integer_1 = require("../convert/integer");
5
+ function canBeInteger(v) {
6
+ return (0, integer_1.toInteger)(v).ok;
7
+ }
@@ -0,0 +1,2 @@
1
+ export declare function canBeJson(v: unknown): boolean;
2
+ export declare const canBeJsonObject: typeof canBeJson;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canBeJsonObject = void 0;
4
+ exports.canBeJson = canBeJson;
5
+ const json_1 = require("../convert/json");
6
+ function canBeJson(v) {
7
+ return (0, json_1.toJson)(v).ok;
8
+ }
9
+ exports.canBeJsonObject = canBeJson;
@@ -0,0 +1 @@
1
+ export declare function canBeString(v: unknown): boolean;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canBeString = canBeString;
4
+ const string_1 = require("../convert/string");
5
+ function canBeString(v) {
6
+ return (0, string_1.toString)(v).ok;
7
+ }
@@ -0,0 +1 @@
1
+ export declare function anyToString(value: any): string;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.anyToString = anyToString;
4
+ const string_1 = require("./string");
5
+ function anyToString(value) {
6
+ try {
7
+ return describe(value, new WeakSet());
8
+ }
9
+ catch {
10
+ return '[Unrepresentable value]';
11
+ }
12
+ }
13
+ function describe(value, seen) {
14
+ const text = (0, string_1.toString)(value);
15
+ if (text.ok) {
16
+ return text.value;
17
+ }
18
+ else if (value === null) {
19
+ return 'null';
20
+ }
21
+ else if (value === undefined) {
22
+ return 'undefined';
23
+ }
24
+ else if (typeof value === 'number' && isNaN(value)) {
25
+ return 'NaN';
26
+ }
27
+ else if (value instanceof Date) {
28
+ return isNaN(value.getTime()) ? 'Date(Invalid)' : `Date(${value.toISOString()})`;
29
+ }
30
+ else if (value instanceof Map || value instanceof Set) {
31
+ if (seen.has(value))
32
+ return '[Circular]';
33
+ seen.add(value);
34
+ const described = value instanceof Map
35
+ ? `Map({${Array.from(value, ([key, val]) => `${describe(key, seen)}: ${describe(val, seen)}`).join(', ')}})`
36
+ : `Set(${Array.from(value, (item) => describe(item, seen)).join(', ')})`;
37
+ seen.delete(value);
38
+ return described;
39
+ }
40
+ else if (value instanceof RegExp) {
41
+ return `RegExp(${value.toString()})`;
42
+ }
43
+ else if (value instanceof Error) {
44
+ return `new ${value.name}(${value.message})`;
45
+ }
46
+ else if (value instanceof Promise) {
47
+ return 'Promise';
48
+ }
49
+ else if (typeof value === 'object') {
50
+ try {
51
+ return JSON.stringify(value) || value.toString();
52
+ }
53
+ catch {
54
+ return '[Circular or too complex to stringify]';
55
+ }
56
+ }
57
+ else if (typeof value === 'function') {
58
+ return `Function(${value.name || 'anonymous'})`;
59
+ }
60
+ else if (typeof value === 'symbol') {
61
+ return value.toString();
62
+ }
63
+ return String(value);
64
+ }
@@ -0,0 +1,2 @@
1
+ import type { Converted } from './result';
2
+ export declare function toArray(v: unknown): Converted<unknown[]>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toArray = toArray;
4
+ const result_1 = require("./result");
5
+ function toArray(v) {
6
+ let isArray;
7
+ try {
8
+ isArray = Array.isArray(v);
9
+ }
10
+ catch {
11
+ return (0, result_1.failure)(result_1.ConvertMessages.ARRAY);
12
+ }
13
+ if (isArray)
14
+ return (0, result_1.success)(v);
15
+ if (typeof v !== 'string')
16
+ return (0, result_1.failure)(result_1.ConvertMessages.ARRAY);
17
+ let parsed;
18
+ try {
19
+ parsed = JSON.parse(v);
20
+ }
21
+ catch {
22
+ return (0, result_1.failure)(result_1.ConvertMessages.ARRAY);
23
+ }
24
+ return Array.isArray(parsed) ? (0, result_1.success)(parsed) : (0, result_1.failure)(result_1.ConvertMessages.ARRAY);
25
+ }
@@ -0,0 +1,5 @@
1
+ import type { Converted } from './result';
2
+ export interface BooleanConvertOptions {
3
+ mode?: 'default' | 'strict' | 'loose';
4
+ }
5
+ export declare function toBoolean(v: unknown, options?: BooleanConvertOptions): Converted<boolean>;