stdnum 1.10.7 → 1.11.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 (324) hide show
  1. package/README.md +3 -2
  2. package/lib/cjs/ad/index.js +18 -8
  3. package/lib/cjs/ad/nrt.js +18 -8
  4. package/lib/cjs/al/index.js +18 -8
  5. package/lib/cjs/al/nipt.js +18 -8
  6. package/lib/cjs/ar/cbu.js +18 -8
  7. package/lib/cjs/ar/cuit.js +18 -8
  8. package/lib/cjs/ar/dni.js +18 -8
  9. package/lib/cjs/ar/index.js +18 -8
  10. package/lib/cjs/at/businessid.js +18 -8
  11. package/lib/cjs/at/index.js +18 -8
  12. package/lib/cjs/at/tin.js +18 -8
  13. package/lib/cjs/at/uid.js +18 -8
  14. package/lib/cjs/at/vnr.js +18 -8
  15. package/lib/cjs/au/abn.js +18 -8
  16. package/lib/cjs/au/acn.js +18 -8
  17. package/lib/cjs/au/index.js +18 -8
  18. package/lib/cjs/au/tfn.js +18 -8
  19. package/lib/cjs/az/index.js +18 -8
  20. package/lib/cjs/az/pin.js +18 -8
  21. package/lib/cjs/az/tin.js +18 -8
  22. package/lib/cjs/ba/index.js +18 -8
  23. package/lib/cjs/ba/jmbg.js +18 -8
  24. package/lib/cjs/be/bis.js +18 -8
  25. package/lib/cjs/be/index.js +18 -8
  26. package/lib/cjs/be/nn.js +18 -8
  27. package/lib/cjs/be/personIdentifierHelpers.js +4 -5
  28. package/lib/cjs/be/vat.js +18 -8
  29. package/lib/cjs/bg/egn.js +18 -8
  30. package/lib/cjs/bg/index.js +18 -8
  31. package/lib/cjs/bg/pnf.js +18 -8
  32. package/lib/cjs/bg/vat.js +18 -8
  33. package/lib/cjs/br/cnpj.js +18 -8
  34. package/lib/cjs/br/cpf.js +18 -8
  35. package/lib/cjs/br/index.js +18 -8
  36. package/lib/cjs/by/index.js +18 -8
  37. package/lib/cjs/by/unp.js +18 -8
  38. package/lib/cjs/bz/index.js +18 -8
  39. package/lib/cjs/bz/tin.js +18 -8
  40. package/lib/cjs/ca/bc_bhn.d.ts +2 -0
  41. package/lib/cjs/ca/bc_bhn.js +89 -0
  42. package/lib/cjs/ca/bn.js +18 -8
  43. package/lib/cjs/ca/gst.js +18 -8
  44. package/lib/cjs/ca/index.d.ts +1 -0
  45. package/lib/cjs/ca/index.js +20 -9
  46. package/lib/cjs/ca/pst.js +18 -8
  47. package/lib/cjs/ca/qst.js +18 -8
  48. package/lib/cjs/ca/sin.js +18 -8
  49. package/lib/cjs/ch/index.js +18 -8
  50. package/lib/cjs/ch/ssn.js +18 -8
  51. package/lib/cjs/ch/uid.js +18 -8
  52. package/lib/cjs/ch/vat.js +18 -8
  53. package/lib/cjs/cl/index.js +18 -8
  54. package/lib/cjs/cl/run.js +18 -8
  55. package/lib/cjs/cl/rut.js +18 -8
  56. package/lib/cjs/cn/index.js +18 -8
  57. package/lib/cjs/cn/ric.js +18 -8
  58. package/lib/cjs/cn/uscc.js +18 -8
  59. package/lib/cjs/co/index.js +18 -8
  60. package/lib/cjs/co/nit.js +18 -8
  61. package/lib/cjs/cr/cpf.js +18 -8
  62. package/lib/cjs/cr/cpj.js +18 -8
  63. package/lib/cjs/cr/cr.js +18 -8
  64. package/lib/cjs/cr/index.js +18 -8
  65. package/lib/cjs/cu/index.js +18 -8
  66. package/lib/cjs/cu/ni.js +18 -8
  67. package/lib/cjs/cy/index.js +18 -8
  68. package/lib/cjs/cy/vat.js +18 -8
  69. package/lib/cjs/cz/dic.js +18 -8
  70. package/lib/cjs/cz/index.js +18 -8
  71. package/lib/cjs/cz/rc.js +18 -8
  72. package/lib/cjs/de/idnr.js +18 -8
  73. package/lib/cjs/de/index.js +18 -8
  74. package/lib/cjs/de/passport.js +18 -8
  75. package/lib/cjs/de/pwnr.js +21 -11
  76. package/lib/cjs/de/stnr.js +18 -8
  77. package/lib/cjs/de/svnr.js +18 -8
  78. package/lib/cjs/de/vat.js +18 -8
  79. package/lib/cjs/dk/cpr.js +20 -10
  80. package/lib/cjs/dk/cvr.js +18 -8
  81. package/lib/cjs/dk/index.js +18 -8
  82. package/lib/cjs/do/cedula.js +18 -8
  83. package/lib/cjs/do/index.js +18 -8
  84. package/lib/cjs/do/ncf.js +18 -8
  85. package/lib/cjs/do/rnc.js +18 -8
  86. package/lib/cjs/dz/index.js +18 -8
  87. package/lib/cjs/dz/nif.js +18 -8
  88. package/lib/cjs/ec/ci.js +20 -10
  89. package/lib/cjs/ec/index.js +18 -8
  90. package/lib/cjs/ec/ruc.js +18 -8
  91. package/lib/cjs/ee/ik.js +21 -11
  92. package/lib/cjs/ee/index.js +18 -8
  93. package/lib/cjs/ee/kmkr.js +18 -8
  94. package/lib/cjs/ee/registrikood.js +18 -8
  95. package/lib/cjs/eg/index.js +18 -8
  96. package/lib/cjs/eg/tn.js +18 -8
  97. package/lib/cjs/es/cif.js +18 -8
  98. package/lib/cjs/es/dni.js +20 -10
  99. package/lib/cjs/es/index.js +18 -8
  100. package/lib/cjs/es/nie.js +18 -8
  101. package/lib/cjs/es/nif.js +18 -8
  102. package/lib/cjs/es/nss.js +18 -8
  103. package/lib/cjs/exceptions.js +2 -2
  104. package/lib/cjs/fi/alv.js +18 -8
  105. package/lib/cjs/fi/hetu.js +18 -8
  106. package/lib/cjs/fi/index.js +18 -8
  107. package/lib/cjs/fo/index.js +18 -8
  108. package/lib/cjs/fo/vn.js +18 -8
  109. package/lib/cjs/fr/index.js +18 -8
  110. package/lib/cjs/fr/nif.js +18 -8
  111. package/lib/cjs/fr/nir.js +18 -8
  112. package/lib/cjs/fr/siren.js +18 -8
  113. package/lib/cjs/fr/siret.js +18 -8
  114. package/lib/cjs/fr/tva.js +18 -8
  115. package/lib/cjs/gb/index.js +18 -8
  116. package/lib/cjs/gb/nino.js +18 -8
  117. package/lib/cjs/gb/utr.js +18 -8
  118. package/lib/cjs/gb/vat.js +18 -8
  119. package/lib/cjs/gen/ean.js +18 -8
  120. package/lib/cjs/gen/index.js +18 -8
  121. package/lib/cjs/gh/index.js +18 -8
  122. package/lib/cjs/gh/tin.js +18 -8
  123. package/lib/cjs/gn/index.js +18 -8
  124. package/lib/cjs/gn/nifp.js +18 -8
  125. package/lib/cjs/gr/amka.js +18 -8
  126. package/lib/cjs/gr/index.js +18 -8
  127. package/lib/cjs/gr/vat.js +18 -8
  128. package/lib/cjs/gt/cui.js +18 -8
  129. package/lib/cjs/gt/index.js +18 -8
  130. package/lib/cjs/gt/nit.js +18 -8
  131. package/lib/cjs/hk/hkid.js +18 -8
  132. package/lib/cjs/hk/index.js +18 -8
  133. package/lib/cjs/hr/index.js +18 -8
  134. package/lib/cjs/hr/oib.js +18 -8
  135. package/lib/cjs/hu/anum.js +18 -8
  136. package/lib/cjs/hu/index.js +18 -8
  137. package/lib/cjs/id/index.js +18 -8
  138. package/lib/cjs/id/npwp.js +18 -8
  139. package/lib/cjs/ie/index.js +18 -8
  140. package/lib/cjs/ie/pps.js +18 -8
  141. package/lib/cjs/ie/vat.js +20 -10
  142. package/lib/cjs/il/hp.js +18 -8
  143. package/lib/cjs/il/idnr.js +18 -8
  144. package/lib/cjs/il/index.js +18 -8
  145. package/lib/cjs/in/aadhaar.js +18 -8
  146. package/lib/cjs/in/epic.js +18 -8
  147. package/lib/cjs/in/gstin.js +18 -8
  148. package/lib/cjs/in/index.d.ts +1 -0
  149. package/lib/cjs/in/index.js +20 -9
  150. package/lib/cjs/in/pan.js +18 -8
  151. package/lib/cjs/in/vid.d.ts +2 -0
  152. package/lib/cjs/in/vid.js +87 -0
  153. package/lib/cjs/index.js +21 -11
  154. package/lib/cjs/is/index.js +18 -8
  155. package/lib/cjs/is/kennitala.js +18 -8
  156. package/lib/cjs/is/vsk.js +18 -8
  157. package/lib/cjs/it/aic.js +18 -8
  158. package/lib/cjs/it/codicefiscale.js +18 -8
  159. package/lib/cjs/it/index.js +18 -8
  160. package/lib/cjs/it/iva.js +18 -8
  161. package/lib/cjs/jp/cn.js +18 -8
  162. package/lib/cjs/jp/index.js +18 -8
  163. package/lib/cjs/ke/index.js +18 -8
  164. package/lib/cjs/ke/pin.js +18 -8
  165. package/lib/cjs/kr/brn.js +18 -8
  166. package/lib/cjs/kr/index.js +18 -8
  167. package/lib/cjs/kr/rrn.js +18 -8
  168. package/lib/cjs/li/index.js +18 -8
  169. package/lib/cjs/li/peid.js +18 -8
  170. package/lib/cjs/lk/index.js +18 -8
  171. package/lib/cjs/lk/nic.js +18 -8
  172. package/lib/cjs/lt/asmens.js +18 -8
  173. package/lib/cjs/lt/index.js +18 -8
  174. package/lib/cjs/lt/pvm.js +18 -8
  175. package/lib/cjs/lu/index.js +18 -8
  176. package/lib/cjs/lu/tva.js +18 -8
  177. package/lib/cjs/lv/index.js +18 -8
  178. package/lib/cjs/lv/pvn.js +18 -8
  179. package/lib/cjs/ma/ice.js +18 -8
  180. package/lib/cjs/ma/ice9.js +18 -8
  181. package/lib/cjs/ma/index.js +18 -8
  182. package/lib/cjs/mc/index.js +18 -8
  183. package/lib/cjs/mc/tva.js +18 -8
  184. package/lib/cjs/md/idno.js +18 -8
  185. package/lib/cjs/md/index.js +18 -8
  186. package/lib/cjs/me/index.js +18 -8
  187. package/lib/cjs/me/jmbg.js +18 -8
  188. package/lib/cjs/me/pib.js +18 -8
  189. package/lib/cjs/mk/edb.js +18 -8
  190. package/lib/cjs/mk/index.js +18 -8
  191. package/lib/cjs/mk/jmbg.js +18 -8
  192. package/lib/cjs/mt/index.js +18 -8
  193. package/lib/cjs/mt/vat.js +18 -8
  194. package/lib/cjs/mu/index.js +18 -8
  195. package/lib/cjs/mu/nid.js +18 -8
  196. package/lib/cjs/mx/clabe.js +18 -8
  197. package/lib/cjs/mx/curp.js +21 -11
  198. package/lib/cjs/mx/index.js +18 -8
  199. package/lib/cjs/mx/rfc.js +18 -8
  200. package/lib/cjs/my/index.js +18 -8
  201. package/lib/cjs/my/nric.js +18 -8
  202. package/lib/cjs/nl/bsn.js +18 -8
  203. package/lib/cjs/nl/btw.js +18 -8
  204. package/lib/cjs/nl/index.js +18 -8
  205. package/lib/cjs/nl/onderwijsnummer.js +18 -8
  206. package/lib/cjs/no/fodselsnummer.js +18 -8
  207. package/lib/cjs/no/index.js +18 -8
  208. package/lib/cjs/no/kontonr.js +18 -8
  209. package/lib/cjs/no/mva.js +18 -8
  210. package/lib/cjs/no/orgnr.js +18 -8
  211. package/lib/cjs/nz/bank.js +18 -8
  212. package/lib/cjs/nz/index.js +18 -8
  213. package/lib/cjs/nz/ird.js +18 -8
  214. package/lib/cjs/pe/ce.js +18 -8
  215. package/lib/cjs/pe/cui.js +18 -8
  216. package/lib/cjs/pe/index.js +18 -8
  217. package/lib/cjs/pe/ruc.js +18 -8
  218. package/lib/cjs/pk/cnic.js +18 -8
  219. package/lib/cjs/pk/index.js +18 -8
  220. package/lib/cjs/pk/ntn.js +18 -8
  221. package/lib/cjs/pl/index.js +18 -8
  222. package/lib/cjs/pl/nip.js +18 -8
  223. package/lib/cjs/pl/pesel.js +18 -8
  224. package/lib/cjs/pl/regon.js +18 -8
  225. package/lib/cjs/pt/cc.js +18 -8
  226. package/lib/cjs/pt/index.js +18 -8
  227. package/lib/cjs/pt/nif.js +18 -8
  228. package/lib/cjs/pt/nipc.js +18 -8
  229. package/lib/cjs/py/cedula.js +18 -8
  230. package/lib/cjs/py/index.js +18 -8
  231. package/lib/cjs/py/ruc.js +18 -8
  232. package/lib/cjs/ro/cif.js +18 -8
  233. package/lib/cjs/ro/cnp.js +18 -8
  234. package/lib/cjs/ro/cui.js +18 -8
  235. package/lib/cjs/ro/index.js +18 -8
  236. package/lib/cjs/ro/onrc.js +18 -8
  237. package/lib/cjs/rs/index.js +18 -8
  238. package/lib/cjs/rs/jmbg.js +18 -8
  239. package/lib/cjs/rs/pib.js +18 -8
  240. package/lib/cjs/ru/index.js +18 -8
  241. package/lib/cjs/ru/inn.js +18 -8
  242. package/lib/cjs/se/index.js +18 -8
  243. package/lib/cjs/se/orgnr.js +18 -8
  244. package/lib/cjs/se/personnummer.js +18 -8
  245. package/lib/cjs/se/vat.js +18 -8
  246. package/lib/cjs/sg/index.js +18 -8
  247. package/lib/cjs/sg/uen.js +18 -8
  248. package/lib/cjs/si/ddv.js +18 -8
  249. package/lib/cjs/si/emso.js +18 -8
  250. package/lib/cjs/si/index.js +18 -8
  251. package/lib/cjs/si/jmbg.js +18 -8
  252. package/lib/cjs/sk/dph.js +18 -8
  253. package/lib/cjs/sk/index.js +18 -8
  254. package/lib/cjs/sk/rc.js +18 -8
  255. package/lib/cjs/sm/coe.js +18 -8
  256. package/lib/cjs/sm/index.js +18 -8
  257. package/lib/cjs/sv/index.js +18 -8
  258. package/lib/cjs/sv/nit.js +18 -8
  259. package/lib/cjs/th/idnr.js +18 -8
  260. package/lib/cjs/th/index.js +18 -8
  261. package/lib/cjs/th/moa.js +18 -8
  262. package/lib/cjs/th/tin.js +18 -8
  263. package/lib/cjs/tn/index.js +18 -8
  264. package/lib/cjs/tn/mf.js +18 -8
  265. package/lib/cjs/tr/index.js +18 -8
  266. package/lib/cjs/tr/tckimlik.js +18 -8
  267. package/lib/cjs/tr/vkn.js +18 -8
  268. package/lib/cjs/tw/ban.js +18 -8
  269. package/lib/cjs/tw/index.js +18 -8
  270. package/lib/cjs/tw/natid.js +18 -8
  271. package/lib/cjs/tw/tax_code.js +18 -8
  272. package/lib/cjs/tw/ubn.js +18 -8
  273. package/lib/cjs/tw/ui.js +18 -8
  274. package/lib/cjs/ua/edrpou.js +19 -9
  275. package/lib/cjs/ua/index.js +18 -8
  276. package/lib/cjs/ua/rntrc.js +18 -8
  277. package/lib/cjs/us/ein.js +18 -8
  278. package/lib/cjs/us/index.js +18 -8
  279. package/lib/cjs/us/ssn.js +18 -8
  280. package/lib/cjs/util/checksum.js +10 -11
  281. package/lib/cjs/util/index.js +18 -8
  282. package/lib/cjs/util/isValidDate.js +7 -8
  283. package/lib/cjs/util/iso7064.js +2 -3
  284. package/lib/cjs/util/pymod.js +2 -3
  285. package/lib/cjs/util/strings/char.js +4 -5
  286. package/lib/cjs/util/strings/clean.js +19 -10
  287. package/lib/cjs/util/strings/format.js +2 -3
  288. package/lib/cjs/util/strings/reverseString.js +2 -3
  289. package/lib/cjs/util/strings/splitAt.js +2 -3
  290. package/lib/cjs/uy/cedula.js +18 -8
  291. package/lib/cjs/uy/index.js +18 -8
  292. package/lib/cjs/uy/nie.js +18 -8
  293. package/lib/cjs/uy/rut.js +18 -8
  294. package/lib/cjs/ve/index.js +18 -8
  295. package/lib/cjs/ve/rif.js +18 -8
  296. package/lib/cjs/vn/index.js +18 -8
  297. package/lib/cjs/vn/mst.js +18 -8
  298. package/lib/cjs/za/idnr.js +18 -8
  299. package/lib/cjs/za/index.js +18 -8
  300. package/lib/cjs/za/tin.js +18 -8
  301. package/lib/esm/ca/bc_bhn.d.ts +2 -0
  302. package/lib/esm/ca/bc_bhn.js +53 -0
  303. package/lib/esm/ca/index.d.ts +1 -0
  304. package/lib/esm/ca/index.js +3 -1
  305. package/lib/esm/exceptions.js +2 -2
  306. package/lib/esm/in/index.d.ts +1 -0
  307. package/lib/esm/in/index.js +3 -1
  308. package/lib/esm/in/vid.d.ts +2 -0
  309. package/lib/esm/in/vid.js +51 -0
  310. package/lib/esm/ua/edrpou.js +2 -2
  311. package/package.json +9 -12
  312. package/src/be/personIdentifierHelpers.ts +4 -4
  313. package/src/ca/bc_bhn.spec.ts +38 -0
  314. package/src/ca/bc_bhn.ts +88 -0
  315. package/src/ca/index.ts +1 -0
  316. package/src/de/vat.ts +1 -1
  317. package/src/exceptions.ts +1 -2
  318. package/src/fr/nif.spec.ts +13 -4
  319. package/src/in/index.ts +1 -0
  320. package/src/in/vid.spec.ts +34 -0
  321. package/src/in/vid.ts +84 -0
  322. package/src/ua/edrpou.spec.ts +8 -5
  323. package/src/ua/edrpou.ts +1 -1
  324. package/src/za/idnr.ts +1 -1
