@stll/stdnum 1.0.0 → 2.0.0

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 (704) hide show
  1. package/dist/_checksums/luhn.js.map +1 -1
  2. package/dist/_checksums/mod1110.js +1 -1
  3. package/dist/_checksums/mod1110.js.map +1 -1
  4. package/dist/_checksums/mod112.js.map +1 -1
  5. package/dist/_checksums/mod97.js.map +1 -1
  6. package/dist/_checksums/verhoeff.js.map +1 -1
  7. package/dist/_checksums/weighted-sum.js.map +1 -1
  8. package/dist/_util/arabic.js.map +1 -1
  9. package/dist/_util/clean.js.map +1 -1
  10. package/dist/_util/date.js.map +1 -1
  11. package/dist/_util/generate.js.map +1 -1
  12. package/dist/_util/result.js.map +1 -1
  13. package/dist/_util/strings.js.map +1 -1
  14. package/dist/ad/nrt.d.ts +16 -2
  15. package/dist/ad/nrt.js +1 -14
  16. package/dist/ad/nrt.js.map +1 -1
  17. package/dist/ae/eid.d.ts +2 -2
  18. package/dist/ae/eid.js +2 -12
  19. package/dist/ae/eid.js.map +1 -1
  20. package/dist/ai/tin.d.ts +20 -2
  21. package/dist/ai/tin.js +1 -18
  22. package/dist/ai/tin.js.map +1 -1
  23. package/dist/al/nipt.d.ts +13 -2
  24. package/dist/al/nipt.js +1 -11
  25. package/dist/al/nipt.js.map +1 -1
  26. package/dist/am/tin.d.ts +16 -2
  27. package/dist/am/tin.js +1 -14
  28. package/dist/am/tin.js.map +1 -1
  29. package/dist/ar/cbu.d.ts +2 -2
  30. package/dist/ar/cbu.js +1 -9
  31. package/dist/ar/cbu.js.map +1 -1
  32. package/dist/ar/cuit.d.ts +2 -2
  33. package/dist/ar/cuit.js +1 -17
  34. package/dist/ar/cuit.js.map +1 -1
  35. package/dist/ar/dni.d.ts +11 -2
  36. package/dist/ar/dni.js +1 -9
  37. package/dist/ar/dni.js.map +1 -1
  38. package/dist/at/businessid.d.ts +10 -2
  39. package/dist/at/businessid.js +1 -8
  40. package/dist/at/businessid.js.map +1 -1
  41. package/dist/at/tin.d.ts +2 -2
  42. package/dist/at/tin.js +1 -11
  43. package/dist/at/tin.js.map +1 -1
  44. package/dist/at/uid.d.ts +2 -2
  45. package/dist/at/uid.js +2 -10
  46. package/dist/at/uid.js.map +1 -1
  47. package/dist/at/vnr.d.ts +2 -2
  48. package/dist/at/vnr.js +4 -14
  49. package/dist/at/vnr.js.map +1 -1
  50. package/dist/au/abn.d.ts +2 -2
  51. package/dist/au/abn.js +1 -10
  52. package/dist/au/abn.js.map +1 -1
  53. package/dist/au/acn.d.ts +2 -2
  54. package/dist/au/acn.js +1 -10
  55. package/dist/au/acn.js.map +1 -1
  56. package/dist/au/tfn.d.ts +2 -2
  57. package/dist/au/tfn.js +1 -10
  58. package/dist/au/tfn.js.map +1 -1
  59. package/dist/az/voen.d.ts +2 -2
  60. package/dist/az/voen.js +1 -14
  61. package/dist/az/voen.js.map +1 -1
  62. package/dist/ba/jmbg.d.ts +2 -2
  63. package/dist/ba/jmbg.js +3 -11
  64. package/dist/ba/jmbg.js.map +1 -1
  65. package/dist/bd/nid.d.ts +23 -2
  66. package/dist/bd/nid.js +1 -21
  67. package/dist/bd/nid.js.map +1 -1
  68. package/dist/be/bis.d.ts +2 -2
  69. package/dist/be/bis.js +1 -11
  70. package/dist/be/bis.js.map +1 -1
  71. package/dist/be/nn.d.ts +2 -2
  72. package/dist/be/nn.js +1 -11
  73. package/dist/be/nn.js.map +1 -1
  74. package/dist/be/vat.d.ts +2 -2
  75. package/dist/be/vat.js +1 -9
  76. package/dist/be/vat.js.map +1 -1
  77. package/dist/bg/egn.d.ts +2 -2
  78. package/dist/bg/egn.js +3 -18
  79. package/dist/bg/egn.js.map +1 -1
  80. package/dist/bg/pnf.d.ts +2 -2
  81. package/dist/bg/pnf.js +1 -8
  82. package/dist/bg/pnf.js.map +1 -1
  83. package/dist/bg/vat.d.ts +2 -2
  84. package/dist/bg/vat.js +3 -9
  85. package/dist/bg/vat.js.map +1 -1
  86. package/dist/bh/cpr.d.ts +2 -2
  87. package/dist/bh/cpr.js +1 -17
  88. package/dist/bh/cpr.js.map +1 -1
  89. package/dist/bic.d.ts +13 -2
  90. package/dist/bic.js +1 -11
  91. package/dist/bic.js.map +1 -1
  92. package/dist/br/cnpj.d.ts +2 -2
  93. package/dist/br/cnpj.js +1 -20
  94. package/dist/br/cnpj.js.map +1 -1
  95. package/dist/br/cpf.d.ts +2 -2
  96. package/dist/br/cpf.js +1 -14
  97. package/dist/br/cpf.js.map +1 -1
  98. package/dist/by/unp.d.ts +2 -2
  99. package/dist/by/unp.js +3 -14
  100. package/dist/by/unp.js.map +1 -1
  101. package/dist/bz/tin.d.ts +2 -2
  102. package/dist/bz/tin.js +1 -26
  103. package/dist/bz/tin.js.map +1 -1
  104. package/dist/ca/bn.d.ts +2 -2
  105. package/dist/ca/bn.js +2 -10
  106. package/dist/ca/bn.js.map +1 -1
  107. package/dist/ca/sin.d.ts +2 -2
  108. package/dist/ca/sin.js +2 -10
  109. package/dist/ca/sin.js.map +1 -1
  110. package/dist/ch/ssn.d.ts +2 -2
  111. package/dist/ch/ssn.js +1 -9
  112. package/dist/ch/ssn.js.map +1 -1
  113. package/dist/ch/uid.d.ts +2 -2
  114. package/dist/ch/uid.js +1 -9
  115. package/dist/ch/uid.js.map +1 -1
  116. package/dist/ch/vat.d.ts +2 -2
  117. package/dist/ch/vat.js +1 -9
  118. package/dist/ch/vat.js.map +1 -1
  119. package/dist/cl/rut.d.ts +2 -2
  120. package/dist/cl/rut.js +1 -14
  121. package/dist/cl/rut.js.map +1 -1
  122. package/dist/cn/ric.d.ts +2 -2
  123. package/dist/cn/ric.js +3 -14
  124. package/dist/cn/ric.js.map +1 -1
  125. package/dist/cn/uscc.d.ts +2 -2
  126. package/dist/cn/uscc.js +1 -10
  127. package/dist/cn/uscc.js.map +1 -1
  128. package/dist/co/nit.d.ts +2 -2
  129. package/dist/co/nit.js +2 -12
  130. package/dist/co/nit.js.map +1 -1
  131. package/dist/cr/cpf.d.ts +18 -2
  132. package/dist/cr/cpf.js +1 -16
  133. package/dist/cr/cpf.js.map +1 -1
  134. package/dist/creditcard.d.ts +2 -2
  135. package/dist/creditcard.js +5 -14
  136. package/dist/creditcard.js.map +1 -1
  137. package/dist/cu/ni.d.ts +2 -2
  138. package/dist/cu/ni.js +2 -17
  139. package/dist/cu/ni.js.map +1 -1
  140. package/dist/cy/vat.d.ts +2 -2
  141. package/dist/cy/vat.js +1 -8
  142. package/dist/cy/vat.js.map +1 -1
  143. package/dist/cz/dic.d.ts +2 -2
  144. package/dist/cz/dic.js +7 -13
  145. package/dist/cz/dic.js.map +1 -1
  146. package/dist/cz/ico.d.ts +2 -2
  147. package/dist/cz/ico.js +2 -10
  148. package/dist/cz/ico.js.map +1 -1
  149. package/dist/cz/rc.d.ts +2 -2
  150. package/dist/cz/rc.js +2 -26
  151. package/dist/cz/rc.js.map +1 -1
  152. package/dist/de/handelsreg.d.ts +19 -2
  153. package/dist/de/handelsreg.js +1 -17
  154. package/dist/de/handelsreg.js.map +1 -1
  155. package/dist/de/idnr.d.ts +2 -2
  156. package/dist/de/idnr.js +2 -12
  157. package/dist/de/idnr.js.map +1 -1
  158. package/dist/de/stnr.d.ts +17 -2
  159. package/dist/de/stnr.js +1 -15
  160. package/dist/de/stnr.js.map +1 -1
  161. package/dist/de/svnr.d.ts +2 -2
  162. package/dist/de/svnr.js +2 -11
  163. package/dist/de/svnr.js.map +1 -1
  164. package/dist/de/vat.d.ts +2 -2
  165. package/dist/de/vat.js +2 -11
  166. package/dist/de/vat.js.map +1 -1
  167. package/dist/dk/cpr.d.ts +2 -2
  168. package/dist/dk/cpr.js +2 -10
  169. package/dist/dk/cpr.js.map +1 -1
  170. package/dist/dk/cvr.d.ts +2 -2
  171. package/dist/dk/cvr.js +2 -15
  172. package/dist/dk/cvr.js.map +1 -1
  173. package/dist/dk/vat.d.ts +2 -2
  174. package/dist/dk/vat.js +3 -13
  175. package/dist/dk/vat.js.map +1 -1
  176. package/dist/do/rnc.d.ts +2 -2
  177. package/dist/do/rnc.js +2 -16
  178. package/dist/do/rnc.js.map +1 -1
  179. package/dist/ec/ruc.d.ts +2 -2
  180. package/dist/ec/ruc.js +1 -18
  181. package/dist/ec/ruc.js.map +1 -1
  182. package/dist/ee/ik.d.ts +2 -2
  183. package/dist/ee/ik.js +3 -20
  184. package/dist/ee/ik.js.map +1 -1
  185. package/dist/ee/registrikood.d.ts +2 -2
  186. package/dist/ee/registrikood.js +1 -8
  187. package/dist/ee/registrikood.js.map +1 -1
  188. package/dist/ee/vat.d.ts +2 -2
  189. package/dist/ee/vat.js +2 -10
  190. package/dist/ee/vat.js.map +1 -1
  191. package/dist/eg/tn.d.ts +11 -2
  192. package/dist/eg/tn.js +1 -9
  193. package/dist/eg/tn.js.map +1 -1
  194. package/dist/es/cif.d.ts +2 -2
  195. package/dist/es/cif.js +1 -10
  196. package/dist/es/cif.js.map +1 -1
  197. package/dist/es/dni.d.ts +2 -2
  198. package/dist/es/dni.js +1 -9
  199. package/dist/es/dni.js.map +1 -1
  200. package/dist/es/nie.d.ts +2 -2
  201. package/dist/es/nie.js +1 -9
  202. package/dist/es/nie.js.map +1 -1
  203. package/dist/es/nss.d.ts +2 -2
  204. package/dist/es/nss.js +1 -16
  205. package/dist/es/nss.js.map +1 -1
  206. package/dist/es/vat.d.ts +2 -2
  207. package/dist/es/vat.js +5 -10
  208. package/dist/es/vat.js.map +1 -1
  209. package/dist/eu/vat.d.ts +2 -2
  210. package/dist/eu/vat.js +1 -0
  211. package/dist/eu/vat.js.map +1 -1
  212. package/dist/fi/hetu.d.ts +2 -2
  213. package/dist/fi/hetu.js +2 -10
  214. package/dist/fi/hetu.js.map +1 -1
  215. package/dist/fi/vat.d.ts +2 -2
  216. package/dist/fi/vat.js +3 -10
  217. package/dist/fi/vat.js.map +1 -1
  218. package/dist/fi/ytunnus.d.ts +2 -2
  219. package/dist/fi/ytunnus.js +2 -10
  220. package/dist/fi/ytunnus.js.map +1 -1
  221. package/dist/fr/nif.d.ts +2 -2
  222. package/dist/fr/nif.js +1 -9
  223. package/dist/fr/nif.js.map +1 -1
  224. package/dist/fr/nir.d.ts +2 -2
  225. package/dist/fr/nir.js +2 -14
  226. package/dist/fr/nir.js.map +1 -1
  227. package/dist/fr/siren.d.ts +2 -2
  228. package/dist/fr/siren.js +2 -10
  229. package/dist/fr/siren.js.map +1 -1
  230. package/dist/fr/siret.d.ts +2 -2
  231. package/dist/fr/siret.js +2 -11
  232. package/dist/fr/siret.js.map +1 -1
  233. package/dist/fr/tva.d.ts +2 -2
  234. package/dist/fr/tva.js +2 -12
  235. package/dist/fr/tva.js.map +1 -1
  236. package/dist/gb/nino.d.ts +12 -2
  237. package/dist/gb/nino.js +1 -10
  238. package/dist/gb/nino.js.map +1 -1
  239. package/dist/gb/sedol.d.ts +2 -2
  240. package/dist/gb/sedol.js +1 -11
  241. package/dist/gb/sedol.js.map +1 -1
  242. package/dist/gb/utr.d.ts +2 -2
  243. package/dist/gb/utr.js +2 -10
  244. package/dist/gb/utr.js.map +1 -1
  245. package/dist/gb/vat.d.ts +2 -2
  246. package/dist/gb/vat.js +2 -11
  247. package/dist/gb/vat.js.map +1 -1
  248. package/dist/ge/pin.d.ts +14 -2
  249. package/dist/ge/pin.js +1 -12
  250. package/dist/ge/pin.js.map +1 -1
  251. package/dist/gh/tin.d.ts +2 -2
  252. package/dist/gh/tin.js +1 -15
  253. package/dist/gh/tin.js.map +1 -1
  254. package/dist/gr/amka.d.ts +2 -2
  255. package/dist/gr/amka.js +3 -11
  256. package/dist/gr/amka.js.map +1 -1
  257. package/dist/gr/vat.d.ts +2 -2
  258. package/dist/gr/vat.js +1 -10
  259. package/dist/gr/vat.js.map +1 -1
  260. package/dist/gt/nit.d.ts +2 -2
  261. package/dist/gt/nit.js +1 -12
  262. package/dist/gt/nit.js.map +1 -1
  263. package/dist/hk/hkid.d.ts +2 -2
  264. package/dist/hk/hkid.js +1 -10
  265. package/dist/hk/hkid.js.map +1 -1
  266. package/dist/hr/vat.d.ts +2 -2
  267. package/dist/hr/vat.js +2 -9
  268. package/dist/hr/vat.js.map +1 -1
  269. package/dist/hu/vat.d.ts +2 -2
  270. package/dist/hu/vat.js +3 -10
  271. package/dist/hu/vat.js.map +1 -1
  272. package/dist/iban.d.ts +2 -2
  273. package/dist/iban.js +2 -8
  274. package/dist/iban.js.map +1 -1
  275. package/dist/id/npwp.d.ts +2 -2
  276. package/dist/id/npwp.js +3 -13
  277. package/dist/id/npwp.js.map +1 -1
  278. package/dist/ie/pps.d.ts +2 -2
  279. package/dist/ie/pps.js +1 -10
  280. package/dist/ie/pps.js.map +1 -1
  281. package/dist/ie/vat.d.ts +2 -2
  282. package/dist/ie/vat.js +1 -9
  283. package/dist/ie/vat.js.map +1 -1
  284. package/dist/il/idnr.d.ts +2 -2
  285. package/dist/il/idnr.js +2 -9
  286. package/dist/il/idnr.js.map +1 -1
  287. package/dist/in/aadhaar.d.ts +2 -2
  288. package/dist/in/aadhaar.js +2 -12
  289. package/dist/in/aadhaar.js.map +1 -1
  290. package/dist/in/gstin.d.ts +2 -2
  291. package/dist/in/gstin.js +1 -10
  292. package/dist/in/gstin.js.map +1 -1
  293. package/dist/in/pan.d.ts +15 -2
  294. package/dist/in/pan.js +1 -13
  295. package/dist/in/pan.js.map +1 -1
  296. package/dist/index.d.ts +2 -2
  297. package/dist/index.js +6 -6
  298. package/dist/iq/nid.d.ts +16 -2
  299. package/dist/iq/nid.js +2 -15
  300. package/dist/iq/nid.js.map +1 -1
  301. package/dist/ir/nid.d.ts +2 -2
  302. package/dist/ir/nid.js +2 -24
  303. package/dist/ir/nid.js.map +1 -1
  304. package/dist/is/kennitala.d.ts +2 -2
  305. package/dist/is/kennitala.js +2 -13
  306. package/dist/is/kennitala.js.map +1 -1
  307. package/dist/is/vsk.d.ts +9 -2
  308. package/dist/is/vsk.js +1 -7
  309. package/dist/is/vsk.js.map +1 -1
  310. package/dist/isin.d.ts +2 -2
  311. package/dist/isin.js +2 -12
  312. package/dist/isin.js.map +1 -1
  313. package/dist/it/codicefiscale.d.ts +2 -2
  314. package/dist/it/codicefiscale.js +1 -21
  315. package/dist/it/codicefiscale.js.map +1 -1
  316. package/dist/it/iva.d.ts +2 -2
  317. package/dist/it/iva.js +2 -9
  318. package/dist/it/iva.js.map +1 -1
  319. package/dist/jp/cn.d.ts +2 -2
  320. package/dist/jp/cn.js +1 -9
  321. package/dist/jp/cn.js.map +1 -1
  322. package/dist/jp/mynumber.d.ts +2 -2
  323. package/dist/jp/mynumber.js +1 -10
  324. package/dist/jp/mynumber.js.map +1 -1
  325. package/dist/kr/brn.d.ts +11 -2
  326. package/dist/kr/brn.js +1 -9
  327. package/dist/kr/brn.js.map +1 -1
  328. package/dist/kr/rrn.d.ts +2 -2
  329. package/dist/kr/rrn.js +2 -11
  330. package/dist/kr/rrn.js.map +1 -1
  331. package/dist/kw/civil.d.ts +2 -2
  332. package/dist/kw/civil.js +2 -14
  333. package/dist/kw/civil.js.map +1 -1
  334. package/dist/kz/iin.d.ts +2 -2
  335. package/dist/kz/iin.js +3 -18
  336. package/dist/kz/iin.js.map +1 -1
  337. package/dist/lei.d.ts +2 -2
  338. package/dist/lei.js +2 -11
  339. package/dist/lei.js.map +1 -1
  340. package/dist/li/peid.d.ts +11 -2
  341. package/dist/li/peid.js +1 -9
  342. package/dist/li/peid.js.map +1 -1
  343. package/dist/lk/nic.d.ts +2 -2
  344. package/dist/lk/nic.js +2 -14
  345. package/dist/lk/nic.js.map +1 -1
  346. package/dist/lt/asmens.d.ts +2 -2
  347. package/dist/lt/asmens.js +2 -1
  348. package/dist/lt/asmens.js.map +1 -1
  349. package/dist/lt/vat.d.ts +2 -2
  350. package/dist/lt/vat.js +2 -10
  351. package/dist/lt/vat.js.map +1 -1
  352. package/dist/lu/vat.d.ts +2 -2
  353. package/dist/lu/vat.js +2 -8
  354. package/dist/lu/vat.js.map +1 -1
  355. package/dist/luhn.d.ts +2 -2
  356. package/dist/luhn.js +2 -9
  357. package/dist/luhn.js.map +1 -1
  358. package/dist/lv/vat.d.ts +2 -2
  359. package/dist/lv/vat.js +2 -28
  360. package/dist/lv/vat.js.map +1 -1
  361. package/dist/ma/ice.d.ts +2 -2
  362. package/dist/ma/ice.js +2 -11
  363. package/dist/ma/ice.js.map +1 -1
  364. package/dist/mc/tva.d.ts +2 -2
  365. package/dist/mc/tva.js +1 -0
  366. package/dist/mc/tva.js.map +1 -1
  367. package/dist/md/idno.d.ts +2 -2
  368. package/dist/md/idno.js +1 -10
  369. package/dist/md/idno.js.map +1 -1
  370. package/dist/me/pib.d.ts +2 -2
  371. package/dist/me/pib.js +2 -10
  372. package/dist/me/pib.js.map +1 -1
  373. package/dist/mk/edb.d.ts +2 -2
  374. package/dist/mk/edb.js +2 -11
  375. package/dist/mk/edb.js.map +1 -1
  376. package/dist/mt/vat.d.ts +2 -2
  377. package/dist/mt/vat.js +3 -10
  378. package/dist/mt/vat.js.map +1 -1
  379. package/dist/mu/brn.d.ts +23 -2
  380. package/dist/mu/brn.js +1 -21
  381. package/dist/mu/brn.js.map +1 -1
  382. package/dist/mx/clabe.d.ts +2 -2
  383. package/dist/mx/clabe.js +1 -14
  384. package/dist/mx/clabe.js.map +1 -1
  385. package/dist/mx/curp.d.ts +2 -2
  386. package/dist/mx/curp.js +3 -17
  387. package/dist/mx/curp.js.map +1 -1
  388. package/dist/mx/rfc.d.ts +2 -2
  389. package/dist/mx/rfc.js +3 -19
  390. package/dist/mx/rfc.js.map +1 -1
  391. package/dist/my/nric.d.ts +2 -2
  392. package/dist/my/nric.js +2 -14
  393. package/dist/my/nric.js.map +1 -1
  394. package/dist/ng/nin.d.ts +13 -2
  395. package/dist/ng/nin.js +1 -11
  396. package/dist/ng/nin.js.map +1 -1
  397. package/dist/ni/ruc.d.ts +2 -2
  398. package/dist/ni/ruc.js +1 -23
  399. package/dist/ni/ruc.js.map +1 -1
  400. package/dist/nl/bsn.d.ts +2 -2
  401. package/dist/nl/bsn.js +2 -10
  402. package/dist/nl/bsn.js.map +1 -1
  403. package/dist/nl/kvk.d.ts +9 -2
  404. package/dist/nl/kvk.js +1 -7
  405. package/dist/nl/kvk.js.map +1 -1
  406. package/dist/nl/vat.d.ts +2 -2
  407. package/dist/nl/vat.js +1 -13
  408. package/dist/nl/vat.js.map +1 -1
  409. package/dist/no/fodselsnummer.d.ts +2 -2
  410. package/dist/no/fodselsnummer.js +2 -10
  411. package/dist/no/fodselsnummer.js.map +1 -1
  412. package/dist/no/mva.d.ts +2 -2
  413. package/dist/no/mva.js +1 -8
  414. package/dist/no/mva.js.map +1 -1
  415. package/dist/no/orgnr.d.ts +2 -2
  416. package/dist/no/orgnr.js +2 -8
  417. package/dist/no/orgnr.js.map +1 -1
  418. package/dist/nz/ird.d.ts +2 -2
  419. package/dist/nz/ird.js +2 -11
  420. package/dist/nz/ird.js.map +1 -1
  421. package/dist/pa/ruc.d.ts +2 -2
  422. package/dist/pa/ruc.js +1 -18
  423. package/dist/pa/ruc.js.map +1 -1
  424. package/dist/patterns.d.ts +8 -7
  425. package/dist/patterns.js +3 -5
  426. package/dist/patterns.js.map +1 -1
  427. package/dist/pe/ruc.d.ts +2 -2
  428. package/dist/pe/ruc.js +1 -15
  429. package/dist/pe/ruc.js.map +1 -1
  430. package/dist/ph/philid.d.ts +14 -2
  431. package/dist/ph/philid.js +1 -12
  432. package/dist/ph/philid.js.map +1 -1
  433. package/dist/pk/cnic.d.ts +14 -2
  434. package/dist/pk/cnic.js +1 -12
  435. package/dist/pk/cnic.js.map +1 -1
  436. package/dist/pl/nip.d.ts +2 -2
  437. package/dist/pl/nip.js +2 -10
  438. package/dist/pl/nip.js.map +1 -1
  439. package/dist/pl/pesel.d.ts +2 -2
  440. package/dist/pl/pesel.js +3 -13
  441. package/dist/pl/pesel.js.map +1 -1
  442. package/dist/pl/regon.d.ts +2 -2
  443. package/dist/pl/regon.js +2 -11
  444. package/dist/pl/regon.js.map +1 -1
  445. package/dist/pt/cc.d.ts +2 -2
  446. package/dist/pt/cc.js +1 -9
  447. package/dist/pt/cc.js.map +1 -1
  448. package/dist/pt/vat.d.ts +2 -2
  449. package/dist/pt/vat.js +3 -11
  450. package/dist/pt/vat.js.map +1 -1
  451. package/dist/ro/cnp.d.ts +2 -2
  452. package/dist/ro/cnp.js +4 -14
  453. package/dist/ro/cnp.js.map +1 -1
  454. package/dist/ro/vat.d.ts +2 -2
  455. package/dist/ro/vat.js +13 -11
  456. package/dist/ro/vat.js.map +1 -1
  457. package/dist/rs/pib.d.ts +2 -2
  458. package/dist/rs/pib.js +1 -9
  459. package/dist/rs/pib.js.map +1 -1
  460. package/dist/ru/inn.d.ts +2 -2
  461. package/dist/ru/inn.js +1 -11
  462. package/dist/ru/inn.js.map +1 -1
  463. package/dist/se/orgnr.d.ts +2 -2
  464. package/dist/se/orgnr.js +2 -9
  465. package/dist/se/orgnr.js.map +1 -1
  466. package/dist/se/personnummer.d.ts +2 -2
  467. package/dist/se/personnummer.js +7 -15
  468. package/dist/se/personnummer.js.map +1 -1
  469. package/dist/se/vat.d.ts +2 -2
  470. package/dist/se/vat.js +3 -10
  471. package/dist/se/vat.js.map +1 -1
  472. package/dist/sg/uen.d.ts +2 -2
  473. package/dist/sg/uen.js +1 -15
  474. package/dist/sg/uen.js.map +1 -1
  475. package/dist/si/emso.d.ts +2 -2
  476. package/dist/si/emso.js +3 -18
  477. package/dist/si/emso.js.map +1 -1
  478. package/dist/si/vat.d.ts +2 -2
  479. package/dist/si/vat.js +3 -12
  480. package/dist/si/vat.js.map +1 -1
  481. package/dist/sk/dic.d.ts +2 -2
  482. package/dist/sk/dic.js +1 -0
  483. package/dist/sk/dic.js.map +1 -1
  484. package/dist/sk/ico.d.ts +2 -2
  485. package/dist/sk/ico.js +1 -0
  486. package/dist/sk/ico.js.map +1 -1
  487. package/dist/sk/rc.d.ts +2 -2
  488. package/dist/sk/rc.js +1 -0
  489. package/dist/sk/rc.js.map +1 -1
  490. package/dist/th/tin.d.ts +2 -2
  491. package/dist/th/tin.js +1 -11
  492. package/dist/th/tin.js.map +1 -1
  493. package/dist/tr/tckimlik.d.ts +2 -2
  494. package/dist/tr/tckimlik.js +1 -20
  495. package/dist/tr/tckimlik.js.map +1 -1
  496. package/dist/tr/vkn.d.ts +2 -2
  497. package/dist/tr/vkn.js +1 -20
  498. package/dist/tr/vkn.js.map +1 -1
  499. package/dist/tw/ubn.d.ts +2 -2
  500. package/dist/tw/ubn.js +1 -11
  501. package/dist/tw/ubn.js.map +1 -1
  502. package/dist/types.d.ts +26 -4
  503. package/dist/ua/edrpou.d.ts +2 -2
  504. package/dist/ua/edrpou.js +1 -11
  505. package/dist/ua/edrpou.js.map +1 -1
  506. package/dist/us/ein.d.ts +12 -2
  507. package/dist/us/ein.js +1 -10
  508. package/dist/us/ein.js.map +1 -1
  509. package/dist/us/itin.d.ts +13 -2
  510. package/dist/us/itin.js +1 -11
  511. package/dist/us/itin.js.map +1 -1
  512. package/dist/us/rtn.d.ts +2 -2
  513. package/dist/us/rtn.js +3 -18
  514. package/dist/us/rtn.js.map +1 -1
  515. package/dist/us/ssn.d.ts +13 -2
  516. package/dist/us/ssn.js +1 -11
  517. package/dist/us/ssn.js.map +1 -1
  518. package/dist/uy/rut.d.ts +2 -2
  519. package/dist/uy/rut.js +1 -14
  520. package/dist/uy/rut.js.map +1 -1
  521. package/dist/ve/rif.d.ts +2 -2
  522. package/dist/ve/rif.js +2 -15
  523. package/dist/ve/rif.js.map +1 -1
  524. package/dist/vn/mst.d.ts +2 -2
  525. package/dist/vn/mst.js +1 -12
  526. package/dist/vn/mst.js.map +1 -1
  527. package/dist/za/idnr.d.ts +2 -2
  528. package/dist/za/idnr.js +3 -16
  529. package/dist/za/idnr.js.map +1 -1
  530. package/package.json +22 -12
  531. package/src/_checksums/mod1110.ts +1 -1
  532. package/src/ad/nrt.ts +7 -3
  533. package/src/ae/eid.ts +7 -3
  534. package/src/ai/tin.ts +7 -3
  535. package/src/al/nipt.ts +7 -3
  536. package/src/am/tin.ts +7 -3
  537. package/src/ar/cbu.ts +7 -3
  538. package/src/ar/cuit.ts +7 -3
  539. package/src/ar/dni.ts +7 -3
  540. package/src/at/businessid.ts +7 -3
  541. package/src/at/tin.ts +7 -3
  542. package/src/at/uid.ts +7 -3
  543. package/src/at/vnr.ts +37 -9
  544. package/src/au/abn.ts +7 -3
  545. package/src/au/acn.ts +7 -3
  546. package/src/au/tfn.ts +7 -3
  547. package/src/az/voen.ts +7 -3
  548. package/src/ba/jmbg.ts +8 -7
  549. package/src/bd/nid.ts +7 -3
  550. package/src/be/bis.ts +8 -4
  551. package/src/be/nn.ts +7 -3
  552. package/src/be/vat.ts +7 -3
  553. package/src/bg/egn.ts +8 -7
  554. package/src/bg/pnf.ts +7 -3
  555. package/src/bg/vat.ts +8 -3
  556. package/src/bh/cpr.ts +7 -3
  557. package/src/bic.ts +7 -3
  558. package/src/br/cnpj.ts +7 -3
  559. package/src/br/cpf.ts +7 -3
  560. package/src/by/unp.ts +10 -5
  561. package/src/bz/tin.ts +7 -3
  562. package/src/ca/bn.ts +7 -3
  563. package/src/ca/sin.ts +7 -3
  564. package/src/ch/ssn.ts +7 -3
  565. package/src/ch/uid.ts +7 -3
  566. package/src/ch/vat.ts +9 -5
  567. package/src/cl/rut.ts +7 -3
  568. package/src/cn/ric.ts +8 -7
  569. package/src/cn/uscc.ts +7 -3
  570. package/src/co/nit.ts +8 -4
  571. package/src/cr/cpf.ts +7 -3
  572. package/src/creditcard.ts +10 -6
  573. package/src/cu/ni.ts +8 -7
  574. package/src/cy/vat.ts +7 -3
  575. package/src/cz/dic.ts +9 -4
  576. package/src/cz/ico.ts +7 -3
  577. package/src/cz/rc.ts +8 -7
  578. package/src/de/handelsreg.ts +7 -3
  579. package/src/de/idnr.ts +7 -3
  580. package/src/de/stnr.ts +7 -3
  581. package/src/de/svnr.ts +7 -3
  582. package/src/de/vat.ts +7 -3
  583. package/src/dk/cpr.ts +8 -7
  584. package/src/dk/cvr.ts +7 -3
  585. package/src/dk/vat.ts +8 -3
  586. package/src/do/rnc.ts +7 -3
  587. package/src/ec/ruc.ts +7 -3
  588. package/src/ee/ik.ts +8 -7
  589. package/src/ee/registrikood.ts +8 -4
  590. package/src/ee/vat.ts +7 -3
  591. package/src/eg/tn.ts +7 -3
  592. package/src/es/cif.ts +8 -4
  593. package/src/es/dni.ts +7 -3
  594. package/src/es/nie.ts +8 -4
  595. package/src/es/nss.ts +7 -3
  596. package/src/es/vat.ts +13 -5
  597. package/src/eu/vat.ts +10 -6
  598. package/src/fi/hetu.ts +8 -7
  599. package/src/fi/vat.ts +8 -3
  600. package/src/fi/ytunnus.ts +7 -3
  601. package/src/fr/nif.ts +7 -3
  602. package/src/fr/nir.ts +8 -7
  603. package/src/fr/siren.ts +7 -3
  604. package/src/fr/siret.ts +7 -3
  605. package/src/fr/tva.ts +7 -3
  606. package/src/gb/nino.ts +7 -3
  607. package/src/gb/sedol.ts +7 -3
  608. package/src/gb/utr.ts +7 -3
  609. package/src/gb/vat.ts +7 -3
  610. package/src/ge/pin.ts +7 -3
  611. package/src/gh/tin.ts +7 -3
  612. package/src/gr/amka.ts +7 -3
  613. package/src/gr/vat.ts +7 -3
  614. package/src/gt/nit.ts +7 -3
  615. package/src/hk/hkid.ts +7 -3
  616. package/src/hr/vat.ts +7 -3
  617. package/src/hu/vat.ts +8 -3
  618. package/src/iban.ts +7 -3
  619. package/src/id/npwp.ts +7 -3
  620. package/src/ie/pps.ts +7 -3
  621. package/src/ie/vat.ts +7 -3
  622. package/src/il/idnr.ts +7 -3
  623. package/src/in/aadhaar.ts +7 -3
  624. package/src/in/gstin.ts +7 -3
  625. package/src/in/pan.ts +7 -3
  626. package/src/index.ts +3 -0
  627. package/src/iq/nid.ts +7 -3
  628. package/src/ir/nid.ts +7 -3
  629. package/src/is/kennitala.ts +7 -3
  630. package/src/is/vsk.ts +7 -3
  631. package/src/isin.ts +7 -3
  632. package/src/it/codicefiscale.ts +11 -7
  633. package/src/it/iva.ts +7 -3
  634. package/src/jp/cn.ts +7 -3
  635. package/src/jp/mynumber.ts +7 -3
  636. package/src/kr/brn.ts +7 -3
  637. package/src/kr/rrn.ts +8 -7
  638. package/src/kw/civil.ts +8 -7
  639. package/src/kz/iin.ts +8 -8
  640. package/src/lei.ts +7 -3
  641. package/src/li/peid.ts +7 -3
  642. package/src/lk/nic.ts +8 -7
  643. package/src/lt/asmens.ts +8 -4
  644. package/src/lt/vat.ts +8 -3
  645. package/src/lu/vat.ts +8 -3
  646. package/src/luhn.ts +7 -3
  647. package/src/lv/vat.ts +7 -3
  648. package/src/ma/ice.ts +7 -3
  649. package/src/mc/tva.ts +9 -5
  650. package/src/md/idno.ts +7 -3
  651. package/src/me/pib.ts +7 -3
  652. package/src/mk/edb.ts +7 -3
  653. package/src/mt/vat.ts +8 -3
  654. package/src/mu/brn.ts +7 -3
  655. package/src/mx/clabe.ts +7 -3
  656. package/src/mx/curp.ts +9 -8
  657. package/src/mx/rfc.ts +8 -4
  658. package/src/my/nric.ts +8 -7
  659. package/src/ng/nin.ts +7 -3
  660. package/src/ni/ruc.ts +7 -3
  661. package/src/nl/bsn.ts +7 -3
  662. package/src/nl/kvk.ts +7 -3
  663. package/src/nl/vat.ts +7 -3
  664. package/src/no/fodselsnummer.ts +11 -7
  665. package/src/no/mva.ts +9 -5
  666. package/src/no/orgnr.ts +7 -3
  667. package/src/nz/ird.ts +8 -4
  668. package/src/pa/ruc.ts +7 -3
  669. package/src/patterns.ts +49 -18
  670. package/src/pe/ruc.ts +7 -3
  671. package/src/ph/philid.ts +7 -3
  672. package/src/pk/cnic.ts +7 -3
  673. package/src/pl/nip.ts +7 -3
  674. package/src/pl/pesel.ts +8 -7
  675. package/src/pl/regon.ts +7 -3
  676. package/src/pt/cc.ts +7 -3
  677. package/src/pt/vat.ts +8 -3
  678. package/src/ro/cnp.ts +15 -8
  679. package/src/ro/vat.ts +8 -3
  680. package/src/rs/pib.ts +7 -3
  681. package/src/ru/inn.ts +7 -3
  682. package/src/se/orgnr.ts +7 -3
  683. package/src/se/personnummer.ts +35 -33
  684. package/src/se/vat.ts +8 -3
  685. package/src/sg/uen.ts +7 -3
  686. package/src/si/emso.ts +8 -7
  687. package/src/si/vat.ts +8 -3
  688. package/src/sk/dic.ts +8 -4
  689. package/src/sk/ico.ts +3 -2
  690. package/src/sk/rc.ts +6 -2
  691. package/src/th/tin.ts +7 -3
  692. package/src/tr/tckimlik.ts +7 -3
  693. package/src/tr/vkn.ts +7 -3
  694. package/src/tw/ubn.ts +7 -3
  695. package/src/types.ts +34 -3
  696. package/src/ua/edrpou.ts +7 -3
  697. package/src/us/ein.ts +7 -3
  698. package/src/us/itin.ts +7 -3
  699. package/src/us/rtn.ts +16 -8
  700. package/src/us/ssn.ts +7 -3
  701. package/src/uy/rut.ts +7 -3
  702. package/src/ve/rif.ts +8 -6
  703. package/src/vn/mst.ts +7 -3
  704. package/src/za/idnr.ts +8 -7
