@discretion/core 0.1.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 (885) hide show
  1. package/CHANGELOG.md +117 -0
  2. package/LICENSE +21 -0
  3. package/README.md +319 -0
  4. package/dist/src/checksums/aba.d.ts +25 -0
  5. package/dist/src/checksums/aba.d.ts.map +1 -0
  6. package/dist/src/checksums/aba.js +47 -0
  7. package/dist/src/checksums/aba.js.map +1 -0
  8. package/dist/src/checksums/digits.d.ts +55 -0
  9. package/dist/src/checksums/digits.d.ts.map +1 -0
  10. package/dist/src/checksums/digits.js +114 -0
  11. package/dist/src/checksums/digits.js.map +1 -0
  12. package/dist/src/checksums/icao9303.d.ts +29 -0
  13. package/dist/src/checksums/icao9303.d.ts.map +1 -0
  14. package/dist/src/checksums/icao9303.js +56 -0
  15. package/dist/src/checksums/icao9303.js.map +1 -0
  16. package/dist/src/checksums/index.d.ts +21 -0
  17. package/dist/src/checksums/index.d.ts.map +1 -0
  18. package/dist/src/checksums/index.js +21 -0
  19. package/dist/src/checksums/index.js.map +1 -0
  20. package/dist/src/checksums/iso7064.d.ts +67 -0
  21. package/dist/src/checksums/iso7064.d.ts.map +1 -0
  22. package/dist/src/checksums/iso7064.js +159 -0
  23. package/dist/src/checksums/iso7064.js.map +1 -0
  24. package/dist/src/checksums/luhn.d.ts +32 -0
  25. package/dist/src/checksums/luhn.d.ts.map +1 -0
  26. package/dist/src/checksums/luhn.js +66 -0
  27. package/dist/src/checksums/luhn.js.map +1 -0
  28. package/dist/src/checksums/mod97.d.ts +55 -0
  29. package/dist/src/checksums/mod97.d.ts.map +1 -0
  30. package/dist/src/checksums/mod97.js +94 -0
  31. package/dist/src/checksums/mod97.js.map +1 -0
  32. package/dist/src/checksums/verhoeff.d.ts +28 -0
  33. package/dist/src/checksums/verhoeff.d.ts.map +1 -0
  34. package/dist/src/checksums/verhoeff.js +80 -0
  35. package/dist/src/checksums/verhoeff.js.map +1 -0
  36. package/dist/src/checksums/weighted.d.ts +64 -0
  37. package/dist/src/checksums/weighted.d.ts.map +1 -0
  38. package/dist/src/checksums/weighted.js +97 -0
  39. package/dist/src/checksums/weighted.js.map +1 -0
  40. package/dist/src/context/documentProfile.d.ts +34 -0
  41. package/dist/src/context/documentProfile.d.ts.map +1 -0
  42. package/dist/src/context/documentProfile.js +253 -0
  43. package/dist/src/context/documentProfile.js.map +1 -0
  44. package/dist/src/context/negativeRules.d.ts +60 -0
  45. package/dist/src/context/negativeRules.d.ts.map +1 -0
  46. package/dist/src/context/negativeRules.js +696 -0
  47. package/dist/src/context/negativeRules.js.map +1 -0
  48. package/dist/src/context/score.d.ts +52 -0
  49. package/dist/src/context/score.d.ts.map +1 -0
  50. package/dist/src/context/score.js +346 -0
  51. package/dist/src/context/score.js.map +1 -0
  52. package/dist/src/context/structure.d.ts +46 -0
  53. package/dist/src/context/structure.d.ts.map +1 -0
  54. package/dist/src/context/structure.js +528 -0
  55. package/dist/src/context/structure.js.map +1 -0
  56. package/dist/src/context/triggers.d.ts +73 -0
  57. package/dist/src/context/triggers.d.ts.map +1 -0
  58. package/dist/src/context/triggers.js +172 -0
  59. package/dist/src/context/triggers.js.map +1 -0
  60. package/dist/src/context/types.d.ts +137 -0
  61. package/dist/src/context/types.d.ts.map +1 -0
  62. package/dist/src/context/types.js +25 -0
  63. package/dist/src/context/types.js.map +1 -0
  64. package/dist/src/crypto/keccak256.d.ts +15 -0
  65. package/dist/src/crypto/keccak256.d.ts.map +1 -0
  66. package/dist/src/crypto/keccak256.js +89 -0
  67. package/dist/src/crypto/keccak256.js.map +1 -0
  68. package/dist/src/crypto/sha256.d.ts +16 -0
  69. package/dist/src/crypto/sha256.d.ts.map +1 -0
  70. package/dist/src/crypto/sha256.js +81 -0
  71. package/dist/src/crypto/sha256.js.map +1 -0
  72. package/dist/src/detect/detectors/bankcodes/auBsb.d.ts +11 -0
  73. package/dist/src/detect/detectors/bankcodes/auBsb.d.ts.map +1 -0
  74. package/dist/src/detect/detectors/bankcodes/auBsb.js +34 -0
  75. package/dist/src/detect/detectors/bankcodes/auBsb.js.map +1 -0
  76. package/dist/src/detect/detectors/bankcodes/brAgencia.d.ts +15 -0
  77. package/dist/src/detect/detectors/bankcodes/brAgencia.d.ts.map +1 -0
  78. package/dist/src/detect/detectors/bankcodes/brAgencia.js +43 -0
  79. package/dist/src/detect/detectors/bankcodes/brAgencia.js.map +1 -0
  80. package/dist/src/detect/detectors/bankcodes/caTransit.d.ts +13 -0
  81. package/dist/src/detect/detectors/bankcodes/caTransit.d.ts.map +1 -0
  82. package/dist/src/detect/detectors/bankcodes/caTransit.js +86 -0
  83. package/dist/src/detect/detectors/bankcodes/caTransit.js.map +1 -0
  84. package/dist/src/detect/detectors/bankcodes/inIfsc.d.ts +13 -0
  85. package/dist/src/detect/detectors/bankcodes/inIfsc.d.ts.map +1 -0
  86. package/dist/src/detect/detectors/bankcodes/inIfsc.js +37 -0
  87. package/dist/src/detect/detectors/bankcodes/inIfsc.js.map +1 -0
  88. package/dist/src/detect/detectors/bankcodes/index.d.ts +10 -0
  89. package/dist/src/detect/detectors/bankcodes/index.d.ts.map +1 -0
  90. package/dist/src/detect/detectors/bankcodes/index.js +10 -0
  91. package/dist/src/detect/detectors/bankcodes/index.js.map +1 -0
  92. package/dist/src/detect/detectors/bankcodes/ukSortCode.d.ts +13 -0
  93. package/dist/src/detect/detectors/bankcodes/ukSortCode.d.ts.map +1 -0
  94. package/dist/src/detect/detectors/bankcodes/ukSortCode.js +36 -0
  95. package/dist/src/detect/detectors/bankcodes/ukSortCode.js.map +1 -0
  96. package/dist/src/detect/detectors/bankcodes/usRouting.d.ts +12 -0
  97. package/dist/src/detect/detectors/bankcodes/usRouting.d.ts.map +1 -0
  98. package/dist/src/detect/detectors/bankcodes/usRouting.js +45 -0
  99. package/dist/src/detect/detectors/bankcodes/usRouting.js.map +1 -0
  100. package/dist/src/detect/detectors/contact/email.d.ts +16 -0
  101. package/dist/src/detect/detectors/contact/email.d.ts.map +1 -0
  102. package/dist/src/detect/detectors/contact/email.js +111 -0
  103. package/dist/src/detect/detectors/contact/email.js.map +1 -0
  104. package/dist/src/detect/detectors/contact/index.d.ts +11 -0
  105. package/dist/src/detect/detectors/contact/index.d.ts.map +1 -0
  106. package/dist/src/detect/detectors/contact/index.js +11 -0
  107. package/dist/src/detect/detectors/contact/index.js.map +1 -0
  108. package/dist/src/detect/detectors/contact/ipv4.d.ts +12 -0
  109. package/dist/src/detect/detectors/contact/ipv4.d.ts.map +1 -0
  110. package/dist/src/detect/detectors/contact/ipv4.js +109 -0
  111. package/dist/src/detect/detectors/contact/ipv4.js.map +1 -0
  112. package/dist/src/detect/detectors/contact/ipv6.d.ts +16 -0
  113. package/dist/src/detect/detectors/contact/ipv6.d.ts.map +1 -0
  114. package/dist/src/detect/detectors/contact/ipv6.js +187 -0
  115. package/dist/src/detect/detectors/contact/ipv6.js.map +1 -0
  116. package/dist/src/detect/detectors/contact/mac.d.ts +14 -0
  117. package/dist/src/detect/detectors/contact/mac.d.ts.map +1 -0
  118. package/dist/src/detect/detectors/contact/mac.js +64 -0
  119. package/dist/src/detect/detectors/contact/mac.js.map +1 -0
  120. package/dist/src/detect/detectors/contact/phone.d.ts +21 -0
  121. package/dist/src/detect/detectors/contact/phone.d.ts.map +1 -0
  122. package/dist/src/detect/detectors/contact/phone.js +76 -0
  123. package/dist/src/detect/detectors/contact/phone.js.map +1 -0
  124. package/dist/src/detect/detectors/contact/urlCredentials.d.ts +23 -0
  125. package/dist/src/detect/detectors/contact/urlCredentials.d.ts.map +1 -0
  126. package/dist/src/detect/detectors/contact/urlCredentials.js +123 -0
  127. package/dist/src/detect/detectors/contact/urlCredentials.js.map +1 -0
  128. package/dist/src/detect/detectors/crypto/ada.d.ts +13 -0
  129. package/dist/src/detect/detectors/crypto/ada.d.ts.map +1 -0
  130. package/dist/src/detect/detectors/crypto/ada.js +51 -0
  131. package/dist/src/detect/detectors/crypto/ada.js.map +1 -0
  132. package/dist/src/detect/detectors/crypto/btc.d.ts +15 -0
  133. package/dist/src/detect/detectors/crypto/btc.d.ts.map +1 -0
  134. package/dist/src/detect/detectors/crypto/btc.js +78 -0
  135. package/dist/src/detect/detectors/crypto/btc.js.map +1 -0
  136. package/dist/src/detect/detectors/crypto/dot.d.ts +13 -0
  137. package/dist/src/detect/detectors/crypto/dot.d.ts.map +1 -0
  138. package/dist/src/detect/detectors/crypto/dot.js +41 -0
  139. package/dist/src/detect/detectors/crypto/dot.js.map +1 -0
  140. package/dist/src/detect/detectors/crypto/eth.d.ts +15 -0
  141. package/dist/src/detect/detectors/crypto/eth.d.ts.map +1 -0
  142. package/dist/src/detect/detectors/crypto/eth.js +63 -0
  143. package/dist/src/detect/detectors/crypto/eth.js.map +1 -0
  144. package/dist/src/detect/detectors/crypto/index.d.ts +12 -0
  145. package/dist/src/detect/detectors/crypto/index.d.ts.map +1 -0
  146. package/dist/src/detect/detectors/crypto/index.js +12 -0
  147. package/dist/src/detect/detectors/crypto/index.js.map +1 -0
  148. package/dist/src/detect/detectors/crypto/ltc.d.ts +12 -0
  149. package/dist/src/detect/detectors/crypto/ltc.d.ts.map +1 -0
  150. package/dist/src/detect/detectors/crypto/ltc.js +71 -0
  151. package/dist/src/detect/detectors/crypto/ltc.js.map +1 -0
  152. package/dist/src/detect/detectors/crypto/sol.d.ts +13 -0
  153. package/dist/src/detect/detectors/crypto/sol.d.ts.map +1 -0
  154. package/dist/src/detect/detectors/crypto/sol.js +39 -0
  155. package/dist/src/detect/detectors/crypto/sol.js.map +1 -0
  156. package/dist/src/detect/detectors/crypto/trx.d.ts +8 -0
  157. package/dist/src/detect/detectors/crypto/trx.d.ts.map +1 -0
  158. package/dist/src/detect/detectors/crypto/trx.js +34 -0
  159. package/dist/src/detect/detectors/crypto/trx.js.map +1 -0
  160. package/dist/src/detect/detectors/crypto/xmr.d.ts +10 -0
  161. package/dist/src/detect/detectors/crypto/xmr.d.ts.map +1 -0
  162. package/dist/src/detect/detectors/crypto/xmr.js +51 -0
  163. package/dist/src/detect/detectors/crypto/xmr.js.map +1 -0
  164. package/dist/src/detect/detectors/documents/driversLicense.d.ts +24 -0
  165. package/dist/src/detect/detectors/documents/driversLicense.d.ts.map +1 -0
  166. package/dist/src/detect/detectors/documents/driversLicense.js +79 -0
  167. package/dist/src/detect/detectors/documents/driversLicense.js.map +1 -0
  168. package/dist/src/detect/detectors/documents/healthData.d.ts +23 -0
  169. package/dist/src/detect/detectors/documents/healthData.d.ts.map +1 -0
  170. package/dist/src/detect/detectors/documents/healthData.js +78 -0
  171. package/dist/src/detect/detectors/documents/healthData.js.map +1 -0
  172. package/dist/src/detect/detectors/documents/index.d.ts +9 -0
  173. package/dist/src/detect/detectors/documents/index.d.ts.map +1 -0
  174. package/dist/src/detect/detectors/documents/index.js +9 -0
  175. package/dist/src/detect/detectors/documents/index.js.map +1 -0
  176. package/dist/src/detect/detectors/documents/passportMrz.d.ts +20 -0
  177. package/dist/src/detect/detectors/documents/passportMrz.d.ts.map +1 -0
  178. package/dist/src/detect/detectors/documents/passportMrz.js +194 -0
  179. package/dist/src/detect/detectors/documents/passportMrz.js.map +1 -0
  180. package/dist/src/detect/detectors/documents/usNpi.d.ts +16 -0
  181. package/dist/src/detect/detectors/documents/usNpi.d.ts.map +1 -0
  182. package/dist/src/detect/detectors/documents/usNpi.js +48 -0
  183. package/dist/src/detect/detectors/documents/usNpi.js.map +1 -0
  184. package/dist/src/detect/detectors/documents/vin.d.ts +15 -0
  185. package/dist/src/detect/detectors/documents/vin.d.ts.map +1 -0
  186. package/dist/src/detect/detectors/documents/vin.js +64 -0
  187. package/dist/src/detect/detectors/documents/vin.js.map +1 -0
  188. package/dist/src/detect/detectors/financial/creditCard.d.ts +23 -0
  189. package/dist/src/detect/detectors/financial/creditCard.d.ts.map +1 -0
  190. package/dist/src/detect/detectors/financial/creditCard.js +157 -0
  191. package/dist/src/detect/detectors/financial/creditCard.js.map +1 -0
  192. package/dist/src/detect/detectors/financial/iban.d.ts +18 -0
  193. package/dist/src/detect/detectors/financial/iban.d.ts.map +1 -0
  194. package/dist/src/detect/detectors/financial/iban.js +80 -0
  195. package/dist/src/detect/detectors/financial/iban.js.map +1 -0
  196. package/dist/src/detect/detectors/financial/ibanRegistry.d.ts +35 -0
  197. package/dist/src/detect/detectors/financial/ibanRegistry.d.ts.map +1 -0
  198. package/dist/src/detect/detectors/financial/ibanRegistry.js +92 -0
  199. package/dist/src/detect/detectors/financial/ibanRegistry.js.map +1 -0
  200. package/dist/src/detect/detectors/financial/index.d.ts +7 -0
  201. package/dist/src/detect/detectors/financial/index.d.ts.map +1 -0
  202. package/dist/src/detect/detectors/financial/index.js +7 -0
  203. package/dist/src/detect/detectors/financial/index.js.map +1 -0
  204. package/dist/src/detect/detectors/financial/swiftBic.d.ts +17 -0
  205. package/dist/src/detect/detectors/financial/swiftBic.d.ts.map +1 -0
  206. package/dist/src/detect/detectors/financial/swiftBic.js +55 -0
  207. package/dist/src/detect/detectors/financial/swiftBic.js.map +1 -0
  208. package/dist/src/detect/detectors/index.d.ts +15 -0
  209. package/dist/src/detect/detectors/index.d.ts.map +1 -0
  210. package/dist/src/detect/detectors/index.js +15 -0
  211. package/dist/src/detect/detectors/index.js.map +1 -0
  212. package/dist/src/detect/detectors/location/coordinates.d.ts +14 -0
  213. package/dist/src/detect/detectors/location/coordinates.d.ts.map +1 -0
  214. package/dist/src/detect/detectors/location/coordinates.js +79 -0
  215. package/dist/src/detect/detectors/location/coordinates.js.map +1 -0
  216. package/dist/src/detect/detectors/location/index.d.ts +7 -0
  217. package/dist/src/detect/detectors/location/index.d.ts.map +1 -0
  218. package/dist/src/detect/detectors/location/index.js +7 -0
  219. package/dist/src/detect/detectors/location/index.js.map +1 -0
  220. package/dist/src/detect/detectors/location/postalCode.d.ts +13 -0
  221. package/dist/src/detect/detectors/location/postalCode.d.ts.map +1 -0
  222. package/dist/src/detect/detectors/location/postalCode.js +53 -0
  223. package/dist/src/detect/detectors/location/postalCode.js.map +1 -0
  224. package/dist/src/detect/detectors/location/postalRegistry.d.ts +19 -0
  225. package/dist/src/detect/detectors/location/postalRegistry.d.ts.map +1 -0
  226. package/dist/src/detect/detectors/location/postalRegistry.js +73 -0
  227. package/dist/src/detect/detectors/location/postalRegistry.js.map +1 -0
  228. package/dist/src/detect/detectors/location/streetAddress.d.ts +21 -0
  229. package/dist/src/detect/detectors/location/streetAddress.d.ts.map +1 -0
  230. package/dist/src/detect/detectors/location/streetAddress.js +70 -0
  231. package/dist/src/detect/detectors/location/streetAddress.js.map +1 -0
  232. package/dist/src/detect/detectors/natid/africa.d.ts +17 -0
  233. package/dist/src/detect/detectors/natid/africa.d.ts.map +1 -0
  234. package/dist/src/detect/detectors/natid/africa.js +106 -0
  235. package/dist/src/detect/detectors/natid/africa.js.map +1 -0
  236. package/dist/src/detect/detectors/natid/ar.d.ts +14 -0
  237. package/dist/src/detect/detectors/natid/ar.d.ts.map +1 -0
  238. package/dist/src/detect/detectors/natid/ar.js +62 -0
  239. package/dist/src/detect/detectors/natid/ar.js.map +1 -0
  240. package/dist/src/detect/detectors/natid/au.d.ts +13 -0
  241. package/dist/src/detect/detectors/natid/au.d.ts.map +1 -0
  242. package/dist/src/detect/detectors/natid/au.js +100 -0
  243. package/dist/src/detect/detectors/natid/au.js.map +1 -0
  244. package/dist/src/detect/detectors/natid/be.d.ts +8 -0
  245. package/dist/src/detect/detectors/natid/be.d.ts.map +1 -0
  246. package/dist/src/detect/detectors/natid/be.js +44 -0
  247. package/dist/src/detect/detectors/natid/be.js.map +1 -0
  248. package/dist/src/detect/detectors/natid/bg.d.ts +7 -0
  249. package/dist/src/detect/detectors/natid/bg.d.ts.map +1 -0
  250. package/dist/src/detect/detectors/natid/bg.js +44 -0
  251. package/dist/src/detect/detectors/natid/bg.js.map +1 -0
  252. package/dist/src/detect/detectors/natid/br.d.ts +8 -0
  253. package/dist/src/detect/detectors/natid/br.d.ts.map +1 -0
  254. package/dist/src/detect/detectors/natid/br.js +85 -0
  255. package/dist/src/detect/detectors/natid/br.js.map +1 -0
  256. package/dist/src/detect/detectors/natid/ca.d.ts +8 -0
  257. package/dist/src/detect/detectors/natid/ca.d.ts.map +1 -0
  258. package/dist/src/detect/detectors/natid/ca.js +41 -0
  259. package/dist/src/detect/detectors/natid/ca.js.map +1 -0
  260. package/dist/src/detect/detectors/natid/cl.d.ts +9 -0
  261. package/dist/src/detect/detectors/natid/cl.d.ts.map +1 -0
  262. package/dist/src/detect/detectors/natid/cl.js +47 -0
  263. package/dist/src/detect/detectors/natid/cl.js.map +1 -0
  264. package/dist/src/detect/detectors/natid/cn.d.ts +9 -0
  265. package/dist/src/detect/detectors/natid/cn.d.ts.map +1 -0
  266. package/dist/src/detect/detectors/natid/cn.js +49 -0
  267. package/dist/src/detect/detectors/natid/cn.js.map +1 -0
  268. package/dist/src/detect/detectors/natid/co.d.ts +10 -0
  269. package/dist/src/detect/detectors/natid/co.d.ts.map +1 -0
  270. package/dist/src/detect/detectors/natid/co.js +43 -0
  271. package/dist/src/detect/detectors/natid/co.js.map +1 -0
  272. package/dist/src/detect/detectors/natid/cz.d.ts +11 -0
  273. package/dist/src/detect/detectors/natid/cz.d.ts.map +1 -0
  274. package/dist/src/detect/detectors/natid/cz.js +44 -0
  275. package/dist/src/detect/detectors/natid/cz.js.map +1 -0
  276. package/dist/src/detect/detectors/natid/de.d.ts +16 -0
  277. package/dist/src/detect/detectors/natid/de.d.ts.map +1 -0
  278. package/dist/src/detect/detectors/natid/de.js +77 -0
  279. package/dist/src/detect/detectors/natid/de.js.map +1 -0
  280. package/dist/src/detect/detectors/natid/dk.d.ts +9 -0
  281. package/dist/src/detect/detectors/natid/dk.d.ts.map +1 -0
  282. package/dist/src/detect/detectors/natid/dk.js +31 -0
  283. package/dist/src/detect/detectors/natid/dk.js.map +1 -0
  284. package/dist/src/detect/detectors/natid/es.d.ts +12 -0
  285. package/dist/src/detect/detectors/natid/es.d.ts.map +1 -0
  286. package/dist/src/detect/detectors/natid/es.js +96 -0
  287. package/dist/src/detect/detectors/natid/es.js.map +1 -0
  288. package/dist/src/detect/detectors/natid/fi.d.ts +10 -0
  289. package/dist/src/detect/detectors/natid/fi.d.ts.map +1 -0
  290. package/dist/src/detect/detectors/natid/fi.js +40 -0
  291. package/dist/src/detect/detectors/natid/fi.js.map +1 -0
  292. package/dist/src/detect/detectors/natid/fr.d.ts +12 -0
  293. package/dist/src/detect/detectors/natid/fr.d.ts.map +1 -0
  294. package/dist/src/detect/detectors/natid/fr.js +61 -0
  295. package/dist/src/detect/detectors/natid/fr.js.map +1 -0
  296. package/dist/src/detect/detectors/natid/gb.d.ts +10 -0
  297. package/dist/src/detect/detectors/natid/gb.d.ts.map +1 -0
  298. package/dist/src/detect/detectors/natid/gb.js +72 -0
  299. package/dist/src/detect/detectors/natid/gb.js.map +1 -0
  300. package/dist/src/detect/detectors/natid/gr.d.ts +7 -0
  301. package/dist/src/detect/detectors/natid/gr.d.ts.map +1 -0
  302. package/dist/src/detect/detectors/natid/gr.js +36 -0
  303. package/dist/src/detect/detectors/natid/gr.js.map +1 -0
  304. package/dist/src/detect/detectors/natid/gulf.d.ts +16 -0
  305. package/dist/src/detect/detectors/natid/gulf.d.ts.map +1 -0
  306. package/dist/src/detect/detectors/natid/gulf.js +121 -0
  307. package/dist/src/detect/detectors/natid/gulf.js.map +1 -0
  308. package/dist/src/detect/detectors/natid/hk.d.ts +9 -0
  309. package/dist/src/detect/detectors/natid/hk.d.ts.map +1 -0
  310. package/dist/src/detect/detectors/natid/hk.js +41 -0
  311. package/dist/src/detect/detectors/natid/hk.js.map +1 -0
  312. package/dist/src/detect/detectors/natid/hr.d.ts +6 -0
  313. package/dist/src/detect/detectors/natid/hr.d.ts.map +1 -0
  314. package/dist/src/detect/detectors/natid/hr.js +32 -0
  315. package/dist/src/detect/detectors/natid/hr.js.map +1 -0
  316. package/dist/src/detect/detectors/natid/hu.d.ts +7 -0
  317. package/dist/src/detect/detectors/natid/hu.d.ts.map +1 -0
  318. package/dist/src/detect/detectors/natid/hu.js +37 -0
  319. package/dist/src/detect/detectors/natid/hu.js.map +1 -0
  320. package/dist/src/detect/detectors/natid/ie.d.ts +9 -0
  321. package/dist/src/detect/detectors/natid/ie.d.ts.map +1 -0
  322. package/dist/src/detect/detectors/natid/ie.js +36 -0
  323. package/dist/src/detect/detectors/natid/ie.js.map +1 -0
  324. package/dist/src/detect/detectors/natid/il.d.ts +10 -0
  325. package/dist/src/detect/detectors/natid/il.d.ts.map +1 -0
  326. package/dist/src/detect/detectors/natid/il.js +38 -0
  327. package/dist/src/detect/detectors/natid/il.js.map +1 -0
  328. package/dist/src/detect/detectors/natid/in.d.ts +17 -0
  329. package/dist/src/detect/detectors/natid/in.d.ts.map +1 -0
  330. package/dist/src/detect/detectors/natid/in.js +67 -0
  331. package/dist/src/detect/detectors/natid/in.js.map +1 -0
  332. package/dist/src/detect/detectors/natid/index.d.ts +55 -0
  333. package/dist/src/detect/detectors/natid/index.d.ts.map +1 -0
  334. package/dist/src/detect/detectors/natid/index.js +55 -0
  335. package/dist/src/detect/detectors/natid/index.js.map +1 -0
  336. package/dist/src/detect/detectors/natid/is.d.ts +8 -0
  337. package/dist/src/detect/detectors/natid/is.d.ts.map +1 -0
  338. package/dist/src/detect/detectors/natid/is.js +42 -0
  339. package/dist/src/detect/detectors/natid/is.js.map +1 -0
  340. package/dist/src/detect/detectors/natid/it.d.ts +12 -0
  341. package/dist/src/detect/detectors/natid/it.d.ts.map +1 -0
  342. package/dist/src/detect/detectors/natid/it.js +62 -0
  343. package/dist/src/detect/detectors/natid/it.js.map +1 -0
  344. package/dist/src/detect/detectors/natid/jp.d.ts +9 -0
  345. package/dist/src/detect/detectors/natid/jp.d.ts.map +1 -0
  346. package/dist/src/detect/detectors/natid/jp.js +46 -0
  347. package/dist/src/detect/detectors/natid/jp.js.map +1 -0
  348. package/dist/src/detect/detectors/natid/kr.d.ts +11 -0
  349. package/dist/src/detect/detectors/natid/kr.d.ts.map +1 -0
  350. package/dist/src/detect/detectors/natid/kr.js +40 -0
  351. package/dist/src/detect/detectors/natid/kr.js.map +1 -0
  352. package/dist/src/detect/detectors/natid/kz.d.ts +8 -0
  353. package/dist/src/detect/detectors/natid/kz.d.ts.map +1 -0
  354. package/dist/src/detect/detectors/natid/kz.js +46 -0
  355. package/dist/src/detect/detectors/natid/kz.js.map +1 -0
  356. package/dist/src/detect/detectors/natid/mx.d.ts +16 -0
  357. package/dist/src/detect/detectors/natid/mx.d.ts.map +1 -0
  358. package/dist/src/detect/detectors/natid/mx.js +82 -0
  359. package/dist/src/detect/detectors/natid/mx.js.map +1 -0
  360. package/dist/src/detect/detectors/natid/nl.d.ts +8 -0
  361. package/dist/src/detect/detectors/natid/nl.d.ts.map +1 -0
  362. package/dist/src/detect/detectors/natid/nl.js +40 -0
  363. package/dist/src/detect/detectors/natid/nl.js.map +1 -0
  364. package/dist/src/detect/detectors/natid/no.d.ts +9 -0
  365. package/dist/src/detect/detectors/natid/no.d.ts.map +1 -0
  366. package/dist/src/detect/detectors/natid/no.js +52 -0
  367. package/dist/src/detect/detectors/natid/no.js.map +1 -0
  368. package/dist/src/detect/detectors/natid/nz.d.ts +9 -0
  369. package/dist/src/detect/detectors/natid/nz.d.ts.map +1 -0
  370. package/dist/src/detect/detectors/natid/nz.js +52 -0
  371. package/dist/src/detect/detectors/natid/nz.js.map +1 -0
  372. package/dist/src/detect/detectors/natid/pe.d.ts +7 -0
  373. package/dist/src/detect/detectors/natid/pe.d.ts.map +1 -0
  374. package/dist/src/detect/detectors/natid/pe.js +26 -0
  375. package/dist/src/detect/detectors/natid/pe.js.map +1 -0
  376. package/dist/src/detect/detectors/natid/pl.d.ts +11 -0
  377. package/dist/src/detect/detectors/natid/pl.d.ts.map +1 -0
  378. package/dist/src/detect/detectors/natid/pl.js +105 -0
  379. package/dist/src/detect/detectors/natid/pl.js.map +1 -0
  380. package/dist/src/detect/detectors/natid/pt.d.ts +6 -0
  381. package/dist/src/detect/detectors/natid/pt.d.ts.map +1 -0
  382. package/dist/src/detect/detectors/natid/pt.js +35 -0
  383. package/dist/src/detect/detectors/natid/pt.js.map +1 -0
  384. package/dist/src/detect/detectors/natid/ro.d.ts +8 -0
  385. package/dist/src/detect/detectors/natid/ro.d.ts.map +1 -0
  386. package/dist/src/detect/detectors/natid/ro.js +48 -0
  387. package/dist/src/detect/detectors/natid/ro.js.map +1 -0
  388. package/dist/src/detect/detectors/natid/ru.d.ts +11 -0
  389. package/dist/src/detect/detectors/natid/ru.d.ts.map +1 -0
  390. package/dist/src/detect/detectors/natid/ru.js +86 -0
  391. package/dist/src/detect/detectors/natid/ru.js.map +1 -0
  392. package/dist/src/detect/detectors/natid/se.d.ts +9 -0
  393. package/dist/src/detect/detectors/natid/se.d.ts.map +1 -0
  394. package/dist/src/detect/detectors/natid/se.js +43 -0
  395. package/dist/src/detect/detectors/natid/se.js.map +1 -0
  396. package/dist/src/detect/detectors/natid/seasia.d.ts +19 -0
  397. package/dist/src/detect/detectors/natid/seasia.d.ts.map +1 -0
  398. package/dist/src/detect/detectors/natid/seasia.js +182 -0
  399. package/dist/src/detect/detectors/natid/seasia.js.map +1 -0
  400. package/dist/src/detect/detectors/natid/sg.d.ts +8 -0
  401. package/dist/src/detect/detectors/natid/sg.d.ts.map +1 -0
  402. package/dist/src/detect/detectors/natid/sg.js +39 -0
  403. package/dist/src/detect/detectors/natid/sg.js.map +1 -0
  404. package/dist/src/detect/detectors/natid/si.d.ts +8 -0
  405. package/dist/src/detect/detectors/natid/si.d.ts.map +1 -0
  406. package/dist/src/detect/detectors/natid/si.js +44 -0
  407. package/dist/src/detect/detectors/natid/si.js.map +1 -0
  408. package/dist/src/detect/detectors/natid/tr.d.ts +14 -0
  409. package/dist/src/detect/detectors/natid/tr.d.ts.map +1 -0
  410. package/dist/src/detect/detectors/natid/tr.js +79 -0
  411. package/dist/src/detect/detectors/natid/tr.js.map +1 -0
  412. package/dist/src/detect/detectors/natid/tw.d.ts +9 -0
  413. package/dist/src/detect/detectors/natid/tw.d.ts.map +1 -0
  414. package/dist/src/detect/detectors/natid/tw.js +40 -0
  415. package/dist/src/detect/detectors/natid/tw.js.map +1 -0
  416. package/dist/src/detect/detectors/natid/ua.d.ts +7 -0
  417. package/dist/src/detect/detectors/natid/ua.d.ts.map +1 -0
  418. package/dist/src/detect/detectors/natid/ua.js +38 -0
  419. package/dist/src/detect/detectors/natid/ua.js.map +1 -0
  420. package/dist/src/detect/detectors/natid/us.d.ts +15 -0
  421. package/dist/src/detect/detectors/natid/us.d.ts.map +1 -0
  422. package/dist/src/detect/detectors/natid/us.js +119 -0
  423. package/dist/src/detect/detectors/natid/us.js.map +1 -0
  424. package/dist/src/detect/detectors/natid/za.d.ts +9 -0
  425. package/dist/src/detect/detectors/natid/za.d.ts.map +1 -0
  426. package/dist/src/detect/detectors/natid/za.js +44 -0
  427. package/dist/src/detect/detectors/natid/za.js.map +1 -0
  428. package/dist/src/detect/detectors/secrets/apiKey.d.ts +14 -0
  429. package/dist/src/detect/detectors/secrets/apiKey.d.ts.map +1 -0
  430. package/dist/src/detect/detectors/secrets/apiKey.js +103 -0
  431. package/dist/src/detect/detectors/secrets/apiKey.js.map +1 -0
  432. package/dist/src/detect/detectors/secrets/connectionString.d.ts +12 -0
  433. package/dist/src/detect/detectors/secrets/connectionString.d.ts.map +1 -0
  434. package/dist/src/detect/detectors/secrets/connectionString.js +70 -0
  435. package/dist/src/detect/detectors/secrets/connectionString.js.map +1 -0
  436. package/dist/src/detect/detectors/secrets/genericSecret.d.ts +22 -0
  437. package/dist/src/detect/detectors/secrets/genericSecret.d.ts.map +1 -0
  438. package/dist/src/detect/detectors/secrets/genericSecret.js +77 -0
  439. package/dist/src/detect/detectors/secrets/genericSecret.js.map +1 -0
  440. package/dist/src/detect/detectors/secrets/index.d.ts +9 -0
  441. package/dist/src/detect/detectors/secrets/index.d.ts.map +1 -0
  442. package/dist/src/detect/detectors/secrets/index.js +9 -0
  443. package/dist/src/detect/detectors/secrets/index.js.map +1 -0
  444. package/dist/src/detect/detectors/secrets/jwt.d.ts +11 -0
  445. package/dist/src/detect/detectors/secrets/jwt.d.ts.map +1 -0
  446. package/dist/src/detect/detectors/secrets/jwt.js +111 -0
  447. package/dist/src/detect/detectors/secrets/jwt.js.map +1 -0
  448. package/dist/src/detect/detectors/secrets/pemPrivateKey.d.ts +16 -0
  449. package/dist/src/detect/detectors/secrets/pemPrivateKey.d.ts.map +1 -0
  450. package/dist/src/detect/detectors/secrets/pemPrivateKey.js +56 -0
  451. package/dist/src/detect/detectors/secrets/pemPrivateKey.js.map +1 -0
  452. package/dist/src/detect/detectors/vat/euVat.d.ts +17 -0
  453. package/dist/src/detect/detectors/vat/euVat.d.ts.map +1 -0
  454. package/dist/src/detect/detectors/vat/euVat.js +293 -0
  455. package/dist/src/detect/detectors/vat/euVat.js.map +1 -0
  456. package/dist/src/detect/detectors/vat/index.d.ts +5 -0
  457. package/dist/src/detect/detectors/vat/index.d.ts.map +1 -0
  458. package/dist/src/detect/detectors/vat/index.js +5 -0
  459. package/dist/src/detect/detectors/vat/index.js.map +1 -0
  460. package/dist/src/detect/entropy.d.ts +28 -0
  461. package/dist/src/detect/entropy.d.ts.map +1 -0
  462. package/dist/src/detect/entropy.js +64 -0
  463. package/dist/src/detect/entropy.js.map +1 -0
  464. package/dist/src/detect/isoCountries.d.ts +10 -0
  465. package/dist/src/detect/isoCountries.d.ts.map +1 -0
  466. package/dist/src/detect/isoCountries.js +25 -0
  467. package/dist/src/detect/isoCountries.js.map +1 -0
  468. package/dist/src/detect/registry.d.ts +50 -0
  469. package/dist/src/detect/registry.d.ts.map +1 -0
  470. package/dist/src/detect/registry.js +110 -0
  471. package/dist/src/detect/registry.js.map +1 -0
  472. package/dist/src/detect/runner.d.ts +64 -0
  473. package/dist/src/detect/runner.d.ts.map +1 -0
  474. package/dist/src/detect/runner.js +142 -0
  475. package/dist/src/detect/runner.js.map +1 -0
  476. package/dist/src/detect/types.d.ts +251 -0
  477. package/dist/src/detect/types.d.ts.map +1 -0
  478. package/dist/src/detect/types.js +59 -0
  479. package/dist/src/detect/types.js.map +1 -0
  480. package/dist/src/encoding/base58.d.ts +26 -0
  481. package/dist/src/encoding/base58.d.ts.map +1 -0
  482. package/dist/src/encoding/base58.js +77 -0
  483. package/dist/src/encoding/base58.js.map +1 -0
  484. package/dist/src/encoding/base58monero.d.ts +15 -0
  485. package/dist/src/encoding/base58monero.d.ts.map +1 -0
  486. package/dist/src/encoding/base58monero.js +87 -0
  487. package/dist/src/encoding/base58monero.js.map +1 -0
  488. package/dist/src/encoding/bech32.d.ts +28 -0
  489. package/dist/src/encoding/bech32.d.ts.map +1 -0
  490. package/dist/src/encoding/bech32.js +108 -0
  491. package/dist/src/encoding/bech32.js.map +1 -0
  492. package/dist/src/encoding/bytes.d.ts +15 -0
  493. package/dist/src/encoding/bytes.d.ts.map +1 -0
  494. package/dist/src/encoding/bytes.js +46 -0
  495. package/dist/src/encoding/bytes.js.map +1 -0
  496. package/dist/src/entityFamily.d.ts +18 -0
  497. package/dist/src/entityFamily.d.ts.map +1 -0
  498. package/dist/src/entityFamily.js +54 -0
  499. package/dist/src/entityFamily.js.map +1 -0
  500. package/dist/src/entityLabel.d.ts +18 -0
  501. package/dist/src/entityLabel.d.ts.map +1 -0
  502. package/dist/src/entityLabel.js +53 -0
  503. package/dist/src/entityLabel.js.map +1 -0
  504. package/dist/src/entityTypes.d.ts +64 -0
  505. package/dist/src/entityTypes.d.ts.map +1 -0
  506. package/dist/src/entityTypes.js +94 -0
  507. package/dist/src/entityTypes.js.map +1 -0
  508. package/dist/src/exposure/index.d.ts +86 -0
  509. package/dist/src/exposure/index.d.ts.map +1 -0
  510. package/dist/src/exposure/index.js +134 -0
  511. package/dist/src/exposure/index.js.map +1 -0
  512. package/dist/src/fuse/calibrate.d.ts +95 -0
  513. package/dist/src/fuse/calibrate.d.ts.map +1 -0
  514. package/dist/src/fuse/calibrate.js +165 -0
  515. package/dist/src/fuse/calibrate.js.map +1 -0
  516. package/dist/src/fuse/defaultCalibration.d.ts +52 -0
  517. package/dist/src/fuse/defaultCalibration.d.ts.map +1 -0
  518. package/dist/src/fuse/defaultCalibration.js +41 -0
  519. package/dist/src/fuse/defaultCalibration.js.map +1 -0
  520. package/dist/src/fuse/explain.d.ts +55 -0
  521. package/dist/src/fuse/explain.d.ts.map +1 -0
  522. package/dist/src/fuse/explain.js +91 -0
  523. package/dist/src/fuse/explain.js.map +1 -0
  524. package/dist/src/fuse/profiles.d.ts +80 -0
  525. package/dist/src/fuse/profiles.d.ts.map +1 -0
  526. package/dist/src/fuse/profiles.js +126 -0
  527. package/dist/src/fuse/profiles.js.map +1 -0
  528. package/dist/src/fuse/resolve.d.ts +73 -0
  529. package/dist/src/fuse/resolve.d.ts.map +1 -0
  530. package/dist/src/fuse/resolve.js +206 -0
  531. package/dist/src/fuse/resolve.js.map +1 -0
  532. package/dist/src/gazetteer/index.d.ts +41 -0
  533. package/dist/src/gazetteer/index.d.ts.map +1 -0
  534. package/dist/src/gazetteer/index.js +117 -0
  535. package/dist/src/gazetteer/index.js.map +1 -0
  536. package/dist/src/generate/bankcodes.d.ts +20 -0
  537. package/dist/src/generate/bankcodes.d.ts.map +1 -0
  538. package/dist/src/generate/bankcodes.js +71 -0
  539. package/dist/src/generate/bankcodes.js.map +1 -0
  540. package/dist/src/generate/contact.d.ts +31 -0
  541. package/dist/src/generate/contact.d.ts.map +1 -0
  542. package/dist/src/generate/contact.js +139 -0
  543. package/dist/src/generate/contact.js.map +1 -0
  544. package/dist/src/generate/crypto.d.ts +27 -0
  545. package/dist/src/generate/crypto.d.ts.map +1 -0
  546. package/dist/src/generate/crypto.js +88 -0
  547. package/dist/src/generate/crypto.js.map +1 -0
  548. package/dist/src/generate/documents.d.ts +24 -0
  549. package/dist/src/generate/documents.d.ts.map +1 -0
  550. package/dist/src/generate/documents.js +124 -0
  551. package/dist/src/generate/documents.js.map +1 -0
  552. package/dist/src/generate/financial.d.ts +26 -0
  553. package/dist/src/generate/financial.d.ts.map +1 -0
  554. package/dist/src/generate/financial.js +136 -0
  555. package/dist/src/generate/financial.js.map +1 -0
  556. package/dist/src/generate/index.d.ts +23 -0
  557. package/dist/src/generate/index.d.ts.map +1 -0
  558. package/dist/src/generate/index.js +23 -0
  559. package/dist/src/generate/index.js.map +1 -0
  560. package/dist/src/generate/location.d.ts +12 -0
  561. package/dist/src/generate/location.d.ts.map +1 -0
  562. package/dist/src/generate/location.js +75 -0
  563. package/dist/src/generate/location.js.map +1 -0
  564. package/dist/src/generate/natidAmOc.d.ts +22 -0
  565. package/dist/src/generate/natidAmOc.d.ts.map +1 -0
  566. package/dist/src/generate/natidAmOc.js +181 -0
  567. package/dist/src/generate/natidAmOc.js.map +1 -0
  568. package/dist/src/generate/natidAsia.d.ts +20 -0
  569. package/dist/src/generate/natidAsia.d.ts.map +1 -0
  570. package/dist/src/generate/natidAsia.js +147 -0
  571. package/dist/src/generate/natidAsia.js.map +1 -0
  572. package/dist/src/generate/natidCee.d.ts +21 -0
  573. package/dist/src/generate/natidCee.d.ts.map +1 -0
  574. package/dist/src/generate/natidCee.js +181 -0
  575. package/dist/src/generate/natidCee.js.map +1 -0
  576. package/dist/src/generate/natidMeCis.d.ts +17 -0
  577. package/dist/src/generate/natidMeCis.d.ts.map +1 -0
  578. package/dist/src/generate/natidMeCis.js +121 -0
  579. package/dist/src/generate/natidMeCis.js.map +1 -0
  580. package/dist/src/generate/natidWest.d.ts +32 -0
  581. package/dist/src/generate/natidWest.d.ts.map +1 -0
  582. package/dist/src/generate/natidWest.js +187 -0
  583. package/dist/src/generate/natidWest.js.map +1 -0
  584. package/dist/src/generate/prng.d.ts +10 -0
  585. package/dist/src/generate/prng.d.ts.map +1 -0
  586. package/dist/src/generate/prng.js +18 -0
  587. package/dist/src/generate/prng.js.map +1 -0
  588. package/dist/src/generate/secrets.d.ts +23 -0
  589. package/dist/src/generate/secrets.d.ts.map +1 -0
  590. package/dist/src/generate/secrets.js +126 -0
  591. package/dist/src/generate/secrets.js.map +1 -0
  592. package/dist/src/generate/vat.d.ts +11 -0
  593. package/dist/src/generate/vat.d.ts.map +1 -0
  594. package/dist/src/generate/vat.js +233 -0
  595. package/dist/src/generate/vat.js.map +1 -0
  596. package/dist/src/index.d.ts +81 -0
  597. package/dist/src/index.d.ts.map +1 -0
  598. package/dist/src/index.js +76 -0
  599. package/dist/src/index.js.map +1 -0
  600. package/dist/src/mask/egressGuard.d.ts +54 -0
  601. package/dist/src/mask/egressGuard.d.ts.map +1 -0
  602. package/dist/src/mask/egressGuard.js +67 -0
  603. package/dist/src/mask/egressGuard.js.map +1 -0
  604. package/dist/src/mask/masker.d.ts +76 -0
  605. package/dist/src/mask/masker.d.ts.map +1 -0
  606. package/dist/src/mask/masker.js +201 -0
  607. package/dist/src/mask/masker.js.map +1 -0
  608. package/dist/src/mask/restorer.d.ts +96 -0
  609. package/dist/src/mask/restorer.d.ts.map +1 -0
  610. package/dist/src/mask/restorer.js +263 -0
  611. package/dist/src/mask/restorer.js.map +1 -0
  612. package/dist/src/mask/surrogatePools.d.ts +33 -0
  613. package/dist/src/mask/surrogatePools.d.ts.map +1 -0
  614. package/dist/src/mask/surrogatePools.js +81 -0
  615. package/dist/src/mask/surrogatePools.js.map +1 -0
  616. package/dist/src/mask/surrogates.d.ts +45 -0
  617. package/dist/src/mask/surrogates.d.ts.map +1 -0
  618. package/dist/src/mask/surrogates.js +241 -0
  619. package/dist/src/mask/surrogates.js.map +1 -0
  620. package/dist/src/mask/vault.d.ts +76 -0
  621. package/dist/src/mask/vault.d.ts.map +1 -0
  622. package/dist/src/mask/vault.js +141 -0
  623. package/dist/src/mask/vault.js.map +1 -0
  624. package/dist/src/ner/align.d.ts +36 -0
  625. package/dist/src/ner/align.d.ts.map +1 -0
  626. package/dist/src/ner/align.js +73 -0
  627. package/dist/src/ner/align.js.map +1 -0
  628. package/dist/src/ner/chunk.d.ts +27 -0
  629. package/dist/src/ner/chunk.d.ts.map +1 -0
  630. package/dist/src/ner/chunk.js +55 -0
  631. package/dist/src/ner/chunk.js.map +1 -0
  632. package/dist/src/ner/chunkCache.d.ts +63 -0
  633. package/dist/src/ner/chunkCache.d.ts.map +1 -0
  634. package/dist/src/ner/chunkCache.js +99 -0
  635. package/dist/src/ner/chunkCache.js.map +1 -0
  636. package/dist/src/ner/engine.d.ts +53 -0
  637. package/dist/src/ner/engine.d.ts.map +1 -0
  638. package/dist/src/ner/engine.js +113 -0
  639. package/dist/src/ner/engine.js.map +1 -0
  640. package/dist/src/ner/merge.d.ts +26 -0
  641. package/dist/src/ner/merge.d.ts.map +1 -0
  642. package/dist/src/ner/merge.js +108 -0
  643. package/dist/src/ner/merge.js.map +1 -0
  644. package/dist/src/ner/runStage2.d.ts +17 -0
  645. package/dist/src/ner/runStage2.d.ts.map +1 -0
  646. package/dist/src/ner/runStage2.js +43 -0
  647. package/dist/src/ner/runStage2.js.map +1 -0
  648. package/dist/src/ner/stage2b.d.ts +59 -0
  649. package/dist/src/ner/stage2b.d.ts.map +1 -0
  650. package/dist/src/ner/stage2b.js +51 -0
  651. package/dist/src/ner/stage2b.js.map +1 -0
  652. package/dist/src/ner/transformersClassifier.d.ts +45 -0
  653. package/dist/src/ner/transformersClassifier.d.ts.map +1 -0
  654. package/dist/src/ner/transformersClassifier.js +40 -0
  655. package/dist/src/ner/transformersClassifier.js.map +1 -0
  656. package/dist/src/ner/types.d.ts +93 -0
  657. package/dist/src/ner/types.d.ts.map +1 -0
  658. package/dist/src/ner/types.js +12 -0
  659. package/dist/src/ner/types.js.map +1 -0
  660. package/dist/src/normalization.d.ts +24 -0
  661. package/dist/src/normalization.d.ts.map +1 -0
  662. package/dist/src/normalization.js +92 -0
  663. package/dist/src/normalization.js.map +1 -0
  664. package/dist/src/offsetMap.d.ts +165 -0
  665. package/dist/src/offsetMap.d.ts.map +1 -0
  666. package/dist/src/offsetMap.js +225 -0
  667. package/dist/src/offsetMap.js.map +1 -0
  668. package/dist/src/pipeline.d.ts +58 -0
  669. package/dist/src/pipeline.d.ts.map +1 -0
  670. package/dist/src/pipeline.js +57 -0
  671. package/dist/src/pipeline.js.map +1 -0
  672. package/dist/src/protect.d.ts +146 -0
  673. package/dist/src/protect.d.ts.map +1 -0
  674. package/dist/src/protect.js +161 -0
  675. package/dist/src/protect.js.map +1 -0
  676. package/dist/src/scripts.d.ts +37 -0
  677. package/dist/src/scripts.d.ts.map +1 -0
  678. package/dist/src/scripts.js +145 -0
  679. package/dist/src/scripts.js.map +1 -0
  680. package/dist/src/transforms/foldDigits.d.ts +49 -0
  681. package/dist/src/transforms/foldDigits.d.ts.map +1 -0
  682. package/dist/src/transforms/foldDigits.js +135 -0
  683. package/dist/src/transforms/foldDigits.js.map +1 -0
  684. package/dist/src/transforms/graphemes.d.ts +6 -0
  685. package/dist/src/transforms/graphemes.d.ts.map +1 -0
  686. package/dist/src/transforms/graphemes.js +6 -0
  687. package/dist/src/transforms/graphemes.js.map +1 -0
  688. package/dist/src/transforms/homoglyphFold.d.ts +5 -0
  689. package/dist/src/transforms/homoglyphFold.d.ts.map +1 -0
  690. package/dist/src/transforms/homoglyphFold.js +214 -0
  691. package/dist/src/transforms/homoglyphFold.js.map +1 -0
  692. package/dist/src/transforms/nfkc.d.ts +20 -0
  693. package/dist/src/transforms/nfkc.d.ts.map +1 -0
  694. package/dist/src/transforms/nfkc.js +48 -0
  695. package/dist/src/transforms/nfkc.js.map +1 -0
  696. package/dist/src/transforms/stripInvisibles.d.ts +37 -0
  697. package/dist/src/transforms/stripInvisibles.d.ts.map +1 -0
  698. package/dist/src/transforms/stripInvisibles.js +151 -0
  699. package/dist/src/transforms/stripInvisibles.js.map +1 -0
  700. package/dist/src/transforms/whitespacePunct.d.ts +21 -0
  701. package/dist/src/transforms/whitespacePunct.d.ts.map +1 -0
  702. package/dist/src/transforms/whitespacePunct.js +100 -0
  703. package/dist/src/transforms/whitespacePunct.js.map +1 -0
  704. package/dist/src/types.d.ts +212 -0
  705. package/dist/src/types.d.ts.map +1 -0
  706. package/dist/src/types.js +14 -0
  707. package/dist/src/types.js.map +1 -0
  708. package/package.json +67 -0
  709. package/src/checksums/aba.ts +45 -0
  710. package/src/checksums/digits.ts +108 -0
  711. package/src/checksums/icao9303.ts +53 -0
  712. package/src/checksums/index.ts +36 -0
  713. package/src/checksums/iso7064.ts +168 -0
  714. package/src/checksums/luhn.ts +66 -0
  715. package/src/checksums/mod97.ts +91 -0
  716. package/src/checksums/verhoeff.ts +84 -0
  717. package/src/checksums/weighted.ts +108 -0
  718. package/src/context/documentProfile.ts +293 -0
  719. package/src/context/negativeRules.ts +765 -0
  720. package/src/context/score.ts +430 -0
  721. package/src/context/structure.ts +611 -0
  722. package/src/context/triggers.ts +266 -0
  723. package/src/context/types.ts +150 -0
  724. package/src/crypto/keccak256.ts +98 -0
  725. package/src/crypto/sha256.ts +76 -0
  726. package/src/detect/AUTHORING.md +50 -0
  727. package/src/detect/detectors/bankcodes/auBsb.ts +36 -0
  728. package/src/detect/detectors/bankcodes/brAgencia.ts +46 -0
  729. package/src/detect/detectors/bankcodes/caTransit.ts +89 -0
  730. package/src/detect/detectors/bankcodes/inIfsc.ts +40 -0
  731. package/src/detect/detectors/bankcodes/index.ts +9 -0
  732. package/src/detect/detectors/bankcodes/ukSortCode.ts +38 -0
  733. package/src/detect/detectors/bankcodes/usRouting.ts +47 -0
  734. package/src/detect/detectors/contact/email.ts +113 -0
  735. package/src/detect/detectors/contact/index.ts +10 -0
  736. package/src/detect/detectors/contact/ipv4.ts +112 -0
  737. package/src/detect/detectors/contact/ipv6.ts +188 -0
  738. package/src/detect/detectors/contact/mac.ts +68 -0
  739. package/src/detect/detectors/contact/phone.ts +81 -0
  740. package/src/detect/detectors/contact/urlCredentials.ts +124 -0
  741. package/src/detect/detectors/crypto/ada.ts +52 -0
  742. package/src/detect/detectors/crypto/btc.ts +77 -0
  743. package/src/detect/detectors/crypto/dot.ts +42 -0
  744. package/src/detect/detectors/crypto/eth.ts +70 -0
  745. package/src/detect/detectors/crypto/index.ts +11 -0
  746. package/src/detect/detectors/crypto/ltc.ts +69 -0
  747. package/src/detect/detectors/crypto/sol.ts +41 -0
  748. package/src/detect/detectors/crypto/trx.ts +35 -0
  749. package/src/detect/detectors/crypto/xmr.ts +54 -0
  750. package/src/detect/detectors/documents/driversLicense.ts +83 -0
  751. package/src/detect/detectors/documents/healthData.ts +88 -0
  752. package/src/detect/detectors/documents/index.ts +8 -0
  753. package/src/detect/detectors/documents/passportMrz.ts +203 -0
  754. package/src/detect/detectors/documents/usNpi.ts +50 -0
  755. package/src/detect/detectors/documents/vin.ts +67 -0
  756. package/src/detect/detectors/financial/creditCard.ts +167 -0
  757. package/src/detect/detectors/financial/iban.ts +82 -0
  758. package/src/detect/detectors/financial/ibanRegistry.ts +112 -0
  759. package/src/detect/detectors/financial/index.ts +6 -0
  760. package/src/detect/detectors/financial/swiftBic.ts +61 -0
  761. package/src/detect/detectors/index.ts +14 -0
  762. package/src/detect/detectors/location/coordinates.ts +84 -0
  763. package/src/detect/detectors/location/index.ts +6 -0
  764. package/src/detect/detectors/location/postalCode.ts +56 -0
  765. package/src/detect/detectors/location/postalRegistry.ts +74 -0
  766. package/src/detect/detectors/location/streetAddress.ts +84 -0
  767. package/src/detect/detectors/natid/africa.ts +108 -0
  768. package/src/detect/detectors/natid/ar.ts +62 -0
  769. package/src/detect/detectors/natid/au.ts +99 -0
  770. package/src/detect/detectors/natid/be.ts +45 -0
  771. package/src/detect/detectors/natid/bg.ts +44 -0
  772. package/src/detect/detectors/natid/br.ts +81 -0
  773. package/src/detect/detectors/natid/ca.ts +40 -0
  774. package/src/detect/detectors/natid/cl.ts +47 -0
  775. package/src/detect/detectors/natid/cn.ts +48 -0
  776. package/src/detect/detectors/natid/co.ts +46 -0
  777. package/src/detect/detectors/natid/cz.ts +44 -0
  778. package/src/detect/detectors/natid/de.ts +75 -0
  779. package/src/detect/detectors/natid/dk.ts +31 -0
  780. package/src/detect/detectors/natid/es.ts +95 -0
  781. package/src/detect/detectors/natid/fi.ts +41 -0
  782. package/src/detect/detectors/natid/fr.ts +63 -0
  783. package/src/detect/detectors/natid/gb.ts +70 -0
  784. package/src/detect/detectors/natid/gr.ts +35 -0
  785. package/src/detect/detectors/natid/gulf.ts +116 -0
  786. package/src/detect/detectors/natid/hk.ts +42 -0
  787. package/src/detect/detectors/natid/hr.ts +32 -0
  788. package/src/detect/detectors/natid/hu.ts +36 -0
  789. package/src/detect/detectors/natid/ie.ts +37 -0
  790. package/src/detect/detectors/natid/il.ts +37 -0
  791. package/src/detect/detectors/natid/in.ts +67 -0
  792. package/src/detect/detectors/natid/index.ts +54 -0
  793. package/src/detect/detectors/natid/is.ts +42 -0
  794. package/src/detect/detectors/natid/it.ts +65 -0
  795. package/src/detect/detectors/natid/jp.ts +48 -0
  796. package/src/detect/detectors/natid/kr.ts +41 -0
  797. package/src/detect/detectors/natid/kz.ts +44 -0
  798. package/src/detect/detectors/natid/mx.ts +83 -0
  799. package/src/detect/detectors/natid/nl.ts +38 -0
  800. package/src/detect/detectors/natid/no.ts +50 -0
  801. package/src/detect/detectors/natid/nz.ts +53 -0
  802. package/src/detect/detectors/natid/pe.ts +28 -0
  803. package/src/detect/detectors/natid/pl.ts +100 -0
  804. package/src/detect/detectors/natid/pt.ts +36 -0
  805. package/src/detect/detectors/natid/ro.ts +47 -0
  806. package/src/detect/detectors/natid/ru.ts +82 -0
  807. package/src/detect/detectors/natid/se.ts +42 -0
  808. package/src/detect/detectors/natid/seasia.ts +174 -0
  809. package/src/detect/detectors/natid/sg.ts +39 -0
  810. package/src/detect/detectors/natid/si.ts +42 -0
  811. package/src/detect/detectors/natid/tr.ts +76 -0
  812. package/src/detect/detectors/natid/tw.ts +41 -0
  813. package/src/detect/detectors/natid/ua.ts +38 -0
  814. package/src/detect/detectors/natid/us.ts +118 -0
  815. package/src/detect/detectors/natid/za.ts +42 -0
  816. package/src/detect/detectors/secrets/apiKey.ts +115 -0
  817. package/src/detect/detectors/secrets/connectionString.ts +71 -0
  818. package/src/detect/detectors/secrets/genericSecret.ts +81 -0
  819. package/src/detect/detectors/secrets/index.ts +8 -0
  820. package/src/detect/detectors/secrets/jwt.ts +101 -0
  821. package/src/detect/detectors/secrets/pemPrivateKey.ts +59 -0
  822. package/src/detect/detectors/vat/euVat.ts +280 -0
  823. package/src/detect/detectors/vat/index.ts +4 -0
  824. package/src/detect/entropy.ts +60 -0
  825. package/src/detect/isoCountries.ts +30 -0
  826. package/src/detect/registry.ts +134 -0
  827. package/src/detect/runner.ts +187 -0
  828. package/src/detect/types.ts +296 -0
  829. package/src/encoding/base58.ts +85 -0
  830. package/src/encoding/base58monero.ts +90 -0
  831. package/src/encoding/bech32.ts +125 -0
  832. package/src/encoding/bytes.ts +48 -0
  833. package/src/entityFamily.ts +70 -0
  834. package/src/entityLabel.ts +56 -0
  835. package/src/entityTypes.ts +107 -0
  836. package/src/exposure/index.ts +189 -0
  837. package/src/fuse/calibrate.ts +224 -0
  838. package/src/fuse/defaultCalibration.ts +71 -0
  839. package/src/fuse/explain.ts +114 -0
  840. package/src/fuse/profiles.ts +187 -0
  841. package/src/fuse/resolve.ts +237 -0
  842. package/src/gazetteer/index.ts +139 -0
  843. package/src/generate/bankcodes.ts +82 -0
  844. package/src/generate/contact.ts +147 -0
  845. package/src/generate/crypto.ts +91 -0
  846. package/src/generate/documents.ts +142 -0
  847. package/src/generate/financial.ts +149 -0
  848. package/src/generate/index.ts +22 -0
  849. package/src/generate/location.ts +80 -0
  850. package/src/generate/natidAmOc.ts +198 -0
  851. package/src/generate/natidAsia.ts +162 -0
  852. package/src/generate/natidCee.ts +196 -0
  853. package/src/generate/natidMeCis.ts +131 -0
  854. package/src/generate/natidWest.ts +208 -0
  855. package/src/generate/prng.ts +17 -0
  856. package/src/generate/secrets.ts +141 -0
  857. package/src/generate/vat.ts +239 -0
  858. package/src/index.ts +186 -0
  859. package/src/mask/egressGuard.ts +88 -0
  860. package/src/mask/masker.ts +276 -0
  861. package/src/mask/restorer.ts +284 -0
  862. package/src/mask/surrogatePools.ts +96 -0
  863. package/src/mask/surrogates.ts +248 -0
  864. package/src/mask/vault.ts +153 -0
  865. package/src/ner/align.ts +86 -0
  866. package/src/ner/chunk.ts +65 -0
  867. package/src/ner/chunkCache.ts +110 -0
  868. package/src/ner/engine.ts +141 -0
  869. package/src/ner/merge.ts +123 -0
  870. package/src/ner/runStage2.ts +51 -0
  871. package/src/ner/stage2b.ts +73 -0
  872. package/src/ner/transformersClassifier.ts +79 -0
  873. package/src/ner/types.ts +99 -0
  874. package/src/normalization.ts +119 -0
  875. package/src/offsetMap.ts +271 -0
  876. package/src/pipeline.ts +96 -0
  877. package/src/protect.ts +284 -0
  878. package/src/scripts.ts +164 -0
  879. package/src/transforms/foldDigits.ts +138 -0
  880. package/src/transforms/graphemes.ts +5 -0
  881. package/src/transforms/homoglyphFold.ts +221 -0
  882. package/src/transforms/nfkc.ts +48 -0
  883. package/src/transforms/stripInvisibles.ts +158 -0
  884. package/src/transforms/whitespacePunct.ts +100 -0
  885. package/src/types.ts +339 -0