@@ -2,8 +2,10 @@ import * as aadhaar_1 from './aadhaar';
2
2
  export { aadhaar_1 as aadhaar };
3
3
  import * as pan_1 from './pan';
4
4
  export { pan_1 as pan };
5
+ import * as vid_1 from './vid';
6
+ export { vid_1 as vid };
5
7
  import * as epic_1 from './epic';
6
8
  export { epic_1 as epic };
7
9
  import * as gstin_1 from './gstin';
8
10
  export { gstin_1 as gstin };
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjJCQUF5QixXQUFXO3NCQUF4QixPQUFPO3VCQUNFLE9BQU87a0JBQWhCLEdBQUc7d0JBQ08sUUFBUTttQkFBbEIsSUFBSTt5QkFDTyxTQUFTO29CQUFwQixLQUFLIn0=
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjJCQUF5QixXQUFXO3NCQUF4QixPQUFPO3VCQUNFLE9BQU87a0JBQWhCLEdBQUc7dUJBQ00sT0FBTztrQkFBaEIsR0FBRzt3QkFDTyxRQUFRO21CQUFsQixJQUFJO3lCQUNPLFNBQVM7b0JBQXBCLEtBQUsifQ==
@@ -0,0 +1,2 @@
1
+ import { ValidateReturn } from '../types';
2
+ export declare const name: string, localName: string, abbreviation: string | undefined, validate: (value: string) => ValidateReturn, format: (value: string) => string, compact: (value: string) => string;
@@ -0,0 +1,51 @@
1
+ import * as exceptions from '../exceptions';
2
+ import { strings } from '../util';
3
+ import { verhoeffValidate } from '../util/checksum';
4
+ function clean(input) {
5
+ return strings.cleanUnicode(input, ' -');
6
+ }
7
+ const validRE = /^[2-9][0-9]{15}$/;
8
+ const impl = {
9
+ name: 'Indian personal virtual identity number',
10
+ localName: 'Indian personal virtual identity number',
11
+ abbreviation: 'VIN',
12
+ compact(input) {
13
+ const [value, err] = clean(input);
14
+ if (err) {
15
+ throw err;
16
+ }
17
+ return value;
18
+ },
19
+ format(input) {
20
+ const [value] = clean(input);
21
+ return strings.splitAt(value, 4, 8, 12).join(' ');
22
+ },
23
+ validate(input) {
24
+ const [value, error] = clean(input);
25
+ if (error) {
26
+ return { isValid: false, error };
27
+ }
28
+ if (value.length !== 16) {
29
+ return { isValid: false, error: new exceptions.InvalidLength() };
30
+ }
31
+ if (!validRE.test(value)) {
32
+ return { isValid: false, error: new exceptions.InvalidFormat() };
33
+ }
34
+ const r = value.split('');
35
+ r.reverse();
36
+ if (value === r.join('')) {
37
+ return { isValid: false, error: new exceptions.InvalidFormat() };
38
+ }
39
+ if (!verhoeffValidate(value)) {
40
+ return { isValid: false, error: new exceptions.InvalidChecksum() };
41
+ }
42
+ return {
43
+ isValid: true,
44
+ compact: value,
45
+ isIndividual: true,
46
+ isCompany: false,
47
+ };
48
+ },
49
+ };
50
+ export const { name, localName, abbreviation, validate, format, compact } = impl;
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2luL3ZpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxLQUFLLFVBQVUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVsQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRCxTQUFTLEtBQUssQ0FBQyxLQUFhO0lBQzFCLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUdELE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDO0FBRW5DLE1BQU0sSUFBSSxHQUFjO0lBQ3RCLElBQUksRUFBRSx5Q0FBeUM7SUFDL0MsU0FBUyxFQUFFLHlDQUF5QztJQUNwRCxZQUFZLEVBQUUsS0FBSztJQUNuQixPQUFPLENBQUMsS0FBYTtRQUNuQixNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1IsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWE7UUFDbEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxRQUFRLENBQUMsS0FBYTtRQUNwQixNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN4QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDWixJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksVUFBVSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7UUFDbkUsQ0FBQztRQUdELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdCLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLFVBQVUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1FBQ3JFLENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUUsS0FBSztZQUNkLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFNBQVMsRUFBRSxLQUFLO1NBQ2pCLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FDdkUsSUFBSSxDQUFDIn0=
@@ -43,7 +43,7 @@ const impl = {
43
43
  modulus: 11,
44
44
  });
