@stll/stdnum 0.0.1 → 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 (808) hide show
  1. package/LICENSE +1 -5
  2. package/README.md +28 -4
  3. package/dist/_checksums/luhn.js.map +1 -1
  4. package/dist/_checksums/mod1110.js +1 -1
  5. package/dist/_checksums/mod1110.js.map +1 -1
  6. package/dist/_checksums/mod112.js +5 -5
  7. package/dist/_checksums/mod112.js.map +1 -1
  8. package/dist/_checksums/mod97.js.map +1 -1
  9. package/dist/_checksums/verhoeff.js.map +1 -1
  10. package/dist/_checksums/weighted-sum.js.map +1 -1
  11. package/dist/_util/arabic.js.map +1 -1
  12. package/dist/_util/clean.js.map +1 -1
  13. package/dist/_util/date.js.map +1 -1
  14. package/dist/_util/generate.d.ts +13 -1
  15. package/dist/_util/generate.js +23 -1
  16. package/dist/_util/generate.js.map +1 -1
  17. package/dist/_util/result.js.map +1 -1
  18. package/dist/_util/strings.js.map +1 -1
  19. package/dist/ad/mod.d.ts +3 -2
  20. package/dist/ad/nrt.d.ts +16 -2
  21. package/dist/ad/nrt.js +4 -16
  22. package/dist/ad/nrt.js.map +1 -1
  23. package/dist/ae/eid.d.ts +2 -3
  24. package/dist/ae/eid.js +2 -12
  25. package/dist/ae/eid.js.map +1 -1
  26. package/dist/ae/mod.d.ts +3 -2
  27. package/dist/ai/mod.d.ts +3 -2
  28. package/dist/ai/tin.d.ts +20 -2
  29. package/dist/ai/tin.js +1 -18
  30. package/dist/ai/tin.js.map +1 -1
  31. package/dist/al/mod.d.ts +3 -2
  32. package/dist/al/nipt.d.ts +13 -2
  33. package/dist/al/nipt.js +1 -11
  34. package/dist/al/nipt.js.map +1 -1
  35. package/dist/am/mod.d.ts +3 -2
  36. package/dist/am/tin.d.ts +16 -2
  37. package/dist/am/tin.js +1 -14
  38. package/dist/am/tin.js.map +1 -1
  39. package/dist/ar/cbu.d.ts +2 -3
  40. package/dist/ar/cbu.js +2 -10
  41. package/dist/ar/cbu.js.map +1 -1
  42. package/dist/ar/cuit.d.ts +2 -3
  43. package/dist/ar/cuit.js +13 -29
  44. package/dist/ar/cuit.js.map +1 -1
  45. package/dist/ar/dni.d.ts +11 -2
  46. package/dist/ar/dni.js +1 -9
  47. package/dist/ar/dni.js.map +1 -1
  48. package/dist/ar/mod.d.ts +3 -2
  49. package/dist/at/businessid.d.ts +10 -2
  50. package/dist/at/businessid.js +1 -8
  51. package/dist/at/businessid.js.map +1 -1
  52. package/dist/at/mod.d.ts +3 -2
  53. package/dist/at/tin.d.ts +2 -3
  54. package/dist/at/tin.js +1 -11
  55. package/dist/at/tin.js.map +1 -1
  56. package/dist/at/uid.d.ts +2 -3
  57. package/dist/at/uid.js +2 -10
  58. package/dist/at/uid.js.map +1 -1
  59. package/dist/at/vnr.d.ts +5 -4
  60. package/dist/at/vnr.js +23 -16
  61. package/dist/at/vnr.js.map +1 -1
  62. package/dist/au/abn.d.ts +2 -3
  63. package/dist/au/abn.js +1 -10
  64. package/dist/au/abn.js.map +1 -1
  65. package/dist/au/acn.d.ts +2 -3
  66. package/dist/au/acn.js +1 -10
  67. package/dist/au/acn.js.map +1 -1
  68. package/dist/au/mod.d.ts +3 -2
  69. package/dist/au/tfn.d.ts +2 -3
  70. package/dist/au/tfn.js +1 -10
  71. package/dist/au/tfn.js.map +1 -1
  72. package/dist/az/mod.d.ts +3 -2
  73. package/dist/az/voen.d.ts +2 -3
  74. package/dist/az/voen.js +1 -14
  75. package/dist/az/voen.js.map +1 -1
  76. package/dist/ba/jmbg.d.ts +2 -3
  77. package/dist/ba/jmbg.js +4 -11
  78. package/dist/ba/jmbg.js.map +1 -1
  79. package/dist/ba/mod.d.ts +3 -2
  80. package/dist/bd/mod.d.ts +3 -2
  81. package/dist/bd/nid.d.ts +23 -2
  82. package/dist/bd/nid.js +11 -32
  83. package/dist/bd/nid.js.map +1 -1
  84. package/dist/be/bis.d.ts +2 -3
  85. package/dist/be/bis.js +1 -11
  86. package/dist/be/bis.js.map +1 -1
  87. package/dist/be/mod.d.ts +3 -2
  88. package/dist/be/nn.d.ts +2 -3
  89. package/dist/be/nn.js +1 -11
  90. package/dist/be/nn.js.map +1 -1
  91. package/dist/be/vat.d.ts +2 -3
  92. package/dist/be/vat.js +1 -9
  93. package/dist/be/vat.js.map +1 -1
  94. package/dist/bg/egn.d.ts +2 -3
  95. package/dist/bg/egn.js +5 -13
  96. package/dist/bg/egn.js.map +1 -1
  97. package/dist/bg/mod.d.ts +3 -2
  98. package/dist/bg/pnf.d.ts +2 -3
  99. package/dist/bg/pnf.js +1 -8
  100. package/dist/bg/pnf.js.map +1 -1
  101. package/dist/bg/vat.d.ts +2 -3
  102. package/dist/bg/vat.js +3 -9
  103. package/dist/bg/vat.js.map +1 -1
  104. package/dist/bh/cpr.d.ts +5 -4
  105. package/dist/bh/cpr.js +9 -19
  106. package/dist/bh/cpr.js.map +1 -1
  107. package/dist/bh/mod.d.ts +3 -2
  108. package/dist/bic.d.ts +13 -2
  109. package/dist/bic.js +14 -26
  110. package/dist/bic.js.map +1 -1
  111. package/dist/br/cnpj.d.ts +2 -3
  112. package/dist/br/cnpj.js +1 -20
  113. package/dist/br/cnpj.js.map +1 -1
  114. package/dist/br/cpf.d.ts +2 -3
  115. package/dist/br/cpf.js +1 -14
  116. package/dist/br/cpf.js.map +1 -1
  117. package/dist/br/mod.d.ts +3 -2
  118. package/dist/by/mod.d.ts +3 -2
  119. package/dist/by/unp.d.ts +2 -3
  120. package/dist/by/unp.js +9 -17
  121. package/dist/by/unp.js.map +1 -1
  122. package/dist/bz/mod.d.ts +3 -2
  123. package/dist/bz/tin.d.ts +5 -4
  124. package/dist/bz/tin.js +10 -27
  125. package/dist/bz/tin.js.map +1 -1
  126. package/dist/ca/bn.d.ts +2 -3
  127. package/dist/ca/bn.js +2 -10
  128. package/dist/ca/bn.js.map +1 -1
  129. package/dist/ca/mod.d.ts +3 -2
  130. package/dist/ca/sin.d.ts +2 -3
  131. package/dist/ca/sin.js +2 -10
  132. package/dist/ca/sin.js.map +1 -1
  133. package/dist/ch/mod.d.ts +3 -2
  134. package/dist/ch/ssn.d.ts +2 -3
  135. package/dist/ch/ssn.js +1 -9
  136. package/dist/ch/ssn.js.map +1 -1
  137. package/dist/ch/uid.d.ts +2 -3
  138. package/dist/ch/uid.js +1 -9
  139. package/dist/ch/uid.js.map +1 -1
  140. package/dist/ch/vat.d.ts +2 -3
  141. package/dist/ch/vat.js +1 -9
  142. package/dist/ch/vat.js.map +1 -1
  143. package/dist/cl/mod.d.ts +3 -2
  144. package/dist/cl/rut.d.ts +2 -3
  145. package/dist/cl/rut.js +2 -15
  146. package/dist/cl/rut.js.map +1 -1
  147. package/dist/cn/mod.d.ts +3 -2
  148. package/dist/cn/ric.d.ts +2 -3
  149. package/dist/cn/ric.js +4 -14
  150. package/dist/cn/ric.js.map +1 -1
  151. package/dist/cn/uscc.d.ts +2 -3
  152. package/dist/cn/uscc.js +8 -16
  153. package/dist/cn/uscc.js.map +1 -1
  154. package/dist/co/mod.d.ts +3 -2
  155. package/dist/co/nit.d.ts +2 -3
  156. package/dist/co/nit.js +6 -13
  157. package/dist/co/nit.js.map +1 -1
  158. package/dist/cr/cpf.d.ts +18 -2
  159. package/dist/cr/cpf.js +5 -19
  160. package/dist/cr/cpf.js.map +1 -1
  161. package/dist/cr/mod.d.ts +3 -2
  162. package/dist/creditcard.d.ts +2 -3
  163. package/dist/creditcard.js +5 -14
  164. package/dist/creditcard.js.map +1 -1
  165. package/dist/cu/mod.d.ts +3 -2
  166. package/dist/cu/ni.d.ts +5 -4
  167. package/dist/cu/ni.js +13 -18
  168. package/dist/cu/ni.js.map +1 -1
  169. package/dist/cy/mod.d.ts +3 -2
  170. package/dist/cy/vat.d.ts +2 -3
  171. package/dist/cy/vat.js +1 -8
  172. package/dist/cy/vat.js.map +1 -1
  173. package/dist/cz/dic.d.ts +2 -3
  174. package/dist/cz/dic.js +7 -13
  175. package/dist/cz/dic.js.map +1 -1
  176. package/dist/cz/ico.d.ts +2 -3
  177. package/dist/cz/ico.js +2 -10
  178. package/dist/cz/ico.js.map +1 -1
  179. package/dist/cz/mod.d.ts +3 -2
  180. package/dist/cz/rc.d.ts +2 -3
  181. package/dist/cz/rc.js +22 -21
  182. package/dist/cz/rc.js.map +1 -1
  183. package/dist/de/handelsreg.d.ts +19 -2
  184. package/dist/de/handelsreg.js +10 -26
  185. package/dist/de/handelsreg.js.map +1 -1
  186. package/dist/de/idnr.d.ts +2 -3
  187. package/dist/de/idnr.js +2 -12
  188. package/dist/de/idnr.js.map +1 -1
  189. package/dist/de/mod.d.ts +3 -2
  190. package/dist/de/stnr.d.ts +17 -3
  191. package/dist/de/stnr.js +1 -15
  192. package/dist/de/stnr.js.map +1 -1
  193. package/dist/de/svnr.d.ts +2 -3
  194. package/dist/de/svnr.js +4 -13
  195. package/dist/de/svnr.js.map +1 -1
  196. package/dist/de/vat.d.ts +2 -3
  197. package/dist/de/vat.js +2 -11
  198. package/dist/de/vat.js.map +1 -1
  199. package/dist/dk/cpr.d.ts +5 -4
  200. package/dist/dk/cpr.js +14 -12
  201. package/dist/dk/cpr.js.map +1 -1
  202. package/dist/dk/cvr.d.ts +2 -3
  203. package/dist/dk/cvr.js +2 -15
  204. package/dist/dk/cvr.js.map +1 -1
  205. package/dist/dk/mod.d.ts +3 -2
  206. package/dist/dk/vat.d.ts +2 -3
  207. package/dist/dk/vat.js +3 -13
  208. package/dist/dk/vat.js.map +1 -1
  209. package/dist/do/mod.d.ts +3 -2
  210. package/dist/do/rnc.d.ts +2 -3
  211. package/dist/do/rnc.js +3 -17
  212. package/dist/do/rnc.js.map +1 -1
  213. package/dist/ec/mod.d.ts +3 -2
  214. package/dist/ec/ruc.d.ts +2 -3
  215. package/dist/ec/ruc.js +2 -19
  216. package/dist/ec/ruc.js.map +1 -1
  217. package/dist/ee/ik.d.ts +2 -3
  218. package/dist/ee/ik.js +6 -15
  219. package/dist/ee/ik.js.map +1 -1
  220. package/dist/ee/mod.d.ts +3 -2
  221. package/dist/ee/registrikood.d.ts +2 -3
  222. package/dist/ee/registrikood.js +9 -15
  223. package/dist/ee/registrikood.js.map +1 -1
  224. package/dist/ee/vat.d.ts +2 -3
  225. package/dist/ee/vat.js +2 -10
  226. package/dist/ee/vat.js.map +1 -1
  227. package/dist/eg/mod.d.ts +3 -2
  228. package/dist/eg/tn.d.ts +11 -2
  229. package/dist/eg/tn.js +1 -9
  230. package/dist/eg/tn.js.map +1 -1
  231. package/dist/es/cif.d.ts +2 -3
  232. package/dist/es/cif.js +3 -12
  233. package/dist/es/cif.js.map +1 -1
  234. package/dist/es/dni.d.ts +2 -3
  235. package/dist/es/dni.js +1 -9
  236. package/dist/es/dni.js.map +1 -1
  237. package/dist/es/mod.d.ts +3 -2
  238. package/dist/es/nie.d.ts +2 -3
  239. package/dist/es/nie.js +14 -22
  240. package/dist/es/nie.js.map +1 -1
  241. package/dist/es/nss.d.ts +2 -3
  242. package/dist/es/nss.js +1 -16
  243. package/dist/es/nss.js.map +1 -1
  244. package/dist/es/vat.d.ts +2 -3
  245. package/dist/es/vat.js +5 -10
  246. package/dist/es/vat.js.map +1 -1
  247. package/dist/eu/mod.d.ts +3 -2
  248. package/dist/eu/vat.d.ts +5 -4
  249. package/dist/eu/vat.js +44 -2
  250. package/dist/eu/vat.js.map +1 -1
  251. package/dist/fi/hetu.d.ts +5 -4
  252. package/dist/fi/hetu.js +19 -12
  253. package/dist/fi/hetu.js.map +1 -1
  254. package/dist/fi/mod.d.ts +3 -2
  255. package/dist/fi/vat.d.ts +2 -3
  256. package/dist/fi/vat.js +3 -10
  257. package/dist/fi/vat.js.map +1 -1
  258. package/dist/fi/ytunnus.d.ts +2 -3
  259. package/dist/fi/ytunnus.js +2 -10
  260. package/dist/fi/ytunnus.js.map +1 -1
  261. package/dist/fr/mod.d.ts +3 -2
  262. package/dist/fr/nif.d.ts +2 -3
  263. package/dist/fr/nif.js +1 -9
  264. package/dist/fr/nif.js.map +1 -1
  265. package/dist/fr/nir.d.ts +2 -3
  266. package/dist/fr/nir.js +3 -14
  267. package/dist/fr/nir.js.map +1 -1
  268. package/dist/fr/siren.d.ts +2 -3
  269. package/dist/fr/siren.js +2 -10
  270. package/dist/fr/siren.js.map +1 -1
  271. package/dist/fr/siret.d.ts +2 -3
  272. package/dist/fr/siret.js +2 -11
  273. package/dist/fr/siret.js.map +1 -1
  274. package/dist/fr/tva.d.ts +2 -3
  275. package/dist/fr/tva.js +2 -12
  276. package/dist/fr/tva.js.map +1 -1
  277. package/dist/gb/mod.d.ts +3 -2
  278. package/dist/gb/nino.d.ts +12 -2
  279. package/dist/gb/nino.js +8 -17
  280. package/dist/gb/nino.js.map +1 -1
  281. package/dist/gb/sedol.d.ts +2 -3
  282. package/dist/gb/sedol.js +9 -18
  283. package/dist/gb/sedol.js.map +1 -1
  284. package/dist/gb/utr.d.ts +2 -3
  285. package/dist/gb/utr.js +2 -10
  286. package/dist/gb/utr.js.map +1 -1
  287. package/dist/gb/vat.d.ts +2 -3
  288. package/dist/gb/vat.js +2 -11
  289. package/dist/gb/vat.js.map +1 -1
  290. package/dist/ge/mod.d.ts +3 -2
  291. package/dist/ge/pin.d.ts +14 -2
  292. package/dist/ge/pin.js +1 -12
  293. package/dist/ge/pin.js.map +1 -1
  294. package/dist/gh/mod.d.ts +3 -2
  295. package/dist/gh/tin.d.ts +2 -3
  296. package/dist/gh/tin.js +10 -24
  297. package/dist/gh/tin.js.map +1 -1
  298. package/dist/gr/amka.d.ts +2 -3
  299. package/dist/gr/amka.js +3 -11
  300. package/dist/gr/amka.js.map +1 -1
  301. package/dist/gr/mod.d.ts +3 -2
  302. package/dist/gr/vat.d.ts +2 -3
  303. package/dist/gr/vat.js +1 -10
  304. package/dist/gr/vat.js.map +1 -1
  305. package/dist/gt/mod.d.ts +3 -2
  306. package/dist/gt/nit.d.ts +2 -3
  307. package/dist/gt/nit.js +6 -14
  308. package/dist/gt/nit.js.map +1 -1
  309. package/dist/hk/hkid.d.ts +2 -3
  310. package/dist/hk/hkid.js +2 -10
  311. package/dist/hk/hkid.js.map +1 -1
  312. package/dist/hk/mod.d.ts +3 -2
  313. package/dist/hr/mod.d.ts +3 -2
  314. package/dist/hr/vat.d.ts +2 -3
  315. package/dist/hr/vat.js +2 -9
  316. package/dist/hr/vat.js.map +1 -1
  317. package/dist/hu/mod.d.ts +3 -2
  318. package/dist/hu/vat.d.ts +2 -3
  319. package/dist/hu/vat.js +3 -10
  320. package/dist/hu/vat.js.map +1 -1
  321. package/dist/iban.d.ts +2 -3
  322. package/dist/iban.js +2 -8
  323. package/dist/iban.js.map +1 -1
  324. package/dist/id/mod.d.ts +3 -2
  325. package/dist/id/npwp.d.ts +2 -3
  326. package/dist/id/npwp.js +3 -13
  327. package/dist/id/npwp.js.map +1 -1
  328. package/dist/ie/mod.d.ts +3 -2
  329. package/dist/ie/pps.d.ts +2 -3
  330. package/dist/ie/pps.js +1 -10
  331. package/dist/ie/pps.js.map +1 -1
  332. package/dist/ie/vat.d.ts +2 -3
  333. package/dist/ie/vat.js +1 -9
  334. package/dist/ie/vat.js.map +1 -1
  335. package/dist/il/idnr.d.ts +2 -3
  336. package/dist/il/idnr.js +2 -9
  337. package/dist/il/idnr.js.map +1 -1
  338. package/dist/il/mod.d.ts +3 -2
  339. package/dist/in/aadhaar.d.ts +2 -3
  340. package/dist/in/aadhaar.js +2 -12
  341. package/dist/in/aadhaar.js.map +1 -1
  342. package/dist/in/gstin.d.ts +2 -3
  343. package/dist/in/gstin.js +4 -11
  344. package/dist/in/gstin.js.map +1 -1
  345. package/dist/in/mod.d.ts +3 -2
  346. package/dist/in/pan.d.ts +15 -2
  347. package/dist/in/pan.js +3 -15
  348. package/dist/in/pan.js.map +1 -1
  349. package/dist/index.d.ts +2 -2
  350. package/dist/index.js +6 -6
  351. package/dist/iq/mod.d.ts +3 -2
  352. package/dist/iq/nid.d.ts +16 -2
  353. package/dist/iq/nid.js +2 -15
  354. package/dist/iq/nid.js.map +1 -1
  355. package/dist/ir/mod.d.ts +3 -2
  356. package/dist/ir/nid.d.ts +2 -3
  357. package/dist/ir/nid.js +2 -24
  358. package/dist/ir/nid.js.map +1 -1
  359. package/dist/is/kennitala.d.ts +2 -3
  360. package/dist/is/kennitala.js +2 -13
  361. package/dist/is/kennitala.js.map +1 -1
  362. package/dist/is/mod.d.ts +3 -2
  363. package/dist/is/vsk.d.ts +9 -2
  364. package/dist/is/vsk.js +1 -7
  365. package/dist/is/vsk.js.map +1 -1
  366. package/dist/isin.d.ts +2 -3
  367. package/dist/isin.js +11 -21
  368. package/dist/isin.js.map +1 -1
  369. package/dist/it/codicefiscale.d.ts +5 -4
  370. package/dist/it/codicefiscale.js +27 -23
  371. package/dist/it/codicefiscale.js.map +1 -1
  372. package/dist/it/iva.d.ts +2 -3
  373. package/dist/it/iva.js +2 -9
  374. package/dist/it/iva.js.map +1 -1
  375. package/dist/it/mod.d.ts +3 -2
  376. package/dist/jp/cn.d.ts +2 -3
  377. package/dist/jp/cn.js +1 -9
  378. package/dist/jp/cn.js.map +1 -1
  379. package/dist/jp/mod.d.ts +3 -2
  380. package/dist/jp/mynumber.d.ts +2 -3
  381. package/dist/jp/mynumber.js +1 -10
  382. package/dist/jp/mynumber.js.map +1 -1
  383. package/dist/kr/brn.d.ts +11 -2
  384. package/dist/kr/brn.js +1 -9
  385. package/dist/kr/brn.js.map +1 -1
  386. package/dist/kr/mod.d.ts +3 -2
  387. package/dist/kr/rrn.d.ts +5 -4
  388. package/dist/kr/rrn.js +15 -13
  389. package/dist/kr/rrn.js.map +1 -1
  390. package/dist/kw/civil.d.ts +6 -5
  391. package/dist/kw/civil.js +20 -17
  392. package/dist/kw/civil.js.map +1 -1
  393. package/dist/kw/mod.d.ts +3 -2
  394. package/dist/kz/iin.d.ts +2 -3
  395. package/dist/kz/iin.js +4 -18
  396. package/dist/kz/iin.js.map +1 -1
  397. package/dist/kz/mod.d.ts +3 -2
  398. package/dist/lei.d.ts +2 -3
  399. package/dist/lei.js +2 -11
  400. package/dist/lei.js.map +1 -1
  401. package/dist/li/mod.d.ts +3 -2
  402. package/dist/li/peid.d.ts +11 -2
  403. package/dist/li/peid.js +1 -9
  404. package/dist/li/peid.js.map +1 -1
  405. package/dist/lk/mod.d.ts +3 -2
  406. package/dist/lk/nic.d.ts +5 -4
  407. package/dist/lk/nic.js +16 -16
  408. package/dist/lk/nic.js.map +1 -1
  409. package/dist/lt/asmens.d.ts +2 -3
  410. package/dist/lt/asmens.js +2 -1
  411. package/dist/lt/asmens.js.map +1 -1
  412. package/dist/lt/mod.d.ts +3 -2
  413. package/dist/lt/vat.d.ts +2 -3
  414. package/dist/lt/vat.js +2 -10
  415. package/dist/lt/vat.js.map +1 -1
  416. package/dist/lu/mod.d.ts +3 -2
  417. package/dist/lu/vat.d.ts +2 -3
  418. package/dist/lu/vat.js +2 -8
  419. package/dist/lu/vat.js.map +1 -1
  420. package/dist/luhn.d.ts +2 -3
  421. package/dist/luhn.js +9 -9
  422. package/dist/luhn.js.map +1 -1
  423. package/dist/lv/mod.d.ts +3 -2
  424. package/dist/lv/vat.d.ts +2 -3
  425. package/dist/lv/vat.js +19 -18
  426. package/dist/lv/vat.js.map +1 -1
  427. package/dist/ma/ice.d.ts +2 -3
  428. package/dist/ma/ice.js +2 -11
  429. package/dist/ma/ice.js.map +1 -1
  430. package/dist/ma/mod.d.ts +3 -2
  431. package/dist/mc/mod.d.ts +3 -2
  432. package/dist/mc/tva.d.ts +2 -3
  433. package/dist/mc/tva.js +1 -0
  434. package/dist/mc/tva.js.map +1 -1
  435. package/dist/md/idno.d.ts +2 -3
  436. package/dist/md/idno.js +1 -10
  437. package/dist/md/idno.js.map +1 -1
  438. package/dist/md/mod.d.ts +3 -2
  439. package/dist/me/mod.d.ts +3 -2
  440. package/dist/me/pib.d.ts +2 -3
  441. package/dist/me/pib.js +2 -10
  442. package/dist/me/pib.js.map +1 -1
  443. package/dist/mk/edb.d.ts +2 -3
  444. package/dist/mk/edb.js +2 -11
  445. package/dist/mk/edb.js.map +1 -1
  446. package/dist/mk/mod.d.ts +3 -2
  447. package/dist/mt/mod.d.ts +3 -2
  448. package/dist/mt/vat.d.ts +2 -3
  449. package/dist/mt/vat.js +3 -10
  450. package/dist/mt/vat.js.map +1 -1
  451. package/dist/mu/brn.d.ts +23 -2
  452. package/dist/mu/brn.js +1 -21
  453. package/dist/mu/brn.js.map +1 -1
  454. package/dist/mu/mod.d.ts +3 -2
  455. package/dist/mx/clabe.d.ts +2 -3
  456. package/dist/mx/clabe.js +1 -14
  457. package/dist/mx/clabe.js.map +1 -1
  458. package/dist/mx/curp.d.ts +5 -4
  459. package/dist/mx/curp.js +27 -19
  460. package/dist/mx/curp.js.map +1 -1
  461. package/dist/mx/mod.d.ts +3 -2
  462. package/dist/mx/rfc.d.ts +5 -4
  463. package/dist/mx/rfc.js +23 -20
  464. package/dist/mx/rfc.js.map +1 -1
  465. package/dist/my/mod.d.ts +3 -2
  466. package/dist/my/nric.d.ts +5 -4
  467. package/dist/my/nric.js +18 -16
  468. package/dist/my/nric.js.map +1 -1
  469. package/dist/ng/mod.d.ts +3 -2
  470. package/dist/ng/nin.d.ts +13 -2
  471. package/dist/ng/nin.js +1 -11
  472. package/dist/ng/nin.js.map +1 -1
  473. package/dist/ni/mod.d.ts +3 -2
  474. package/dist/ni/ruc.d.ts +2 -3
  475. package/dist/ni/ruc.js +1 -23
  476. package/dist/ni/ruc.js.map +1 -1
  477. package/dist/nl/bsn.d.ts +2 -3
  478. package/dist/nl/bsn.js +2 -10
  479. package/dist/nl/bsn.js.map +1 -1
  480. package/dist/nl/kvk.d.ts +9 -2
  481. package/dist/nl/kvk.js +1 -7
  482. package/dist/nl/kvk.js.map +1 -1
  483. package/dist/nl/mod.d.ts +3 -2
  484. package/dist/nl/vat.d.ts +2 -3
  485. package/dist/nl/vat.js +4 -50
  486. package/dist/nl/vat.js.map +1 -1
  487. package/dist/no/fodselsnummer.d.ts +2 -3
  488. package/dist/no/fodselsnummer.js +3 -10
  489. package/dist/no/fodselsnummer.js.map +1 -1
  490. package/dist/no/mod.d.ts +3 -2
  491. package/dist/no/mva.d.ts +2 -3
  492. package/dist/no/mva.js +1 -8
  493. package/dist/no/mva.js.map +1 -1
  494. package/dist/no/orgnr.d.ts +2 -3
  495. package/dist/no/orgnr.js +2 -8
  496. package/dist/no/orgnr.js.map +1 -1
  497. package/dist/nz/ird.d.ts +2 -3
  498. package/dist/nz/ird.js +4 -13
  499. package/dist/nz/ird.js.map +1 -1
  500. package/dist/nz/mod.d.ts +3 -2
  501. package/dist/pa/mod.d.ts +3 -2
  502. package/dist/pa/ruc.d.ts +2 -3
  503. package/dist/pa/ruc.js +4 -19
  504. package/dist/pa/ruc.js.map +1 -1
  505. package/dist/patterns.d.ts +8 -10
  506. package/dist/patterns.js +83 -28
  507. package/dist/patterns.js.map +1 -1
  508. package/dist/pe/mod.d.ts +3 -2
  509. package/dist/pe/ruc.d.ts +2 -3
  510. package/dist/pe/ruc.js +10 -24
  511. package/dist/pe/ruc.js.map +1 -1
  512. package/dist/ph/mod.d.ts +3 -2
  513. package/dist/ph/philid.d.ts +14 -2
  514. package/dist/ph/philid.js +1 -12
  515. package/dist/ph/philid.js.map +1 -1
  516. package/dist/pk/cnic.d.ts +14 -2
  517. package/dist/pk/cnic.js +1 -12
  518. package/dist/pk/cnic.js.map +1 -1
  519. package/dist/pk/mod.d.ts +3 -2
  520. package/dist/pl/mod.d.ts +3 -2
  521. package/dist/pl/nip.d.ts +2 -3
  522. package/dist/pl/nip.js +2 -10
  523. package/dist/pl/nip.js.map +1 -1
  524. package/dist/pl/pesel.d.ts +2 -3
  525. package/dist/pl/pesel.js +4 -13
  526. package/dist/pl/pesel.js.map +1 -1
  527. package/dist/pl/regon.d.ts +2 -3
  528. package/dist/pl/regon.js +2 -11
  529. package/dist/pl/regon.js.map +1 -1
  530. package/dist/pt/cc.d.ts +2 -3
  531. package/dist/pt/cc.js +7 -13
  532. package/dist/pt/cc.js.map +1 -1
  533. package/dist/pt/mod.d.ts +3 -2
  534. package/dist/pt/vat.d.ts +2 -3
  535. package/dist/pt/vat.js +3 -11
  536. package/dist/pt/vat.js.map +1 -1
  537. package/dist/ro/cnp.d.ts +2 -3
  538. package/dist/ro/cnp.js +5 -14
  539. package/dist/ro/cnp.js.map +1 -1
  540. package/dist/ro/mod.d.ts +3 -2
  541. package/dist/ro/vat.d.ts +2 -3
  542. package/dist/ro/vat.js +13 -11
  543. package/dist/ro/vat.js.map +1 -1
  544. package/dist/rs/mod.d.ts +3 -2
  545. package/dist/rs/pib.d.ts +2 -3
  546. package/dist/rs/pib.js +1 -9
  547. package/dist/rs/pib.js.map +1 -1
  548. package/dist/ru/inn.d.ts +2 -3
  549. package/dist/ru/inn.js +2 -12
  550. package/dist/ru/inn.js.map +1 -1
  551. package/dist/ru/mod.d.ts +3 -2
  552. package/dist/se/mod.d.ts +3 -2
  553. package/dist/se/orgnr.d.ts +2 -3
  554. package/dist/se/orgnr.js +2 -9
  555. package/dist/se/orgnr.js.map +1 -1
  556. package/dist/se/personnummer.d.ts +2 -3
  557. package/dist/se/personnummer.js +8 -15
  558. package/dist/se/personnummer.js.map +1 -1
  559. package/dist/se/vat.d.ts +2 -3
  560. package/dist/se/vat.js +3 -10
  561. package/dist/se/vat.js.map +1 -1
  562. package/dist/sg/mod.d.ts +3 -2
  563. package/dist/sg/uen.d.ts +2 -3
  564. package/dist/sg/uen.js +47 -70
  565. package/dist/sg/uen.js.map +1 -1
  566. package/dist/si/emso.d.ts +2 -3
  567. package/dist/si/emso.js +12 -14
  568. package/dist/si/emso.js.map +1 -1
  569. package/dist/si/mod.d.ts +3 -2
  570. package/dist/si/vat.d.ts +2 -3
  571. package/dist/si/vat.js +3 -12
  572. package/dist/si/vat.js.map +1 -1
  573. package/dist/sk/dic.d.ts +2 -3
  574. package/dist/sk/dic.js +1 -0
  575. package/dist/sk/dic.js.map +1 -1
  576. package/dist/sk/ico.d.ts +2 -3
  577. package/dist/sk/ico.js +1 -0
  578. package/dist/sk/ico.js.map +1 -1
  579. package/dist/sk/mod.d.ts +3 -2
  580. package/dist/sk/rc.d.ts +4 -5
  581. package/dist/sk/rc.js +6 -2
  582. package/dist/sk/rc.js.map +1 -1
  583. package/dist/th/mod.d.ts +3 -2
  584. package/dist/th/tin.d.ts +2 -3
  585. package/dist/th/tin.js +1 -11
  586. package/dist/th/tin.js.map +1 -1
  587. package/dist/tr/mod.d.ts +3 -2
  588. package/dist/tr/tckimlik.d.ts +2 -3
  589. package/dist/tr/tckimlik.js +1 -20
  590. package/dist/tr/tckimlik.js.map +1 -1
  591. package/dist/tr/vkn.d.ts +2 -3
  592. package/dist/tr/vkn.js +1 -20
  593. package/dist/tr/vkn.js.map +1 -1
  594. package/dist/tw/mod.d.ts +3 -2
  595. package/dist/tw/ubn.d.ts +2 -3
  596. package/dist/tw/ubn.js +2 -12
  597. package/dist/tw/ubn.js.map +1 -1
  598. package/dist/types.d.ts +56 -21
  599. package/dist/ua/edrpou.d.ts +2 -3
  600. package/dist/ua/edrpou.js +5 -12
  601. package/dist/ua/edrpou.js.map +1 -1
  602. package/dist/ua/mod.d.ts +3 -2
  603. package/dist/us/ein.d.ts +12 -2
  604. package/dist/us/ein.js +88 -97
  605. package/dist/us/ein.js.map +1 -1
  606. package/dist/us/itin.d.ts +13 -2
  607. package/dist/us/itin.js +4 -15
  608. package/dist/us/itin.js.map +1 -1
  609. package/dist/us/mod.d.ts +3 -2
  610. package/dist/us/rtn.d.ts +2 -3
  611. package/dist/us/rtn.js +11 -23
  612. package/dist/us/rtn.js.map +1 -1
  613. package/dist/us/ssn.d.ts +13 -2
  614. package/dist/us/ssn.js +1 -11
  615. package/dist/us/ssn.js.map +1 -1
  616. package/dist/uy/mod.d.ts +3 -2
  617. package/dist/uy/rut.d.ts +2 -3
  618. package/dist/uy/rut.js +2 -15
  619. package/dist/uy/rut.js.map +1 -1
  620. package/dist/ve/mod.d.ts +3 -2
  621. package/dist/ve/rif.d.ts +2 -3
  622. package/dist/ve/rif.js +13 -26
  623. package/dist/ve/rif.js.map +1 -1
  624. package/dist/vn/mod.d.ts +3 -2
  625. package/dist/vn/mst.d.ts +2 -3
  626. package/dist/vn/mst.js +1 -12
  627. package/dist/vn/mst.js.map +1 -1
  628. package/dist/za/idnr.d.ts +2 -3
  629. package/dist/za/idnr.js +4 -16
  630. package/dist/za/idnr.js.map +1 -1
  631. package/dist/za/mod.d.ts +3 -2
  632. package/package.json +34 -21
  633. package/src/_checksums/mod1110.ts +1 -1
  634. package/src/_checksums/mod112.ts +7 -6
  635. package/src/_util/generate.ts +38 -0
  636. package/src/ad/nrt.ts +19 -7
  637. package/src/ae/eid.ts +7 -3
  638. package/src/ai/tin.ts +7 -3
  639. package/src/al/nipt.ts +7 -3
  640. package/src/am/tin.ts +7 -3
  641. package/src/ar/cbu.ts +9 -5
  642. package/src/ar/cuit.ts +22 -10
  643. package/src/ar/dni.ts +7 -3
  644. package/src/at/businessid.ts +7 -3
  645. package/src/at/tin.ts +7 -3
  646. package/src/at/uid.ts +7 -3
  647. package/src/at/vnr.ts +62 -12
  648. package/src/au/abn.ts +7 -3
  649. package/src/au/acn.ts +7 -3
  650. package/src/au/tfn.ts +7 -3
  651. package/src/az/voen.ts +9 -3
  652. package/src/ba/jmbg.ts +9 -7
  653. package/src/bd/nid.ts +11 -7
  654. package/src/be/bis.ts +8 -4
  655. package/src/be/nn.ts +7 -3
  656. package/src/be/vat.ts +7 -3
  657. package/src/bg/egn.ts +19 -10
  658. package/src/bg/pnf.ts +7 -3
  659. package/src/bg/vat.ts +8 -3
  660. package/src/bh/cpr.ts +17 -4
  661. package/src/bic.ts +26 -20
  662. package/src/br/cnpj.ts +7 -3
  663. package/src/br/cpf.ts +7 -3
  664. package/src/by/unp.ts +19 -9
  665. package/src/bz/tin.ts +19 -4
  666. package/src/ca/bn.ts +7 -3
  667. package/src/ca/sin.ts +7 -3
  668. package/src/ch/ssn.ts +7 -3
  669. package/src/ch/uid.ts +7 -3
  670. package/src/ch/vat.ts +9 -5
  671. package/src/cl/rut.ts +11 -5
  672. package/src/cn/ric.ts +11 -7
  673. package/src/cn/uscc.ts +27 -11
  674. package/src/co/nit.ts +14 -6
  675. package/src/cr/cpf.ts +11 -6
  676. package/src/creditcard.ts +10 -6
  677. package/src/cu/ni.ts +28 -7
  678. package/src/cy/vat.ts +7 -3
  679. package/src/cz/dic.ts +9 -4
  680. package/src/cz/ico.ts +7 -3
  681. package/src/cz/rc.ts +61 -29
  682. package/src/de/handelsreg.ts +21 -6
  683. package/src/de/idnr.ts +10 -3
  684. package/src/de/stnr.ts +11 -3
  685. package/src/de/svnr.ts +14 -5
  686. package/src/de/vat.ts +7 -3
  687. package/src/dk/cpr.ts +23 -8
  688. package/src/dk/cvr.ts +7 -3
  689. package/src/dk/vat.ts +8 -3
  690. package/src/do/rnc.ts +9 -5
  691. package/src/ec/ruc.ts +9 -5
  692. package/src/ee/ik.ts +21 -10
  693. package/src/ee/registrikood.ts +12 -7
  694. package/src/ee/vat.ts +7 -3
  695. package/src/eg/tn.ts +7 -3
  696. package/src/es/cif.ts +10 -7
  697. package/src/es/dni.ts +7 -3
  698. package/src/es/nie.ts +18 -9
  699. package/src/es/nss.ts +7 -3
  700. package/src/es/vat.ts +13 -5
  701. package/src/eu/vat.ts +55 -6
  702. package/src/fi/hetu.ts +26 -8
  703. package/src/fi/vat.ts +8 -3
  704. package/src/fi/ytunnus.ts +7 -3
  705. package/src/fr/nif.ts +7 -3
  706. package/src/fr/nir.ts +9 -7
  707. package/src/fr/siren.ts +7 -3
  708. package/src/fr/siret.ts +7 -3
  709. package/src/fr/tva.ts +7 -3
  710. package/src/gb/nino.ts +18 -13
  711. package/src/gb/sedol.ts +21 -15
  712. package/src/gb/utr.ts +7 -3
  713. package/src/gb/vat.ts +7 -3
  714. package/src/ge/pin.ts +7 -3
  715. package/src/gh/tin.ts +11 -6
  716. package/src/gr/amka.ts +7 -3
  717. package/src/gr/vat.ts +7 -3
  718. package/src/gt/nit.ts +13 -6
  719. package/src/hk/hkid.ts +9 -4
  720. package/src/hr/vat.ts +7 -3
  721. package/src/hu/vat.ts +8 -3
  722. package/src/iban.ts +7 -3
  723. package/src/id/npwp.ts +7 -3
  724. package/src/ie/pps.ts +7 -3
  725. package/src/ie/vat.ts +7 -3
  726. package/src/il/idnr.ts +7 -3
  727. package/src/in/aadhaar.ts +7 -3
  728. package/src/in/gstin.ts +10 -4
  729. package/src/in/pan.ts +15 -6
  730. package/src/index.ts +6 -0
  731. package/src/iq/nid.ts +7 -3
  732. package/src/ir/nid.ts +7 -3
  733. package/src/is/kennitala.ts +7 -3
  734. package/src/is/vsk.ts +7 -3
  735. package/src/isin.ts +17 -7
  736. package/src/it/codicefiscale.ts +49 -7
  737. package/src/it/iva.ts +7 -3
  738. package/src/jp/cn.ts +7 -3
  739. package/src/jp/mynumber.ts +7 -3
  740. package/src/kr/brn.ts +7 -3
  741. package/src/kr/rrn.ts +27 -8
  742. package/src/kw/civil.ts +31 -14
  743. package/src/kz/iin.ts +9 -8
  744. package/src/lei.ts +7 -3
  745. package/src/li/peid.ts +7 -3
  746. package/src/lk/nic.ts +31 -8
  747. package/src/lt/asmens.ts +8 -4
  748. package/src/lt/vat.ts +8 -3
  749. package/src/lu/vat.ts +8 -3
  750. package/src/luhn.ts +10 -3
  751. package/src/lv/vat.ts +53 -23
  752. package/src/ma/ice.ts +7 -3
  753. package/src/mc/tva.ts +9 -5
  754. package/src/md/idno.ts +7 -3
  755. package/src/me/pib.ts +7 -3
  756. package/src/mk/edb.ts +7 -3
  757. package/src/mt/vat.ts +8 -3
  758. package/src/mu/brn.ts +7 -3
  759. package/src/mx/clabe.ts +7 -3
  760. package/src/mx/curp.ts +47 -10
  761. package/src/mx/rfc.ts +42 -7
  762. package/src/my/nric.ts +33 -8
  763. package/src/ng/nin.ts +7 -3
  764. package/src/ni/ruc.ts +7 -3
  765. package/src/nl/bsn.ts +7 -3
  766. package/src/nl/kvk.ts +7 -3
  767. package/src/nl/vat.ts +18 -69
  768. package/src/no/fodselsnummer.ts +12 -7
  769. package/src/no/mva.ts +9 -5
  770. package/src/no/orgnr.ts +7 -3
  771. package/src/nz/ird.ts +12 -8
  772. package/src/pa/ruc.ts +39 -11
  773. package/src/patterns.ts +184 -46
  774. package/src/pe/ruc.ts +13 -10
  775. package/src/ph/philid.ts +7 -3
  776. package/src/pk/cnic.ts +9 -3
  777. package/src/pl/nip.ts +7 -3
  778. package/src/pl/pesel.ts +9 -7
  779. package/src/pl/regon.ts +7 -3
  780. package/src/pt/cc.ts +13 -7
  781. package/src/pt/vat.ts +8 -3
  782. package/src/ro/cnp.ts +16 -8
  783. package/src/ro/vat.ts +8 -3
  784. package/src/rs/pib.ts +7 -3
  785. package/src/ru/inn.ts +9 -5
  786. package/src/se/orgnr.ts +7 -3
  787. package/src/se/personnummer.ts +35 -32
  788. package/src/se/vat.ts +8 -3
  789. package/src/sg/uen.ts +44 -23
  790. package/src/si/emso.ts +37 -11
  791. package/src/si/vat.ts +8 -3
  792. package/src/sk/dic.ts +8 -4
  793. package/src/sk/ico.ts +3 -2
  794. package/src/sk/rc.ts +17 -4
  795. package/src/th/tin.ts +7 -3
  796. package/src/tr/tckimlik.ts +7 -3
  797. package/src/tr/vkn.ts +7 -3
  798. package/src/tw/ubn.ts +9 -5
  799. package/src/types.ts +69 -7
  800. package/src/ua/edrpou.ts +10 -5
  801. package/src/us/ein.ts +95 -91
  802. package/src/us/itin.ts +14 -11
  803. package/src/us/rtn.ts +32 -19
  804. package/src/us/ssn.ts +7 -3
  805. package/src/uy/rut.ts +9 -5
  806. package/src/ve/rif.ts +19 -12
  807. package/src/vn/mst.ts +7 -3
  808. package/src/za/idnr.ts +9 -7