package/dist/bz/tin.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/bz/tin.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -11,7 +11,7 @@ declare const generate: () => string;
11
11
  *
12
12
  * Examples derived from stdnum-js test suite.
13
13
  */
14
- declare const tin: Validator;
14
+ declare const tin: CountryValidator<"BZ">;
15
15
  //#endregion
16
16
  export { compact, tin as default, format, generate, validate };
17
17
  //# sourceMappingURL=tin.d.ts.map
package/dist/bz/tin.js CHANGED
@@ -2,32 +2,6 @@ import { clean } from "../_util/clean.js";
2
2
  import { randomDigits, randomInt } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  //#region src/bz/tin.ts
5
- /**
6
- * TIN (Belize Tax Identification Number).
7
- *
8
- * Issued by the Belize Tax Service Department to
9
- * individuals, sole proprietors, partnerships, and
10
- * companies. The base number is 6 digits generated
11
- * by the Revenue Management System. A 2-digit
12
- * suffix code may be appended to indicate entity
13
- * type:
14
- * - 10: individual
15
- * - 13: company
16
- * - 66: company (alternate)
17
- *
18
- * The OECD spec mentions a 7th check digit that is
19
- * not visible to the taxpayer; in practice the
20
- * number circulates as 6 or 8 digits (6 + suffix).
21
- *
22
- * Formatted as NNNNNN-SS (when suffix is present).
23
- *
24
- * Source: OECD CRS TIN information sheet; Belize
25
- * Tax Service (https://bts.gov.bz/).
26
- *
27
- * PERSON/ENTITY
28
- *
29
- * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Belize-TIN.pdf
30
- */
31
5
  /** Valid 2-digit suffix codes. */