45
45
  }
46
- if (String(sum) !== check) {
46
+ if (String(sum % 10) !== check) {
47
47
  return { isValid: false, error: new exceptions.InvalidChecksum() };
48
48
  }
49
49
  return {
@@ -55,4 +55,4 @@ const impl = {
55
55
  },
56
56
  };
57
57
  export const { name, localName, abbreviation, validate, format, compact } = impl;
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRycG91LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3VhL2VkcnBvdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFlQSxPQUFPLEtBQUssVUFBVSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUcvQyxTQUFTLEtBQUssQ0FBQyxLQUFhO0lBQzFCLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELE1BQU0sSUFBSSxHQUFjO0lBQ3RCLElBQUksRUFBRSxtRUFBbUU7SUFDekUsU0FBUyxFQUFFLCtEQUErRDtJQUMxRSxZQUFZLEVBQUUsUUFBUTtJQUN0QixPQUFPLENBQUMsS0FBYTtRQUNuQixNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1IsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWE7UUFDbEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBYTtRQUNwQixNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBRUQsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWxELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUxQixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFO1lBQzNCLE9BQU87WUFDUCxPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUMsQ0FBQztRQUVILElBQUksR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ2YsR0FBRyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3ZCLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEMsT0FBTyxFQUFFLEVBQUU7YUFDWixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksVUFBVSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7UUFDckUsQ0FBQztRQUVELE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSTtZQUNiLE9BQU8sRUFBRSxLQUFLO1lBQ2QsWUFBWSxFQUFFLEtBQUs7WUFDbkIsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUN2RSxJQUFJLENBQUMifQ==
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRycG91LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3VhL2VkcnBvdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFlQSxPQUFPLEtBQUssVUFBVSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUcvQyxTQUFTLEtBQUssQ0FBQyxLQUFhO0lBQzFCLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELE1BQU0sSUFBSSxHQUFjO0lBQ3RCLElBQUksRUFBRSxtRUFBbUU7SUFDekUsU0FBUyxFQUFFLCtEQUErRDtJQUMxRSxZQUFZLEVBQUUsUUFBUTtJQUN0QixPQUFPLENBQUMsS0FBYTtRQUNuQixNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1IsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWE7UUFDbEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBYTtRQUNwQixNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBRUQsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWxELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUxQixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFO1lBQzNCLE9BQU87WUFDUCxPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUMsQ0FBQztRQUVILElBQUksR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ2YsR0FBRyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3ZCLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEMsT0FBTyxFQUFFLEVBQUU7YUFDWixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQy9CLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLFVBQVUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1FBQ3JFLENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUUsS0FBSztZQUNkLFlBQVksRUFBRSxLQUFLO1lBQ25CLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FDdkUsSUFBSSxDQUFDIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stdnum",
3
- "version": "1.10.7",
3
+ "version": "1.11.0",
4
4
  "description": "Standard Number Validation",
5
5
  "files": [
6
6
  "README.md",
@@ -37,7 +37,7 @@
37
37
  },
38
38
  "scripts": {
39
39
  "format": "prettier --write \"src/**/*.ts\"",
40
- "lint": "eslint --ext .js,.jsx,.ts,.tsx src",
40
+ "lint": "eslint src",
41
41
  "test": "jest",
42
42
  "build": "tsc",
43
43
  "prepublishOnly:esm": "tsc -p tsconfig.json",
@@ -75,20 +75,17 @@
75
75
  },
76
76
  "license": "MIT",
77
77
  "devDependencies": {
78
+ "@eslint/js": "^9.18.0",
78
79
  "@semantic-release/changelog": "^6.0.3",
79
80
  "@semantic-release/git": "^10.0.1",
80
81
  "@types/jest": "^29.5.0",
81
- "@typescript-eslint/eslint-plugin": "^7.1.1",
82
- "@typescript-eslint/parser": "^7.1.1",
83
- "eslint": "^8.22.0",
84
- "eslint-config-airbnb-base": "^15.0.0",
85
- "eslint-config-airbnb-typescript": "^18.0.0",
86
- "eslint-config-prettier": "^9.0.0",
87
- "eslint-plugin-import": "^2.22.1",
88
- "eslint-plugin-prettier": "^5.0.0",
82
+ "eslint": "^9.18.0",
83
+ "eslint-config-prettier": "^10.0.1",
89
84
  "jest": "^29.5.0",
90
- "prettier": "^3.0.0",
85
+ "prettier": "^3.4.2",
86
+ "prettier-eslint": "^16.3.0",
91
87
  "ts-jest": "^29.1.0",
92
- "typescript": "^5.1.6"
88
+ "typescript": "^5.7.3",
89
+ "typescript-eslint": "^8.20.0"
93
90
  }
94
91
  }