package/dist/bg/vat.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/bg/vat.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid 9-digit Bulgarian VAT. */
9
8
  declare const generate: () => string;
10
9
  /** Bulgarian VAT Number. */
11
- declare const vat: Validator;
10
+ declare const vat: CountryValidator<"BG">;
12
11
  //#endregion
13
12
  export { compact, vat as default, format, generate, validate };
14
13
  //# sourceMappingURL=vat.d.ts.map
package/dist/bg/vat.js CHANGED
@@ -1,17 +1,9 @@
1
+ import { weightedSum } from "../_checksums/weighted-sum.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
5
  import { isdigits } from "../_util/strings.js";
5
- import { weightedSum } from "../_checksums/weighted-sum.js";
6
6
  //#region src/bg/vat.ts
7
- /**
8
- * ИН по ДДС (Bulgarian VAT number).
9
- *
10
- * 9 or 10 digits with weighted checksum.
11
- *
12
- * @see https://www.vatify.eu/bulgaria-vat-number.html
13
- * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/bulgaria-tin.pdf
14
- */
15
7
  const compact = (value) => {
16
8
  let v = clean(value, " -/.");
17
9
  if (v.startsWith("BG") || v.startsWith("bg")) v = v.slice(2);
@@ -138,9 +130,11 @@ const vat = {
138
130
  abbreviation: "ИН по ДДС",
139
131
  aliases: ["ДДС", "идентификационен номер по ДДС"],
140
132
  candidatePattern: "BG\\d{9,10}",
133
+ scope: "country",
141
134
  country: "BG",
142
135
  entityType: "any",
143
136
  sourceUrl: "https://www.nra.bg/",
137
+ lengths: [9, 10],
144
138
  examples: ["175074752"],
145
139
  compact,
146
140
  format,
@@ -1 +1 @@
1
- {"version":3,"file":"vat.js","names":[],"sources":["../../src/bg/vat.ts"],"sourcesContent":["/**\n * ИН по ДДС (Bulgarian VAT number).\n *\n * 9 or 10 digits with weighted checksum.\n *\n * @see https://www.vatify.eu/bulgaria-vat-number.html\n * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/bulgaria-tin.pdf\n */\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\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 let v = clean(value, \" -/.\");\n if (v.startsWith(\"BG\") || v.startsWith(\"bg\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst d = (v: string, i: number): number => Number(v[i]);\n\nconst WEIGHTS_9_PASS1 = [1, 2, 3, 4, 5, 6, 7, 8];\nconst WEIGHTS_9_PASS2 = [3, 4, 5, 6, 7, 8, 9, 10];\nconst WEIGHTS_EGN = [2, 4, 8, 5, 10, 9, 7, 3, 6];\nconst WEIGHTS_PNF = [21, 19, 17, 13, 11, 9, 7, 3, 1];\nconst WEIGHTS_OTHER = [4, 3, 2, 7, 6, 5, 4, 3, 2];\n\nconst validate9 = (v: string): boolean => {\n let check = weightedSum(\n v.slice(0, 8),\n WEIGHTS_9_PASS1,\n 11,\n );\n if (check === 10) {\n check = weightedSum(v.slice(0, 8), WEIGHTS_9_PASS2, 11);\n }\n return check % 10 === d(v, 8);\n};\n\n/**\n * Validate a 10-digit EGN (personal code).\n * First 6 digits encode birth date (YYMMDD with month\n * offsets: +20 for 1800s, +40 for 2000s). Check digit\n * uses weights [2,4,8,5,10,9,7,3,6], sum % 11 % 10.\n */\nconst validateEgn = (v: string): boolean => {\n const year = d(v, 0) * 10 + d(v, 1);\n let month = d(v, 2) * 10 + d(v, 3);\n const day = d(v, 4) * 10 + d(v, 5);\n let fullYear = year + 1900;\n if (month > 40) {\n fullYear += 100;\n month -= 40;\n } else if (month > 20) {\n fullYear -= 100;\n month -= 20;\n }\n // Validate the birth date\n const date = new Date(fullYear, month - 1, day);\n if (\n date.getFullYear() !== fullYear ||\n date.getMonth() !== month - 1 ||\n date.getDate() !== day\n ) {\n return false;\n }\n const sum = weightedSum(v.slice(0, 9), WEIGHTS_EGN, 11);\n return sum % 10 === d(v, 9);\n};\n\n/**\n * Validate a 10-digit PNF (foreigner personal number).\n * Weights [21,19,17,13,11,9,7,3,1], sum % 10.\n */\nconst validatePnf = (v: string): boolean => {\n const sum = weightedSum(v.slice(0, 9), WEIGHTS_PNF, 10);\n return sum === d(v, 9);\n};\n\n/**\n * Validate a 10-digit \"other\" VAT number.\n * Weights [4,3,2,7,6,5,4,3,2], (11 - sum%11) % 11.\n */\nconst validateOther = (v: string): boolean => {\n const sum = weightedSum(v.slice(0, 9), WEIGHTS_OTHER, 11);\n return (11 - sum) % 11 === d(v, 9);\n};\n\nconst validate10 = (v: string): boolean =>\n validateEgn(v) || validatePnf(v) || validateOther(v);\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9 && v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"Bulgarian VAT number must be 9 or 10 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Bulgarian VAT number must contain only digits\",\n );\n }\n const valid =\n v.length === 9 ? validate9(v) : validate10(v);\n if (!valid) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Bulgarian VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `BG${compact(value)}`;\n\n/** Generate a random valid 9-digit Bulgarian VAT. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(9);\n if (validate(c).valid) return c;\n }\n};\n\n/** Bulgarian VAT Number. */\nconst vat: Validator = {\n name: \"Bulgarian VAT Number\",\n localName: \"ИН по ДДС\",\n abbreviation: \"ИН по ДДС\",\n aliases: [\n \"ДДС\",\n \"идентификационен номер по ДДС\",\n ] as const,\n candidatePattern: \"BG\\\\d{9,10}\",\n country: \"BG\",\n entityType: \"any\",\n sourceUrl: \"https://www.nra.bg/\",\n examples: [\"175074752\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":"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"}
1
+ {"version":3,"file":"vat.js","names":[],"sources":["../../src/bg/vat.ts"],"sourcesContent":["/**\n * ИН по ДДС (Bulgarian VAT number).\n *\n * 9 or 10 digits with weighted checksum.\n *\n * @see https://www.vatify.eu/bulgaria-vat-number.html\n * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/bulgaria-tin.pdf\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\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 let v = clean(value, \" -/.\");\n if (v.startsWith(\"BG\") || v.startsWith(\"bg\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst d = (v: string, i: number): number => Number(v[i]);\n\nconst WEIGHTS_9_PASS1 = [1, 2, 3, 4, 5, 6, 7, 8];\nconst WEIGHTS_9_PASS2 = [3, 4, 5, 6, 7, 8, 9, 10];\nconst WEIGHTS_EGN = [2, 4, 8, 5, 10, 9, 7, 3, 6];\nconst WEIGHTS_PNF = [21, 19, 17, 13, 11, 9, 7, 3, 1];\nconst WEIGHTS_OTHER = [4, 3, 2, 7, 6, 5, 4, 3, 2];\n\nconst validate9 = (v: string): boolean => {\n let check = weightedSum(\n v.slice(0, 8),\n WEIGHTS_9_PASS1,\n 11,\n );\n if (check === 10) {\n check = weightedSum(v.slice(0, 8), WEIGHTS_9_PASS2, 11);\n }\n return check % 10 === d(v, 8);\n};\n\n/**\n * Validate a 10-digit EGN (personal code).\n * First 6 digits encode birth date (YYMMDD with month\n * offsets: +20 for 1800s, +40 for 2000s). Check digit\n * uses weights [2,4,8,5,10,9,7,3,6], sum % 11 % 10.\n */\nconst validateEgn = (v: string): boolean => {\n const year = d(v, 0) * 10 + d(v, 1);\n let month = d(v, 2) * 10 + d(v, 3);\n const day = d(v, 4) * 10 + d(v, 5);\n let fullYear = year + 1900;\n if (month > 40) {\n fullYear += 100;\n month -= 40;\n } else if (month > 20) {\n fullYear -= 100;\n month -= 20;\n }\n // Validate the birth date\n const date = new Date(fullYear, month - 1, day);\n if (\n date.getFullYear() !== fullYear ||\n date.getMonth() !== month - 1 ||\n date.getDate() !== day\n ) {\n return false;\n }\n const sum = weightedSum(v.slice(0, 9), WEIGHTS_EGN, 11);\n return sum % 10 === d(v, 9);\n};\n\n/**\n * Validate a 10-digit PNF (foreigner personal number).\n * Weights [21,19,17,13,11,9,7,3,1], sum % 10.\n */\nconst validatePnf = (v: string): boolean => {\n const sum = weightedSum(v.slice(0, 9), WEIGHTS_PNF, 10);\n return sum === d(v, 9);\n};\n\n/**\n * Validate a 10-digit \"other\" VAT number.\n * Weights [4,3,2,7,6,5,4,3,2], (11 - sum%11) % 11.\n */\nconst validateOther = (v: string): boolean => {\n const sum = weightedSum(v.slice(0, 9), WEIGHTS_OTHER, 11);\n return (11 - sum) % 11 === d(v, 9);\n};\n\nconst validate10 = (v: string): boolean =>\n validateEgn(v) || validatePnf(v) || validateOther(v);\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9 && v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"Bulgarian VAT number must be 9 or 10 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Bulgarian VAT number must contain only digits\",\n );\n }\n const valid =\n v.length === 9 ? validate9(v) : validate10(v);\n if (!valid) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Bulgarian VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `BG${compact(value)}`;\n\n/** Generate a random valid 9-digit Bulgarian VAT. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(9);\n if (validate(c).valid) return c;\n }\n};\n\n/** Bulgarian VAT Number. */\nconst vat: CountryValidator<\"BG\"> = {\n name: \"Bulgarian VAT Number\",\n localName: \"ИН по ДДС\",\n abbreviation: \"ИН по ДДС\",\n aliases: [\n \"ДДС\",\n \"идентификационен номер по ДДС\",\n ] as const,\n candidatePattern: \"BG\\\\d{9,10}\",\n scope: \"country\",\n country: \"BG\",\n entityType: \"any\",\n sourceUrl: \"https://www.nra.bg/\",\n lengths: [9, 10] as const,\n examples: [\"175074752\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":"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"}
package/dist/bh/cpr.d.ts CHANGED
@@ -1,12 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/bh/cpr.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
7
+ /** Generate a random structurally valid Bahrain CPR. */
8
+ declare const generate: () => string;
8
9
  /** Bahrain Central Population Registration number. */
9
- declare const cpr: Validator;
10
+ declare const cpr: CountryValidator<"BH">;
10
11
  //#endregion
11
- export { compact, cpr as default, format, validate };
12
+ export { compact, cpr as default, format, generate, validate };
12
13
  //# sourceMappingURL=cpr.d.ts.map
package/dist/bh/cpr.js CHANGED
@@ -1,24 +1,8 @@
1
1
  import { clean } from "../_util/clean.js";
2
+ import { randomDigits, randomInt } from "../_util/generate.js";
2
3
  import { err } from "../_util/result.js";
3
4
  import { isdigits } from "../_util/strings.js";
4
5
  //#region src/bh/cpr.ts
5
- /**
6
- * CPR (Central Population Registration number, Bahrain).
7
- *
8
- * 9-digit personal identification number:
9
- * YYMM = year and month of birth
10
- * NNNN = serial number
11
- * C = check digit
12
- *
13
- * The check digit algorithm is not publicly
14
- * documented; validation is structural only
15
- * (length, digits, and valid birth month).
16
- *
17
- * Note: a minority of older CPR numbers do not
18
- * follow the YYMMNNNNC format.
19
- *
20
- * @see https://www.bahrain.bh/wps/portal/IDInfo_en
21
- */
22
6
  const compact = (value) => clean(value, " -");
23
7
  const validate = (value) => {
24
8
  const v = compact(value);
@@ -35,6 +19,10 @@ const format = (value) => {
35
19
  const v = compact(value);
36
20
  return `${v.slice(0, 2)}-${v.slice(2, 4)}-${v.slice(4)}`;
37
21
  };
22
+ /** Generate a random structurally valid Bahrain CPR. */
23
+ const generate = () => {
24
+ return `${String(randomInt(0, 99)).padStart(2, "0")}${String(randomInt(1, 12)).padStart(2, "0")}${randomDigits(5)}`;
25
+ };
38
26
  /** Bahrain Central Population Registration number. */
39
27
  const cpr = {
40
28
  name: "Central Population Registration Number",
@@ -42,6 +30,7 @@ const cpr = {
42
30
  abbreviation: "CPR",
43
31
  aliases: ["CPR", "الرقم السكاني"],
44
32
  candidatePattern: "\\d{9}",
33
+ scope: "country",
45
34
  country: "BH",
46
35
  entityType: "person",
47
36
  lengths: [9],
@@ -50,9 +39,10 @@ const cpr = {
50
39
  sourceUrl: "https://www.bahrain.bh/wps/portal/IDInfo_en",
51
40
  compact,
52
41
  format,
53
- validate
42
+ validate,
43
+ generate
54
44
  };
55
45
  //#endregion
56
- export { compact, cpr as default, format, validate };
46
+ export { compact, cpr as default, format, generate, validate };
57
47
 
58
48
  //# sourceMappingURL=cpr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cpr.js","names":[],"sources":["../../src/bh/cpr.ts"],"sourcesContent":["/**\n * CPR (Central Population Registration number, Bahrain).\n *\n * 9-digit personal identification number:\n * YYMM = year and month of birth\n * NNNN = serial number\n * C = check digit\n *\n * The check digit algorithm is not publicly\n * documented; validation is structural only\n * (length, digits, and valid birth month).\n *\n * Note: a minority of older CPR numbers do not\n * follow the YYMMNNNNC format.\n *\n * @see https://www.bahrain.bh/wps/portal/IDInfo_en\n */\n\nimport { clean } from \"#util/clean\";\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\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Bahrain CPR must be 9 digits\",\n );\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Bahrain CPR must contain only digits\",\n );\n }\n\n // Validate birth month (digits 3-4) is 01-12\n const mm = Number(v.slice(2, 4));\n if (mm < 1 || mm > 12) {\n return err(\n \"INVALID_COMPONENT\",\n \"CPR birth month must be 01-12\",\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, 2)}-${v.slice(2, 4)}-${v.slice(4)}`;\n};\n\n/** Bahrain Central Population Registration number. */\nconst cpr: Validator = {\n name: \"Central Population Registration Number\",\n localName: \"الرقم السكاني\",\n abbreviation: \"CPR\",\n aliases: [\"CPR\", \"الرقم السكاني\"] as const,\n candidatePattern: \"\\\\d{9}\",\n country: \"BH\",\n entityType: \"person\",\n lengths: [9] as const,\n examples: [\"890112345\", \"000612345\"] as const,\n description: \"9-digit personal identification number\",\n sourceUrl: \"https://www.bahrain.bh/wps/portal/IDInfo_en\",\n compact,\n format,\n validate,\n};\n\nexport default cpr;\nexport { compact, format, validate };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,WAAW,EACf,QAAO,IACL,kBACA,+BACD;AAGH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,uCACD;CAIH,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;AAChC,KAAI,KAAK,KAAK,KAAK,GACjB,QAAO,IACL,qBACA,gCACD;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,EAAE;;;AAIxD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,gBAAgB;CACjC,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,aAAa,YAAY;CACpC,aAAa;CACb,WAAW;CACX;CACA;CACA;CACD"}
1
+ {"version":3,"file":"cpr.js","names":[],"sources":["../../src/bh/cpr.ts"],"sourcesContent":["/**\n * CPR (Central Population Registration number, Bahrain).\n *\n * 9-digit personal identification number:\n * YYMM = year and month of birth\n * NNNN = serial number\n * C = check digit\n *\n * The check digit algorithm is not publicly\n * documented; validation is structural only\n * (length, digits, and valid birth month).\n *\n * Note: a minority of older CPR numbers do not\n * follow the YYMMNNNNC format.\n *\n * @see https://www.bahrain.bh/wps/portal/IDInfo_en\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\";\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\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Bahrain CPR must be 9 digits\",\n );\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Bahrain CPR must contain only digits\",\n );\n }\n\n // Validate birth month (digits 3-4) is 01-12\n const mm = Number(v.slice(2, 4));\n if (mm < 1 || mm > 12) {\n return err(\n \"INVALID_COMPONENT\",\n \"CPR birth month must be 01-12\",\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, 2)}-${v.slice(2, 4)}-${v.slice(4)}`;\n};\n\n/** Generate a random structurally valid Bahrain CPR. */\nconst generate = (): string => {\n const yy = String(randomInt(0, 99)).padStart(2, \"0\");\n const mm = String(randomInt(1, 12)).padStart(2, \"0\");\n return `${yy}${mm}${randomDigits(5)}`;\n};\n\n/** Bahrain Central Population Registration number. */\nconst cpr: CountryValidator<\"BH\"> = {\n name: \"Central Population Registration Number\",\n localName: \"الرقم السكاني\",\n abbreviation: \"CPR\",\n aliases: [\"CPR\", \"الرقم السكاني\"] as const,\n candidatePattern: \"\\\\d{9}\",\n scope: \"country\",\n country: \"BH\",\n entityType: \"person\",\n lengths: [9] as const,\n examples: [\"890112345\", \"000612345\"] as const,\n description: \"9-digit personal identification number\",\n sourceUrl: \"https://www.bahrain.bh/wps/portal/IDInfo_en\",\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cpr;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;AA4BA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,8BACF;CAGF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,sCACF;CAIF,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAC/B,IAAI,KAAK,KAAK,KAAK,IACjB,OAAO,IACL,qBACA,+BACF;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,CAAC;AACvD;;AAGA,MAAM,iBAAyB;CAG7B,OAAO,GAFI,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SAAS,GAAG,GAErC,IADA,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SAAS,GAAG,GAChC,IAAI,aAAa,CAAC;AACpC;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,eAAe;CAChC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,CAAC;CACX,UAAU,CAAC,aAAa,WAAW;CACnC,aAAa;CACb,WAAW;CACX;CACA;CACA;CACA;AACF"}
package/dist/bh/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import cpr from "./cpr.js";
3
2
 
4
3
  //#region src/bh/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { cpr };
6
+ }
6
7
  //#endregion
7
8
  export { cpr, mod_d_exports };
8
9
  //# sourceMappingURL=mod.d.ts.map
package/dist/bic.d.ts CHANGED
@@ -1,13 +1,24 @@
1
- import { ValidateResult, Validator } from "./types.js";
1
+ import { GlobalValidator, ValidateResult } from "./types.js";
2
2
 
3
3
  //#region src/bic.d.ts
4
4
  /** Generate a random valid BIC (8-character). */
5
5
  declare const generate: () => string;
6
+ /**
7
+ * BIC (Business Identifier Code).
8
+ *
9
+ * ISO 9362. 8 or 11 character code identifying
10
+ * financial institutions. Format:
11
+ * [A-Z]{4} (institution) + [A-Z]{2} (country) +
12
+ * [0-9A-Z]{2} (location) + [0-9A-Z]{3} (branch,
13
+ * optional).
14
+ *
15
+ * @see https://www.swift.com/
16
+ */
6
17
  declare const compact: (value: string) => string;
7
18
  declare const validate: (value: string) => ValidateResult;
8
19
  declare const format: (value: string) => string;
9
20
  /** Business Identifier Code (SWIFT/BIC). */
10
- declare const bic: Validator;
21
+ declare const bic: GlobalValidator;
11
22
  //#endregion
12
23
  export { compact, bic as default, format, generate, validate };
13
24
  //# sourceMappingURL=bic.d.ts.map
package/dist/bic.js CHANGED
@@ -1,35 +1,22 @@
1
1
  import { clean } from "./_util/clean.js";
2
- import { randomInt } from "./_util/generate.js";
2
+ import { randomChar, randomInt, randomPick } from "./_util/generate.js";
3
3
  import { err } from "./_util/result.js";
4
4
  //#region src/bic.ts
5
- /**
6
- * BIC (Business Identifier Code).
7
- *
8
- * ISO 9362. 8 or 11 character code identifying
9
- * financial institutions. Format:
10
- * [A-Z]{4} (institution) + [A-Z]{2} (country) +
11
- * [0-9A-Z]{2} (location) + [0-9A-Z]{3} (branch,
12
- * optional).
13
- *
14
- * @see https://www.swift.com/
15
- */
5
+ const BIC_ALPHANUM = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
6
+ const BIC_COUNTRIES = [
7
+ "DE",
8
+ "GB",
9
+ "US",
10
+ "FR",
11
+ "CH",
12
+ "NL",
13
+ "AT"
14
+ ];
16
15
  /** Generate a random valid BIC (8-character). */
17
16
  const generate = () => {
18
17
  const randomLetter = () => String.fromCodePoint(65 + randomInt(0, 25));
19
- const randomAlphaNum = () => {
20
- return "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"[randomInt(0, 35)];
21
- };
22
- const countries = [
23
- "DE",
24
- "GB",
25
- "US",
26
- "FR",
27
- "CH",
28
- "NL",
29
- "AT"
30
- ];
31
- const country = countries[randomInt(0, countries.length - 1)];
32
- return `${randomLetter() + randomLetter() + randomLetter() + randomLetter()}${country}${randomAlphaNum() + randomAlphaNum()}`;
18
+ const country = randomPick(BIC_COUNTRIES);
19
+ return `${randomLetter() + randomLetter() + randomLetter() + randomLetter()}${country}${randomChar(BIC_ALPHANUM) + randomChar(BIC_ALPHANUM)}`;
33
20
  };
34
21
  const BIC_RE = /^[A-Z]{4}[A-Z]{2}[0-9A-Z]{2}([0-9A-Z]{3})?$/;
35
22
  const compact = (value) => clean(value, " -").toUpperCase();
@@ -49,6 +36,7 @@ const format = (value) => {
49
36
  };
50
37
  /** Business Identifier Code (SWIFT/BIC). */
51
38
  const bic = {
39
+ scope: "global",
52
40
  name: "Business Identifier Code",
53
41
  localName: "Business Identifier Code",
54
42
  abbreviation: "BIC",
package/dist/bic.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bic.js","names":[],"sources":["../src/bic.ts"],"sourcesContent":["/** Generate a random valid BIC (8-character). */\nconst generate = (): string => {\n const randomLetter = (): string =>\n String.fromCodePoint(65 + randomInt(0, 25));\n const randomAlphaNum = (): string => {\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n return chars[randomInt(0, chars.length - 1)]!;\n };\n const countries = [\n \"DE\",\n \"GB\",\n \"US\",\n \"FR\",\n \"CH\",\n \"NL\",\n \"AT\",\n ];\n const country =\n countries[randomInt(0, countries.length - 1)]!;\n const bank =\n randomLetter() +\n randomLetter() +\n randomLetter() +\n randomLetter();\n const location = randomAlphaNum() + randomAlphaNum();\n return `${bank}${country}${location}`;\n};\n\n/**\n * BIC (Business Identifier Code).\n *\n * ISO 9362. 8 or 11 character code identifying\n * financial institutions. Format:\n * [A-Z]{4} (institution) + [A-Z]{2} (country) +\n * [0-9A-Z]{2} (location) + [0-9A-Z]{3} (branch,\n * optional).\n *\n * @see https://www.swift.com/\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nimport type { ValidateResult, Validator } from \"./types\";\n\nconst BIC_RE =\n /^[A-Z]{4}[A-Z]{2}[0-9A-Z]{2}([0-9A-Z]{3})?$/;\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 !== 8 && v.length !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"BIC must be 8 or 11 characters\",\n );\n }\n if (!BIC_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"BIC must be 8 or 11 alphanumeric characters\",\n );\n }\n // Country code at positions 4-5 is already\n // validated as [A-Z]{2} by the regex above.\n // SWIFT accepts all ISO 3166-1 alpha-2 codes\n // plus XK (Kosovo); we don't restrict further.\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 11) {\n return `${v.slice(0, 4)} ${v.slice(4, 6)} ${v.slice(6, 8)} ${v.slice(8)}`;\n }\n return `${v.slice(0, 4)} ${v.slice(4, 6)} ${v.slice(6)}`;\n};\n\n/** Business Identifier Code (SWIFT/BIC). */\nconst bic: Validator = {\n name: \"Business Identifier Code\",\n localName: \"Business Identifier Code\",\n abbreviation: \"BIC\",\n aliases: [\"BIC\", \"SWIFT\", \"BIC/SWIFT\"] as const,\n candidatePattern: \"[A-Z]{6}[A-Z0-9]{2}(?:[A-Z0-9]{3})?\",\n entityType: \"company\",\n sourceUrl: \"https://www.swift.com/\",\n examples: [\"DEUTDEFF\", \"DEUTDEFF500\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default bic;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;AACA,MAAM,iBAAyB;CAC7B,MAAM,qBACJ,OAAO,cAAc,KAAK,UAAU,GAAG,GAAG,CAAC;CAC7C,MAAM,uBAA+B;AAEnC,SADc,uCACD,UAAU,GAAG,GAAiB;;CAE7C,MAAM,YAAY;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM,UACJ,UAAU,UAAU,GAAG,UAAU,SAAS,EAAE;AAO9C,QAAO,GALL,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GAEC,UADA,gBAAgB,GAAG,gBAAgB;;AAsBtD,MAAM,SACJ;AAEF,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,CAAC,aAAa;AAElC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GACjC,QAAO,IACL,kBACA,iCACD;AAEH,KAAI,CAAC,OAAO,KAAK,EAAE,CACjB,QAAO,IACL,kBACA,8CACD;AAMH,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,EAAE;AAEzE,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;;;AAIxD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAO;EAAS;EAAY;CACtC,kBAAkB;CAClB,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,YAAY,cAAc;CACrC;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"bic.js","names":[],"sources":["../src/bic.ts"],"sourcesContent":["const BIC_ALPHANUM = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\nconst BIC_COUNTRIES = [\n \"DE\",\n \"GB\",\n \"US\",\n \"FR\",\n \"CH\",\n \"NL\",\n \"AT\",\n] as const;\n\n/** Generate a random valid BIC (8-character). */\nconst generate = (): string => {\n const randomLetter = (): string =>\n String.fromCodePoint(65 + randomInt(0, 25));\n const country = randomPick(BIC_COUNTRIES);\n const bank =\n randomLetter() +\n randomLetter() +\n randomLetter() +\n randomLetter();\n const location =\n randomChar(BIC_ALPHANUM) + randomChar(BIC_ALPHANUM);\n return `${bank}${country}${location}`;\n};\n\n/**\n * BIC (Business Identifier Code).\n *\n * ISO 9362. 8 or 11 character code identifying\n * financial institutions. Format:\n * [A-Z]{4} (institution) + [A-Z]{2} (country) +\n * [0-9A-Z]{2} (location) + [0-9A-Z]{3} (branch,\n * optional).\n *\n * @see https://www.swift.com/\n */\n\nimport type {\n ValidateResult,\n GlobalValidator,\n} from \"./types\";\n\nimport { clean } from \"#util/clean\";\nimport {\n randomChar,\n randomInt,\n randomPick,\n} from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nconst BIC_RE =\n /^[A-Z]{4}[A-Z]{2}[0-9A-Z]{2}([0-9A-Z]{3})?$/;\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 !== 8 && v.length !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"BIC must be 8 or 11 characters\",\n );\n }\n if (!BIC_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"BIC must be 8 or 11 alphanumeric characters\",\n );\n }\n // Country code at positions 4-5 is already\n // validated as [A-Z]{2} by the regex above.\n // SWIFT accepts all ISO 3166-1 alpha-2 codes\n // plus XK (Kosovo); we don't restrict further.\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 11) {\n return `${v.slice(0, 4)} ${v.slice(4, 6)} ${v.slice(6, 8)} ${v.slice(8)}`;\n }\n return `${v.slice(0, 4)} ${v.slice(4, 6)} ${v.slice(6)}`;\n};\n\n/** Business Identifier Code (SWIFT/BIC). */\nconst bic: GlobalValidator = {\n scope: \"global\",\n name: \"Business Identifier Code\",\n localName: \"Business Identifier Code\",\n abbreviation: \"BIC\",\n aliases: [\"BIC\", \"SWIFT\", \"BIC/SWIFT\"] as const,\n candidatePattern: \"[A-Z]{6}[A-Z0-9]{2}(?:[A-Z0-9]{3})?\",\n entityType: \"company\",\n sourceUrl: \"https://www.swift.com/\",\n examples: [\"DEUTDEFF\", \"DEUTDEFF500\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default bic;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;AAAA,MAAM,eAAe;AACrB,MAAM,gBAAgB;CACpB;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAM,iBAAyB;CAC7B,MAAM,qBACJ,OAAO,cAAc,KAAK,UAAU,GAAG,EAAE,CAAC;CAC5C,MAAM,UAAU,WAAW,aAAa;CAQxC,OAAO,GANL,aAAa,IACb,aAAa,IACb,aAAa,IACb,aAAa,IAGE,UADf,WAAW,YAAY,IAAI,WAAW,YAAY;AAEtD;AA2BA,MAAM,SACJ;AAEF,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,EAAE,YAAY;AAEjC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,IACjC,OAAO,IACL,kBACA,gCACF;CAEF,IAAI,CAAC,OAAO,KAAK,CAAC,GAChB,OAAO,IACL,kBACA,6CACF;CAMF,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,CAAC;CAExE,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;AACvD;;AAGA,MAAM,MAAuB;CAC3B,OAAO;CACP,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAO;EAAS;CAAW;CACrC,kBAAkB;CAClB,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,YAAY,aAAa;CACpC;CACA;CACA;CACA;AACF"}
package/dist/br/cnpj.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/br/cnpj.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
@@ -15,7 +14,7 @@ declare const generate: () => string;
15
14
  * - Petrobras: 33.000.167/0001-01
16
15
  * - Banco do Brasil: 00.000.000/0001-91
17
16
  */
18
- declare const cnpj: Validator;
17
+ declare const cnpj: CountryValidator<"BR">;
19
18
  //#endregion
20
19
  export { compact, cnpj as default, format, generate, validate };
21
20
  //# sourceMappingURL=cnpj.d.ts.map
package/dist/br/cnpj.js CHANGED
@@ -2,26 +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/br/cnpj.ts
5
- /**
6
- * CNPJ (Cadastro Nacional da Pessoa Jurídica).
7
- *
8
- * Brazilian company tax identification number assigned by
9
- * the Receita Federal (Federal Revenue Service). The
10
- * number consists of 14 characters: 8 identifying the
11
- * company, 4 identifying the establishment (0001 for
12
- * headquarters), and 2 check digits computed using a
13
- * weighted modulo 11 algorithm.
14
- *
15
- * As of July 2026 the Receita Federal will begin issuing
16
- * alphanumeric CNPJs (letters A-Z in place of some
17
- * digits). The check digit algorithm uses ordinal values
18
- * (0-9 = 0-9, A-Z = 17-42) to support this.
19
- *
20
- * Format: NN.NNN.NNN/NNNN-DD (14 characters).
21
- *
22
- * @see https://www.gov.br/en/categories/finance-taxes-and-public-management/cpf-cnpj-and-other-records
23
- * @see https://en.wikipedia.org/wiki/CNPJ
24
- */
25
5
  const CNPJ_RE = /^[\dA-Z]+$/;
26
6
  const compact = (value) => clean(value, " -./").trim().toUpperCase();
27
7
  /**
@@ -117,6 +97,7 @@ const cnpj = {
117
97
  abbreviation: "CNPJ",
118
98
  aliases: ["CNPJ", "Cadastro Nacional da Pessoa Jurídica"],
119
99
  candidatePattern: "\\d{2}\\.?\\d{3}\\.?\\d{3}/?\\d{4}-?\\d{2}",
100
+ scope: "country",
120
101
  country: "BR",
121
102
  entityType: "company",
122
103
  sourceUrl: "https://www.gov.br/receitafederal/",
@@ -1 +1 @@
1
- {"version":3,"file":"cnpj.js","names":[],"sources":["../../src/br/cnpj.ts"],"sourcesContent":["/**\n * CNPJ (Cadastro Nacional da Pessoa Jurídica).\n *\n * Brazilian company tax identification number assigned by\n * the Receita Federal (Federal Revenue Service). The\n * number consists of 14 characters: 8 identifying the\n * company, 4 identifying the establishment (0001 for\n * headquarters), and 2 check digits computed using a\n * weighted modulo 11 algorithm.\n *\n * As of July 2026 the Receita Federal will begin issuing\n * alphanumeric CNPJs (letters A-Z in place of some\n * digits). The check digit algorithm uses ordinal values\n * (0-9 = 0-9, A-Z = 17-42) to support this.\n *\n * Format: NN.NNN.NNN/NNNN-DD (14 characters).\n *\n * @see https://www.gov.br/en/categories/finance-taxes-and-public-management/cpf-cnpj-and-other-records\n * @see https://en.wikipedia.org/wiki/CNPJ\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 CNPJ_RE = /^[\\dA-Z]+$/;\n\nconst compact = (value: string): string =>\n clean(value, \" -./\").trim().toUpperCase();\n\n/**\n * Convert a CNPJ character to its numeric value.\n * Digits 0-9 map to 0-9; letters A-Z map to their\n * char code minus 48 (matching python-stdnum's\n * `ord(n) - 48` convention: A=17, B=18, ..., Z=42).\n */\nconst charToValue = (ch: string): number =>\n ch.charCodeAt(0) - 48;\n\n/**\n * Calculate the two CNPJ check digits using the\n * Receita Federal modulo 11 algorithm.\n *\n * First check digit: weights [5,4,3,2,9,8,7,6,5,4,3,2]\n * applied to the first 12 characters.\n *\n * Second check digit: weights [6,5,4,3,2,9,8,7,6,5,4,3,2]\n * applied to the first 12 characters plus the first\n * check digit.\n */\nconst calcCheckDigits = (number: string): string => {\n const w1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];\n let sum = 0;\n for (let i = 0; i < 12; i++) {\n sum += (w1[i] ?? 0) * charToValue(number.charAt(i));\n }\n const d1 = ((11 - (sum % 11)) % 11) % 10;\n\n const w2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];\n sum = 0;\n for (let i = 0; i < 12; i++) {\n sum += (w2[i] ?? 0) * charToValue(number.charAt(i));\n }\n // Use the computed d1 (not the stored digit at\n // number[12]) so both check digits are derived\n // from the base alone.\n sum += (w2[12] ?? 0) * d1;\n const d2 = ((11 - (sum % 11)) % 11) % 10;\n\n return `${d1}${d2}`;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 14) {\n return err(\n \"INVALID_LENGTH\",\n \"CNPJ must be 14 characters\",\n );\n }\n if (!CNPJ_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CNPJ must contain only digits and uppercase letters\",\n );\n }\n // Reject all-zero base (first 12 chars).\n // Unlike CPF, we do not reject all-same-digit CNPJs;\n // python-stdnum only blocks the all-zero base, and\n // there is no official Receita Federal list of\n // blocked same-digit CNPJ sequences.\n if (v.startsWith(\"000000000000\")) {\n return err(\n \"INVALID_FORMAT\",\n \"CNPJ base must not be all zeros\",\n );\n }\n if (calcCheckDigits(v) !== v.slice(12)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"CNPJ check digit mismatch\",\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, 2)}.${v.slice(2, 5)}.${v.slice(5, 8)}/${v.slice(8, 12)}-${v.slice(12)}`;\n};\n\n/** Generate a random valid CNPJ. */\nconst generate = (): string => {\n for (;;) {\n const base = randomDigits(12);\n if (base === \"000000000000\") continue;\n return base + calcCheckDigits(base);\n }\n};\n\n/**\n * Brazilian CNPJ (company tax ID).\n *\n * Examples sourced from publicly available Brazilian\n * corporate registries:\n * - Petrobras: 33.000.167/0001-01\n * - Banco do Brasil: 00.000.000/0001-91\n */\nconst cnpj: Validator = {\n name: \"Brazilian CNPJ\",\n localName: \"Cadastro Nacional da Pessoa Jurídica\",\n abbreviation: \"CNPJ\",\n aliases: [\n \"CNPJ\",\n \"Cadastro Nacional da Pessoa Jurídica\",\n ] as const,\n candidatePattern:\n \"\\\\d{2}\\\\.?\\\\d{3}\\\\.?\\\\d{3}/?\\\\d{4}-?\\\\d{2}\",\n country: \"BR\",\n entityType: \"company\",\n sourceUrl: \"https://www.gov.br/receitafederal/\",\n examples: [\"33000167000101\", \"00000000000191\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cnpj;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA2BA,MAAM,UAAU;AAEhB,MAAM,WAAW,UACf,MAAM,OAAO,OAAO,CAAC,MAAM,CAAC,aAAa;;;;;;;AAQ3C,MAAM,eAAe,OACnB,GAAG,WAAW,EAAE,GAAG;;;;;;;;;;;;AAarB,MAAM,mBAAmB,WAA2B;CAClD,MAAM,KAAK;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC/C,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IACtB,SAAQ,GAAG,MAAM,KAAK,YAAY,OAAO,OAAO,EAAE,CAAC;CAErD,MAAM,MAAO,KAAM,MAAM,MAAO,KAAM;CAEtC,MAAM,KAAK;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;AAClD,OAAM;AACN,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IACtB,SAAQ,GAAG,MAAM,KAAK,YAAY,OAAO,OAAO,EAAE,CAAC;AAKrD,SAAQ,GAAG,OAAO,KAAK;AAGvB,QAAO,GAAG,MAFG,KAAM,MAAM,MAAO,KAAM;;AAKxC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,6BACD;AAEH,KAAI,CAAC,QAAQ,KAAK,EAAE,CAClB,QAAO,IACL,kBACA,sDACD;AAOH,KAAI,EAAE,WAAW,eAAe,CAC9B,QAAO,IACL,kBACA,kCACD;AAEH,KAAI,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,CACpC,QAAO,IACL,oBACA,4BACD;AAEH,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,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG;;;AAI5F,MAAM,iBAAyB;AAC7B,UAAS;EACP,MAAM,OAAO,aAAa,GAAG;AAC7B,MAAI,SAAS,eAAgB;AAC7B,SAAO,OAAO,gBAAgB,KAAK;;;;;;;;;;;AAYvC,MAAM,OAAkB;CACtB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CACP,QACA,uCACD;CACD,kBACE;CACF,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,kBAAkB,iBAAiB;CAC9C;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"cnpj.js","names":[],"sources":["../../src/br/cnpj.ts"],"sourcesContent":["/**\n * CNPJ (Cadastro Nacional da Pessoa Jurídica).\n *\n * Brazilian company tax identification number assigned by\n * the Receita Federal (Federal Revenue Service). The\n * number consists of 14 characters: 8 identifying the\n * company, 4 identifying the establishment (0001 for\n * headquarters), and 2 check digits computed using a\n * weighted modulo 11 algorithm.\n *\n * As of July 2026 the Receita Federal will begin issuing\n * alphanumeric CNPJs (letters A-Z in place of some\n * digits). The check digit algorithm uses ordinal values\n * (0-9 = 0-9, A-Z = 17-42) to support this.\n *\n * Format: NN.NNN.NNN/NNNN-DD (14 characters).\n *\n * @see https://www.gov.br/en/categories/finance-taxes-and-public-management/cpf-cnpj-and-other-records\n * @see https://en.wikipedia.org/wiki/CNPJ\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 CNPJ_RE = /^[\\dA-Z]+$/;\n\nconst compact = (value: string): string =>\n clean(value, \" -./\").trim().toUpperCase();\n\n/**\n * Convert a CNPJ character to its numeric value.\n * Digits 0-9 map to 0-9; letters A-Z map to their\n * char code minus 48 (matching python-stdnum's\n * `ord(n) - 48` convention: A=17, B=18, ..., Z=42).\n */\nconst charToValue = (ch: string): number =>\n ch.charCodeAt(0) - 48;\n\n/**\n * Calculate the two CNPJ check digits using the\n * Receita Federal modulo 11 algorithm.\n *\n * First check digit: weights [5,4,3,2,9,8,7,6,5,4,3,2]\n * applied to the first 12 characters.\n *\n * Second check digit: weights [6,5,4,3,2,9,8,7,6,5,4,3,2]\n * applied to the first 12 characters plus the first\n * check digit.\n */\nconst calcCheckDigits = (number: string): string => {\n const w1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];\n let sum = 0;\n for (let i = 0; i < 12; i++) {\n sum += (w1[i] ?? 0) * charToValue(number.charAt(i));\n }\n const d1 = ((11 - (sum % 11)) % 11) % 10;\n\n const w2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];\n sum = 0;\n for (let i = 0; i < 12; i++) {\n sum += (w2[i] ?? 0) * charToValue(number.charAt(i));\n }\n // Use the computed d1 (not the stored digit at\n // number[12]) so both check digits are derived\n // from the base alone.\n sum += (w2[12] ?? 0) * d1;\n const d2 = ((11 - (sum % 11)) % 11) % 10;\n\n return `${d1}${d2}`;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 14) {\n return err(\n \"INVALID_LENGTH\",\n \"CNPJ must be 14 characters\",\n );\n }\n if (!CNPJ_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CNPJ must contain only digits and uppercase letters\",\n );\n }\n // Reject all-zero base (first 12 chars).\n // Unlike CPF, we do not reject all-same-digit CNPJs;\n // python-stdnum only blocks the all-zero base, and\n // there is no official Receita Federal list of\n // blocked same-digit CNPJ sequences.\n if (v.startsWith(\"000000000000\")) {\n return err(\n \"INVALID_FORMAT\",\n \"CNPJ base must not be all zeros\",\n );\n }\n if (calcCheckDigits(v) !== v.slice(12)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"CNPJ check digit mismatch\",\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, 2)}.${v.slice(2, 5)}.${v.slice(5, 8)}/${v.slice(8, 12)}-${v.slice(12)}`;\n};\n\n/** Generate a random valid CNPJ. */\nconst generate = (): string => {\n for (;;) {\n const base = randomDigits(12);\n if (base === \"000000000000\") continue;\n return base + calcCheckDigits(base);\n }\n};\n\n/**\n * Brazilian CNPJ (company tax ID).\n *\n * Examples sourced from publicly available Brazilian\n * corporate registries:\n * - Petrobras: 33.000.167/0001-01\n * - Banco do Brasil: 00.000.000/0001-91\n */\nconst cnpj: CountryValidator<\"BR\"> = {\n name: \"Brazilian CNPJ\",\n localName: \"Cadastro Nacional da Pessoa Jurídica\",\n abbreviation: \"CNPJ\",\n aliases: [\n \"CNPJ\",\n \"Cadastro Nacional da Pessoa Jurídica\",\n ] as const,\n candidatePattern:\n \"\\\\d{2}\\\\.?\\\\d{3}\\\\.?\\\\d{3}/?\\\\d{4}-?\\\\d{2}\",\n scope: \"country\",\n country: \"BR\",\n entityType: \"company\",\n sourceUrl: \"https://www.gov.br/receitafederal/\",\n examples: [\"33000167000101\", \"00000000000191\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cnpj;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;AA8BA,MAAM,UAAU;AAEhB,MAAM,WAAW,UACf,MAAM,OAAO,MAAM,EAAE,KAAK,EAAE,YAAY;;;;;;;AAQ1C,MAAM,eAAe,OACnB,GAAG,WAAW,CAAC,IAAI;;;;;;;;;;;;AAarB,MAAM,mBAAmB,WAA2B;CAClD,MAAM,KAAK;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC9C,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KACtB,QAAQ,GAAG,MAAM,KAAK,YAAY,OAAO,OAAO,CAAC,CAAC;CAEpD,MAAM,MAAO,KAAM,MAAM,MAAO,KAAM;CAEtC,MAAM,KAAK;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CACjD,MAAM;CACN,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KACtB,QAAQ,GAAG,MAAM,KAAK,YAAY,OAAO,OAAO,CAAC,CAAC;CAKpD,QAAQ,GAAG,OAAO,KAAK;CAGvB,OAAO,GAAG,MAFG,KAAM,MAAM,MAAO,KAAM;AAGxC;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,4BACF;CAEF,IAAI,CAAC,QAAQ,KAAK,CAAC,GACjB,OAAO,IACL,kBACA,qDACF;CAOF,IAAI,EAAE,WAAW,cAAc,GAC7B,OAAO,IACL,kBACA,iCACF;CAEF,IAAI,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GACnC,OAAO,IACL,oBACA,2BACF;CAEF,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,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;AAC3F;;AAGA,MAAM,iBAAyB;CAC7B,SAAS;EACP,MAAM,OAAO,aAAa,EAAE;EAC5B,IAAI,SAAS,gBAAgB;EAC7B,OAAO,OAAO,gBAAgB,IAAI;CACpC;AACF;;;;;;;;;AAUA,MAAM,OAA+B;CACnC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CACP,QACA,sCACF;CACA,kBACE;CACF,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,kBAAkB,gBAAgB;CAC7C;CACA;CACA;CACA;AACF"}
package/dist/br/cpf.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/br/cpf.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid CPF. */
9
8
  declare const generate: () => string;
10
9
  /** Brazilian CPF (personal tax ID). */
11
- declare const cpf: Validator;
10
+ declare const cpf: CountryValidator<"BR">;
12
11
  //#endregion
13
12
  export { compact, cpf as default, format, generate, validate };
14
13
  //# sourceMappingURL=cpf.d.ts.map
package/dist/br/cpf.js CHANGED
@@ -3,20 +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/br/cpf.ts
6
- /**
7
- * CPF (Cadastro de Pessoas Físicas).
8
- *
9
- * Brazilian personal tax identification number assigned
10
- * by the Receita Federal (Federal Revenue Service) to
11
- * individuals. The number consists of 11 digits: 9 base
12
- * digits followed by 2 check digits computed using a
13
- * weighted modulo 11 algorithm.
14
- *
15
- * Format: NNN.NNN.NNN-DD (11 digits, purely numeric).
16
- *
17
- * @see https://www.gov.br/en/categories/finance-taxes-and-public-management/cpf-cnpj-and-other-records
18
- * @see https://en.wikipedia.org/wiki/CPF_number
19
- */
20
6
  const compact = (value) => clean(value, " -.").trim();
21
7
  /**
22
8
  * Calculate the two CPF check digits using the
@@ -68,6 +54,7 @@ const cpf = {
68
54
  abbreviation: "CPF",
69
55
  aliases: ["CPF", "Cadastro de Pessoas Físicas"],
70
56
  candidatePattern: "\\d{3}\\.?\\d{3}\\.?\\d{3}-?\\d{2}",
57
+ scope: "country",
71
58
  country: "BR",
72
59
  entityType: "person",
73
60
  sourceUrl: "https://www.gov.br/receitafederal/",
@@ -1 +1 @@
1
- {"version":3,"file":"cpf.js","names":[],"sources":["../../src/br/cpf.ts"],"sourcesContent":["/**\n * CPF (Cadastro de Pessoas Físicas).\n *\n * Brazilian personal tax identification number assigned\n * by the Receita Federal (Federal Revenue Service) to\n * individuals. The number consists of 11 digits: 9 base\n * digits followed by 2 check digits computed using a\n * weighted modulo 11 algorithm.\n *\n * Format: NNN.NNN.NNN-DD (11 digits, purely numeric).\n *\n * @see https://www.gov.br/en/categories/finance-taxes-and-public-management/cpf-cnpj-and-other-records\n * @see https://en.wikipedia.org/wiki/CPF_number\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, \" -.\").trim();\n\n/**\n * Calculate the two CPF check digits using the\n * Receita Federal modulo 11 algorithm.\n *\n * First check digit: multiply digits 0..8 by weights\n * 10..2, sum, then (11 - sum % 11) % 11 % 10.\n *\n * Second check digit: multiply digits 0..8 by weights\n * 11..3, add 2 * first check digit, then\n * (11 - sum % 11) % 11 % 10.\n */\nconst calcCheckDigits = (number: string): string => {\n let sum = 0;\n for (let i = 0; i < 9; i++) {\n sum += (10 - i) * Number(number[i]);\n }\n const d1 = ((11 - (sum % 11)) % 11) % 10;\n\n sum = 0;\n for (let i = 0; i < 9; i++) {\n sum += (11 - i) * Number(number[i]);\n }\n sum += 2 * d1;\n const d2 = ((11 - (sum % 11)) % 11) % 10;\n\n return `${d1}${d2}`;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 11) {\n return err(\"INVALID_LENGTH\", \"CPF must be 11 digits\");\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CPF must contain only digits\",\n );\n }\n // All-same-digit CPFs (e.g. 000.000.000-00) pass the\n // checksum but are not valid registrations.\n if (/^(\\d)\\1{10}$/.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CPF must not be a repeated digit sequence\",\n );\n }\n if (calcCheckDigits(v) !== v.slice(9)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"CPF check digit mismatch\",\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, 6)}.${v.slice(6, 9)}-${v.slice(9)}`;\n};\n\n/** Generate a random valid CPF. */\nconst generate = (): string => {\n for (;;) {\n const base = randomDigits(9);\n if (/^(\\d)\\1{8}$/.test(base)) continue;\n return base + calcCheckDigits(base);\n }\n};\n\n/** Brazilian CPF (personal tax ID). */\nconst cpf: Validator = {\n name: \"Brazilian CPF\",\n localName: \"Cadastro de Pessoas Físicas\",\n abbreviation: \"CPF\",\n aliases: [\"CPF\", \"Cadastro de Pessoas Físicas\"] as const,\n candidatePattern: \"\\\\d{3}\\\\.?\\\\d{3}\\\\.?\\\\d{3}-?\\\\d{2}\",\n country: \"BR\",\n entityType: \"person\",\n sourceUrl: \"https://www.gov.br/receitafederal/\",\n examples: [\"39053344705\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cpf;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAsBA,MAAM,WAAW,UACf,MAAM,OAAO,MAAM,CAAC,MAAM;;;;;;;;;;;;AAa5B,MAAM,mBAAmB,WAA2B;CAClD,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,SAAQ,KAAK,KAAK,OAAO,OAAO,GAAG;CAErC,MAAM,MAAO,KAAM,MAAM,MAAO,KAAM;AAEtC,OAAM;AACN,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,SAAQ,KAAK,KAAK,OAAO,OAAO,GAAG;AAErC,QAAO,IAAI;AAGX,QAAO,GAAG,MAFG,KAAM,MAAM,MAAO,KAAM;;AAKxC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IAAI,kBAAkB,wBAAwB;AAEvD,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,+BACD;AAIH,KAAI,eAAe,KAAK,EAAE,CACxB,QAAO,IACL,kBACA,4CACD;AAEH,KAAI,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,CACnC,QAAO,IACL,oBACA,2BACD;AAEH,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,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;;;AAIzE,MAAM,iBAAyB;AAC7B,UAAS;EACP,MAAM,OAAO,aAAa,EAAE;AAC5B,MAAI,cAAc,KAAK,KAAK,CAAE;AAC9B,SAAO,OAAO,gBAAgB,KAAK;;;;AAKvC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,8BAA8B;CAC/C,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,cAAc;CACzB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"cpf.js","names":[],"sources":["../../src/br/cpf.ts"],"sourcesContent":["/**\n * CPF (Cadastro de Pessoas Físicas).\n *\n * Brazilian personal tax identification number assigned\n * by the Receita Federal (Federal Revenue Service) to\n * individuals. The number consists of 11 digits: 9 base\n * digits followed by 2 check digits computed using a\n * weighted modulo 11 algorithm.\n *\n * Format: NNN.NNN.NNN-DD (11 digits, purely numeric).\n *\n * @see https://www.gov.br/en/categories/finance-taxes-and-public-management/cpf-cnpj-and-other-records\n * @see https://en.wikipedia.org/wiki/CPF_number\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, \" -.\").trim();\n\n/**\n * Calculate the two CPF check digits using the\n * Receita Federal modulo 11 algorithm.\n *\n * First check digit: multiply digits 0..8 by weights\n * 10..2, sum, then (11 - sum % 11) % 11 % 10.\n *\n * Second check digit: multiply digits 0..8 by weights\n * 11..3, add 2 * first check digit, then\n * (11 - sum % 11) % 11 % 10.\n */\nconst calcCheckDigits = (number: string): string => {\n let sum = 0;\n for (let i = 0; i < 9; i++) {\n sum += (10 - i) * Number(number[i]);\n }\n const d1 = ((11 - (sum % 11)) % 11) % 10;\n\n sum = 0;\n for (let i = 0; i < 9; i++) {\n sum += (11 - i) * Number(number[i]);\n }\n sum += 2 * d1;\n const d2 = ((11 - (sum % 11)) % 11) % 10;\n\n return `${d1}${d2}`;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 11) {\n return err(\"INVALID_LENGTH\", \"CPF must be 11 digits\");\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CPF must contain only digits\",\n );\n }\n // All-same-digit CPFs (e.g. 000.000.000-00) pass the\n // checksum but are not valid registrations.\n if (/^(\\d)\\1{10}$/.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CPF must not be a repeated digit sequence\",\n );\n }\n if (calcCheckDigits(v) !== v.slice(9)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"CPF check digit mismatch\",\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, 6)}.${v.slice(6, 9)}-${v.slice(9)}`;\n};\n\n/** Generate a random valid CPF. */\nconst generate = (): string => {\n for (;;) {\n const base = randomDigits(9);\n if (/^(\\d)\\1{8}$/.test(base)) continue;\n return base + calcCheckDigits(base);\n }\n};\n\n/** Brazilian CPF (personal tax ID). */\nconst cpf: CountryValidator<\"BR\"> = {\n name: \"Brazilian CPF\",\n localName: \"Cadastro de Pessoas Físicas\",\n abbreviation: \"CPF\",\n aliases: [\"CPF\", \"Cadastro de Pessoas Físicas\"] as const,\n candidatePattern: \"\\\\d{3}\\\\.?\\\\d{3}\\\\.?\\\\d{3}-?\\\\d{2}\",\n scope: \"country\",\n country: \"BR\",\n entityType: \"person\",\n sourceUrl: \"https://www.gov.br/receitafederal/\",\n examples: [\"39053344705\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cpf;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAyBA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,EAAE,KAAK;;;;;;;;;;;;AAa3B,MAAM,mBAAmB,WAA2B;CAClD,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,QAAQ,KAAK,KAAK,OAAO,OAAO,EAAE;CAEpC,MAAM,MAAO,KAAM,MAAM,MAAO,KAAM;CAEtC,MAAM;CACN,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,QAAQ,KAAK,KAAK,OAAO,OAAO,EAAE;CAEpC,OAAO,IAAI;CAGX,OAAO,GAAG,MAFG,KAAM,MAAM,MAAO,KAAM;AAGxC;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IAAI,kBAAkB,uBAAuB;CAEtD,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAIF,IAAI,eAAe,KAAK,CAAC,GACvB,OAAO,IACL,kBACA,2CACF;CAEF,IAAI,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,OAAO,IACL,oBACA,0BACF;CAEF,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,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;AACxE;;AAGA,MAAM,iBAAyB;CAC7B,SAAS;EACP,MAAM,OAAO,aAAa,CAAC;EAC3B,IAAI,cAAc,KAAK,IAAI,GAAG;EAC9B,OAAO,OAAO,gBAAgB,IAAI;CACpC;AACF;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,6BAA6B;CAC9C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,aAAa;CACxB;CACA;CACA;CACA;AACF"}
package/dist/br/mod.d.ts CHANGED
@@ -1,9 +1,10 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import cnpj from "./cnpj.js";
3
2
  import cpf from "./cpf.js";
4
3
 
5
4
  //#region src/br/mod.d.ts
6
-
5
+ declare namespace mod_d_exports {
6
+ export { cnpj, cpf };
7
+ }
7
8
  //#endregion
8
9
  export { cnpj, cpf, mod_d_exports };
9
10
  //# sourceMappingURL=mod.d.ts.map
package/dist/by/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import unp from "./unp.js";
3
2
 
4
3
  //#region src/by/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { unp };
6
+ }
6
7
  //#endregion
7
8
  export { mod_d_exports, unp };
8
9
  //# sourceMappingURL=mod.d.ts.map
package/dist/by/unp.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/by/unp.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid Belarus UNP. */
9
8
  declare const generate: () => string;
10
9
  /** Belarus UNP (Учётный номер плательщика). */
11
- declare const unp: Validator;
10
+ declare const unp: CountryValidator<"BY">;
12
11
  //#endregion
13
12
  export { compact, unp as default, format, generate, validate };
14
13
  //# sourceMappingURL=unp.d.ts.map
package/dist/by/unp.js CHANGED
@@ -3,18 +3,6 @@ import { randomDigits, randomInt } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/by/unp.ts
6
- /**
7
- * UNP (Учётный номер плательщика, Belarus tax number).
8
- *
9
- * 9 characters: the first two identify the region (numeric
10
- * for organisations, letters from ABCEHKMOPT for
11
- * individuals), followed by 7 digits. The last digit is a
12
- * weighted check digit (mod 11; if remainder > 9 the
13
- * number is invalid).
14
- *
15
- * @see https://be.wikipedia.org/wiki/Уліковы_нумар_плацельшчыка
16
- * @see https://www.nalog.gov.by/
17
- */
18
6
  /** Cyrillic to Latin mapping for the letter positions. */
19
7
  const CYRILLIC_TO_LATIN = {
20
8
  А: "A",
@@ -45,21 +33,24 @@ const compact = (value) => {
45
33
  let v = clean(value, " ").toUpperCase().trim();
46
34
  if (v.startsWith("УНП")) v = v.slice(3);
47
35
  else if (v.startsWith("UNP")) v = v.slice(3);
48
- return [...v].map((ch) => CYRILLIC_TO_LATIN[ch] ?? ch).join("");
36
+ return v.split("").map((ch) => CYRILLIC_TO_LATIN[ch] ?? ch).join("");
49
37
  };
50
38
  const calcCheckDigit = (number) => {
51
39
  let work = number;
52
40
  if (!isdigits(number)) {
53
- const idx = ALPHA_SET.indexOf(number[1]);
41
+ const second = number[1];
42
+ if (second === void 0) return null;
43
+ const idx = ALPHA_SET.indexOf(second);
54
44
  if (idx === -1) return null;
55
45
  work = number[0] + String(idx) + number.slice(2);
56
46
  }
57
47
  let sum = 0;
58
- for (let i = 0; i < 8; i++) {
48
+ for (const [i, weight] of WEIGHTS.entries()) {
59
49
  const ch = work[i];
50
+ if (ch === void 0) return null;
60
51
  const val = ALPHABET.indexOf(ch);
61
52
  if (val === -1) return null;
62
- sum += (WEIGHTS[i] ?? 0) * val;
53
+ sum += weight * val;
63
54
  }
64
55
  const remainder = sum % 11;
65
56
  if (remainder > 9) return null;
@@ -70,7 +61,7 @@ const validate = (value) => {
70
61
  if (v.length !== 9) return err("INVALID_LENGTH", "Belarus UNP must be 9 characters");
71
62
  if (!isdigits(v.slice(2))) return err("INVALID_FORMAT", "Belarus UNP positions 3-9 must be digits");
72
63
  const first2 = v.slice(0, 2);
73
- if (!isdigits(first2) && ![...first2].every((ch) => ALPHA_SET.includes(ch))) return err("INVALID_FORMAT", "Belarus UNP first two characters must be digits or letters from ABCEHKMOPT");
64
+ if (!isdigits(first2) && !first2.split("").every((ch) => ALPHA_SET.includes(ch))) return err("INVALID_FORMAT", "Belarus UNP first two characters must be digits or letters from ABCEHKMOPT");
74
65
  if (!VALID_FIRST.includes(v[0])) return err("INVALID_COMPONENT", "Belarus UNP has an invalid region prefix");
75
66
  const expected = calcCheckDigit(v);
76
67
  if (expected === null) return err("INVALID_CHECKSUM", "Belarus UNP check digit is invalid (mod 11 remainder > 9)");
@@ -99,6 +90,7 @@ const unp = {
99
90
  abbreviation: "УНП",
100
91
  aliases: ["УНП", "UNP"],
101
92
  candidatePattern: "\\d{9}",
93
+ scope: "country",
102
94
  country: "BY",
103
95
  entityType: "any",
104
96
  sourceUrl: "https://www.nalog.gov.by/",