32
6
  const SUFFIX_CODES = [
33
7
  "10",
@@ -72,6 +46,7 @@ const tin = {
72
46
  abbreviation: "TIN",
73
47
  aliases: ["TIN"],
74
48
  candidatePattern: "\\d{6}",
49
+ scope: "country",
75
50
  country: "BZ",
76
51
  entityType: "any",
77
52
  lengths: [6, 8],
@@ -1 +1 @@
1
- {"version":3,"file":"tin.js","names":[],"sources":["../../src/bz/tin.ts"],"sourcesContent":["/**\n * TIN (Belize Tax Identification Number).\n *\n * Issued by the Belize Tax Service Department to\n * individuals, sole proprietors, partnerships, and\n * companies. The base number is 6 digits generated\n * by the Revenue Management System. A 2-digit\n * suffix code may be appended to indicate entity\n * type:\n * - 10: individual\n * - 13: company\n * - 66: company (alternate)\n *\n * The OECD spec mentions a 7th check digit that is\n * not visible to the taxpayer; in practice the\n * number circulates as 6 or 8 digits (6 + suffix).\n *\n * Formatted as NNNNNN-SS (when suffix is present).\n *\n * Source: OECD CRS TIN information sheet; Belize\n * Tax Service (https://bts.gov.bz/).\n *\n * PERSON/ENTITY\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Belize-TIN.pdf\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\n/** Valid 2-digit suffix codes. */\nconst SUFFIX_CODES = [\"10\", \"13\", \"66\"] as const;\n\nconst compact = (value: string): string => {\n return clean(value, \" -\").trim();\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 6 && v.length !== 8) {\n return err(\n \"INVALID_LENGTH\",\n \"Belize TIN must be 6 or 8 digits\",\n );\n }\n\n if (!/^\\d+$/.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Belize TIN must contain only digits\",\n );\n }\n\n if (v.length === 8) {\n const suffix = v.slice(6);\n if (\n !SUFFIX_CODES.includes(\n suffix as (typeof SUFFIX_CODES)[number],\n )\n ) {\n return err(\n \"INVALID_COMPONENT\",\n \"Belize TIN suffix must be 10, 13, or 66\",\n );\n }\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length <= 6) {\n return v;\n }\n return `${v.slice(0, 6)}-${v.slice(6)}`;\n};\n\n/** Generate a random valid Belize TIN. */\nconst generate = (): string => {\n const base = randomDigits(6);\n const suffixes = [\"\", ...SUFFIX_CODES] as const;\n const suffix =\n suffixes[randomInt(0, suffixes.length - 1)] ?? \"\";\n return `${base}${suffix}`;\n};\n\n/**\n * Belize Tax Identification Number.\n *\n * Examples derived from stdnum-js test suite.\n */\nconst tin: Validator = {\n name: \"Belize Tax Identification Number\",\n localName: \"Tax Identification Number\",\n abbreviation: \"TIN\",\n aliases: [\"TIN\"] as const,\n candidatePattern: \"\\\\d{6}\",\n country: \"BZ\",\n entityType: \"any\",\n lengths: [6, 8] as const,\n examples: [\"000005\", \"00000510\", \"00000513\"] as const,\n compact,\n format,\n validate,\n generate,\n description:\n \"Belize tax number issued by the Belize Tax Service Department\",\n sourceUrl:\n \"https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Belize-TIN.pdf\",\n};\n\nexport default tin;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAM,eAAe;CAAC;CAAM;CAAM;CAAK;AAEvC,MAAM,WAAW,UAA0B;AACzC,QAAO,MAAM,OAAO,KAAK,CAAC,MAAM;;AAGlC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EACjC,QAAO,IACL,kBACA,mCACD;AAGH,KAAI,CAAC,QAAQ,KAAK,EAAE,CAClB,QAAO,IACL,kBACA,sCACD;AAGH,KAAI,EAAE,WAAW,GAAG;EAClB,MAAM,SAAS,EAAE,MAAM,EAAE;AACzB,MACE,CAAC,aAAa,SACZ,OACD,CAED,QAAO,IACL,qBACA,0CACD;;AAIL,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,UAAU,EACd,QAAO;AAET,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;;;AAIvC,MAAM,iBAAyB;CAC7B,MAAM,OAAO,aAAa,EAAE;CAC5B,MAAM,WAAW,CAAC,IAAI,GAAG,aAAa;AAGtC,QAAO,GAAG,OADR,SAAS,UAAU,GAAG,SAAS,SAAS,EAAE,KAAK;;;;;;;AASnD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,MAAM;CAChB,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,GAAG,EAAE;CACf,UAAU;EAAC;EAAU;EAAY;EAAW;CAC5C;CACA;CACA;CACA;CACA,aACE;CACF,WACE;CACH"}
1
+ {"version":3,"file":"tin.js","names":[],"sources":["../../src/bz/tin.ts"],"sourcesContent":["/**\n * TIN (Belize Tax Identification Number).\n *\n * Issued by the Belize Tax Service Department to\n * individuals, sole proprietors, partnerships, and\n * companies. The base number is 6 digits generated\n * by the Revenue Management System. A 2-digit\n * suffix code may be appended to indicate entity\n * type:\n * - 10: individual\n * - 13: company\n * - 66: company (alternate)\n *\n * The OECD spec mentions a 7th check digit that is\n * not visible to the taxpayer; in practice the\n * number circulates as 6 or 8 digits (6 + suffix).\n *\n * Formatted as NNNNNN-SS (when suffix is present).\n *\n * Source: OECD CRS TIN information sheet; Belize\n * Tax Service (https://bts.gov.bz/).\n *\n * PERSON/ENTITY\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Belize-TIN.pdf\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\n/** Valid 2-digit suffix codes. */\nconst SUFFIX_CODES = [\"10\", \"13\", \"66\"] as const;\n\nconst compact = (value: string): string => {\n return clean(value, \" -\").trim();\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 6 && v.length !== 8) {\n return err(\n \"INVALID_LENGTH\",\n \"Belize TIN must be 6 or 8 digits\",\n );\n }\n\n if (!/^\\d+$/.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Belize TIN must contain only digits\",\n );\n }\n\n if (v.length === 8) {\n const suffix = v.slice(6);\n if (\n !SUFFIX_CODES.includes(\n suffix as (typeof SUFFIX_CODES)[number],\n )\n ) {\n return err(\n \"INVALID_COMPONENT\",\n \"Belize TIN suffix must be 10, 13, or 66\",\n );\n }\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length <= 6) {\n return v;\n }\n return `${v.slice(0, 6)}-${v.slice(6)}`;\n};\n\n/** Generate a random valid Belize TIN. */\nconst generate = (): string => {\n const base = randomDigits(6);\n const suffixes = [\"\", ...SUFFIX_CODES] as const;\n const suffix =\n suffixes[randomInt(0, suffixes.length - 1)] ?? \"\";\n return `${base}${suffix}`;\n};\n\n/**\n * Belize Tax Identification Number.\n *\n * Examples derived from stdnum-js test suite.\n */\nconst tin: CountryValidator<\"BZ\"> = {\n name: \"Belize Tax Identification Number\",\n localName: \"Tax Identification Number\",\n abbreviation: \"TIN\",\n aliases: [\"TIN\"] as const,\n candidatePattern: \"\\\\d{6}\",\n scope: \"country\",\n country: \"BZ\",\n entityType: \"any\",\n lengths: [6, 8] as const,\n examples: [\"000005\", \"00000510\", \"00000513\"] as const,\n compact,\n format,\n validate,\n generate,\n description:\n \"Belize tax number issued by the Belize Tax Service Department\",\n sourceUrl:\n \"https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Belize-TIN.pdf\",\n};\n\nexport default tin;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;AAqCA,MAAM,eAAe;CAAC;CAAM;CAAM;AAAI;AAEtC,MAAM,WAAW,UAA0B;CACzC,OAAO,MAAM,OAAO,IAAI,EAAE,KAAK;AACjC;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GACjC,OAAO,IACL,kBACA,kCACF;CAGF,IAAI,CAAC,QAAQ,KAAK,CAAC,GACjB,OAAO,IACL,kBACA,qCACF;CAGF,IAAI,EAAE,WAAW,GAAG;EAClB,MAAM,SAAS,EAAE,MAAM,CAAC;EACxB,IACE,CAAC,aAAa,SACZ,MACF,GAEA,OAAO,IACL,qBACA,yCACF;CAEJ;CAEA,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,UAAU,GACd,OAAO;CAET,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;AACtC;;AAGA,MAAM,iBAAyB;CAC7B,MAAM,OAAO,aAAa,CAAC;CAC3B,MAAM,WAAW,CAAC,IAAI,GAAG,YAAY;CAGrC,OAAO,GAAG,OADR,SAAS,UAAU,GAAG,SAAS,SAAS,CAAC,MAAM;AAEnD;;;;;;AAOA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,KAAK;CACf,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,GAAG,CAAC;CACd,UAAU;EAAC;EAAU;EAAY;CAAU;CAC3C;CACA;CACA;CACA;CACA,aACE;CACF,WACE;AACJ"}
package/dist/ca/bn.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/ca/bn.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Canadian BN. */
8
8
  declare const generate: () => string;
9
9
  /** Canadian Business Number. */
10
- declare const bn: Validator;
10
+ declare const bn: CountryValidator<"CA">;
11
11
  //#endregion
12
12
  export { compact, bn as default, format, generate, validate };
13
13
  //# sourceMappingURL=bn.d.ts.map
package/dist/ca/bn.js CHANGED
@@ -1,18 +1,9 @@
1
+ import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
1
2
  import { clean } from "../_util/clean.js";
2
3
  import { randomDigits } from "../_util/generate.js";
3
4
  import { err } from "../_util/result.js";
4
- import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
5
5
  import { isdigits } from "../_util/strings.js";
6
6
  //#region src/ca/bn.ts
7
- /**
8
- * BN (Canadian Business Number).
9
- *
10
- * 9-digit BN root (Luhn checksum) optionally
11
- * followed by a 2-letter program type (RC, RM,
12
- * RP, RT) and a 4-digit reference number (BN15).
13
- *
14
- * @see https://www.canada.ca/en/services/taxes/business-number.html
15
- */
16
7
  const VALID_PROGRAMS = new Set([
17
8
  "RC",
18
9
  "RM",
@@ -58,6 +49,7 @@ const bn = {
58
49
  "numéro d'entreprise"
59
50
  ],
60
51
  candidatePattern: "\\d{9}\\s?[A-Z]{2}\\s?\\d{4}",
52
+ scope: "country",
61
53
  country: "CA",
62
54
  entityType: "company",
63
55
  sourceUrl: "https://www.canada.ca/en/services/taxes/business-number.html",
package/dist/ca/bn.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bn.js","names":[],"sources":["../../src/ca/bn.ts"],"sourcesContent":["/**\n * BN (Canadian Business Number).\n *\n * 9-digit BN root (Luhn checksum) optionally\n * followed by a 2-letter program type (RC, RM,\n * RP, RT) and a 4-digit reference number (BN15).\n *\n * @see https://www.canada.ca/en/services/taxes/business-number.html\n */\n\nimport {\n luhnValidate,\n luhnChecksum,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst VALID_PROGRAMS = new Set([\"RC\", \"RM\", \"RP\", \"RT\"]);\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9 && v.length !== 15) {\n return err(\n \"INVALID_LENGTH\",\n \"BN must be 9 or 15 characters\",\n );\n }\n if (!isdigits(v.slice(0, 9))) {\n return err(\n \"INVALID_FORMAT\",\n \"BN root must contain only digits\",\n );\n }\n if (!luhnValidate(v.slice(0, 9))) {\n return err(\n \"INVALID_CHECKSUM\",\n \"BN Luhn check digit mismatch\",\n );\n }\n if (v.length === 15) {\n const program = v.slice(9, 11);\n if (!VALID_PROGRAMS.has(program)) {\n return err(\n \"INVALID_COMPONENT\",\n \"BN program type must be RC, RM, RP, or RT\",\n );\n }\n if (!isdigits(v.slice(11))) {\n return err(\n \"INVALID_FORMAT\",\n \"BN reference number must be digits\",\n );\n }\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 15) {\n return `${v.slice(0, 3)} ${v.slice(3, 6)} ${v.slice(6, 9)} ${v.slice(9, 11)} ${v.slice(11)}`;\n }\n if (v.length === 9) {\n return `${v.slice(0, 3)} ${v.slice(3, 6)} ${v.slice(6)}`;\n }\n return v;\n};\n\n/** Generate a random valid Canadian BN. */\nconst generate = (): string => {\n const payload = randomDigits(8);\n const cs = luhnChecksum(payload + \"0\");\n return payload + String((10 - cs) % 10);\n};\n\n/** Canadian Business Number. */\nconst bn: Validator = {\n name: \"Business Number\",\n localName: \"Business Number\",\n abbreviation: \"BN\",\n aliases: [\n \"BN\",\n \"Business Number\",\n \"numéro d'entreprise\",\n ] as const,\n candidatePattern: \"\\\\d{9}\\\\s?[A-Z]{2}\\\\s?\\\\d{4}\",\n country: \"CA\",\n entityType: \"company\",\n sourceUrl:\n \"https://www.canada.ca/en/services/taxes/business-number.html\",\n examples: [\"123026635\", \"123026635RC0001\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default bn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAqBA,MAAM,iBAAiB,IAAI,IAAI;CAAC;CAAM;CAAM;CAAM;CAAK,CAAC;AAExD,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GACjC,QAAO,IACL,kBACA,gCACD;AAEH,KAAI,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,CAC1B,QAAO,IACL,kBACA,mCACD;AAEH,KAAI,CAAC,aAAa,EAAE,MAAM,GAAG,EAAE,CAAC,CAC9B,QAAO,IACL,oBACA,+BACD;AAEH,KAAI,EAAE,WAAW,IAAI;EACnB,MAAM,UAAU,EAAE,MAAM,GAAG,GAAG;AAC9B,MAAI,CAAC,eAAe,IAAI,QAAQ,CAC9B,QAAO,IACL,qBACA,4CACD;AAEH,MAAI,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,CACxB,QAAO,IACL,kBACA,qCACD;;AAIL,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG;AAE5F,KAAI,EAAE,WAAW,EACf,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;AAExD,QAAO;;;AAIT,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,EAAE;CAC/B,MAAM,KAAK,aAAa,UAAU,IAAI;AACtC,QAAO,UAAU,QAAQ,KAAK,MAAM,GAAG;;;AAIzC,MAAM,KAAgB;CACpB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,aAAa,kBAAkB;CAC1C;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"bn.js","names":[],"sources":["../../src/ca/bn.ts"],"sourcesContent":["/**\n * BN (Canadian Business Number).\n *\n * 9-digit BN root (Luhn checksum) optionally\n * followed by a 2-letter program type (RC, RM,\n * RP, RT) and a 4-digit reference number (BN15).\n *\n * @see https://www.canada.ca/en/services/taxes/business-number.html\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport {\n luhnValidate,\n luhnChecksum,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst VALID_PROGRAMS = new Set([\"RC\", \"RM\", \"RP\", \"RT\"]);\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9 && v.length !== 15) {\n return err(\n \"INVALID_LENGTH\",\n \"BN must be 9 or 15 characters\",\n );\n }\n if (!isdigits(v.slice(0, 9))) {\n return err(\n \"INVALID_FORMAT\",\n \"BN root must contain only digits\",\n );\n }\n if (!luhnValidate(v.slice(0, 9))) {\n return err(\n \"INVALID_CHECKSUM\",\n \"BN Luhn check digit mismatch\",\n );\n }\n if (v.length === 15) {\n const program = v.slice(9, 11);\n if (!VALID_PROGRAMS.has(program)) {\n return err(\n \"INVALID_COMPONENT\",\n \"BN program type must be RC, RM, RP, or RT\",\n );\n }\n if (!isdigits(v.slice(11))) {\n return err(\n \"INVALID_FORMAT\",\n \"BN reference number must be digits\",\n );\n }\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 15) {\n return `${v.slice(0, 3)} ${v.slice(3, 6)} ${v.slice(6, 9)} ${v.slice(9, 11)} ${v.slice(11)}`;\n }\n if (v.length === 9) {\n return `${v.slice(0, 3)} ${v.slice(3, 6)} ${v.slice(6)}`;\n }\n return v;\n};\n\n/** Generate a random valid Canadian BN. */\nconst generate = (): string => {\n const payload = randomDigits(8);\n const cs = luhnChecksum(payload + \"0\");\n return payload + String((10 - cs) % 10);\n};\n\n/** Canadian Business Number. */\nconst bn: CountryValidator<\"CA\"> = {\n name: \"Business Number\",\n localName: \"Business Number\",\n abbreviation: \"BN\",\n aliases: [\n \"BN\",\n \"Business Number\",\n \"numéro d'entreprise\",\n ] as const,\n candidatePattern: \"\\\\d{9}\\\\s?[A-Z]{2}\\\\s?\\\\d{4}\",\n scope: \"country\",\n country: \"CA\",\n entityType: \"company\",\n sourceUrl:\n \"https://www.canada.ca/en/services/taxes/business-number.html\",\n examples: [\"123026635\", \"123026635RC0001\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default bn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAwBA,MAAM,iBAAiB,IAAI,IAAI;CAAC;CAAM;CAAM;CAAM;AAAI,CAAC;AAEvD,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,IACjC,OAAO,IACL,kBACA,+BACF;CAEF,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,GACzB,OAAO,IACL,kBACA,kCACF;CAEF,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,CAAC,CAAC,GAC7B,OAAO,IACL,oBACA,8BACF;CAEF,IAAI,EAAE,WAAW,IAAI;EACnB,MAAM,UAAU,EAAE,MAAM,GAAG,EAAE;EAC7B,IAAI,CAAC,eAAe,IAAI,OAAO,GAC7B,OAAO,IACL,qBACA,2CACF;EAEF,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,GACvB,OAAO,IACL,kBACA,oCACF;CAEJ;CAEA,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;CAE3F,IAAI,EAAE,WAAW,GACf,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;CAEvD,OAAO;AACT;;AAGA,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,CAAC;CAC9B,MAAM,KAAK,aAAa,UAAU,GAAG;CACrC,OAAO,UAAU,QAAQ,KAAK,MAAM,EAAE;AACxC;;AAGA,MAAM,KAA6B;CACjC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,aAAa,iBAAiB;CACzC;CACA;CACA;CACA;AACF"}
package/dist/ca/sin.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/ca/sin.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Canadian SIN. */
8
8
  declare const generate: () => string;
9
9
  /** Canadian Social Insurance Number. */
10
- declare const sin: Validator;
10
+ declare const sin: CountryValidator<"CA">;
11
11
  //#endregion
12
12
  export { compact, sin as default, format, generate, validate };
13
13
  //# sourceMappingURL=sin.d.ts.map
package/dist/ca/sin.js CHANGED
@@ -1,18 +1,9 @@
1
+ import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
1
2
  import { clean } from "../_util/clean.js";
2
3
  import { randomDigits, randomInt } from "../_util/generate.js";
3
4
  import { err } from "../_util/result.js";
4
- import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
5
5
  import { isdigits } from "../_util/strings.js";
6
6
  //#region src/ca/sin.ts
7
- /**
8
- * SIN (Canadian Social Insurance Number).
9
- *
10
- * 9-digit identifier with Luhn checksum. First
11
- * digit cannot be 0 or 8.
12
- *
13
- * @see https://www.canada.ca/en/employment-social-development/services/sin.html
14
- * @see https://en.wikipedia.org/wiki/Social_Insurance_Number
15
- */
16
7
  const compact = (value) => clean(value, " -");
17
8
  const validate = (value) => {
18
9
  const v = compact(value);
@@ -47,6 +38,7 @@ const sin = {
47
38
  "NAS"
48
39
  ],
49
40
  candidatePattern: "\\d{3}-?\\d{3}-?\\d{3}",
41
+ scope: "country",
50
42
  country: "CA",
51
43
  entityType: "person",
52
44
  sourceUrl: "https://www.canada.ca/en/employment-social-development/services/sin.html",
@@ -1 +1 @@
1
- {"version":3,"file":"sin.js","names":[],"sources":["../../src/ca/sin.ts"],"sourcesContent":["/**\n * SIN (Canadian Social Insurance Number).\n *\n * 9-digit identifier with Luhn checksum. First\n * digit cannot be 0 or 8.\n *\n * @see https://www.canada.ca/en/employment-social-development/services/sin.html\n * @see https://en.wikipedia.org/wiki/Social_Insurance_Number\n */\n\nimport {\n luhnValidate,\n luhnChecksum,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"SIN must contain only digits\",\n );\n }\n if (v.length !== 9) {\n return err(\"INVALID_LENGTH\", \"SIN must be 9 digits\");\n }\n if (v[0] === \"0\" || v[0] === \"8\") {\n return err(\n \"INVALID_COMPONENT\",\n \"SIN cannot start with 0 or 8\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"SIN Luhn check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 9) {\n return `${v.slice(0, 3)}-${v.slice(3, 6)}-${v.slice(6)}`;\n }\n return v;\n};\n\n/** Generate a random valid Canadian SIN. */\nconst generate = (): string => {\n const first = String(randomInt(1, 7));\n const payload = first + randomDigits(7);\n const cs = luhnChecksum(payload + \"0\");\n return payload + String((10 - cs) % 10);\n};\n\n/** Canadian Social Insurance Number. */\nconst sin: Validator = {\n name: \"Social Insurance Number\",\n localName: \"Social Insurance Number\",\n abbreviation: \"SIN\",\n aliases: [\n \"SIN\",\n \"Social Insurance Number\",\n \"NAS\",\n ] as const,\n candidatePattern: \"\\\\d{3}-?\\\\d{3}-?\\\\d{3}\",\n country: \"CA\",\n entityType: \"person\",\n sourceUrl:\n \"https://www.canada.ca/en/employment-social-development/services/sin.html\",\n examples: [\"123456782\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default sin;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAqBA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,+BACD;AAEH,KAAI,EAAE,WAAW,EACf,QAAO,IAAI,kBAAkB,uBAAuB;AAEtD,KAAI,EAAE,OAAO,OAAO,EAAE,OAAO,IAC3B,QAAO,IACL,qBACA,+BACD;AAEH,KAAI,CAAC,aAAa,EAAE,CAClB,QAAO,IACL,oBACA,gCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EACf,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;AAExD,QAAO;;;AAIT,MAAM,iBAAyB;CAE7B,MAAM,UADQ,OAAO,UAAU,GAAG,EAAE,CAAC,GACb,aAAa,EAAE;CACvC,MAAM,KAAK,aAAa,UAAU,IAAI;AACtC,QAAO,UAAU,QAAQ,KAAK,MAAM,GAAG;;;AAIzC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,YAAY;CACvB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"sin.js","names":[],"sources":["../../src/ca/sin.ts"],"sourcesContent":["/**\n * SIN (Canadian Social Insurance Number).\n *\n * 9-digit identifier with Luhn checksum. First\n * digit cannot be 0 or 8.\n *\n * @see https://www.canada.ca/en/employment-social-development/services/sin.html\n * @see https://en.wikipedia.org/wiki/Social_Insurance_Number\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport {\n luhnValidate,\n luhnChecksum,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"SIN must contain only digits\",\n );\n }\n if (v.length !== 9) {\n return err(\"INVALID_LENGTH\", \"SIN must be 9 digits\");\n }\n if (v[0] === \"0\" || v[0] === \"8\") {\n return err(\n \"INVALID_COMPONENT\",\n \"SIN cannot start with 0 or 8\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"SIN Luhn check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 9) {\n return `${v.slice(0, 3)}-${v.slice(3, 6)}-${v.slice(6)}`;\n }\n return v;\n};\n\n/** Generate a random valid Canadian SIN. */\nconst generate = (): string => {\n const first = String(randomInt(1, 7));\n const payload = first + randomDigits(7);\n const cs = luhnChecksum(payload + \"0\");\n return payload + String((10 - cs) % 10);\n};\n\n/** Canadian Social Insurance Number. */\nconst sin: CountryValidator<\"CA\"> = {\n name: \"Social Insurance Number\",\n localName: \"Social Insurance Number\",\n abbreviation: \"SIN\",\n aliases: [\n \"SIN\",\n \"Social Insurance Number\",\n \"NAS\",\n ] as const,\n candidatePattern: \"\\\\d{3}-?\\\\d{3}-?\\\\d{3}\",\n scope: \"country\",\n country: \"CA\",\n entityType: \"person\",\n sourceUrl:\n \"https://www.canada.ca/en/employment-social-development/services/sin.html\",\n examples: [\"123456782\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default sin;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAwBA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAEF,IAAI,EAAE,WAAW,GACf,OAAO,IAAI,kBAAkB,sBAAsB;CAErD,IAAI,EAAE,OAAO,OAAO,EAAE,OAAO,KAC3B,OAAO,IACL,qBACA,8BACF;CAEF,IAAI,CAAC,aAAa,CAAC,GACjB,OAAO,IACL,oBACA,+BACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;CAEvD,OAAO;AACT;;AAGA,MAAM,iBAAyB;CAE7B,MAAM,UADQ,OAAO,UAAU,GAAG,CAAC,CACf,IAAI,aAAa,CAAC;CACtC,MAAM,KAAK,aAAa,UAAU,GAAG;CACrC,OAAO,UAAU,QAAQ,KAAK,MAAM,EAAE;AACxC;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;AACF"}
package/dist/ch/ssn.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/ch/ssn.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Swiss SSN. */
8
8
  declare const generate: () => string;
9
9
  /** Swiss Social Security Number. */
10
- declare const ssn: Validator;
10
+ declare const ssn: CountryValidator<"CH">;
11
11
  //#endregion
12
12
  export { compact, ssn as default, format, generate, validate };
13
13
  //# sourceMappingURL=ssn.d.ts.map
package/dist/ch/ssn.js CHANGED
@@ -3,15 +3,6 @@ import { randomDigits } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/ch/ssn.ts
6
- /**
7
- * Swiss Social Security Number (AHV/AVS).
8
- *
9
- * 13 digits starting with 756. Uses EAN-13 checksum:
10
- * alternating weights (1, 3) from left, check digit
11
- * is (10 - sum % 10) % 10.
12
- *
13
- * @see https://www.bsv.admin.ch/
14
- */
15
6
  const compact = (value) => clean(value, " -.");
16
7
  const validate = (value) => {
17
8
  const v = compact(value);
@@ -52,6 +43,7 @@ const ssn = {
52
43
  "AHV"
53
44
  ],
54
45
  candidatePattern: "756\\.?\\d{4}\\.?\\d{4}\\.?\\d{2}",
46
+ scope: "country",
55
47
  country: "CH",
56
48
  entityType: "person",
57
49
  sourceUrl: "https://www.bsv.admin.ch/",
@@ -1 +1 @@
1
- {"version":3,"file":"ssn.js","names":[],"sources":["../../src/ch/ssn.ts"],"sourcesContent":["/**\n * Swiss Social Security Number (AHV/AVS).\n *\n * 13 digits starting with 756. Uses EAN-13 checksum:\n * alternating weights (1, 3) from left, check digit\n * is (10 - sum % 10) % 10.\n *\n * @see https://www.bsv.admin.ch/\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst compact = (value: string): string =>\n clean(value, \" -.\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 13) {\n return err(\n \"INVALID_LENGTH\",\n \"Swiss SSN must be 13 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Swiss SSN must contain only digits\",\n );\n }\n if (!v.startsWith(\"756\")) {\n return err(\n \"INVALID_COMPONENT\",\n \"Swiss SSN must start with 756\",\n );\n }\n\n let sum = 0;\n for (let i = 0; i < 12; i++) {\n const weight = i % 2 === 0 ? 1 : 3;\n sum += Number(v[i]) * weight;\n }\n const check = (10 - (sum % 10)) % 10;\n if (check !== Number(v[12])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Swiss SSN check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 3)}.${v.slice(3, 7)}.${v.slice(7, 11)}.${v.slice(11)}`;\n};\n\n/** Generate a random valid Swiss SSN. */\nconst generate = (): string => {\n const payload = \"756\" + randomDigits(9);\n let sum = 0;\n for (let i = 0; i < 12; i++)\n sum += Number(payload[i]) * (i % 2 === 0 ? 1 : 3);\n return payload + String((10 - (sum % 10)) % 10);\n};\n\n/** Swiss Social Security Number. */\nconst ssn: Validator = {\n name: \"Swiss Social Security Number\",\n localName: \"AHV-Versichertennummer\",\n abbreviation: \"AHV\",\n aliases: [\n \"AHV-Nummer\",\n \"numéro AVS\",\n \"AVS\",\n \"AHV\",\n ] as const,\n candidatePattern: \"756\\\\.?\\\\d{4}\\\\.?\\\\d{4}\\\\.?\\\\d{2}\",\n country: \"CH\",\n entityType: \"person\",\n sourceUrl: \"https://www.bsv.admin.ch/\",\n examples: [\"7561234567897\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default ssn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;AAiBA,MAAM,WAAW,UACf,MAAM,OAAO,MAAM;AAErB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,8BACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,qCACD;AAEH,KAAI,CAAC,EAAE,WAAW,MAAM,CACtB,QAAO,IACL,qBACA,gCACD;CAGH,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;EAC3B,MAAM,SAAS,IAAI,MAAM,IAAI,IAAI;AACjC,SAAO,OAAO,EAAE,GAAG,GAAG;;AAGxB,MADe,KAAM,MAAM,MAAO,OACpB,OAAO,EAAE,IAAI,CACzB,QAAO,IACL,oBACA,iCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG;;;AAI3E,MAAM,iBAAyB;CAC7B,MAAM,UAAU,QAAQ,aAAa,EAAE;CACvC,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IACtB,QAAO,OAAO,QAAQ,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI;AACjD,QAAO,UAAU,QAAQ,KAAM,MAAM,MAAO,GAAG;;;AAIjD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,gBAAgB;CAC3B;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"ssn.js","names":[],"sources":["../../src/ch/ssn.ts"],"sourcesContent":["/**\n * Swiss Social Security Number (AHV/AVS).\n *\n * 13 digits starting with 756. Uses EAN-13 checksum:\n * alternating weights (1, 3) from left, check digit\n * is (10 - sum % 10) % 10.\n *\n * @see https://www.bsv.admin.ch/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" -.\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 13) {\n return err(\n \"INVALID_LENGTH\",\n \"Swiss SSN must be 13 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Swiss SSN must contain only digits\",\n );\n }\n if (!v.startsWith(\"756\")) {\n return err(\n \"INVALID_COMPONENT\",\n \"Swiss SSN must start with 756\",\n );\n }\n\n let sum = 0;\n for (let i = 0; i < 12; i++) {\n const weight = i % 2 === 0 ? 1 : 3;\n sum += Number(v[i]) * weight;\n }\n const check = (10 - (sum % 10)) % 10;\n if (check !== Number(v[12])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Swiss SSN check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 3)}.${v.slice(3, 7)}.${v.slice(7, 11)}.${v.slice(11)}`;\n};\n\n/** Generate a random valid Swiss SSN. */\nconst generate = (): string => {\n const payload = \"756\" + randomDigits(9);\n let sum = 0;\n for (let i = 0; i < 12; i++)\n sum += Number(payload[i]) * (i % 2 === 0 ? 1 : 3);\n return payload + String((10 - (sum % 10)) % 10);\n};\n\n/** Swiss Social Security Number. */\nconst ssn: CountryValidator<\"CH\"> = {\n name: \"Swiss Social Security Number\",\n localName: \"AHV-Versichertennummer\",\n abbreviation: \"AHV\",\n aliases: [\n \"AHV-Nummer\",\n \"numéro AVS\",\n \"AVS\",\n \"AHV\",\n ] as const,\n candidatePattern: \"756\\\\.?\\\\d{4}\\\\.?\\\\d{4}\\\\.?\\\\d{2}\",\n scope: \"country\",\n country: \"CH\",\n entityType: \"person\",\n sourceUrl: \"https://www.bsv.admin.ch/\",\n examples: [\"7561234567897\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default ssn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAoBA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,6BACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,oCACF;CAEF,IAAI,CAAC,EAAE,WAAW,KAAK,GACrB,OAAO,IACL,qBACA,+BACF;CAGF,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;EAC3B,MAAM,SAAS,IAAI,MAAM,IAAI,IAAI;EACjC,OAAO,OAAO,EAAE,EAAE,IAAI;CACxB;CAEA,KADe,KAAM,MAAM,MAAO,OACpB,OAAO,EAAE,GAAG,GACxB,OAAO,IACL,oBACA,gCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;AAC1E;;AAGA,MAAM,iBAAyB;CAC7B,MAAM,UAAU,QAAQ,aAAa,CAAC;CACtC,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KACtB,OAAO,OAAO,QAAQ,EAAE,KAAK,IAAI,MAAM,IAAI,IAAI;CACjD,OAAO,UAAU,QAAQ,KAAM,MAAM,MAAO,EAAE;AAChD;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,eAAe;CAC1B;CACA;CACA;CACA;AACF"}
package/dist/ch/uid.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/ch/uid.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Swiss UID. */
8
8
  declare const generate: () => string;
9
9
  /** Swiss Business Identification Number. */
10
- declare const uid: Validator;
10
+ declare const uid: CountryValidator<"CH">;
11
11
  //#endregion
12
12
  export { compact, uid as default, format, generate, validate };
13
13
  //# sourceMappingURL=uid.d.ts.map
package/dist/ch/uid.js CHANGED
@@ -3,15 +3,6 @@ import { randomDigits } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/ch/uid.ts
6
- /**
7
- * UID (Unternehmens-Identifikationsnummer).
8
- *
9
- * Swiss business identification number. 12 characters:
10
- * "CHE" prefix + 9 digits. Check digit uses weights
11
- * [5,4,3,2,7,6,5,4] on the first 8 digits.
12
- *
13
- * @see https://www.uid.admin.ch/
14
- */
15
6
  const WEIGHTS = [
16
7
  5,
17
8
  4,
@@ -66,6 +57,7 @@ const uid = {
66
57
  "IDE"
67
58
  ],
68
59
  candidatePattern: "CHE-?\\d{3}\\.?\\d{3}\\.?\\d{3}",
60
+ scope: "country",
69
61
  country: "CH",
70
62
  entityType: "company",
71
63
  sourceUrl: "https://www.uid.admin.ch/",
@@ -1 +1 @@
1
- {"version":3,"file":"uid.js","names":[],"sources":["../../src/ch/uid.ts"],"sourcesContent":["/**\n * UID (Unternehmens-Identifikationsnummer).\n *\n * Swiss business identification number. 12 characters:\n * \"CHE\" prefix + 9 digits. Check digit uses weights\n * [5,4,3,2,7,6,5,4] on the first 8 digits.\n *\n * @see https://www.uid.admin.ch/\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst WEIGHTS = [5, 4, 3, 2, 7, 6, 5, 4] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -./\").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"Swiss UID must be CHE + 9 digits\",\n );\n }\n if (!v.startsWith(\"CHE\")) {\n return err(\n \"INVALID_COMPONENT\",\n \"Swiss UID must start with CHE\",\n );\n }\n const digits = v.slice(3);\n if (!isdigits(digits)) {\n return err(\n \"INVALID_FORMAT\",\n \"Swiss UID must be CHE + 9 digits\",\n );\n }\n\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n sum += Number(digits.charAt(i)) * (WEIGHTS[i] ?? 0);\n }\n const check = (11 - (sum % 11)) % 11;\n if (check === 10) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Swiss UID check digit is invalid\",\n );\n }\n if (check !== Number(digits[8])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Swiss UID check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n const d = v.slice(3);\n return `CHE-${d.slice(0, 3)}.${d.slice(3, 6)}.${d.slice(6)}`;\n};\n\n/** Generate a random valid Swiss UID. */\nconst generate = (): string => {\n for (let i = 0; i < 100; i++) {\n const payload = randomDigits(8);\n let sum = 0;\n for (let j = 0; j < 8; j++)\n sum += Number(payload.charAt(j)) * (WEIGHTS[j] ?? 0);\n const check = (11 - (sum % 11)) % 11;\n if (check === 10) continue;\n return \"CHE\" + payload + String(check);\n }\n throw new Error(\"Failed to generate valid Swiss UID\");\n};\n\n/** Swiss Business Identification Number. */\nconst uid: Validator = {\n name: \"Swiss Business ID\",\n localName: \"Unternehmens-Identifikationsnummer\",\n abbreviation: \"UID\",\n aliases: [\n \"Unternehmens-Identifikationsnummer\",\n \"UID\",\n \"IDE\",\n ] as const,\n candidatePattern: \"CHE-?\\\\d{3}\\\\.?\\\\d{3}\\\\.?\\\\d{3}\",\n country: \"CH\",\n entityType: \"company\",\n sourceUrl: \"https://www.uid.admin.ch/\",\n examples: [\"CHE100155212\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default uid;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;AAiBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAExC,MAAM,WAAW,UACf,MAAM,OAAO,OAAO,CAAC,aAAa;AAEpC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,mCACD;AAEH,KAAI,CAAC,EAAE,WAAW,MAAM,CACtB,QAAO,IACL,qBACA,gCACD;CAEH,MAAM,SAAS,EAAE,MAAM,EAAE;AACzB,KAAI,CAAC,SAAS,OAAO,CACnB,QAAO,IACL,kBACA,mCACD;CAGH,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,QAAO,OAAO,OAAO,OAAO,EAAE,CAAC,IAAI,QAAQ,MAAM;CAEnD,MAAM,SAAS,KAAM,MAAM,MAAO;AAClC,KAAI,UAAU,GACZ,QAAO,IACL,oBACA,mCACD;AAEH,KAAI,UAAU,OAAO,OAAO,GAAG,CAC7B,QAAO,IACL,oBACA,iCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CAExC,MAAM,IADI,QAAQ,MAAM,CACZ,MAAM,EAAE;AACpB,QAAO,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;;;AAI5D,MAAM,iBAAyB;AAC7B,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;EAC5B,MAAM,UAAU,aAAa,EAAE;EAC/B,IAAI,MAAM;AACV,OAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,QAAO,OAAO,QAAQ,OAAO,EAAE,CAAC,IAAI,QAAQ,MAAM;EACpD,MAAM,SAAS,KAAM,MAAM,MAAO;AAClC,MAAI,UAAU,GAAI;AAClB,SAAO,QAAQ,UAAU,OAAO,MAAM;;AAExC,OAAM,IAAI,MAAM,qCAAqC;;;AAIvD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,eAAe;CAC1B;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"uid.js","names":[],"sources":["../../src/ch/uid.ts"],"sourcesContent":["/**\n * UID (Unternehmens-Identifikationsnummer).\n *\n * Swiss business identification number. 12 characters:\n * \"CHE\" prefix + 9 digits. Check digit uses weights\n * [5,4,3,2,7,6,5,4] on the first 8 digits.\n *\n * @see https://www.uid.admin.ch/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS = [5, 4, 3, 2, 7, 6, 5, 4] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -./\").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"Swiss UID must be CHE + 9 digits\",\n );\n }\n if (!v.startsWith(\"CHE\")) {\n return err(\n \"INVALID_COMPONENT\",\n \"Swiss UID must start with CHE\",\n );\n }\n const digits = v.slice(3);\n if (!isdigits(digits)) {\n return err(\n \"INVALID_FORMAT\",\n \"Swiss UID must be CHE + 9 digits\",\n );\n }\n\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n sum += Number(digits.charAt(i)) * (WEIGHTS[i] ?? 0);\n }\n const check = (11 - (sum % 11)) % 11;\n if (check === 10) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Swiss UID check digit is invalid\",\n );\n }\n if (check !== Number(digits[8])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Swiss UID check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n const d = v.slice(3);\n return `CHE-${d.slice(0, 3)}.${d.slice(3, 6)}.${d.slice(6)}`;\n};\n\n/** Generate a random valid Swiss UID. */\nconst generate = (): string => {\n for (let i = 0; i < 100; i++) {\n const payload = randomDigits(8);\n let sum = 0;\n for (let j = 0; j < 8; j++)\n sum += Number(payload.charAt(j)) * (WEIGHTS[j] ?? 0);\n const check = (11 - (sum % 11)) % 11;\n if (check === 10) continue;\n return \"CHE\" + payload + String(check);\n }\n throw new Error(\"Failed to generate valid Swiss UID\");\n};\n\n/** Swiss Business Identification Number. */\nconst uid: CountryValidator<\"CH\"> = {\n name: \"Swiss Business ID\",\n localName: \"Unternehmens-Identifikationsnummer\",\n abbreviation: \"UID\",\n aliases: [\n \"Unternehmens-Identifikationsnummer\",\n \"UID\",\n \"IDE\",\n ] as const,\n candidatePattern: \"CHE-?\\\\d{3}\\\\.?\\\\d{3}\\\\.?\\\\d{3}\",\n scope: \"country\",\n country: \"CH\",\n entityType: \"company\",\n sourceUrl: \"https://www.uid.admin.ch/\",\n examples: [\"CHE100155212\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default uid;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAoBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAEvC,MAAM,WAAW,UACf,MAAM,OAAO,MAAM,EAAE,YAAY;AAEnC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,kCACF;CAEF,IAAI,CAAC,EAAE,WAAW,KAAK,GACrB,OAAO,IACL,qBACA,+BACF;CAEF,MAAM,SAAS,EAAE,MAAM,CAAC;CACxB,IAAI,CAAC,SAAS,MAAM,GAClB,OAAO,IACL,kBACA,kCACF;CAGF,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,OAAO,OAAO,OAAO,OAAO,CAAC,CAAC,KAAK,QAAQ,MAAM;CAEnD,MAAM,SAAS,KAAM,MAAM,MAAO;CAClC,IAAI,UAAU,IACZ,OAAO,IACL,oBACA,kCACF;CAEF,IAAI,UAAU,OAAO,OAAO,EAAE,GAC5B,OAAO,IACL,oBACA,gCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CAExC,MAAM,IADI,QAAQ,KACR,EAAE,MAAM,CAAC;CACnB,OAAO,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;AAC3D;;AAGA,MAAM,iBAAyB;CAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;EAC5B,MAAM,UAAU,aAAa,CAAC;EAC9B,IAAI,MAAM;EACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,OAAO,OAAO,QAAQ,OAAO,CAAC,CAAC,KAAK,QAAQ,MAAM;EACpD,MAAM,SAAS,KAAM,MAAM,MAAO;EAClC,IAAI,UAAU,IAAI;EAClB,OAAO,QAAQ,UAAU,OAAO,KAAK;CACvC;CACA,MAAM,IAAI,MAAM,oCAAoC;AACtD;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,cAAc;CACzB;CACA;CACA;CACA;AACF"}
package/dist/ch/vat.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/ch/vat.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Swiss VAT number. */
8
8
  declare const generate: () => string;
9
9
  /** Swiss VAT Number. */
10
- declare const vat: Validator;
10
+ declare const vat: CountryValidator<"CH">;
11
11
  //#endregion
12
12
  export { compact, vat as default, format, generate, validate };
13
13
  //# sourceMappingURL=vat.d.ts.map
package/dist/ch/vat.js CHANGED
@@ -2,15 +2,6 @@ import { clean } from "../_util/clean.js";
2
2
  import { err } from "../_util/result.js";
3
3
  import { generate as generate$1, validate as validate$1 } from "./uid.js";
4
4
  //#region src/ch/vat.ts
5
- /**
6
- * Swiss VAT number.
7
- *
8
- * Format: CHE + 9 digits + suffix (MWST|TVA|IVA|TPV).
9
- * The numeric part is validated as a UID.
10
- *
11
- * @see https://www.ch.ch/en/value-added-tax-number-und-business-identification-number/
12
- * @see https://www.estv.admin.ch/
13
- */
14
5
  const SUFFIXES = [
15
6
  "MWST",
16
7
  "TVA",
@@ -55,6 +46,7 @@ const vat = {
55
46
  "IVA"
56
47
  ],
57
48
  candidatePattern: "CHE-?\\d{3}\\.?\\d{3}\\.?\\d{3}\\s?(?:MWST|TVA|IVA)",
49
+ scope: "country",
58
50
  country: "CH",
59
51
  entityType: "company",
60
52
  sourceUrl: "https://www.estv.admin.ch/",
@@ -1 +1 @@
1
- {"version":3,"file":"vat.js","names":["validateUid","generateUid"],"sources":["../../src/ch/vat.ts"],"sourcesContent":["/**\n * Swiss VAT number.\n *\n * Format: CHE + 9 digits + suffix (MWST|TVA|IVA|TPV).\n * The numeric part is validated as a UID.\n *\n * @see https://www.ch.ch/en/value-added-tax-number-und-business-identification-number/\n * @see https://www.estv.admin.ch/\n */\n\nimport { clean } from \"#util/clean\";\nimport { err } from \"#util/result\";\n\nimport type { ValidateResult, Validator } from \"../types\";\nimport {\n validate as validateUid,\n generate as generateUid,\n} from \"./uid\";\n\nconst SUFFIXES = [\"MWST\", \"TVA\", \"IVA\", \"TPV\"] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -./\").toUpperCase();\n\nconst extractParts = (\n v: string,\n): { uid: string; suffix: string } | undefined => {\n for (const s of SUFFIXES) {\n if (v.endsWith(s)) {\n return { uid: v.slice(0, -s.length), suffix: s };\n }\n }\n return undefined;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n const parts = extractParts(v);\n if (!parts) {\n return err(\n \"INVALID_FORMAT\",\n \"Swiss VAT must end with MWST, TVA, IVA, or TPV\",\n );\n }\n\n const uidResult = validateUid(parts.uid);\n if (!uidResult.valid) {\n return uidResult;\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n const parts = extractParts(v);\n if (!parts) return v;\n const d = parts.uid.slice(3);\n return `CHE-${d.slice(0, 3)}.${d.slice(3, 6)}.${d.slice(6)} ${parts.suffix}`;\n};\n\n/** Generate a random valid Swiss VAT number. */\nconst generate = (): string => generateUid() + \"MWST\";\n\n/** Swiss VAT Number. */\nconst vat: Validator = {\n name: \"Swiss VAT Number\",\n localName: \"Mehrwertsteuernummer\",\n abbreviation: \"MWST\",\n aliases: [\"MWST\", \"TVA\", \"IVA\"] as const,\n candidatePattern:\n \"CHE-?\\\\d{3}\\\\.?\\\\d{3}\\\\.?\\\\d{3}\\\\s?(?:MWST|TVA|IVA)\",\n country: \"CH\",\n entityType: \"company\",\n sourceUrl: \"https://www.estv.admin.ch/\",\n examples: [\"CHE107787577IVA\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;AAmBA,MAAM,WAAW;CAAC;CAAQ;CAAO;CAAO;CAAM;AAE9C,MAAM,WAAW,UACf,MAAM,OAAO,OAAO,CAAC,aAAa;AAEpC,MAAM,gBACJ,MACgD;AAChD,MAAK,MAAM,KAAK,SACd,KAAI,EAAE,SAAS,EAAE,CACf,QAAO;EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,OAAO;EAAE,QAAQ;EAAG;;AAMtD,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;CAExB,MAAM,QAAQ,aAAa,EAAE;AAC7B,KAAI,CAAC,MACH,QAAO,IACL,kBACA,iDACD;CAGH,MAAM,YAAYA,WAAY,MAAM,IAAI;AACxC,KAAI,CAAC,UAAU,MACb,QAAO;AAGT,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;CACxB,MAAM,QAAQ,aAAa,EAAE;AAC7B,KAAI,CAAC,MAAO,QAAO;CACnB,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE;AAC5B,QAAO,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM;;;AAItE,MAAM,iBAAyBC,YAAa,GAAG;;AAG/C,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAQ;EAAO;EAAM;CAC/B,kBACE;CACF,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,kBAAkB;CAC7B;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"vat.js","names":["validateUid","generateUid"],"sources":["../../src/ch/vat.ts"],"sourcesContent":["/**\n * Swiss VAT number.\n *\n * Format: CHE + 9 digits + suffix (MWST|TVA|IVA|TPV).\n * The numeric part is validated as a UID.\n *\n * @see https://www.ch.ch/en/value-added-tax-number-und-business-identification-number/\n * @see https://www.estv.admin.ch/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\nimport {\n validate as validateUid,\n generate as generateUid,\n} from \"./uid\";\n\nimport { clean } from \"#util/clean\";\nimport { err } from \"#util/result\";\n\nconst SUFFIXES = [\"MWST\", \"TVA\", \"IVA\", \"TPV\"] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -./\").toUpperCase();\n\nconst extractParts = (\n v: string,\n): { uid: string; suffix: string } | undefined => {\n for (const s of SUFFIXES) {\n if (v.endsWith(s)) {\n return { uid: v.slice(0, -s.length), suffix: s };\n }\n }\n return undefined;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n const parts = extractParts(v);\n if (!parts) {\n return err(\n \"INVALID_FORMAT\",\n \"Swiss VAT must end with MWST, TVA, IVA, or TPV\",\n );\n }\n\n const uidResult = validateUid(parts.uid);\n if (!uidResult.valid) {\n return uidResult;\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n const parts = extractParts(v);\n if (!parts) return v;\n const d = parts.uid.slice(3);\n return `CHE-${d.slice(0, 3)}.${d.slice(3, 6)}.${d.slice(6)} ${parts.suffix}`;\n};\n\n/** Generate a random valid Swiss VAT number. */\nconst generate = (): string => generateUid() + \"MWST\";\n\n/** Swiss VAT Number. */\nconst vat: CountryValidator<\"CH\"> = {\n name: \"Swiss VAT Number\",\n localName: \"Mehrwertsteuernummer\",\n abbreviation: \"MWST\",\n aliases: [\"MWST\", \"TVA\", \"IVA\"] as const,\n candidatePattern:\n \"CHE-?\\\\d{3}\\\\.?\\\\d{3}\\\\.?\\\\d{3}\\\\s?(?:MWST|TVA|IVA)\",\n scope: \"country\",\n country: \"CH\",\n entityType: \"company\",\n sourceUrl: \"https://www.estv.admin.ch/\",\n examples: [\"CHE107787577IVA\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;AAsBA,MAAM,WAAW;CAAC;CAAQ;CAAO;CAAO;AAAK;AAE7C,MAAM,WAAW,UACf,MAAM,OAAO,MAAM,EAAE,YAAY;AAEnC,MAAM,gBACJ,MACgD;CAChD,KAAK,MAAM,KAAK,UACd,IAAI,EAAE,SAAS,CAAC,GACd,OAAO;EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM;EAAG,QAAQ;CAAE;AAIrD;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,MAAM,QAAQ,aAAa,CAAC;CAC5B,IAAI,CAAC,OACH,OAAO,IACL,kBACA,gDACF;CAGF,MAAM,YAAYA,WAAY,MAAM,GAAG;CACvC,IAAI,CAAC,UAAU,OACb,OAAO;CAGT,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,MAAM,QAAQ,aAAa,CAAC;CAC5B,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC;CAC3B,OAAO,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM;AACtE;;AAGA,MAAM,iBAAyBC,WAAY,IAAI;;AAG/C,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAQ;EAAO;CAAK;CAC9B,kBACE;CACF,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,iBAAiB;CAC5B;CACA;CACA;CACA;AACF"}
package/dist/cl/rut.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/cl/rut.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -12,7 +12,7 @@ declare const generate: () => string;
12
12
  * Examples sourced from python-stdnum test suite
13
13
  * (cl.rut module).
14
14
  */
15
- declare const rut: Validator;
15
+ declare const rut: CountryValidator<"CL">;
16
16
  //#endregion
17
17
  export { compact, rut as default, format, generate, validate };
18
18
  //# sourceMappingURL=rut.d.ts.map
package/dist/cl/rut.js CHANGED
@@ -2,20 +2,6 @@ import { clean } from "../_util/clean.js";
2
2
  import { randomDigits } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  //#region src/cl/rut.ts
5
- /**
6
- * RUT (Rol Único Tributario).
7
- *
8
- * Chilean tax identification number assigned by the SII
9
- * (Servicio de Impuestos Internos). The number consists
10
- * of 7 or 8 digits followed by a check digit (0-9 or K),
11
- * computed using a modulo 11 algorithm with weights
12
- * [2, 3, 4, 5, 6, 7] cycling right-to-left.
13
- *
14
- * Format: XX.XXX.XXX-C (7-8 digits + check digit).
15
- *
16
- * @see https://www.sii.cl/
17
- * @see https://en.wikipedia.org/wiki/Rol_%C3%9Anico_Tributario
18
- */
19
5
  const RUT_RE = /^\d{7,8}[\dK]$/;
20
6
  const compact = (value) => {
21
7
  let v = clean(value, " -.").trim().toUpperCase();
@@ -79,6 +65,7 @@ const rut = {
79
65
  abbreviation: "RUT",
80
66
  aliases: ["RUT", "Rol Único Tributario"],
81
67
  candidatePattern: "\\d{1,2}\\.?\\d{3}\\.?\\d{3}-?[\\dkK]",
68
+ scope: "country",
82
69
  country: "CL",
83
70
  entityType: "any",
84
71
  compact,
@@ -1 +1 @@
1
- {"version":3,"file":"rut.js","names":[],"sources":["../../src/cl/rut.ts"],"sourcesContent":["/**\n * RUT (Rol Único Tributario).\n *\n * Chilean tax identification number assigned by the SII\n * (Servicio de Impuestos Internos). The number consists\n * of 7 or 8 digits followed by a check digit (0-9 or K),\n * computed using a modulo 11 algorithm with weights\n * [2, 3, 4, 5, 6, 7] cycling right-to-left.\n *\n * Format: XX.XXX.XXX-C (7-8 digits + check digit).\n *\n * @see https://www.sii.cl/\n * @see https://en.wikipedia.org/wiki/Rol_%C3%9Anico_Tributario\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst RUT_RE = /^\\d{7,8}[\\dK]$/;\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -.\").trim().toUpperCase();\n if (v.startsWith(\"CL\")) v = v.slice(2);\n return v;\n};\n\n/**\n * Compute the RUT check digit using mod 11 with\n * weights [2, 3, 4, 5, 6, 7] cycling right-to-left.\n *\n * remainder = 11 - (weighted sum % 11)\n * 11 -> \"0\", 10 -> \"K\", else the digit as string.\n */\nconst calcCheckDigit = (body: string): string => {\n const weights = [2, 3, 4, 5, 6, 7] as const;\n let sum = 0;\n for (let i = body.length - 1, w = 0; i >= 0; i--, w++) {\n // SAFETY: w % weights.length is a valid index.\n // eslint-disable-next-line no-non-null-assertion\n sum += Number(body[i]) * weights[w % weights.length]!;\n }\n const remainder = 11 - (sum % 11);\n if (remainder === 11) return \"0\";\n if (remainder === 10) return \"K\";\n return String(remainder);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 8 && v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"RUT must be 8 or 9 characters\",\n );\n }\n\n if (!RUT_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"RUT must contain only digits and optionally K\",\n );\n }\n\n const body = v.slice(0, -1);\n const expected = calcCheckDigit(body);\n if (v.at(-1) !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"RUT check digit does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n const check = v.at(-1);\n const body = v.slice(0, -1);\n return (\n `${body.slice(0, -6)}.${body.slice(-6, -3)}` +\n `.${body.slice(-3)}-${check}`\n );\n};\n\n/** Generate a random valid Chilean RUT. */\nconst generate = (): string => {\n const body = randomDigits(8);\n return body + calcCheckDigit(body);\n};\n\n/**\n * Chilean RUT (tax identification number).\n *\n * Examples sourced from python-stdnum test suite\n * (cl.rut module).\n */\nconst rut: Validator = {\n name: \"Chilean Tax ID\",\n localName: \"Rol Único Tributario\",\n abbreviation: \"RUT\",\n aliases: [\"RUT\", \"Rol Único Tributario\"] as const,\n candidatePattern: \"\\\\d{1,2}\\\\.?\\\\d{3}\\\\.?\\\\d{3}-?[\\\\dkK]\",\n country: \"CL\",\n entityType: \"any\",\n compact,\n format,\n validate,\n sourceUrl: \"https://www.sii.cl/\",\n lengths: [8, 9] as const,\n examples: [\"760864285\", \"125319092\"] as const,\n generate,\n};\n\nexport default rut;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAqBA,MAAM,SAAS;AAEf,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa;AAChD,KAAI,EAAE,WAAW,KAAK,CAAE,KAAI,EAAE,MAAM,EAAE;AACtC,QAAO;;;;;;;;;AAUT,MAAM,kBAAkB,SAAyB;CAC/C,MAAM,UAAU;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAClC,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,KAAK,SAAS,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,IAGhD,QAAO,OAAO,KAAK,GAAG,GAAG,QAAQ,IAAI,QAAQ;CAE/C,MAAM,YAAY,KAAM,MAAM;AAC9B,KAAI,cAAc,GAAI,QAAO;AAC7B,KAAI,cAAc,GAAI,QAAO;AAC7B,QAAO,OAAO,UAAU;;AAG1B,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EACjC,QAAO,IACL,kBACA,gCACD;AAGH,KAAI,CAAC,OAAO,KAAK,EAAE,CACjB,QAAO,IACL,kBACA,gDACD;CAIH,MAAM,WAAW,eADJ,EAAE,MAAM,GAAG,GAAG,CACU;AACrC,KAAI,EAAE,GAAG,GAAG,KAAK,SACf,QAAO,IACL,oBACA,iCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;CACxB,MAAM,QAAQ,EAAE,GAAG,GAAG;CACtB,MAAM,OAAO,EAAE,MAAM,GAAG,GAAG;AAC3B,QACE,GAAG,KAAK,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,CAAA,GACtC,KAAK,MAAM,GAAG,CAAC,GAAG;;;AAK1B,MAAM,iBAAyB;CAC7B,MAAM,OAAO,aAAa,EAAE;AAC5B,QAAO,OAAO,eAAe,KAAK;;;;;;;;AASpC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,uBAAuB;CACxC,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA,WAAW;CACX,SAAS,CAAC,GAAG,EAAE;CACf,UAAU,CAAC,aAAa,YAAY;CACpC;CACD"}
1
+ {"version":3,"file":"rut.js","names":[],"sources":["../../src/cl/rut.ts"],"sourcesContent":["/**\n * RUT (Rol Único Tributario).\n *\n * Chilean tax identification number assigned by the SII\n * (Servicio de Impuestos Internos). The number consists\n * of 7 or 8 digits followed by a check digit (0-9 or K),\n * computed using a modulo 11 algorithm with weights\n * [2, 3, 4, 5, 6, 7] cycling right-to-left.\n *\n * Format: XX.XXX.XXX-C (7-8 digits + check digit).\n *\n * @see https://www.sii.cl/\n * @see https://en.wikipedia.org/wiki/Rol_%C3%9Anico_Tributario\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nconst RUT_RE = /^\\d{7,8}[\\dK]$/;\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -.\").trim().toUpperCase();\n if (v.startsWith(\"CL\")) v = v.slice(2);\n return v;\n};\n\n/**\n * Compute the RUT check digit using mod 11 with\n * weights [2, 3, 4, 5, 6, 7] cycling right-to-left.\n *\n * remainder = 11 - (weighted sum % 11)\n * 11 -> \"0\", 10 -> \"K\", else the digit as string.\n */\nconst calcCheckDigit = (body: string): string => {\n const weights = [2, 3, 4, 5, 6, 7] as const;\n let sum = 0;\n for (let i = body.length - 1, w = 0; i >= 0; i--, w++) {\n // SAFETY: w % weights.length is a valid index.\n // eslint-disable-next-line no-non-null-assertion\n sum += Number(body[i]) * weights[w % weights.length]!;\n }\n const remainder = 11 - (sum % 11);\n if (remainder === 11) return \"0\";\n if (remainder === 10) return \"K\";\n return String(remainder);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 8 && v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"RUT must be 8 or 9 characters\",\n );\n }\n\n if (!RUT_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"RUT must contain only digits and optionally K\",\n );\n }\n\n const body = v.slice(0, -1);\n const expected = calcCheckDigit(body);\n if (v.at(-1) !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"RUT check digit does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n const check = v.at(-1);\n const body = v.slice(0, -1);\n return (\n `${body.slice(0, -6)}.${body.slice(-6, -3)}` +\n `.${body.slice(-3)}-${check}`\n );\n};\n\n/** Generate a random valid Chilean RUT. */\nconst generate = (): string => {\n const body = randomDigits(8);\n return body + calcCheckDigit(body);\n};\n\n/**\n * Chilean RUT (tax identification number).\n *\n * Examples sourced from python-stdnum test suite\n * (cl.rut module).\n */\nconst rut: CountryValidator<\"CL\"> = {\n name: \"Chilean Tax ID\",\n localName: \"Rol Único Tributario\",\n abbreviation: \"RUT\",\n aliases: [\"RUT\", \"Rol Único Tributario\"] as const,\n candidatePattern: \"\\\\d{1,2}\\\\.?\\\\d{3}\\\\.?\\\\d{3}-?[\\\\dkK]\",\n scope: \"country\",\n country: \"CL\",\n entityType: \"any\",\n compact,\n format,\n validate,\n sourceUrl: \"https://www.sii.cl/\",\n lengths: [8, 9] as const,\n examples: [\"760864285\", \"125319092\"] as const,\n generate,\n};\n\nexport default rut;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;AAwBA,MAAM,SAAS;AAEf,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY;CAC/C,IAAI,EAAE,WAAW,IAAI,GAAG,IAAI,EAAE,MAAM,CAAC;CACrC,OAAO;AACT;;;;;;;;AASA,MAAM,kBAAkB,SAAyB;CAC/C,MAAM,UAAU;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CACjC,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,KAAK,SAAS,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,KAGhD,OAAO,OAAO,KAAK,EAAE,IAAI,QAAQ,IAAI,QAAQ;CAE/C,MAAM,YAAY,KAAM,MAAM;CAC9B,IAAI,cAAc,IAAI,OAAO;CAC7B,IAAI,cAAc,IAAI,OAAO;CAC7B,OAAO,OAAO,SAAS;AACzB;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GACjC,OAAO,IACL,kBACA,+BACF;CAGF,IAAI,CAAC,OAAO,KAAK,CAAC,GAChB,OAAO,IACL,kBACA,+CACF;CAIF,MAAM,WAAW,eADJ,EAAE,MAAM,GAAG,EACW,CAAC;CACpC,IAAI,EAAE,GAAG,EAAE,MAAM,UACf,OAAO,IACL,oBACA,gCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,MAAM,QAAQ,EAAE,GAAG,EAAE;CACrB,MAAM,OAAO,EAAE,MAAM,GAAG,EAAE;CAC1B,OACE,GAAG,KAAK,MAAM,GAAG,EAAE,EAAE,GAAG,KAAK,MAAM,IAAI,EAAE,EAAA,GACrC,KAAK,MAAM,EAAE,EAAE,GAAG;AAE1B;;AAGA,MAAM,iBAAyB;CAC7B,MAAM,OAAO,aAAa,CAAC;CAC3B,OAAO,OAAO,eAAe,IAAI;AACnC;;;;;;;AAQA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,sBAAsB;CACvC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA,WAAW;CACX,SAAS,CAAC,GAAG,CAAC;CACd,UAAU,CAAC,aAAa,WAAW;CACnC;AACF"}
package/dist/cn/ric.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ParsedPersonId, ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ParsedPersonId, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/cn/ric.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -12,7 +12,7 @@ declare const parse: (value: string) => ParsedPersonId | null;
12
12
  /** Generate a random valid 18-digit RIC. */
13
13
  declare const generate: () => string;
14
14
  /** Chinese Resident Identity Card number. */
15
- declare const ric: Validator<ParsedPersonId>;
15
+ declare const ric: CountryValidator<"CN", ParsedPersonId>;
16
16
  //#endregion
17
17
  export { compact, ric as default, format, generate, parse, validate };
18
18
  //# sourceMappingURL=ric.d.ts.map
package/dist/cn/ric.js CHANGED
@@ -1,22 +1,10 @@
1
+ import { mod112checkChar, mod112validate } from "../_checksums/mod112.js";
1
2
  import { clean } from "../_util/clean.js";
3
+ import { isValidDate } from "../_util/date.js";
2
4
  import { randomInt } from "../_util/generate.js";
3
5
  import { err } from "../_util/result.js";
4
6
  import { isdigits } from "../_util/strings.js";
5
- import { isValidDate } from "../_util/date.js";
6
- import { mod112checkChar, mod112validate } from "../_checksums/mod112.js";
7
7
  //#region src/cn/ric.ts
8
- /**
9
- * RIC (Resident Identity Card number, 居民身份证号码).
10
- *
11
- * Chinese national identifier. 18 characters:
12
- * 6 (area code) + 8 (YYYYMMDD birth) + 3 (sequence,
13
- * odd = male) + 1 (check, 0-9 or X).
14
- *
15
- * Also accepts the legacy 15-digit format (no check
16
- * digit, 2-digit year).
17
- *
18
- * @see https://en.wikipedia.org/wiki/Resident_Identity_Card
19
- */
20
8
  const compact = (value) => clean(value, " -").toUpperCase();
21
9
  const validate = (value) => {
22
10
  const v = compact(value);
@@ -91,6 +79,7 @@ const ric = {
91
79
  "RIC"
92
80
  ],
93
81
  candidatePattern: "\\d{17}[\\dX]",
82
+ scope: "country",
94
83
  country: "CN",
95
84
  entityType: "person",
96
85
  description: "18-character national ID encoding area, birth date, gender, and check digit",
@@ -1 +1 @@
1
- {"version":3,"file":"ric.js","names":[],"sources":["../../src/cn/ric.ts"],"sourcesContent":["/**\n * RIC (Resident Identity Card number, 居民身份证号码).\n *\n * Chinese national identifier. 18 characters:\n * 6 (area code) + 8 (YYYYMMDD birth) + 3 (sequence,\n * odd = male) + 1 (check, 0-9 or X).\n *\n * Also accepts the legacy 15-digit format (no check\n * digit, 2-digit year).\n *\n * @see https://en.wikipedia.org/wiki/Resident_Identity_Card\n */\n\nimport {\n mod112checkChar,\n mod112validate,\n} from \"#checksums/mod112\";\nimport { clean } from \"#util/clean\";\nimport { isValidDate } from \"#util/date\";\nimport { randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type {\n ParsedPersonId,\n ValidateResult,\n Validator,\n} from \"../types\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 15 && v.length !== 18) {\n return err(\n \"INVALID_LENGTH\",\n \"RIC must be 15 or 18 characters\",\n );\n }\n\n if (v.length === 15) {\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"15-digit RIC must contain only digits\",\n );\n }\n // Validate date: digits 6-11 are YYMMDD\n const year = 1900 + Number(v.slice(6, 8));\n const month = Number(v.slice(8, 10));\n const day = Number(v.slice(10, 12));\n if (!isValidDate(year, month, day)) {\n return err(\n \"INVALID_COMPONENT\",\n \"RIC contains an invalid birth date\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // 18-character format\n if (!isdigits(v.slice(0, 17))) {\n return err(\n \"INVALID_FORMAT\",\n \"RIC must contain only digits (plus check char)\",\n );\n }\n // SAFETY: 18-character branch guarantees v[17] exists.\n // eslint-disable-next-line no-non-null-assertion\n const lastChar = v[17]!;\n if (!isdigits(lastChar) && lastChar !== \"X\") {\n return err(\n \"INVALID_FORMAT\",\n \"RIC check character must be 0-9 or X\",\n );\n }\n\n // Validate date: digits 6-13 are YYYYMMDD\n const year = Number(v.slice(6, 10));\n const month = Number(v.slice(10, 12));\n const day = Number(v.slice(12, 14));\n if (!isValidDate(year, month, day)) {\n return err(\n \"INVALID_COMPONENT\",\n \"RIC contains an invalid birth date\",\n );\n }\n\n if (!mod112validate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"RIC check character does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/**\n * Extract birth date and gender from an RIC number.\n * Returns null if the value is not valid.\n */\nconst parse = (value: string): ParsedPersonId | null => {\n const result = validate(value);\n if (!result.valid) return null;\n\n const v = result.compact;\n\n let year: number;\n let month: number;\n let day: number;\n let seq: number;\n\n if (v.length === 15) {\n year = 1900 + Number(v.slice(6, 8));\n month = Number(v.slice(8, 10));\n day = Number(v.slice(10, 12));\n seq = Number(v.slice(12, 15));\n } else {\n year = Number(v.slice(6, 10));\n month = Number(v.slice(10, 12));\n day = Number(v.slice(12, 14));\n seq = Number(v.slice(14, 17));\n }\n\n const gender = seq % 2 === 1 ? \"male\" : \"female\";\n\n return {\n birthDate: new Date(year, month - 1, day),\n gender,\n };\n};\n\n/** Generate a random valid 18-digit RIC. */\nconst generate = (): string => {\n // Use a simple area code prefix\n const area = String(randomInt(110000, 659999));\n const year = randomInt(1950, 2005);\n const month = randomInt(1, 12);\n const day = randomInt(1, 28);\n const seqNum = randomInt(1, 999);\n const seq = String(seqNum).padStart(3, \"0\");\n\n const yStr = String(year);\n const mStr = String(month).padStart(2, \"0\");\n const dStr = String(day).padStart(2, \"0\");\n\n const payload = `${area}${yStr}${mStr}${dStr}${seq}`;\n const check = mod112checkChar(payload);\n return `${payload}${check}`;\n};\n\n/** Chinese Resident Identity Card number. */\nconst ric: Validator<ParsedPersonId> = {\n name: \"Chinese Resident Identity Card\",\n localName: \"居民身份证号码\",\n abbreviation: \"RIC\",\n aliases: [\"身份证\", \"居民身份证号码\", \"RIC\"] as const,\n candidatePattern: \"\\\\d{17}[\\\\dX]\",\n country: \"CN\",\n entityType: \"person\",\n description:\n \"18-character national ID encoding area, birth date, gender, and check digit\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/Resident_Identity_Card\",\n lengths: [15, 18] as const,\n examples: [\n \"11010519491231002X\",\n \"440524188001010014\",\n ] as const,\n compact,\n format,\n parse,\n validate,\n generate,\n};\n\nexport default ric;\nexport { compact, format, generate, parse, validate };\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA6BA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,CAAC,aAAa;AAElC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,WAAW,MAAM,EAAE,WAAW,GAClC,QAAO,IACL,kBACA,kCACD;AAGH,KAAI,EAAE,WAAW,IAAI;AACnB,MAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,wCACD;AAMH,MAAI,CAAC,YAHQ,OAAO,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,EAC3B,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,EACxB,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC,CACD,CAChC,QAAO,IACL,qBACA,qCACD;AAEH,SAAO;GAAE,OAAO;GAAM,SAAS;GAAG;;AAIpC,KAAI,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,CAAC,CAC3B,QAAO,IACL,kBACA,iDACD;CAIH,MAAM,WAAW,EAAE;AACnB,KAAI,CAAC,SAAS,SAAS,IAAI,aAAa,IACtC,QAAO,IACL,kBACA,uCACD;AAOH,KAAI,CAAC,YAHQ,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,EACrB,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC,EACzB,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC,CACD,CAChC,QAAO,IACL,qBACA,qCACD;AAGH,KAAI,CAAC,eAAe,EAAE,CACpB,QAAO,IACL,oBACA,qCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;;;;AAMxD,MAAM,SAAS,UAAyC;CACtD,MAAM,SAAS,SAAS,MAAM;AAC9B,KAAI,CAAC,OAAO,MAAO,QAAO;CAE1B,MAAM,IAAI,OAAO;CAEjB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AAEJ,KAAI,EAAE,WAAW,IAAI;AACnB,SAAO,OAAO,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;AACnC,UAAQ,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;AAC9B,QAAM,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC;AAC7B,QAAM,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC;QACxB;AACL,SAAO,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;AAC7B,UAAQ,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC;AAC/B,QAAM,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC;AAC7B,QAAM,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC;;CAG/B,MAAM,SAAS,MAAM,MAAM,IAAI,SAAS;AAExC,QAAO;EACL,WAAW,IAAI,KAAK,MAAM,QAAQ,GAAG,IAAI;EACzC;EACD;;;AAIH,MAAM,iBAAyB;CAE7B,MAAM,OAAO,OAAO,UAAU,MAAQ,OAAO,CAAC;CAC9C,MAAM,OAAO,UAAU,MAAM,KAAK;CAClC,MAAM,QAAQ,UAAU,GAAG,GAAG;CAC9B,MAAM,MAAM,UAAU,GAAG,GAAG;CAC5B,MAAM,SAAS,UAAU,GAAG,IAAI;CAChC,MAAM,MAAM,OAAO,OAAO,CAAC,SAAS,GAAG,IAAI;CAM3C,MAAM,UAAU,GAAG,OAJN,OAAO,KAAK,GACZ,OAAO,MAAM,CAAC,SAAS,GAAG,IAAI,GAC9B,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,GAEM;AAE/C,QAAO,GAAG,UADI,gBAAgB,QAAQ;;;AAKxC,MAAM,MAAiC;CACrC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAO;EAAW;EAAM;CAClC,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,aACE;CACF,WACE;CACF,SAAS,CAAC,IAAI,GAAG;CACjB,UAAU,CACR,sBACA,qBACD;CACD;CACA;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"ric.js","names":[],"sources":["../../src/cn/ric.ts"],"sourcesContent":["/**\n * RIC (Resident Identity Card number, 居民身份证号码).\n *\n * Chinese national identifier. 18 characters:\n * 6 (area code) + 8 (YYYYMMDD birth) + 3 (sequence,\n * odd = male) + 1 (check, 0-9 or X).\n *\n * Also accepts the legacy 15-digit format (no check\n * digit, 2-digit year).\n *\n * @see https://en.wikipedia.org/wiki/Resident_Identity_Card\n */\n\nimport type {\n ParsedPersonId,\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport {\n mod112checkChar,\n mod112validate,\n} from \"#checksums/mod112\";\nimport { clean } from \"#util/clean\";\nimport { isValidDate } from \"#util/date\";\nimport { randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 15 && v.length !== 18) {\n return err(\n \"INVALID_LENGTH\",\n \"RIC must be 15 or 18 characters\",\n );\n }\n\n if (v.length === 15) {\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"15-digit RIC must contain only digits\",\n );\n }\n // Validate date: digits 6-11 are YYMMDD\n const year = 1900 + Number(v.slice(6, 8));\n const month = Number(v.slice(8, 10));\n const day = Number(v.slice(10, 12));\n if (!isValidDate(year, month, day)) {\n return err(\n \"INVALID_COMPONENT\",\n \"RIC contains an invalid birth date\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // 18-character format\n if (!isdigits(v.slice(0, 17))) {\n return err(\n \"INVALID_FORMAT\",\n \"RIC must contain only digits (plus check char)\",\n );\n }\n // SAFETY: 18-character branch guarantees v[17] exists.\n // eslint-disable-next-line no-non-null-assertion\n const lastChar = v[17]!;\n if (!isdigits(lastChar) && lastChar !== \"X\") {\n return err(\n \"INVALID_FORMAT\",\n \"RIC check character must be 0-9 or X\",\n );\n }\n\n // Validate date: digits 6-13 are YYYYMMDD\n const year = Number(v.slice(6, 10));\n const month = Number(v.slice(10, 12));\n const day = Number(v.slice(12, 14));\n if (!isValidDate(year, month, day)) {\n return err(\n \"INVALID_COMPONENT\",\n \"RIC contains an invalid birth date\",\n );\n }\n\n if (!mod112validate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"RIC check character does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/**\n * Extract birth date and gender from an RIC number.\n * Returns null if the value is not valid.\n */\nconst parse = (value: string): ParsedPersonId | null => {\n const result = validate(value);\n if (!result.valid) return null;\n\n const v = result.compact;\n\n let year: number;\n let month: number;\n let day: number;\n let seq: number;\n\n if (v.length === 15) {\n year = 1900 + Number(v.slice(6, 8));\n month = Number(v.slice(8, 10));\n day = Number(v.slice(10, 12));\n seq = Number(v.slice(12, 15));\n } else {\n year = Number(v.slice(6, 10));\n month = Number(v.slice(10, 12));\n day = Number(v.slice(12, 14));\n seq = Number(v.slice(14, 17));\n }\n\n const gender = seq % 2 === 1 ? \"male\" : \"female\";\n\n return {\n birthDate: new Date(year, month - 1, day),\n gender,\n };\n};\n\n/** Generate a random valid 18-digit RIC. */\nconst generate = (): string => {\n // Use a simple area code prefix\n const area = String(randomInt(110000, 659999));\n const year = randomInt(1950, 2005);\n const month = randomInt(1, 12);\n const day = randomInt(1, 28);\n const seqNum = randomInt(1, 999);\n const seq = String(seqNum).padStart(3, \"0\");\n\n const yStr = String(year);\n const mStr = String(month).padStart(2, \"0\");\n const dStr = String(day).padStart(2, \"0\");\n\n const payload = `${area}${yStr}${mStr}${dStr}${seq}`;\n const check = mod112checkChar(payload);\n return `${payload}${check}`;\n};\n\n/** Chinese Resident Identity Card number. */\nconst ric: CountryValidator<\"CN\", ParsedPersonId> = {\n name: \"Chinese Resident Identity Card\",\n localName: \"居民身份证号码\",\n abbreviation: \"RIC\",\n aliases: [\"身份证\", \"居民身份证号码\", \"RIC\"] as const,\n candidatePattern: \"\\\\d{17}[\\\\dX]\",\n scope: \"country\",\n country: \"CN\",\n entityType: \"person\",\n description:\n \"18-character national ID encoding area, birth date, gender, and check digit\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/Resident_Identity_Card\",\n lengths: [15, 18] as const,\n examples: [\n \"11010519491231002X\",\n \"440524188001010014\",\n ] as const,\n compact,\n format,\n parse,\n validate,\n generate,\n};\n\nexport default ric;\nexport { compact, format, generate, parse, validate };\n"],"mappings":";;;;;;;AA6BA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,EAAE,YAAY;AAEjC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,MAAM,EAAE,WAAW,IAClC,OAAO,IACL,kBACA,iCACF;CAGF,IAAI,EAAE,WAAW,IAAI;EACnB,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,uCACF;EAMF,IAAI,CAAC,YAHQ,OAAO,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,GAC1B,OAAO,EAAE,MAAM,GAAG,EAAE,CAEP,GADf,OAAO,EAAE,MAAM,IAAI,EAAE,CACD,CAAC,GAC/B,OAAO,IACL,qBACA,oCACF;EAEF,OAAO;GAAE,OAAO;GAAM,SAAS;EAAE;CACnC;CAGA,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,GAC1B,OAAO,IACL,kBACA,gDACF;CAIF,MAAM,WAAW,EAAE;CACnB,IAAI,CAAC,SAAS,QAAQ,KAAK,aAAa,KACtC,OAAO,IACL,kBACA,sCACF;CAOF,IAAI,CAAC,YAHQ,OAAO,EAAE,MAAM,GAAG,EAAE,CAGb,GAFN,OAAO,EAAE,MAAM,IAAI,EAAE,CAER,GADf,OAAO,EAAE,MAAM,IAAI,EAAE,CACD,CAAC,GAC/B,OAAO,IACL,qBACA,oCACF;CAGF,IAAI,CAAC,eAAe,CAAC,GACnB,OAAO,IACL,oBACA,oCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;;;;AAMvD,MAAM,SAAS,UAAyC;CACtD,MAAM,SAAS,SAAS,KAAK;CAC7B,IAAI,CAAC,OAAO,OAAO,OAAO;CAE1B,MAAM,IAAI,OAAO;CAEjB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,IAAI,EAAE,WAAW,IAAI;EACnB,OAAO,OAAO,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;EAClC,QAAQ,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;EAC7B,MAAM,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;EAC5B,MAAM,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;CAC9B,OAAO;EACL,OAAO,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;EAC5B,QAAQ,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;EAC9B,MAAM,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;EAC5B,MAAM,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;CAC9B;CAEA,MAAM,SAAS,MAAM,MAAM,IAAI,SAAS;CAExC,OAAO;EACL,WAAW,IAAI,KAAK,MAAM,QAAQ,GAAG,GAAG;EACxC;CACF;AACF;;AAGA,MAAM,iBAAyB;CAE7B,MAAM,OAAO,OAAO,UAAU,MAAQ,MAAM,CAAC;CAC7C,MAAM,OAAO,UAAU,MAAM,IAAI;CACjC,MAAM,QAAQ,UAAU,GAAG,EAAE;CAC7B,MAAM,MAAM,UAAU,GAAG,EAAE;CAC3B,MAAM,SAAS,UAAU,GAAG,GAAG;CAC/B,MAAM,MAAM,OAAO,MAAM,EAAE,SAAS,GAAG,GAAG;CAM1C,MAAM,UAAU,GAAG,OAJN,OAAO,IAIS,IAHhB,OAAO,KAAK,EAAE,SAAS,GAAG,GAGH,IAFvB,OAAO,GAAG,EAAE,SAAS,GAAG,GAEM,IAAI;CAE/C,OAAO,GAAG,UADI,gBAAgB,OACN;AAC1B;;AAGA,MAAM,MAA8C;CAClD,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAO;EAAW;CAAK;CACjC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,aACE;CACF,WACE;CACF,SAAS,CAAC,IAAI,EAAE;CAChB,UAAU,CACR,sBACA,oBACF;CACA;CACA;CACA;CACA;CACA;AACF"}
package/dist/cn/uscc.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/cn/uscc.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid USCC. */
8
8
  declare const generate: () => string;
9
9
  /** Chinese Unified Social Credit Code. */
10
- declare const uscc: Validator;
10
+ declare const uscc: CountryValidator<"CN">;
11
11
  //#endregion
12
12
  export { compact, uscc as default, format, generate, validate };
13
13
  //# sourceMappingURL=uscc.d.ts.map