@@ -0,0 +1,56 @@
1
+ /**
2
+ * POSTAL_CODE — the per-country table, context-gated.
3
+ *
4
+ * A five-digit number satisfies twenty countries' postal formats and is
5
+ * also a quantity, a price, and a PIN. SPEC.md therefore assigns "low base
6
+ * confidence, requires context boost": this detector declares
7
+ * requiresContext, the runner caps it at LOW until Stage 3 supplies a
8
+ * trigger ("postcode", "PLZ", "郵便番号") or an address co-occurrence, and
9
+ * the candidate carries every country whose format it satisfies so fusion
10
+ * can reconcile it with the document's other evidence.
11
+ */
12
+
13
+ import { registerDetector } from '../../registry.js';
14
+ import { CONFIDENCE, GLOBAL_REGION, invalid, valid } from '../../types.js';
15
+ import type { ValidationContext, ValidationResult } from '../../types.js';
16
+ import { postalCountriesFor } from './postalRegistry.js';
17
+
18
+ function validatePostal(ctx: ValidationContext): ValidationResult {
19
+ const before = ctx.start > 0 ? ctx.text[ctx.start - 1] : '';
20
+ if (/[\d,.-]/.test(before ?? '')) return invalid('fragment of a longer number');
21
+ const after = ctx.text.slice(ctx.end, ctx.end + 2);
22
+ if (/^[\d]/.test(after) || /^[.,]\d/.test(after)) return invalid('fragment of a longer number');
23
+
24
+ const candidate = ctx.match[0].toUpperCase();
25
+ const countries = postalCountriesFor(candidate);
26
+ if (countries.length === 0) return invalid('no country format matched');
27
+
28
+ // A year-shaped 4-digit number is overwhelmingly a year in running text;
29
+ // the postal reading needs Stage 3 to argue otherwise, and until then it
30
+ // is noise we do not emit at all.
31
+ if (/^\d{4}$/.test(candidate)) {
32
+ const year = Number(candidate);
33
+ if (year >= 1900 && year <= 2099) return invalid('year-shaped');
34
+ }
35
+
36
+ return valid({
37
+ canonical: candidate.replace(/ /g, ''),
38
+ metadata: { countries },
39
+ validator: 'postal-format-table',
40
+ });
41
+ }
42
+
43
+ registerDetector({
44
+ id: 'postal-code',
45
+ entityType: 'POSTAL_CODE',
46
+ regions: [GLOBAL_REGION],
47
+ // Structured letter formats (UK, CA, NL, IE, MT, AZ/AD/MD/LV/LT…) plus
48
+ // digit groups with optional internal dash/space. Uppercase only — postal
49
+ // codes are written uppercase, and lowercase admits ordinary words.
50
+ pattern:
51
+ /\b(?:[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}|[A-Z]\d[A-Z] ?\d[A-Z]\d|\d{4} ?[A-Z]{2}|[A-Z]{2,3}[- ]?\d{4,5}|[A-Z]\d{2} ?[A-Z0-9]{4}|\d{2,7}(?:[- ]\d{2,4})?)\b/g,
52
+ baseConfidence: CONFIDENCE.MEDIUM,
53
+ requiresContext: true,
54
+ description: 'Postal codes against the per-country format table; LOW until Stage 3 context.',
55
+ validate: validatePostal,
56
+ });
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Per-country postal code formats.
3
+ *
4
+ * SPEC.md: "per-country format table covering all countries with postal
5
+ * systems, low base confidence, requires context boost." This table is the
6
+ * format half; the LOW cap comes from the detector's requiresContext flag.
7
+ *
8
+ * Countries sharing a bare digit-count share a regex constant; countries
9
+ * with real internal structure (UK, CA, NL, PL, PT, BR, JP, IE, MT…) get
10
+ * their own, and where the structure encodes genuine rules — Canada's
11
+ * excluded letters, the UK outward/inward split — those rules are in the
12
+ * regex, not commentary. Countries without an operating postal-code system
13
+ * (e.g. AE, HK, PA at the street level, many Caribbean and African states)
14
+ * are deliberately absent; absence here is a statement, not an omission.
15
+ */
16
+
17
+ const D3 = /^\d{3}$/; // IS, PG (also FO)
18
+ const D4 = /^\d{4}$/;
19
+ const D5 = /^\d{5}$/;
20
+ const D6 = /^\d{6}$/;
21
+ const D7 = /^\d{7}$/;
22
+ const D3_SP_D2 = /^\d{3} ?\d{2}$/; // CZ, SK, SE, GR
23
+
24
+ export const POSTAL_FORMATS: Readonly<Record<string, RegExp>> = {
25
+ // ── structured formats ──
26
+ GB: /^(?:GIR ?0AA|[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2})$/, // outward + inward
27
+ // First letter excludes D F I O Q U W Z; later letters exclude D F I O Q U.
28
+ CA: /^[ABCEGHJ-NPRSTVXY]\d[ABCEGHJ-NPRSTV-Z] ?\d[ABCEGHJ-NPRSTV-Z]\d$/,
29
+ NL: /^\d{4} ?[A-Z]{2}$/,
30
+ PL: /^\d{2}-\d{3}$/,
31
+ PT: /^\d{4}-\d{3}$/,
32
+ BR: /^\d{5}-?\d{3}$/,
33
+ JP: /^\d{3}-?\d{4}$/,
34
+ US: /^\d{5}(?:-\d{4})?$/,
35
+ IE: /^[A-Z]\d{2} ?[A-Z0-9]{4}$|^D6W ?[A-Z0-9]{4}$/, // Eircode
36
+ MT: /^[A-Z]{3} ?\d{4}$/,
37
+ AZ: /^AZ ?\d{4}$/,
38
+ AD: /^AD\d{3}$/,
39
+ BB: /^BB\d{5}$/,
40
+ MD: /^MD-?\d{4}$/,
41
+ LV: /^LV-?\d{4}$/,
42
+ LT: /^LT-?\d{5}$/,
43
+ MC: /^980\d{2}$/,
44
+ SM: /^4789\d$/,
45
+ VA: /^00120$/,
46
+ GR: D3_SP_D2, CZ: D3_SP_D2, SK: D3_SP_D2, SE: D3_SP_D2,
47
+ KY: /^KY\d-\d{4}$/,
48
+ BM: /^[A-Z]{2} ?\d{2}$/,
49
+ // ── plain digit counts ──
50
+ IS: D3, PG: D3, FO: D3,
51
+ AT: D4, AU: D4, BE: D4, BG: D4, CH: D4, CY: D4, DK: D4, HU: D4, LI: D4,
52
+ LU: D4, MK: D4, NO: D4, NZ: D4, PH: D4, SI: D4, ZA: D4, AL: D4, BD: D4,
53
+ CV: D4, ET: D4, GE: D4, PY: D4, SV: D4, TN: D4, AM: D4, NE: D4, SJ: D4,
54
+ DE: D5, FR: D5, ES: D5, IT: D5, FI: D5, TR: D5, TH: D5, MY: D5, MX: D5,
55
+ ID: D5, PK: D5, EG: D5, DZ: D5, MA: D5, KE: D5, JO: D5, IQ: D5, KW: D5,
56
+ LK: D5, MN: D5, UA: D5, UZ: D5, HR: D5, EE: D5, RS: D5, ME: D5, BA: D5,
57
+ CU: D5, DO: D5, GT: D5, HN: D5, NI: D5, CR: D5, PE: D5, KR: D5, SA: D5,
58
+ SD: D5, ZM: D5, MZ: D4, TZ: D5, UY: D5, MM: D5, KH: D5, LA: D5, NP: D5,
59
+ BT: D5, MV: D5, SN: D5, GN: D6,
60
+ CN: D6, IN: D6, SG: D6, RU: D6, KZ: D6, BY: D6, NG: D6, RO: D6, KG: D6,
61
+ TJ: D6, TM: D6, VN: D6, EC: D6,
62
+ IL: D7, CL: D7,
63
+ TW: /^\d{3}(?:-?\d{2,3})?$/,
64
+ AR: /^[A-Z]?\d{4}[A-Z]{0,3}$/, // CPA: letter + 4 digits + 3 letters, or legacy 4
65
+ };
66
+
67
+ /** Every country whose format the candidate satisfies. */
68
+ export function postalCountriesFor(candidate: string): string[] {
69
+ const out: string[] = [];
70
+ for (const [country, format] of Object.entries(POSTAL_FORMATS)) {
71
+ if (format.test(candidate)) out.push(country);
72
+ }
73
+ return out;
74
+ }
@@ -0,0 +1,84 @@
1
+ /**
2
+ * STREET_ADDRESS — multilingual heuristics, context-gated.
3
+ *
4
+ * SPEC.md: "multilingual heuristics across address conventions (Western,
5
+ * East Asian reverse-order, Arabic), low base confidence, requires context
6
+ * boost." Address grammar differs by convention, so the pattern is an
7
+ * alternation of convention-specific shapes, each keyed by the street-type
8
+ * lexicon of its languages rather than one English list:
9
+ *
10
+ * • Western number-first: 221B Baker Street, 1600 Pennsylvania Avenue
11
+ * • Romance type-first: 12 rue de la Paix, Calle Mayor 8, Via Roma 3
12
+ * • Germanic name+number: Hauptstraße 12a, Prinsengracht 263
13
+ * • Turkish: Atatürk Caddesi No: 15, Çiçek Sok. 3
14
+ * • East Asian: 中山路25号, 銀座4丁目5番6号, 세종대로 110
15
+ * • Arabic: شارع الملك فهد 12
16
+ *
17
+ * requiresContext caps everything at LOW until Stage 3; the convention
18
+ * travels in metadata for fusion and for M4's surrogate generation.
19
+ */
20
+
21
+ import { registerDetector } from '../../registry.js';
22
+ import { CONFIDENCE, GLOBAL_REGION, invalid, valid } from '../../types.js';
23
+ import type { ValidationContext, ValidationResult } from '../../types.js';
24
+
25
+ const WESTERN_TYPES =
26
+ '(?:Street|St|Avenue|Ave|Road|Rd|Boulevard|Blvd|Lane|Ln|Drive|Dr|Court|Ct|Way|Place|Pl|Terrace|Square|Sq|Crescent|Close|Gardens)';
27
+ const ROMANCE_TYPES =
28
+ '(?:rue|avenue|boulevard|impasse|allée|chemin|place|quai|calle|avenida|paseo|plaza|carrer|via|viale|piazza|corso|rua|travessa|praça)';
29
+ const GERMANIC_SUFFIX =
30
+ '(?:straße|strasse|weg|gasse|platz|allee|ring|damm|ufer|straat|laan|plein|gracht|kade|singel|gade|vej|gatan|vägen|veien|gata)';
31
+ const TURKISH_TYPES = '(?:Caddesi|Cadde|Cad\\.|Sokak|Sokağı|Sok\\.|Bulvarı|Bulvar|Blv\\.|Mahallesi|Mah\\.)';
32
+
33
+ type Convention = 'western' | 'romance' | 'germanic' | 'turkish' | 'east-asian' | 'arabic';
34
+
35
+ const CLASSIFIERS: readonly (readonly [RegExp, Convention])[] = [
36
+ [new RegExp(`^\\d{1,5}[A-Za-z]? [\\p{Lu}][\\p{L}.'-]*(?: [\\p{Lu}][\\p{L}.'-]*){0,3} ${WESTERN_TYPES}\\.?$`, 'u'), 'western'],
37
+ [new RegExp(`^\\d{1,5},? ${ROMANCE_TYPES} [\\p{L}][\\p{L} .'-]{2,40}$`, 'iu'), 'romance'],
38
+ [new RegExp(`^${ROMANCE_TYPES} [\\p{L}][\\p{L} .'-]{2,40},? \\d{1,5}$`, 'iu'), 'romance'],
39
+ [new RegExp(`^[\\p{Lu}][\\p{L}]{2,30}${GERMANIC_SUFFIX} \\d{1,4}[a-z]?$`, 'u'), 'germanic'],
40
+ [new RegExp(`^[\\p{Lu}][\\p{L}]{1,20}(?: [\\p{Lu}][\\p{L}]{1,20})? ${TURKISH_TYPES}(?: No:? ?\\d{1,4}(?:\\/\\d{1,3})?)?$`, 'u'), 'turkish'],
41
+ [/^[一-鿿]{1,12}(?:路|街|大道)\d{1,4}号(?:楼|栋)?$/u, 'east-asian'],
42
+ [/^[一-鿿぀-ヿ]{1,12}\d{1,3}丁目(?:\d{1,3}番地?)?(?:\d{1,3}号)?$/u, 'east-asian'],
43
+ [/^[가-힯]{2,12}(?:로|길) ?\d{1,4}(?:-\d{1,3})?$/u, 'east-asian'],
44
+ [/^شارع [؀-ۿ]{2,20}(?: [؀-ۿ]{2,20}){0,3}(?: \d{1,4})?$/u, 'arabic'],
45
+ ];
46
+
47
+ function validateStreet(ctx: ValidationContext): ValidationResult {
48
+ const value = ctx.match[0].trim();
49
+
50
+ for (const [shape, convention] of CLASSIFIERS) {
51
+ if (shape.test(value)) {
52
+ return valid({
53
+ metadata: { convention },
54
+ validator: 'address-heuristic',
55
+ });
56
+ }
57
+ }
58
+ return invalid('no address convention matched');
59
+ }
60
+
61
+ registerDetector({
62
+ id: 'street-address',
63
+ entityType: 'STREET_ADDRESS',
64
+ regions: [GLOBAL_REGION],
65
+ // The harvest union of every convention shape; the validator classifies.
66
+ pattern: new RegExp(
67
+ [
68
+ `\\d{1,5}[A-Za-z]? [\\p{Lu}][\\p{L}.'-]*(?: [\\p{Lu}][\\p{L}.'-]*){0,3} ${WESTERN_TYPES}\\.?(?![\\p{L}])`,
69
+ `\\d{1,5},? ${ROMANCE_TYPES} [\\p{L}][\\p{L} .'-]{2,40}`,
70
+ `${ROMANCE_TYPES} [\\p{L}][\\p{L} .'-]{2,40},? \\d{1,5}`,
71
+ `[\\p{Lu}][\\p{L}]{2,30}${GERMANIC_SUFFIX} \\d{1,4}[a-z]?`,
72
+ `[\\p{Lu}][\\p{L}]{1,20}(?: [\\p{Lu}][\\p{L}]{1,20})? ${TURKISH_TYPES}(?: No:? ?\\d{1,4}(?:\\/\\d{1,3})?)?`,
73
+ `[\\u4e00-\\u9fff]{1,12}(?:路|街|大道)\\d{1,4}号(?:楼|栋)?`,
74
+ `[\\u4e00-\\u9fff\\u3040-\\u30ff]{1,12}\\d{1,3}丁目(?:\\d{1,3}番地?)?(?:\\d{1,3}号)?`,
75
+ `[\\uac00-\\ud7af]{2,12}(?:로|길) ?\\d{1,4}(?:-\\d{1,3})?`,
76
+ `شارع [\\u0600-\\u06ff]{2,20}(?: [\\u0600-\\u06ff]{2,20}){0,3}(?: \\d{1,4})?`,
77
+ ].join('|'),
78
+ 'gu',
79
+ ),
80
+ baseConfidence: CONFIDENCE.MEDIUM,
81
+ requiresContext: true,
82
+ description: 'Street addresses across six writing conventions; LOW until Stage 3 context.',
83
+ validate: validateStreet,
84
+ });
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Africa beyond South Africa: Nigeria, Kenya, Egypt, Morocco.
3
+ *
4
+ * None of these publishes a verifiable checksum, so all four are
5
+ * structural/labeled at MEDIUM, each stating its gates:
6
+ * • NG NIN — eleven digits, labeled ("NIN"), since a bare 11-digit run
7
+ * belongs to the checksummed schemes.
8
+ * • KE National ID — eight digits behind an explicit "ID No/Number" label.
9
+ * • EG National ID — fourteen digits with REAL structure: century digit
10
+ * 2/3, a valid birth date, and a governorate code from the published
11
+ * table. (A final check digit exists but its algorithm is not officially
12
+ * published — stated here, structural only.)
13
+ * • MA CNIE — one or two letters + six digits, labeled ("CNIE"/"CIN"),
14
+ * since the bare shape collides with order numbers everywhere.
15
+ */
16
+
17
+ import { registerDetector } from '../../registry.js';
18
+ import { CONFIDENCE, invalid, valid } from '../../types.js';
19
+ import type { ValidationResult } from '../../types.js';
20
+
21
+ registerDetector({
22
+ id: 'national-id-ng-nin',
23
+ entityType: 'NATIONAL_ID',
24
+ regions: ['NG'],
25
+ pattern: /\bNIN:?\s*(\d{11})\b/g,
26
+ baseConfidence: CONFIDENCE.MEDIUM,
27
+ description: 'Nigerian NIN in labeled notation (no public checksum).',
28
+ validate(ctx): ValidationResult {
29
+ const numberPart = ctx.match[1]!;
30
+ const start = ctx.start + ctx.match[0].indexOf(numberPart);
31
+ return valid({
32
+ canonical: numberPart,
33
+ metadata: { scheme: 'nin', country: 'NG' },
34
+ validator: 'nin-labeled',
35
+ span: { start, end: start + numberPart.length },
36
+ });
37
+ },
38
+ });
39
+
40
+ registerDetector({
41
+ id: 'national-id-ke',
42
+ entityType: 'NATIONAL_ID',
43
+ regions: ['KE'],
44
+ pattern: /\bID\s?(?:No\.?|Number):?\s*(\d{8})\b/g,
45
+ baseConfidence: CONFIDENCE.MEDIUM,
46
+ description: 'Kenyan National ID behind an explicit ID-number label (no checksum).',
47
+ validate(ctx): ValidationResult {
48
+ const numberPart = ctx.match[1]!;
49
+ const start = ctx.start + ctx.match[0].lastIndexOf(numberPart);
50
+ return valid({
51
+ canonical: numberPart,
52
+ metadata: { scheme: 'ke-id', country: 'KE' },
53
+ validator: 'ke-id-labeled',
54
+ span: { start, end: start + numberPart.length },
55
+ });
56
+ },
57
+ });
58
+
59
+ /** Egyptian governorate codes (the published table, 88 = born abroad). */
60
+ const EG_GOVERNORATES = new Set([
61
+ '01', '02', '03', '04', '11', '12', '13', '14', '15', '16', '17', '18', '19',
62
+ '21', '22', '23', '24', '25', '26', '27', '28', '29', '31', '32', '33', '34', '35', '88',
63
+ ]);
64
+
65
+ registerDetector({
66
+ id: 'national-id-eg',
67
+ entityType: 'NATIONAL_ID',
68
+ regions: ['EG'],
69
+ pattern: /\b([23])(\d{2})(\d{2})(\d{2})(\d{2})(\d{4})(\d)\b/g,
70
+ baseConfidence: CONFIDENCE.MEDIUM,
71
+ description: 'Egyptian National ID: century, date and governorate gates (check algorithm unpublished).',
72
+ validate(ctx): ValidationResult {
73
+ const before = ctx.start > 0 ? ctx.text[ctx.start - 1] : '';
74
+ if (/[\d-]/.test(before ?? '')) return invalid('fragment of a longer number');
75
+ const after = ctx.text.slice(ctx.end, ctx.end + 2);
76
+ if (/^\d/.test(after) || /^-\d/.test(after)) return invalid('fragment of a longer number');
77
+
78
+ const month = Number(ctx.match[3]);
79
+ if (month < 1 || month > 12) return invalid('month out of range');
80
+ const day = Number(ctx.match[4]);
81
+ if (day < 1 || day > 31) return invalid('day out of range');
82
+ if (!EG_GOVERNORATES.has(ctx.match[5]!)) return invalid('not a governorate code');
83
+ return valid({
84
+ canonical: ctx.match[0],
85
+ metadata: { scheme: 'eg-id', country: 'EG' },
86
+ validator: 'eg-id-structure',
87
+ });
88
+ },
89
+ });
90
+
91
+ registerDetector({
92
+ id: 'national-id-ma-cnie',
93
+ entityType: 'NATIONAL_ID',
94
+ regions: ['MA'],
95
+ pattern: /\b(?:CNIE|CIN):?\s*([A-Z]{1,2}\d{6})\b/g,
96
+ baseConfidence: CONFIDENCE.MEDIUM,
97
+ description: 'Moroccan CNIE in labeled notation (no public checksum).',
98
+ validate(ctx): ValidationResult {
99
+ const numberPart = ctx.match[1]!;
100
+ const start = ctx.start + ctx.match[0].indexOf(numberPart);
101
+ return valid({
102
+ canonical: numberPart,
103
+ metadata: { scheme: 'cnie', country: 'MA' },
104
+ validator: 'cnie-labeled',
105
+ span: { start, end: start + numberPart.length },
106
+ });
107
+ },
108
+ });
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Argentina: CUIT/CUIL and DNI.
3
+ *
4
+ * CUIT — XX-XXXXXXXX-X with a real mod-11 check: type prefix from the
5
+ * issued set (20/23/24/25/26/27 people, 30/33/34 companies), weights
6
+ * 5,4,3,2,7,6,5,4,3,2, check = 11 − remainder with 11→0 and 10 unissuable
7
+ * — a bijective mapping, so the hard mutation property applies.
8
+ *
9
+ * DNI — seven or eight digits with NO checksum; only the labeled dotted
10
+ * notation ("DNI 12.345.678") is claimed, span narrowed to the number,
11
+ * MEDIUM — the same posture as the Brazilian agência.
12
+ */
13
+
14
+ import { toDigits, weightedMod } from '../../../checksums/index.js';
15
+ import { registerDetector } from '../../registry.js';
16
+ import { CONFIDENCE, invalid, valid } from '../../types.js';
17
+ import type { ValidationResult } from '../../types.js';
18
+
19
+ const CUIT_PREFIXES = new Set(['20', '23', '24', '25', '26', '27', '30', '33', '34']);
20
+ const CUIT_WEIGHTS = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
21
+
22
+ registerDetector({
23
+ id: 'national-id-ar-cuit',
24
+ entityType: 'TAX_ID',
25
+ regions: ['AR'],
26
+ pattern: /\b(\d{2})-(\d{8})-(\d)\b/g,
27
+ baseConfidence: CONFIDENCE.HIGH,
28
+ description: 'Argentine CUIT/CUIL with prefix set and mod-11 check.',
29
+ validate(ctx): ValidationResult {
30
+ if (!CUIT_PREFIXES.has(ctx.match[1]!)) return invalid('not an issued type prefix');
31
+ const digits = toDigits(`${ctx.match[1]}${ctx.match[2]}`)!;
32
+ const remainder = weightedMod(digits, CUIT_WEIGHTS, 11)!;
33
+ let check = 11 - remainder;
34
+ if (check === 11) check = 0;
35
+ if (check === 10) return invalid('remainder 1 is unissuable');
36
+ if (check !== Number(ctx.match[3])) return invalid('CUIT check digit failed');
37
+ return valid({
38
+ canonical: `${ctx.match[1]}${ctx.match[2]}${ctx.match[3]}`,
39
+ metadata: { scheme: 'cuit', country: 'AR' },
40
+ validator: 'cuit-mod11',
41
+ });
42
+ },
43
+ });
44
+
45
+ registerDetector({
46
+ id: 'national-id-ar-dni',
47
+ entityType: 'NATIONAL_ID',
48
+ regions: ['AR'],
49
+ pattern: /\bDNI:?\s*(\d{1,2}\.\d{3}\.\d{3})\b/g,
50
+ baseConfidence: CONFIDENCE.MEDIUM,
51
+ description: 'Argentine DNI in labeled dotted notation (no checksum exists).',
52
+ validate(ctx): ValidationResult {
53
+ const numberPart = ctx.match[1]!;
54
+ const start = ctx.start + ctx.match[0].indexOf(numberPart);
55
+ return valid({
56
+ canonical: numberPart.replace(/\./g, ''),
57
+ metadata: { scheme: 'dni', country: 'AR' },
58
+ validator: 'dni-labeled',
59
+ span: { start, end: start + numberPart.length },
60
+ });
61
+ },
62
+ });
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Australia: TFN, Medicare number, ABN.
3
+ *
4
+ * TFN — nine digits, weights 1,4,3,7,5,8,6,9,10, valid when the weighted
5
+ * sum is divisible by 11 (SPEC.md: "TFN (mod 11)").
6
+ * Medicare — ten digits + optional IRN: first digit 2–6, weights
7
+ * 1,3,7,9,1,3,7,9 over the first eight, sum mod 10 equals the ninth digit;
8
+ * the tenth is the issue number.
9
+ * ABN — eleven digits: subtract 1 from the first digit, weights
10
+ * 10,1,3,5,7,9,11,13,15,17,19, divisible by 89 (SPEC.md: "ABN (mod 89)").
11
+ */
12
+
13
+ import { toDigits, weightedSum, weightedMod } from '../../../checksums/index.js';
14
+ import { registerDetector } from '../../registry.js';
15
+ import { CONFIDENCE, invalid, valid } from '../../types.js';
16
+ import type { ValidationContext, ValidationResult } from '../../types.js';
17
+
18
+ function guard(ctx: ValidationContext): string | null {
19
+ const before = ctx.start > 0 ? ctx.text[ctx.start - 1] : '';
20
+ if (/[\d-]/.test(before ?? '')) return 'fragment of a longer number';
21
+ const after = ctx.text.slice(ctx.end, ctx.end + 2);
22
+ if (/^\d/.test(after) || /^-\d/.test(after)) return 'fragment of a longer number';
23
+ return null;
24
+ }
25
+
26
+ const TFN_WEIGHTS = [1, 4, 3, 7, 5, 8, 6, 9, 10];
27
+
28
+ registerDetector({
29
+ id: 'national-id-au-tfn',
30
+ entityType: 'TAX_ID',
31
+ regions: ['AU'],
32
+ pattern: /\b(\d{3})[ ]?(\d{3})[ ]?(\d{3})\b/g,
33
+ baseConfidence: CONFIDENCE.HIGH,
34
+ description: 'Australian TFNs: nine digits, weighted sum divisible by 11.',
35
+ validate(ctx): ValidationResult {
36
+ const g = guard(ctx);
37
+ if (g !== null) return invalid(g);
38
+ const digits = toDigits(`${ctx.match[1]}${ctx.match[2]}${ctx.match[3]}`)!;
39
+ if (weightedMod(digits, TFN_WEIGHTS, 11) !== 0) return invalid('TFN sum not divisible by 11');
40
+ return valid({
41
+ canonical: digits.join(''),
42
+ metadata: { scheme: 'tfn', country: 'AU' },
43
+ validator: 'tfn-mod11',
44
+ });
45
+ },
46
+ });
47
+
48
+ const MEDICARE_WEIGHTS = [1, 3, 7, 9, 1, 3, 7, 9];
49
+
50
+ registerDetector({
51
+ id: 'national-id-au-medicare',
52
+ entityType: 'NATIONAL_ID',
53
+ regions: ['AU'],
54
+ // The optional issue number is grouped WITH its separating space. Written
55
+ // as `[ ]?(\d)?` the space could be consumed while the digit matched
56
+ // nothing, leaving trailing whitespace inside the emitted span — which
57
+ // masking would then overwrite along with the identifier.
58
+ pattern: /\b([2-6]\d{3})[ ]?(\d{5})[ ]?(\d)(?:[ ]?(\d))?\b/g,
59
+ baseConfidence: CONFIDENCE.HIGH,
60
+ description: 'Australian Medicare numbers with the weighted mod-10 check digit.',
61
+ validate(ctx): ValidationResult {
62
+ const g = guard(ctx);
63
+ if (g !== null) return invalid(g);
64
+ const nine = `${ctx.match[1]}${ctx.match[2]}`;
65
+ const digits = toDigits(nine)!;
66
+ const check = weightedMod(digits.slice(0, 8), MEDICARE_WEIGHTS, 10)!;
67
+ if (check !== digits[8]) return invalid('Medicare check digit failed');
68
+ return valid({
69
+ canonical: nine + (ctx.match[4] ?? ''),
70
+ metadata: { scheme: 'medicare', country: 'AU' },
71
+ validator: 'medicare-mod10',
72
+ });
73
+ },
74
+ });
75
+
76
+ const ABN_WEIGHTS = [10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19];
77
+
78
+ registerDetector({
79
+ id: 'national-id-au-abn',
80
+ entityType: 'TAX_ID',
81
+ regions: ['AU'],
82
+ pattern: /\b(\d{2})[ ]?(\d{3})[ ]?(\d{3})[ ]?(\d{3})\b/g,
83
+ baseConfidence: CONFIDENCE.HIGH,
84
+ description: 'Australian ABNs: first digit minus one, weighted sum divisible by 89.',
85
+ validate(ctx): ValidationResult {
86
+ const g = guard(ctx);
87
+ if (g !== null) return invalid(g);
88
+ const digits = toDigits(`${ctx.match[1]}${ctx.match[2]}${ctx.match[3]}${ctx.match[4]}`)!;
89
+ if (digits[0] === 0) return invalid('first digit cannot be 0');
90
+ const adjusted = [digits[0]! - 1, ...digits.slice(1)];
91
+ const sum = weightedSum(adjusted, ABN_WEIGHTS)!;
92
+ if (sum % 89 !== 0) return invalid('ABN sum not divisible by 89');
93
+ return valid({
94
+ canonical: digits.join(''),
95
+ metadata: { scheme: 'abn', country: 'AU' },
96
+ validator: 'abn-mod89',
97
+ });
98
+ },
99
+ });
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Belgium: Rijksregisternummer — YY.MM.DD-xxx.cc with a mod-97 check:
3
+ * cc = 97 − (first nine digits mod 97). For people born in or after 2000
4
+ * the nine digits are checked with a leading '2' prepended; the validator
5
+ * accepts whichever century closes, and reports it.
6
+ */
7
+
8
+ import { modString } from '../../../checksums/index.js';
9
+ import { registerDetector } from '../../registry.js';
10
+ import { CONFIDENCE, invalid, valid } from '../../types.js';
11
+ import type { ValidationResult } from '../../types.js';
12
+
13
+ registerDetector({
14
+ id: 'national-id-be-rijksregister',
15
+ entityType: 'NATIONAL_ID',
16
+ regions: ['BE'],
17
+ pattern: /\b(\d{2})[. ]?(\d{2})[. ]?(\d{2})[- ]?(\d{3})[. ]?(\d{2})\b/g,
18
+ baseConfidence: CONFIDENCE.HIGH,
19
+ description: 'Belgian national register numbers with the century-aware mod-97 check.',
20
+ validate(ctx): ValidationResult {
21
+ const month = Number(ctx.match[2]);
22
+ // Ordinary months, plus the +20/+40 BIS-register offsets.
23
+ const monthValid =
24
+ (month >= 1 && month <= 12) || (month >= 21 && month <= 32) || (month >= 41 && month <= 52) || month === 0;
25
+ if (!monthValid) return invalid('implausible month field');
26
+ const day = Number(ctx.match[3]);
27
+ if (day > 31) return invalid('implausible day field');
28
+
29
+ const nine = `${ctx.match[1]}${ctx.match[2]}${ctx.match[3]}${ctx.match[4]}`;
30
+ const check = Number(ctx.match[5]);
31
+
32
+ const r1900 = modString(nine, 97)!;
33
+ const r2000 = modString(`2${nine}`, 97)!;
34
+ let century: number;
35
+ if (97 - r1900 === check) century = 1900;
36
+ else if (97 - r2000 === check) century = 2000;
37
+ else return invalid('mod-97 check failed for both centuries');
38
+
39
+ return valid({
40
+ canonical: `${nine}${ctx.match[5]}`,
41
+ metadata: { scheme: 'rijksregister', country: 'BE', century },
42
+ validator: 'rrn-mod97',
43
+ });
44
+ },
45
+ });
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Bulgaria: EGN (ЕГН) — ten digits: YYMMDD NNN C. The month encodes the
3
+ * century (+20 → born 1800s, +40 → 2000s). Check: weights
4
+ * 2,4,8,5,10,9,7,3,6 mod 11 with 10 → 0.
5
+ */
6
+
7
+ import { toDigits, weightedMod } from '../../../checksums/index.js';
8
+ import { registerDetector } from '../../registry.js';
9
+ import { CONFIDENCE, invalid, valid } from '../../types.js';
10
+ import type { ValidationResult } from '../../types.js';
11
+
12
+ const EGN_WEIGHTS = [2, 4, 8, 5, 10, 9, 7, 3, 6];
13
+
14
+ registerDetector({
15
+ id: 'national-id-bg-egn',
16
+ entityType: 'NATIONAL_ID',
17
+ regions: ['BG'],
18
+ pattern: /\b(\d{2})(\d{2})(\d{2})(\d{4})\b/g,
19
+ baseConfidence: CONFIDENCE.HIGH,
20
+ description: 'Bulgarian EGN: century-banded month plus the mod-11 check.',
21
+ validate(ctx): ValidationResult {
22
+ const before = ctx.start > 0 ? ctx.text[ctx.start - 1] : '';
23
+ if (/[\d-]/.test(before ?? '')) return invalid('fragment of a longer number');
24
+ const after = ctx.text.slice(ctx.end, ctx.end + 2);
25
+ if (/^\d/.test(after) || /^-\d/.test(after)) return invalid('fragment of a longer number');
26
+
27
+ const month = Number(ctx.match[2]);
28
+ const monthValid =
29
+ (month >= 1 && month <= 12) || (month >= 21 && month <= 32) || (month >= 41 && month <= 52);
30
+ if (!monthValid) return invalid('month outside century bands');
31
+ const day = Number(ctx.match[3]);
32
+ if (day < 1 || day > 31) return invalid('day out of range');
33
+
34
+ const digits = toDigits(ctx.match[0])!;
35
+ let check = weightedMod(digits.slice(0, 9), EGN_WEIGHTS, 11)!;
36
+ if (check === 10) check = 0;
37
+ if (check !== digits[9]) return invalid('EGN checksum failed');
38
+ return valid({
39
+ canonical: ctx.match[0],
40
+ metadata: { scheme: 'egn', country: 'BG' },
41
+ validator: 'egn-mod11',
42
+ });
43
+ },
44
+ });
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Brazil: CPF and CNPJ — both with two chained mod-11 check digits (r < 2
3
+ * folds to 0, so mutation detection is ~10/11 by design — the property
4
+ * tests say so). Repdigit CPFs (111.111.111-11 and friends) satisfy the
5
+ * arithmetic but are never issued and are rejected outright.
6
+ */
7
+
8
+ import { toDigits, weightedModBy } from '../../../checksums/index.js';
9
+ import { registerDetector } from '../../registry.js';
10
+ import { CONFIDENCE, invalid, valid } from '../../types.js';
11
+ import type { ValidationContext, ValidationResult } from '../../types.js';
12
+
13
+ function guard(ctx: ValidationContext): string | null {
14
+ const before = ctx.start > 0 ? ctx.text[ctx.start - 1] : '';
15
+ if (/[\d.-]/.test(before ?? '')) return 'fragment of a longer number';
16
+ const after = ctx.text.slice(ctx.end, ctx.end + 2);
17
+ if (/^\d/.test(after) || /^[.-]\d/.test(after)) return 'fragment of a longer number';
18
+ return null;
19
+ }
20
+
21
+ /** Check digit: weights descending from `start`, fold r<2 → 0. */
22
+ function brCheck(digits: readonly number[], start: number): number {
23
+ const remainder = weightedModBy(digits, (i) => start - i, 11)!;
24
+ return remainder < 2 ? 0 : 11 - remainder;
25
+ }
26
+
27
+ registerDetector({
28
+ id: 'national-id-br-cpf',
29
+ entityType: 'NATIONAL_ID',
30
+ regions: ['BR'],
31
+ pattern: /\b(\d{3})\.?(\d{3})\.?(\d{3})-?(\d{2})\b/g,
32
+ baseConfidence: CONFIDENCE.HIGH,
33
+ description: 'Brazilian CPF with both mod-11 check digits; repdigits rejected.',
34
+ validate(ctx): ValidationResult {
35
+ const g = guard(ctx);
36
+ if (g !== null) return invalid(g);
37
+ const all = `${ctx.match[1]}${ctx.match[2]}${ctx.match[3]}${ctx.match[4]}`;
38
+ if (/^(.)\1+$/.test(all)) return invalid('repdigit CPFs are never issued');
39
+ const digits = toDigits(all)!;
40
+ if (brCheck(digits.slice(0, 9), 10) !== digits[9]) return invalid('first check digit failed');
41
+ if (brCheck(digits.slice(0, 10), 11) !== digits[10]) return invalid('second check digit failed');
42
+ return valid({
43
+ canonical: all,
44
+ metadata: { scheme: 'cpf', country: 'BR' },
45
+ validator: 'cpf-dual-mod11',
46
+ });
47
+ },
48
+ });
49
+
50
+ const CNPJ_W1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
51
+ const CNPJ_W2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
52
+
53
+ function cnpjCheck(digits: readonly number[], weights: readonly number[]): number {
54
+ let sum = 0;
55
+ for (let i = 0; i < digits.length; i++) sum += digits[i]! * weights[i]!;
56
+ const remainder = sum % 11;
57
+ return remainder < 2 ? 0 : 11 - remainder;
58
+ }
59
+
60
+ registerDetector({
61
+ id: 'national-id-br-cnpj',
62
+ entityType: 'TAX_ID',
63
+ regions: ['BR'],
64
+ pattern: /\b(\d{2})\.?(\d{3})\.?(\d{3})\/?(\d{4})-?(\d{2})\b/g,
65
+ baseConfidence: CONFIDENCE.HIGH,
66
+ description: 'Brazilian CNPJ with both mod-11 check digits.',
67
+ validate(ctx): ValidationResult {
68
+ const g = guard(ctx);
69
+ if (g !== null) return invalid(g);
70
+ const all = `${ctx.match[1]}${ctx.match[2]}${ctx.match[3]}${ctx.match[4]}${ctx.match[5]}`;
71
+ if (/^0+$/.test(all)) return invalid('all zeros');
72
+ const digits = toDigits(all)!;
73
+ if (cnpjCheck(digits.slice(0, 12), CNPJ_W1) !== digits[12]) return invalid('first check digit failed');
74
+ if (cnpjCheck(digits.slice(0, 13), CNPJ_W2) !== digits[13]) return invalid('second check digit failed');
75
+ return valid({
76
+ canonical: all,
77
+ metadata: { scheme: 'cnpj', country: 'BR' },
78
+ validator: 'cnpj-dual-mod11',
79
+ });
80
+ },
81
+ });