@@ -34,7 +34,7 @@ export function toDateArray(number: string): string[] {
34
34
  return [yy, mm, dd];
35
35
  }
36
36
 
37
- function getValidPastDates(yymmdd: string): Array<string> {
37
+ function getValidPastDates(yymmdd: string): string[] {
38
38
  const [yy, mm, dd] = toDateArray(yymmdd);
39
39
 
40
40
  return getFullYears(yy)
@@ -81,7 +81,7 @@ export function validStructure(
81
81
  return isValidFirstSix(firstSix, toDob);
82
82
  }
83
83
 
84
- function getChecksumBasesUnknownDob(baseNumber: string): Array<number> {
84
+ function getChecksumBasesUnknownDob(baseNumber: string): number[] {
85
85
  const firstSix = getFirstSix(baseNumber);
86
86
  const [yy] = toDateArray(firstSix);
87
87
 
@@ -93,7 +93,7 @@ function getChecksumBasesUnknownDob(baseNumber: string): Array<number> {
93
93
  function getChecksumBasesForStandardDob(
94
94
  baseNumber: string,
95
95
  toDob: typeof defaultToDob,
96
- ): Array<number> {
96
+ ): number[] {
97
97
  const firstSix = getFirstSix(baseNumber);
98
98
  const dob = toDob(firstSix);
99
99
  const validPastDates = getValidPastDates(dob);
@@ -106,7 +106,7 @@ function getChecksumBasesForStandardDob(
106
106
  function getChecksumBases(
107
107
  number: string,
108
108
  toDob: typeof defaultToDob,
109
- ): Array<number> {
109
+ ): number[] {
110
110
  const firstSix = getFirstSix(number);
111
111
  const dob = toDob(firstSix);
112
112
  const baseNumber = getBaseNumber(number);
@@ -0,0 +1,38 @@
1
+ import { validate, format } from './bc_bhn';
2
+ import {
3
+ InvalidChecksum,
4
+ InvalidComponent,
5
+ InvalidFormat,
6
+ } from '../exceptions';
7
+
8
+ describe('ca/bc_bhn', () => {
9
+ it('format:9698658215', () => {
10
+ const result = format('9698658215');
11
+
12
+ expect(result).toEqual('9698 658 215');
13
+ });
14
+
15
+ test.each(['9698 658 215'])('validate:%s', value => {
16
+ const result = validate(value);
17
+
18
+ expect(result.isValid).toEqual(true);
19
+ });
20
+
21
+ it('validate:9736A04212', () => {
22
+ const result = validate('9736A04212');
23
+
24
+ expect(result.error).toBeInstanceOf(InvalidFormat);
25
+ });
26
+
27
+ it('validate:5736504210', () => {
28
+ const result = validate('5736504210');
29
+
30
+ expect(result.error).toBeInstanceOf(InvalidComponent);
31
+ });
32
+
33
+ it('validate:9698648215', () => {
34
+ const result = validate('9698648215');
35
+
36
+ expect(result.error).toBeInstanceOf(InvalidChecksum);
37
+ });
38
+ });
@@ -0,0 +1,88 @@
1
+ /**
2
+ * BC PHN (British Columbia Personal Health Number).
3
+ *
4
+ * A unique, numerical, lifetime identifier used in the specific identification
5
+ * of an individual client or patient who has had any interaction with the
6
+ * British Columbia health system. It is assigned only to and used by one person
7
+ * and will not be assigned to any other person.
8
+ * The existence of a PHN does not imply eligibility for health care services in
9
+ * BC or provide any indication of an individual’s benefit status.
10
+ *
11
+ * The PNH is a 10-digit number where the first digit is always 9, and the last
12
+ * digit is a MOD-11 check digit.
13
+ *
14
+ * Source:
15
+ * https://www2.gov.bc.ca/gov/content/health/health-drug-coverage/msp/bc-residents/personal-health-identification
16
+ * https://www2.gov.bc.ca/assets/gov/health/practitioner-pro/software-development-guidelines/conformance-standards/vol-4b-app-rules-client-registry.pdf
17
+ *
18
+ * PERSON
19
+ */
20
+
21
+ import * as exceptions from '../exceptions';
22
+ import { strings, weightedSum } from '../util';
23
+ import { Validator, ValidateReturn } from '../types';
24
+ import { isdigits, splitAt } from '../util/strings';
25
+
26
+ function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
27
+ return strings.cleanUnicode(input, ' -');
28
+ }
29
+
30
+ const impl: Validator = {
31
+ name: 'British Columbia Personal Health Number',
32
+ localName: 'British Columbia Personal Health Number',
33
+ abbreviation: 'BC_BHN',
34
+
35
+ compact(input: string): string {
36
+ const [value, err] = clean(input);
37
+
38
+ if (err) {
39
+ throw err;
40
+ }
41
+
42
+ return value;
43
+ },
44
+
45
+ format(input: string): string {
46
+ const [value] = clean(input);
47
+
48
+ return splitAt(value, 4, 7).join(' ');
49
+ },
50
+
51
+ validate(input: string): ValidateReturn {
52
+ const [value, error] = clean(input);
53
+
54
+ if (error) {
55
+ return { isValid: false, error };
56
+ }
57
+ if (value.length !== 10) {
58
+ return { isValid: false, error: new exceptions.InvalidLength() };
59
+ }
60
+ if (value[0] !== '9') {
61
+ return { isValid: false, error: new exceptions.InvalidComponent() };
62
+ }
63
+ if (!isdigits(value)) {
64
+ return { isValid: false, error: new exceptions.InvalidFormat() };
65
+ }
66
+
67
+ const [, front, check] = strings.splitAt(value, 1, -1);
68
+
69
+ const sum = weightedSum(front, {
70
+ weights: [2, 4, 8, 5, 10, 9, 7, 3],
71
+ modulus: 11,
72
+ });
73
+
74
+ if (String((11 - sum) % 11) !== check) {
75
+ return { isValid: false, error: new exceptions.InvalidChecksum() };
76
+ }
77
+
78
+ return {
79
+ isValid: true,
80
+ compact: value,
81
+ isIndividual: true,
82
+ isCompany: false,
83
+ };
84
+ },
85
+ };
86
+
87
+ export const { name, localName, abbreviation, validate, format, compact } =
88
+ impl;
package/src/ca/index.ts CHANGED
@@ -3,3 +3,4 @@ export * as sin from './sin';
3
3
  export * as gst from './gst';
4
4
  export * as qst from './qst';
5
5
  export * as pst from './pst';
6
+ export * as bc_bhn from './bc_bhn';
package/src/de/vat.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Ust ID Nr. (Umsatzsteuer Identifikationsnummer, German VAT number).
3
3
  *
4
- * The number is 10 digits long and uses the ISO 7064 Mod 11, 10 check digit
4
+ * The number is 9 digits long and uses the ISO 7064 Mod 11, 10 check digit
5
5
  * algorithm.
6
6
  *
7
7
  * ENTITY
package/src/exceptions.ts CHANGED
@@ -1,4 +1,3 @@
1
- /* eslint-disable max-classes-per-file */
2
1
  /**
3
2
  * Collection of exceptions.
4
3
  * The validation functions of stdnum should raise one of the below exceptions
@@ -35,7 +34,7 @@ export class InvalidFormat extends ValidationError {
35
34
  * The number's internal checksum or check digit does not match.
36
35
  */
37
36
  export class InvalidChecksum extends ValidationError {
38
- constructor(msg = "The number checksum or check digit is invalid.") {
37
+ constructor(msg = 'The number checksum or check digit is invalid.') {
39
38
  super(msg);
40
39
  this.name = 'InvalidChecksum';
41
40
  }
@@ -8,13 +8,22 @@ describe('fr/nif', () => {
8
8
  expect(result).toEqual('07 01 987 765 432');
9
9
  });
10
10
 
11
- test.each(['3023217600053', '0701987765493'])('validate:%s', value => {
12
- const result = validate(value);
11
+ it('format:3023217600053', () => {
12
+ const result = format('3023217600053');
13
13
 
14
- expect(result.isValid && result.compact).toEqual(value);
14
+ expect(result).toEqual('30 23 217 600 053');
15
15
  });
16
16
 
17
- test.each(['0000000000000'])('validate:%s', value => {
17
+ test.each(['3023217600053', '0701987765493', '3023217600053'])(
18
+ 'validate:%s',
19
+ value => {
20
+ const result = validate(value);
21
+
22
+ expect(result.isValid && result.compact).toEqual(value);
23
+ },
24
+ );
25
+
26
+ test.each(['0000000000000', '3023217600054'])('validate:%s', value => {
18
27
  const result = validate(value);
19
28
 
20
29
  expect(result.isValid).toEqual(false);
package/src/in/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * as aadhaar from './aadhaar';
2
2
  export * as pan from './pan';
3
+ export * as vid from './vid';
3
4
  export * as epic from './epic';
4
5
  export * as gstin from './gstin';
@@ -0,0 +1,34 @@
1
+ import { validate, format } from './vid';
2
+ import { InvalidLength, InvalidFormat, InvalidChecksum } from '../exceptions';
3
+
4
+ describe('in/vid', () => {
5
+ it('format:2341234123412342', () => {
6
+ const result = format('2341234123412342');
7
+
8
+ expect(result).toEqual('2341 2341 2341 2342');
9
+ });
10
+
11
+ test.each(['2341234123412341'])('validate:%s', value => {
12
+ const result = validate(value);
13
+
14
+ expect(result.isValid).toEqual(true);
15
+ });
16
+
17
+ test.each(['13'])('validate:%s', value => {
18
+ const result = validate(value);
19
+
20
+ expect(result.error).toBeInstanceOf(InvalidLength);
21
+ });
22
+
23
+ test.each(['1341234123412341', '2222222222222222'])('validate:%s', value => {
24
+ const result = validate(value);
25
+
26
+ expect(result.error).toBeInstanceOf(InvalidFormat);
27
+ });
28
+
29
+ test.each(['2341234123412342'])('validate:%s', value => {
30
+ const result = validate(value);
31
+
32
+ expect(result.error).toBeInstanceOf(InvalidChecksum);
33
+ });
34
+ });
package/src/in/vid.ts ADDED
@@ -0,0 +1,84 @@
1
+ /**
2
+ * VID (Indian personal virtual identity number).
3
+ *
4
+ * VID is a temporary, revocable 16-digit random number mapped with the Aadhaar number.
5
+ * VID is used in lieu of Aadhaar number whenever authentication or e-KYC services
6
+ * are performed.
7
+ * VID is made up of 16 digits where the last digits is a check digit
8
+ * calculated using the Verhoeff algorithm. The numbers are generated in a
9
+ * random, non-repeating sequence and do not begin with 0 or 1.
10
+ *
11
+ * Source:
12
+ * https://uidai.gov.in/en/contact-support/have-any-question/284-faqs/aadhaar-online-services/virtual-id-vid.html
13
+ * https://uidai.gov.in/images/resource/UIDAI_Circular_11012018.pdf
14
+ *
15
+ * PERSON
16
+ */
17
+
18
+ import * as exceptions from '../exceptions';
19
+ import { strings } from '../util';
20
+ import { Validator, ValidateReturn } from '../types';
21
+ import { verhoeffValidate } from '../util/checksum';
22
+
23
+ function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
24
+ return strings.cleanUnicode(input, ' -');
25
+ }
26
+
27
+ // Regular expression used to check syntax of VID numbers.
28
+ const validRE = /^[2-9][0-9]{15}$/;
29
+
30
+ const impl: Validator = {
31
+ name: 'Indian personal virtual identity number',
32
+ localName: 'Indian personal virtual identity number',
33
+ abbreviation: 'VIN',
34
+ compact(input: string): string {
35
+ const [value, err] = clean(input);
36
+
37
+ if (err) {
38
+ throw err;
39
+ }
40
+
41
+ return value;
42
+ },
43
+
44
+ format(input: string): string {
45
+ const [value] = clean(input);
46
+
47
+ return strings.splitAt(value, 4, 8, 12).join(' ');
48
+ },
49
+
50
+ validate(input: string): ValidateReturn {
51
+ const [value, error] = clean(input);
52
+
53
+ if (error) {
54
+ return { isValid: false, error };
55
+ }
56
+ if (value.length !== 16) {
57
+ return { isValid: false, error: new exceptions.InvalidLength() };
58
+ }
59
+ if (!validRE.test(value)) {
60
+ return { isValid: false, error: new exceptions.InvalidFormat() };
61
+ }
62
+ // Value cannot be a palindrome
63
+ const r = value.split('');
64
+ r.reverse();
65
+ if (value === r.join('')) {
66
+ return { isValid: false, error: new exceptions.InvalidFormat() };
67
+ }
68
+
69
+ // checksum check
70
+ if (!verhoeffValidate(value)) {
71
+ return { isValid: false, error: new exceptions.InvalidChecksum() };
72
+ }
73
+
74
+ return {
75
+ isValid: true,
76
+ compact: value,
77
+ isIndividual: true,
78
+ isCompany: false,
79
+ };
80
+ },
81
+ };
82
+
83
+ export const { name, localName, abbreviation, validate, format, compact } =
84
+ impl;
@@ -8,11 +8,14 @@ describe('ua/edrpou', () => {
8
8
  expect(result).toEqual('32855961');
9
9
  });
10
10
 
11
- it('validate:32855961', () => {
12
- const result = validate('32855961');
13
-
14
- expect(result.isValid && result.compact).toEqual('32855961');
15
- });
11
+ test.each(['32855961', '23226362', '23246880', '25083040'])(
12
+ 'validate:%s',
13
+ value => {
14
+ const result = validate(value);
15
+
16
+ expect(result.isValid && result.compact).toEqual(value);
17
+ },
18
+ );
16
19
 
17
20
  it('validate:12345', () => {
18
21
  const result = validate('12345');
package/src/ua/edrpou.ts CHANGED
@@ -71,7 +71,7 @@ const impl: Validator = {
71
71
  modulus: 11,
72
72
  });
73
73
  }
74
- if (String(sum) !== check) {
74
+ if (String(sum % 10) !== check) {
75
75
  return { isValid: false, error: new exceptions.InvalidChecksum() };
76
76
  }
77
77
 
package/src/za/idnr.ts CHANGED
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * Source
9
9
  * https://en.wikipedia.org/wiki/South_African_identity_card
10
- * http://www.dha.gov.za/index.php/identity-documents2
10
+ * https://www.dha.gov.za/index.php/identity-documents2
11
11
  *
12
12
  * PERSON
13
13
  */