@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.
- package/CHANGELOG.md +117 -0
- package/LICENSE +21 -0
- package/README.md +319 -0
- package/dist/src/checksums/aba.d.ts +25 -0
- package/dist/src/checksums/aba.d.ts.map +1 -0
- package/dist/src/checksums/aba.js +47 -0
- package/dist/src/checksums/aba.js.map +1 -0
- package/dist/src/checksums/digits.d.ts +55 -0
- package/dist/src/checksums/digits.d.ts.map +1 -0
- package/dist/src/checksums/digits.js +114 -0
- package/dist/src/checksums/digits.js.map +1 -0
- package/dist/src/checksums/icao9303.d.ts +29 -0
- package/dist/src/checksums/icao9303.d.ts.map +1 -0
- package/dist/src/checksums/icao9303.js +56 -0
- package/dist/src/checksums/icao9303.js.map +1 -0
- package/dist/src/checksums/index.d.ts +21 -0
- package/dist/src/checksums/index.d.ts.map +1 -0
- package/dist/src/checksums/index.js +21 -0
- package/dist/src/checksums/index.js.map +1 -0
- package/dist/src/checksums/iso7064.d.ts +67 -0
- package/dist/src/checksums/iso7064.d.ts.map +1 -0
- package/dist/src/checksums/iso7064.js +159 -0
- package/dist/src/checksums/iso7064.js.map +1 -0
- package/dist/src/checksums/luhn.d.ts +32 -0
- package/dist/src/checksums/luhn.d.ts.map +1 -0
- package/dist/src/checksums/luhn.js +66 -0
- package/dist/src/checksums/luhn.js.map +1 -0
- package/dist/src/checksums/mod97.d.ts +55 -0
- package/dist/src/checksums/mod97.d.ts.map +1 -0
- package/dist/src/checksums/mod97.js +94 -0
- package/dist/src/checksums/mod97.js.map +1 -0
- package/dist/src/checksums/verhoeff.d.ts +28 -0
- package/dist/src/checksums/verhoeff.d.ts.map +1 -0
- package/dist/src/checksums/verhoeff.js +80 -0
- package/dist/src/checksums/verhoeff.js.map +1 -0
- package/dist/src/checksums/weighted.d.ts +64 -0
- package/dist/src/checksums/weighted.d.ts.map +1 -0
- package/dist/src/checksums/weighted.js +97 -0
- package/dist/src/checksums/weighted.js.map +1 -0
- package/dist/src/context/documentProfile.d.ts +34 -0
- package/dist/src/context/documentProfile.d.ts.map +1 -0
- package/dist/src/context/documentProfile.js +253 -0
- package/dist/src/context/documentProfile.js.map +1 -0
- package/dist/src/context/negativeRules.d.ts +60 -0
- package/dist/src/context/negativeRules.d.ts.map +1 -0
- package/dist/src/context/negativeRules.js +696 -0
- package/dist/src/context/negativeRules.js.map +1 -0
- package/dist/src/context/score.d.ts +52 -0
- package/dist/src/context/score.d.ts.map +1 -0
- package/dist/src/context/score.js +346 -0
- package/dist/src/context/score.js.map +1 -0
- package/dist/src/context/structure.d.ts +46 -0
- package/dist/src/context/structure.d.ts.map +1 -0
- package/dist/src/context/structure.js +528 -0
- package/dist/src/context/structure.js.map +1 -0
- package/dist/src/context/triggers.d.ts +73 -0
- package/dist/src/context/triggers.d.ts.map +1 -0
- package/dist/src/context/triggers.js +172 -0
- package/dist/src/context/triggers.js.map +1 -0
- package/dist/src/context/types.d.ts +137 -0
- package/dist/src/context/types.d.ts.map +1 -0
- package/dist/src/context/types.js +25 -0
- package/dist/src/context/types.js.map +1 -0
- package/dist/src/crypto/keccak256.d.ts +15 -0
- package/dist/src/crypto/keccak256.d.ts.map +1 -0
- package/dist/src/crypto/keccak256.js +89 -0
- package/dist/src/crypto/keccak256.js.map +1 -0
- package/dist/src/crypto/sha256.d.ts +16 -0
- package/dist/src/crypto/sha256.d.ts.map +1 -0
- package/dist/src/crypto/sha256.js +81 -0
- package/dist/src/crypto/sha256.js.map +1 -0
- package/dist/src/detect/detectors/bankcodes/auBsb.d.ts +11 -0
- package/dist/src/detect/detectors/bankcodes/auBsb.d.ts.map +1 -0
- package/dist/src/detect/detectors/bankcodes/auBsb.js +34 -0
- package/dist/src/detect/detectors/bankcodes/auBsb.js.map +1 -0
- package/dist/src/detect/detectors/bankcodes/brAgencia.d.ts +15 -0
- package/dist/src/detect/detectors/bankcodes/brAgencia.d.ts.map +1 -0
- package/dist/src/detect/detectors/bankcodes/brAgencia.js +43 -0
- package/dist/src/detect/detectors/bankcodes/brAgencia.js.map +1 -0
- package/dist/src/detect/detectors/bankcodes/caTransit.d.ts +13 -0
- package/dist/src/detect/detectors/bankcodes/caTransit.d.ts.map +1 -0
- package/dist/src/detect/detectors/bankcodes/caTransit.js +86 -0
- package/dist/src/detect/detectors/bankcodes/caTransit.js.map +1 -0
- package/dist/src/detect/detectors/bankcodes/inIfsc.d.ts +13 -0
- package/dist/src/detect/detectors/bankcodes/inIfsc.d.ts.map +1 -0
- package/dist/src/detect/detectors/bankcodes/inIfsc.js +37 -0
- package/dist/src/detect/detectors/bankcodes/inIfsc.js.map +1 -0
- package/dist/src/detect/detectors/bankcodes/index.d.ts +10 -0
- package/dist/src/detect/detectors/bankcodes/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/bankcodes/index.js +10 -0
- package/dist/src/detect/detectors/bankcodes/index.js.map +1 -0
- package/dist/src/detect/detectors/bankcodes/ukSortCode.d.ts +13 -0
- package/dist/src/detect/detectors/bankcodes/ukSortCode.d.ts.map +1 -0
- package/dist/src/detect/detectors/bankcodes/ukSortCode.js +36 -0
- package/dist/src/detect/detectors/bankcodes/ukSortCode.js.map +1 -0
- package/dist/src/detect/detectors/bankcodes/usRouting.d.ts +12 -0
- package/dist/src/detect/detectors/bankcodes/usRouting.d.ts.map +1 -0
- package/dist/src/detect/detectors/bankcodes/usRouting.js +45 -0
- package/dist/src/detect/detectors/bankcodes/usRouting.js.map +1 -0
- package/dist/src/detect/detectors/contact/email.d.ts +16 -0
- package/dist/src/detect/detectors/contact/email.d.ts.map +1 -0
- package/dist/src/detect/detectors/contact/email.js +111 -0
- package/dist/src/detect/detectors/contact/email.js.map +1 -0
- package/dist/src/detect/detectors/contact/index.d.ts +11 -0
- package/dist/src/detect/detectors/contact/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/contact/index.js +11 -0
- package/dist/src/detect/detectors/contact/index.js.map +1 -0
- package/dist/src/detect/detectors/contact/ipv4.d.ts +12 -0
- package/dist/src/detect/detectors/contact/ipv4.d.ts.map +1 -0
- package/dist/src/detect/detectors/contact/ipv4.js +109 -0
- package/dist/src/detect/detectors/contact/ipv4.js.map +1 -0
- package/dist/src/detect/detectors/contact/ipv6.d.ts +16 -0
- package/dist/src/detect/detectors/contact/ipv6.d.ts.map +1 -0
- package/dist/src/detect/detectors/contact/ipv6.js +187 -0
- package/dist/src/detect/detectors/contact/ipv6.js.map +1 -0
- package/dist/src/detect/detectors/contact/mac.d.ts +14 -0
- package/dist/src/detect/detectors/contact/mac.d.ts.map +1 -0
- package/dist/src/detect/detectors/contact/mac.js +64 -0
- package/dist/src/detect/detectors/contact/mac.js.map +1 -0
- package/dist/src/detect/detectors/contact/phone.d.ts +21 -0
- package/dist/src/detect/detectors/contact/phone.d.ts.map +1 -0
- package/dist/src/detect/detectors/contact/phone.js +76 -0
- package/dist/src/detect/detectors/contact/phone.js.map +1 -0
- package/dist/src/detect/detectors/contact/urlCredentials.d.ts +23 -0
- package/dist/src/detect/detectors/contact/urlCredentials.d.ts.map +1 -0
- package/dist/src/detect/detectors/contact/urlCredentials.js +123 -0
- package/dist/src/detect/detectors/contact/urlCredentials.js.map +1 -0
- package/dist/src/detect/detectors/crypto/ada.d.ts +13 -0
- package/dist/src/detect/detectors/crypto/ada.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/ada.js +51 -0
- package/dist/src/detect/detectors/crypto/ada.js.map +1 -0
- package/dist/src/detect/detectors/crypto/btc.d.ts +15 -0
- package/dist/src/detect/detectors/crypto/btc.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/btc.js +78 -0
- package/dist/src/detect/detectors/crypto/btc.js.map +1 -0
- package/dist/src/detect/detectors/crypto/dot.d.ts +13 -0
- package/dist/src/detect/detectors/crypto/dot.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/dot.js +41 -0
- package/dist/src/detect/detectors/crypto/dot.js.map +1 -0
- package/dist/src/detect/detectors/crypto/eth.d.ts +15 -0
- package/dist/src/detect/detectors/crypto/eth.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/eth.js +63 -0
- package/dist/src/detect/detectors/crypto/eth.js.map +1 -0
- package/dist/src/detect/detectors/crypto/index.d.ts +12 -0
- package/dist/src/detect/detectors/crypto/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/index.js +12 -0
- package/dist/src/detect/detectors/crypto/index.js.map +1 -0
- package/dist/src/detect/detectors/crypto/ltc.d.ts +12 -0
- package/dist/src/detect/detectors/crypto/ltc.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/ltc.js +71 -0
- package/dist/src/detect/detectors/crypto/ltc.js.map +1 -0
- package/dist/src/detect/detectors/crypto/sol.d.ts +13 -0
- package/dist/src/detect/detectors/crypto/sol.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/sol.js +39 -0
- package/dist/src/detect/detectors/crypto/sol.js.map +1 -0
- package/dist/src/detect/detectors/crypto/trx.d.ts +8 -0
- package/dist/src/detect/detectors/crypto/trx.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/trx.js +34 -0
- package/dist/src/detect/detectors/crypto/trx.js.map +1 -0
- package/dist/src/detect/detectors/crypto/xmr.d.ts +10 -0
- package/dist/src/detect/detectors/crypto/xmr.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/xmr.js +51 -0
- package/dist/src/detect/detectors/crypto/xmr.js.map +1 -0
- package/dist/src/detect/detectors/documents/driversLicense.d.ts +24 -0
- package/dist/src/detect/detectors/documents/driversLicense.d.ts.map +1 -0
- package/dist/src/detect/detectors/documents/driversLicense.js +79 -0
- package/dist/src/detect/detectors/documents/driversLicense.js.map +1 -0
- package/dist/src/detect/detectors/documents/healthData.d.ts +23 -0
- package/dist/src/detect/detectors/documents/healthData.d.ts.map +1 -0
- package/dist/src/detect/detectors/documents/healthData.js +78 -0
- package/dist/src/detect/detectors/documents/healthData.js.map +1 -0
- package/dist/src/detect/detectors/documents/index.d.ts +9 -0
- package/dist/src/detect/detectors/documents/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/documents/index.js +9 -0
- package/dist/src/detect/detectors/documents/index.js.map +1 -0
- package/dist/src/detect/detectors/documents/passportMrz.d.ts +20 -0
- package/dist/src/detect/detectors/documents/passportMrz.d.ts.map +1 -0
- package/dist/src/detect/detectors/documents/passportMrz.js +194 -0
- package/dist/src/detect/detectors/documents/passportMrz.js.map +1 -0
- package/dist/src/detect/detectors/documents/usNpi.d.ts +16 -0
- package/dist/src/detect/detectors/documents/usNpi.d.ts.map +1 -0
- package/dist/src/detect/detectors/documents/usNpi.js +48 -0
- package/dist/src/detect/detectors/documents/usNpi.js.map +1 -0
- package/dist/src/detect/detectors/documents/vin.d.ts +15 -0
- package/dist/src/detect/detectors/documents/vin.d.ts.map +1 -0
- package/dist/src/detect/detectors/documents/vin.js +64 -0
- package/dist/src/detect/detectors/documents/vin.js.map +1 -0
- package/dist/src/detect/detectors/financial/creditCard.d.ts +23 -0
- package/dist/src/detect/detectors/financial/creditCard.d.ts.map +1 -0
- package/dist/src/detect/detectors/financial/creditCard.js +157 -0
- package/dist/src/detect/detectors/financial/creditCard.js.map +1 -0
- package/dist/src/detect/detectors/financial/iban.d.ts +18 -0
- package/dist/src/detect/detectors/financial/iban.d.ts.map +1 -0
- package/dist/src/detect/detectors/financial/iban.js +80 -0
- package/dist/src/detect/detectors/financial/iban.js.map +1 -0
- package/dist/src/detect/detectors/financial/ibanRegistry.d.ts +35 -0
- package/dist/src/detect/detectors/financial/ibanRegistry.d.ts.map +1 -0
- package/dist/src/detect/detectors/financial/ibanRegistry.js +92 -0
- package/dist/src/detect/detectors/financial/ibanRegistry.js.map +1 -0
- package/dist/src/detect/detectors/financial/index.d.ts +7 -0
- package/dist/src/detect/detectors/financial/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/financial/index.js +7 -0
- package/dist/src/detect/detectors/financial/index.js.map +1 -0
- package/dist/src/detect/detectors/financial/swiftBic.d.ts +17 -0
- package/dist/src/detect/detectors/financial/swiftBic.d.ts.map +1 -0
- package/dist/src/detect/detectors/financial/swiftBic.js +55 -0
- package/dist/src/detect/detectors/financial/swiftBic.js.map +1 -0
- package/dist/src/detect/detectors/index.d.ts +15 -0
- package/dist/src/detect/detectors/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/index.js +15 -0
- package/dist/src/detect/detectors/index.js.map +1 -0
- package/dist/src/detect/detectors/location/coordinates.d.ts +14 -0
- package/dist/src/detect/detectors/location/coordinates.d.ts.map +1 -0
- package/dist/src/detect/detectors/location/coordinates.js +79 -0
- package/dist/src/detect/detectors/location/coordinates.js.map +1 -0
- package/dist/src/detect/detectors/location/index.d.ts +7 -0
- package/dist/src/detect/detectors/location/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/location/index.js +7 -0
- package/dist/src/detect/detectors/location/index.js.map +1 -0
- package/dist/src/detect/detectors/location/postalCode.d.ts +13 -0
- package/dist/src/detect/detectors/location/postalCode.d.ts.map +1 -0
- package/dist/src/detect/detectors/location/postalCode.js +53 -0
- package/dist/src/detect/detectors/location/postalCode.js.map +1 -0
- package/dist/src/detect/detectors/location/postalRegistry.d.ts +19 -0
- package/dist/src/detect/detectors/location/postalRegistry.d.ts.map +1 -0
- package/dist/src/detect/detectors/location/postalRegistry.js +73 -0
- package/dist/src/detect/detectors/location/postalRegistry.js.map +1 -0
- package/dist/src/detect/detectors/location/streetAddress.d.ts +21 -0
- package/dist/src/detect/detectors/location/streetAddress.d.ts.map +1 -0
- package/dist/src/detect/detectors/location/streetAddress.js +70 -0
- package/dist/src/detect/detectors/location/streetAddress.js.map +1 -0
- package/dist/src/detect/detectors/natid/africa.d.ts +17 -0
- package/dist/src/detect/detectors/natid/africa.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/africa.js +106 -0
- package/dist/src/detect/detectors/natid/africa.js.map +1 -0
- package/dist/src/detect/detectors/natid/ar.d.ts +14 -0
- package/dist/src/detect/detectors/natid/ar.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/ar.js +62 -0
- package/dist/src/detect/detectors/natid/ar.js.map +1 -0
- package/dist/src/detect/detectors/natid/au.d.ts +13 -0
- package/dist/src/detect/detectors/natid/au.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/au.js +100 -0
- package/dist/src/detect/detectors/natid/au.js.map +1 -0
- package/dist/src/detect/detectors/natid/be.d.ts +8 -0
- package/dist/src/detect/detectors/natid/be.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/be.js +44 -0
- package/dist/src/detect/detectors/natid/be.js.map +1 -0
- package/dist/src/detect/detectors/natid/bg.d.ts +7 -0
- package/dist/src/detect/detectors/natid/bg.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/bg.js +44 -0
- package/dist/src/detect/detectors/natid/bg.js.map +1 -0
- package/dist/src/detect/detectors/natid/br.d.ts +8 -0
- package/dist/src/detect/detectors/natid/br.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/br.js +85 -0
- package/dist/src/detect/detectors/natid/br.js.map +1 -0
- package/dist/src/detect/detectors/natid/ca.d.ts +8 -0
- package/dist/src/detect/detectors/natid/ca.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/ca.js +41 -0
- package/dist/src/detect/detectors/natid/ca.js.map +1 -0
- package/dist/src/detect/detectors/natid/cl.d.ts +9 -0
- package/dist/src/detect/detectors/natid/cl.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/cl.js +47 -0
- package/dist/src/detect/detectors/natid/cl.js.map +1 -0
- package/dist/src/detect/detectors/natid/cn.d.ts +9 -0
- package/dist/src/detect/detectors/natid/cn.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/cn.js +49 -0
- package/dist/src/detect/detectors/natid/cn.js.map +1 -0
- package/dist/src/detect/detectors/natid/co.d.ts +10 -0
- package/dist/src/detect/detectors/natid/co.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/co.js +43 -0
- package/dist/src/detect/detectors/natid/co.js.map +1 -0
- package/dist/src/detect/detectors/natid/cz.d.ts +11 -0
- package/dist/src/detect/detectors/natid/cz.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/cz.js +44 -0
- package/dist/src/detect/detectors/natid/cz.js.map +1 -0
- package/dist/src/detect/detectors/natid/de.d.ts +16 -0
- package/dist/src/detect/detectors/natid/de.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/de.js +77 -0
- package/dist/src/detect/detectors/natid/de.js.map +1 -0
- package/dist/src/detect/detectors/natid/dk.d.ts +9 -0
- package/dist/src/detect/detectors/natid/dk.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/dk.js +31 -0
- package/dist/src/detect/detectors/natid/dk.js.map +1 -0
- package/dist/src/detect/detectors/natid/es.d.ts +12 -0
- package/dist/src/detect/detectors/natid/es.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/es.js +96 -0
- package/dist/src/detect/detectors/natid/es.js.map +1 -0
- package/dist/src/detect/detectors/natid/fi.d.ts +10 -0
- package/dist/src/detect/detectors/natid/fi.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/fi.js +40 -0
- package/dist/src/detect/detectors/natid/fi.js.map +1 -0
- package/dist/src/detect/detectors/natid/fr.d.ts +12 -0
- package/dist/src/detect/detectors/natid/fr.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/fr.js +61 -0
- package/dist/src/detect/detectors/natid/fr.js.map +1 -0
- package/dist/src/detect/detectors/natid/gb.d.ts +10 -0
- package/dist/src/detect/detectors/natid/gb.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/gb.js +72 -0
- package/dist/src/detect/detectors/natid/gb.js.map +1 -0
- package/dist/src/detect/detectors/natid/gr.d.ts +7 -0
- package/dist/src/detect/detectors/natid/gr.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/gr.js +36 -0
- package/dist/src/detect/detectors/natid/gr.js.map +1 -0
- package/dist/src/detect/detectors/natid/gulf.d.ts +16 -0
- package/dist/src/detect/detectors/natid/gulf.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/gulf.js +121 -0
- package/dist/src/detect/detectors/natid/gulf.js.map +1 -0
- package/dist/src/detect/detectors/natid/hk.d.ts +9 -0
- package/dist/src/detect/detectors/natid/hk.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/hk.js +41 -0
- package/dist/src/detect/detectors/natid/hk.js.map +1 -0
- package/dist/src/detect/detectors/natid/hr.d.ts +6 -0
- package/dist/src/detect/detectors/natid/hr.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/hr.js +32 -0
- package/dist/src/detect/detectors/natid/hr.js.map +1 -0
- package/dist/src/detect/detectors/natid/hu.d.ts +7 -0
- package/dist/src/detect/detectors/natid/hu.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/hu.js +37 -0
- package/dist/src/detect/detectors/natid/hu.js.map +1 -0
- package/dist/src/detect/detectors/natid/ie.d.ts +9 -0
- package/dist/src/detect/detectors/natid/ie.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/ie.js +36 -0
- package/dist/src/detect/detectors/natid/ie.js.map +1 -0
- package/dist/src/detect/detectors/natid/il.d.ts +10 -0
- package/dist/src/detect/detectors/natid/il.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/il.js +38 -0
- package/dist/src/detect/detectors/natid/il.js.map +1 -0
- package/dist/src/detect/detectors/natid/in.d.ts +17 -0
- package/dist/src/detect/detectors/natid/in.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/in.js +67 -0
- package/dist/src/detect/detectors/natid/in.js.map +1 -0
- package/dist/src/detect/detectors/natid/index.d.ts +55 -0
- package/dist/src/detect/detectors/natid/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/index.js +55 -0
- package/dist/src/detect/detectors/natid/index.js.map +1 -0
- package/dist/src/detect/detectors/natid/is.d.ts +8 -0
- package/dist/src/detect/detectors/natid/is.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/is.js +42 -0
- package/dist/src/detect/detectors/natid/is.js.map +1 -0
- package/dist/src/detect/detectors/natid/it.d.ts +12 -0
- package/dist/src/detect/detectors/natid/it.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/it.js +62 -0
- package/dist/src/detect/detectors/natid/it.js.map +1 -0
- package/dist/src/detect/detectors/natid/jp.d.ts +9 -0
- package/dist/src/detect/detectors/natid/jp.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/jp.js +46 -0
- package/dist/src/detect/detectors/natid/jp.js.map +1 -0
- package/dist/src/detect/detectors/natid/kr.d.ts +11 -0
- package/dist/src/detect/detectors/natid/kr.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/kr.js +40 -0
- package/dist/src/detect/detectors/natid/kr.js.map +1 -0
- package/dist/src/detect/detectors/natid/kz.d.ts +8 -0
- package/dist/src/detect/detectors/natid/kz.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/kz.js +46 -0
- package/dist/src/detect/detectors/natid/kz.js.map +1 -0
- package/dist/src/detect/detectors/natid/mx.d.ts +16 -0
- package/dist/src/detect/detectors/natid/mx.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/mx.js +82 -0
- package/dist/src/detect/detectors/natid/mx.js.map +1 -0
- package/dist/src/detect/detectors/natid/nl.d.ts +8 -0
- package/dist/src/detect/detectors/natid/nl.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/nl.js +40 -0
- package/dist/src/detect/detectors/natid/nl.js.map +1 -0
- package/dist/src/detect/detectors/natid/no.d.ts +9 -0
- package/dist/src/detect/detectors/natid/no.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/no.js +52 -0
- package/dist/src/detect/detectors/natid/no.js.map +1 -0
- package/dist/src/detect/detectors/natid/nz.d.ts +9 -0
- package/dist/src/detect/detectors/natid/nz.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/nz.js +52 -0
- package/dist/src/detect/detectors/natid/nz.js.map +1 -0
- package/dist/src/detect/detectors/natid/pe.d.ts +7 -0
- package/dist/src/detect/detectors/natid/pe.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/pe.js +26 -0
- package/dist/src/detect/detectors/natid/pe.js.map +1 -0
- package/dist/src/detect/detectors/natid/pl.d.ts +11 -0
- package/dist/src/detect/detectors/natid/pl.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/pl.js +105 -0
- package/dist/src/detect/detectors/natid/pl.js.map +1 -0
- package/dist/src/detect/detectors/natid/pt.d.ts +6 -0
- package/dist/src/detect/detectors/natid/pt.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/pt.js +35 -0
- package/dist/src/detect/detectors/natid/pt.js.map +1 -0
- package/dist/src/detect/detectors/natid/ro.d.ts +8 -0
- package/dist/src/detect/detectors/natid/ro.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/ro.js +48 -0
- package/dist/src/detect/detectors/natid/ro.js.map +1 -0
- package/dist/src/detect/detectors/natid/ru.d.ts +11 -0
- package/dist/src/detect/detectors/natid/ru.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/ru.js +86 -0
- package/dist/src/detect/detectors/natid/ru.js.map +1 -0
- package/dist/src/detect/detectors/natid/se.d.ts +9 -0
- package/dist/src/detect/detectors/natid/se.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/se.js +43 -0
- package/dist/src/detect/detectors/natid/se.js.map +1 -0
- package/dist/src/detect/detectors/natid/seasia.d.ts +19 -0
- package/dist/src/detect/detectors/natid/seasia.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/seasia.js +182 -0
- package/dist/src/detect/detectors/natid/seasia.js.map +1 -0
- package/dist/src/detect/detectors/natid/sg.d.ts +8 -0
- package/dist/src/detect/detectors/natid/sg.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/sg.js +39 -0
- package/dist/src/detect/detectors/natid/sg.js.map +1 -0
- package/dist/src/detect/detectors/natid/si.d.ts +8 -0
- package/dist/src/detect/detectors/natid/si.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/si.js +44 -0
- package/dist/src/detect/detectors/natid/si.js.map +1 -0
- package/dist/src/detect/detectors/natid/tr.d.ts +14 -0
- package/dist/src/detect/detectors/natid/tr.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/tr.js +79 -0
- package/dist/src/detect/detectors/natid/tr.js.map +1 -0
- package/dist/src/detect/detectors/natid/tw.d.ts +9 -0
- package/dist/src/detect/detectors/natid/tw.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/tw.js +40 -0
- package/dist/src/detect/detectors/natid/tw.js.map +1 -0
- package/dist/src/detect/detectors/natid/ua.d.ts +7 -0
- package/dist/src/detect/detectors/natid/ua.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/ua.js +38 -0
- package/dist/src/detect/detectors/natid/ua.js.map +1 -0
- package/dist/src/detect/detectors/natid/us.d.ts +15 -0
- package/dist/src/detect/detectors/natid/us.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/us.js +119 -0
- package/dist/src/detect/detectors/natid/us.js.map +1 -0
- package/dist/src/detect/detectors/natid/za.d.ts +9 -0
- package/dist/src/detect/detectors/natid/za.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/za.js +44 -0
- package/dist/src/detect/detectors/natid/za.js.map +1 -0
- package/dist/src/detect/detectors/secrets/apiKey.d.ts +14 -0
- package/dist/src/detect/detectors/secrets/apiKey.d.ts.map +1 -0
- package/dist/src/detect/detectors/secrets/apiKey.js +103 -0
- package/dist/src/detect/detectors/secrets/apiKey.js.map +1 -0
- package/dist/src/detect/detectors/secrets/connectionString.d.ts +12 -0
- package/dist/src/detect/detectors/secrets/connectionString.d.ts.map +1 -0
- package/dist/src/detect/detectors/secrets/connectionString.js +70 -0
- package/dist/src/detect/detectors/secrets/connectionString.js.map +1 -0
- package/dist/src/detect/detectors/secrets/genericSecret.d.ts +22 -0
- package/dist/src/detect/detectors/secrets/genericSecret.d.ts.map +1 -0
- package/dist/src/detect/detectors/secrets/genericSecret.js +77 -0
- package/dist/src/detect/detectors/secrets/genericSecret.js.map +1 -0
- package/dist/src/detect/detectors/secrets/index.d.ts +9 -0
- package/dist/src/detect/detectors/secrets/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/secrets/index.js +9 -0
- package/dist/src/detect/detectors/secrets/index.js.map +1 -0
- package/dist/src/detect/detectors/secrets/jwt.d.ts +11 -0
- package/dist/src/detect/detectors/secrets/jwt.d.ts.map +1 -0
- package/dist/src/detect/detectors/secrets/jwt.js +111 -0
- package/dist/src/detect/detectors/secrets/jwt.js.map +1 -0
- package/dist/src/detect/detectors/secrets/pemPrivateKey.d.ts +16 -0
- package/dist/src/detect/detectors/secrets/pemPrivateKey.d.ts.map +1 -0
- package/dist/src/detect/detectors/secrets/pemPrivateKey.js +56 -0
- package/dist/src/detect/detectors/secrets/pemPrivateKey.js.map +1 -0
- package/dist/src/detect/detectors/vat/euVat.d.ts +17 -0
- package/dist/src/detect/detectors/vat/euVat.d.ts.map +1 -0
- package/dist/src/detect/detectors/vat/euVat.js +293 -0
- package/dist/src/detect/detectors/vat/euVat.js.map +1 -0
- package/dist/src/detect/detectors/vat/index.d.ts +5 -0
- package/dist/src/detect/detectors/vat/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/vat/index.js +5 -0
- package/dist/src/detect/detectors/vat/index.js.map +1 -0
- package/dist/src/detect/entropy.d.ts +28 -0
- package/dist/src/detect/entropy.d.ts.map +1 -0
- package/dist/src/detect/entropy.js +64 -0
- package/dist/src/detect/entropy.js.map +1 -0
- package/dist/src/detect/isoCountries.d.ts +10 -0
- package/dist/src/detect/isoCountries.d.ts.map +1 -0
- package/dist/src/detect/isoCountries.js +25 -0
- package/dist/src/detect/isoCountries.js.map +1 -0
- package/dist/src/detect/registry.d.ts +50 -0
- package/dist/src/detect/registry.d.ts.map +1 -0
- package/dist/src/detect/registry.js +110 -0
- package/dist/src/detect/registry.js.map +1 -0
- package/dist/src/detect/runner.d.ts +64 -0
- package/dist/src/detect/runner.d.ts.map +1 -0
- package/dist/src/detect/runner.js +142 -0
- package/dist/src/detect/runner.js.map +1 -0
- package/dist/src/detect/types.d.ts +251 -0
- package/dist/src/detect/types.d.ts.map +1 -0
- package/dist/src/detect/types.js +59 -0
- package/dist/src/detect/types.js.map +1 -0
- package/dist/src/encoding/base58.d.ts +26 -0
- package/dist/src/encoding/base58.d.ts.map +1 -0
- package/dist/src/encoding/base58.js +77 -0
- package/dist/src/encoding/base58.js.map +1 -0
- package/dist/src/encoding/base58monero.d.ts +15 -0
- package/dist/src/encoding/base58monero.d.ts.map +1 -0
- package/dist/src/encoding/base58monero.js +87 -0
- package/dist/src/encoding/base58monero.js.map +1 -0
- package/dist/src/encoding/bech32.d.ts +28 -0
- package/dist/src/encoding/bech32.d.ts.map +1 -0
- package/dist/src/encoding/bech32.js +108 -0
- package/dist/src/encoding/bech32.js.map +1 -0
- package/dist/src/encoding/bytes.d.ts +15 -0
- package/dist/src/encoding/bytes.d.ts.map +1 -0
- package/dist/src/encoding/bytes.js +46 -0
- package/dist/src/encoding/bytes.js.map +1 -0
- package/dist/src/entityFamily.d.ts +18 -0
- package/dist/src/entityFamily.d.ts.map +1 -0
- package/dist/src/entityFamily.js +54 -0
- package/dist/src/entityFamily.js.map +1 -0
- package/dist/src/entityLabel.d.ts +18 -0
- package/dist/src/entityLabel.d.ts.map +1 -0
- package/dist/src/entityLabel.js +53 -0
- package/dist/src/entityLabel.js.map +1 -0
- package/dist/src/entityTypes.d.ts +64 -0
- package/dist/src/entityTypes.d.ts.map +1 -0
- package/dist/src/entityTypes.js +94 -0
- package/dist/src/entityTypes.js.map +1 -0
- package/dist/src/exposure/index.d.ts +86 -0
- package/dist/src/exposure/index.d.ts.map +1 -0
- package/dist/src/exposure/index.js +134 -0
- package/dist/src/exposure/index.js.map +1 -0
- package/dist/src/fuse/calibrate.d.ts +95 -0
- package/dist/src/fuse/calibrate.d.ts.map +1 -0
- package/dist/src/fuse/calibrate.js +165 -0
- package/dist/src/fuse/calibrate.js.map +1 -0
- package/dist/src/fuse/defaultCalibration.d.ts +52 -0
- package/dist/src/fuse/defaultCalibration.d.ts.map +1 -0
- package/dist/src/fuse/defaultCalibration.js +41 -0
- package/dist/src/fuse/defaultCalibration.js.map +1 -0
- package/dist/src/fuse/explain.d.ts +55 -0
- package/dist/src/fuse/explain.d.ts.map +1 -0
- package/dist/src/fuse/explain.js +91 -0
- package/dist/src/fuse/explain.js.map +1 -0
- package/dist/src/fuse/profiles.d.ts +80 -0
- package/dist/src/fuse/profiles.d.ts.map +1 -0
- package/dist/src/fuse/profiles.js +126 -0
- package/dist/src/fuse/profiles.js.map +1 -0
- package/dist/src/fuse/resolve.d.ts +73 -0
- package/dist/src/fuse/resolve.d.ts.map +1 -0
- package/dist/src/fuse/resolve.js +206 -0
- package/dist/src/fuse/resolve.js.map +1 -0
- package/dist/src/gazetteer/index.d.ts +41 -0
- package/dist/src/gazetteer/index.d.ts.map +1 -0
- package/dist/src/gazetteer/index.js +117 -0
- package/dist/src/gazetteer/index.js.map +1 -0
- package/dist/src/generate/bankcodes.d.ts +20 -0
- package/dist/src/generate/bankcodes.d.ts.map +1 -0
- package/dist/src/generate/bankcodes.js +71 -0
- package/dist/src/generate/bankcodes.js.map +1 -0
- package/dist/src/generate/contact.d.ts +31 -0
- package/dist/src/generate/contact.d.ts.map +1 -0
- package/dist/src/generate/contact.js +139 -0
- package/dist/src/generate/contact.js.map +1 -0
- package/dist/src/generate/crypto.d.ts +27 -0
- package/dist/src/generate/crypto.d.ts.map +1 -0
- package/dist/src/generate/crypto.js +88 -0
- package/dist/src/generate/crypto.js.map +1 -0
- package/dist/src/generate/documents.d.ts +24 -0
- package/dist/src/generate/documents.d.ts.map +1 -0
- package/dist/src/generate/documents.js +124 -0
- package/dist/src/generate/documents.js.map +1 -0
- package/dist/src/generate/financial.d.ts +26 -0
- package/dist/src/generate/financial.d.ts.map +1 -0
- package/dist/src/generate/financial.js +136 -0
- package/dist/src/generate/financial.js.map +1 -0
- package/dist/src/generate/index.d.ts +23 -0
- package/dist/src/generate/index.d.ts.map +1 -0
- package/dist/src/generate/index.js +23 -0
- package/dist/src/generate/index.js.map +1 -0
- package/dist/src/generate/location.d.ts +12 -0
- package/dist/src/generate/location.d.ts.map +1 -0
- package/dist/src/generate/location.js +75 -0
- package/dist/src/generate/location.js.map +1 -0
- package/dist/src/generate/natidAmOc.d.ts +22 -0
- package/dist/src/generate/natidAmOc.d.ts.map +1 -0
- package/dist/src/generate/natidAmOc.js +181 -0
- package/dist/src/generate/natidAmOc.js.map +1 -0
- package/dist/src/generate/natidAsia.d.ts +20 -0
- package/dist/src/generate/natidAsia.d.ts.map +1 -0
- package/dist/src/generate/natidAsia.js +147 -0
- package/dist/src/generate/natidAsia.js.map +1 -0
- package/dist/src/generate/natidCee.d.ts +21 -0
- package/dist/src/generate/natidCee.d.ts.map +1 -0
- package/dist/src/generate/natidCee.js +181 -0
- package/dist/src/generate/natidCee.js.map +1 -0
- package/dist/src/generate/natidMeCis.d.ts +17 -0
- package/dist/src/generate/natidMeCis.d.ts.map +1 -0
- package/dist/src/generate/natidMeCis.js +121 -0
- package/dist/src/generate/natidMeCis.js.map +1 -0
- package/dist/src/generate/natidWest.d.ts +32 -0
- package/dist/src/generate/natidWest.d.ts.map +1 -0
- package/dist/src/generate/natidWest.js +187 -0
- package/dist/src/generate/natidWest.js.map +1 -0
- package/dist/src/generate/prng.d.ts +10 -0
- package/dist/src/generate/prng.d.ts.map +1 -0
- package/dist/src/generate/prng.js +18 -0
- package/dist/src/generate/prng.js.map +1 -0
- package/dist/src/generate/secrets.d.ts +23 -0
- package/dist/src/generate/secrets.d.ts.map +1 -0
- package/dist/src/generate/secrets.js +126 -0
- package/dist/src/generate/secrets.js.map +1 -0
- package/dist/src/generate/vat.d.ts +11 -0
- package/dist/src/generate/vat.d.ts.map +1 -0
- package/dist/src/generate/vat.js +233 -0
- package/dist/src/generate/vat.js.map +1 -0
- package/dist/src/index.d.ts +81 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +76 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mask/egressGuard.d.ts +54 -0
- package/dist/src/mask/egressGuard.d.ts.map +1 -0
- package/dist/src/mask/egressGuard.js +67 -0
- package/dist/src/mask/egressGuard.js.map +1 -0
- package/dist/src/mask/masker.d.ts +76 -0
- package/dist/src/mask/masker.d.ts.map +1 -0
- package/dist/src/mask/masker.js +201 -0
- package/dist/src/mask/masker.js.map +1 -0
- package/dist/src/mask/restorer.d.ts +96 -0
- package/dist/src/mask/restorer.d.ts.map +1 -0
- package/dist/src/mask/restorer.js +263 -0
- package/dist/src/mask/restorer.js.map +1 -0
- package/dist/src/mask/surrogatePools.d.ts +33 -0
- package/dist/src/mask/surrogatePools.d.ts.map +1 -0
- package/dist/src/mask/surrogatePools.js +81 -0
- package/dist/src/mask/surrogatePools.js.map +1 -0
- package/dist/src/mask/surrogates.d.ts +45 -0
- package/dist/src/mask/surrogates.d.ts.map +1 -0
- package/dist/src/mask/surrogates.js +241 -0
- package/dist/src/mask/surrogates.js.map +1 -0
- package/dist/src/mask/vault.d.ts +76 -0
- package/dist/src/mask/vault.d.ts.map +1 -0
- package/dist/src/mask/vault.js +141 -0
- package/dist/src/mask/vault.js.map +1 -0
- package/dist/src/ner/align.d.ts +36 -0
- package/dist/src/ner/align.d.ts.map +1 -0
- package/dist/src/ner/align.js +73 -0
- package/dist/src/ner/align.js.map +1 -0
- package/dist/src/ner/chunk.d.ts +27 -0
- package/dist/src/ner/chunk.d.ts.map +1 -0
- package/dist/src/ner/chunk.js +55 -0
- package/dist/src/ner/chunk.js.map +1 -0
- package/dist/src/ner/chunkCache.d.ts +63 -0
- package/dist/src/ner/chunkCache.d.ts.map +1 -0
- package/dist/src/ner/chunkCache.js +99 -0
- package/dist/src/ner/chunkCache.js.map +1 -0
- package/dist/src/ner/engine.d.ts +53 -0
- package/dist/src/ner/engine.d.ts.map +1 -0
- package/dist/src/ner/engine.js +113 -0
- package/dist/src/ner/engine.js.map +1 -0
- package/dist/src/ner/merge.d.ts +26 -0
- package/dist/src/ner/merge.d.ts.map +1 -0
- package/dist/src/ner/merge.js +108 -0
- package/dist/src/ner/merge.js.map +1 -0
- package/dist/src/ner/runStage2.d.ts +17 -0
- package/dist/src/ner/runStage2.d.ts.map +1 -0
- package/dist/src/ner/runStage2.js +43 -0
- package/dist/src/ner/runStage2.js.map +1 -0
- package/dist/src/ner/stage2b.d.ts +59 -0
- package/dist/src/ner/stage2b.d.ts.map +1 -0
- package/dist/src/ner/stage2b.js +51 -0
- package/dist/src/ner/stage2b.js.map +1 -0
- package/dist/src/ner/transformersClassifier.d.ts +45 -0
- package/dist/src/ner/transformersClassifier.d.ts.map +1 -0
- package/dist/src/ner/transformersClassifier.js +40 -0
- package/dist/src/ner/transformersClassifier.js.map +1 -0
- package/dist/src/ner/types.d.ts +93 -0
- package/dist/src/ner/types.d.ts.map +1 -0
- package/dist/src/ner/types.js +12 -0
- package/dist/src/ner/types.js.map +1 -0
- package/dist/src/normalization.d.ts +24 -0
- package/dist/src/normalization.d.ts.map +1 -0
- package/dist/src/normalization.js +92 -0
- package/dist/src/normalization.js.map +1 -0
- package/dist/src/offsetMap.d.ts +165 -0
- package/dist/src/offsetMap.d.ts.map +1 -0
- package/dist/src/offsetMap.js +225 -0
- package/dist/src/offsetMap.js.map +1 -0
- package/dist/src/pipeline.d.ts +58 -0
- package/dist/src/pipeline.d.ts.map +1 -0
- package/dist/src/pipeline.js +57 -0
- package/dist/src/pipeline.js.map +1 -0
- package/dist/src/protect.d.ts +146 -0
- package/dist/src/protect.d.ts.map +1 -0
- package/dist/src/protect.js +161 -0
- package/dist/src/protect.js.map +1 -0
- package/dist/src/scripts.d.ts +37 -0
- package/dist/src/scripts.d.ts.map +1 -0
- package/dist/src/scripts.js +145 -0
- package/dist/src/scripts.js.map +1 -0
- package/dist/src/transforms/foldDigits.d.ts +49 -0
- package/dist/src/transforms/foldDigits.d.ts.map +1 -0
- package/dist/src/transforms/foldDigits.js +135 -0
- package/dist/src/transforms/foldDigits.js.map +1 -0
- package/dist/src/transforms/graphemes.d.ts +6 -0
- package/dist/src/transforms/graphemes.d.ts.map +1 -0
- package/dist/src/transforms/graphemes.js +6 -0
- package/dist/src/transforms/graphemes.js.map +1 -0
- package/dist/src/transforms/homoglyphFold.d.ts +5 -0
- package/dist/src/transforms/homoglyphFold.d.ts.map +1 -0
- package/dist/src/transforms/homoglyphFold.js +214 -0
- package/dist/src/transforms/homoglyphFold.js.map +1 -0
- package/dist/src/transforms/nfkc.d.ts +20 -0
- package/dist/src/transforms/nfkc.d.ts.map +1 -0
- package/dist/src/transforms/nfkc.js +48 -0
- package/dist/src/transforms/nfkc.js.map +1 -0
- package/dist/src/transforms/stripInvisibles.d.ts +37 -0
- package/dist/src/transforms/stripInvisibles.d.ts.map +1 -0
- package/dist/src/transforms/stripInvisibles.js +151 -0
- package/dist/src/transforms/stripInvisibles.js.map +1 -0
- package/dist/src/transforms/whitespacePunct.d.ts +21 -0
- package/dist/src/transforms/whitespacePunct.d.ts.map +1 -0
- package/dist/src/transforms/whitespacePunct.js +100 -0
- package/dist/src/transforms/whitespacePunct.js.map +1 -0
- package/dist/src/types.d.ts +212 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +14 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +67 -0
- package/src/checksums/aba.ts +45 -0
- package/src/checksums/digits.ts +108 -0
- package/src/checksums/icao9303.ts +53 -0
- package/src/checksums/index.ts +36 -0
- package/src/checksums/iso7064.ts +168 -0
- package/src/checksums/luhn.ts +66 -0
- package/src/checksums/mod97.ts +91 -0
- package/src/checksums/verhoeff.ts +84 -0
- package/src/checksums/weighted.ts +108 -0
- package/src/context/documentProfile.ts +293 -0
- package/src/context/negativeRules.ts +765 -0
- package/src/context/score.ts +430 -0
- package/src/context/structure.ts +611 -0
- package/src/context/triggers.ts +266 -0
- package/src/context/types.ts +150 -0
- package/src/crypto/keccak256.ts +98 -0
- package/src/crypto/sha256.ts +76 -0
- package/src/detect/AUTHORING.md +50 -0
- package/src/detect/detectors/bankcodes/auBsb.ts +36 -0
- package/src/detect/detectors/bankcodes/brAgencia.ts +46 -0
- package/src/detect/detectors/bankcodes/caTransit.ts +89 -0
- package/src/detect/detectors/bankcodes/inIfsc.ts +40 -0
- package/src/detect/detectors/bankcodes/index.ts +9 -0
- package/src/detect/detectors/bankcodes/ukSortCode.ts +38 -0
- package/src/detect/detectors/bankcodes/usRouting.ts +47 -0
- package/src/detect/detectors/contact/email.ts +113 -0
- package/src/detect/detectors/contact/index.ts +10 -0
- package/src/detect/detectors/contact/ipv4.ts +112 -0
- package/src/detect/detectors/contact/ipv6.ts +188 -0
- package/src/detect/detectors/contact/mac.ts +68 -0
- package/src/detect/detectors/contact/phone.ts +81 -0
- package/src/detect/detectors/contact/urlCredentials.ts +124 -0
- package/src/detect/detectors/crypto/ada.ts +52 -0
- package/src/detect/detectors/crypto/btc.ts +77 -0
- package/src/detect/detectors/crypto/dot.ts +42 -0
- package/src/detect/detectors/crypto/eth.ts +70 -0
- package/src/detect/detectors/crypto/index.ts +11 -0
- package/src/detect/detectors/crypto/ltc.ts +69 -0
- package/src/detect/detectors/crypto/sol.ts +41 -0
- package/src/detect/detectors/crypto/trx.ts +35 -0
- package/src/detect/detectors/crypto/xmr.ts +54 -0
- package/src/detect/detectors/documents/driversLicense.ts +83 -0
- package/src/detect/detectors/documents/healthData.ts +88 -0
- package/src/detect/detectors/documents/index.ts +8 -0
- package/src/detect/detectors/documents/passportMrz.ts +203 -0
- package/src/detect/detectors/documents/usNpi.ts +50 -0
- package/src/detect/detectors/documents/vin.ts +67 -0
- package/src/detect/detectors/financial/creditCard.ts +167 -0
- package/src/detect/detectors/financial/iban.ts +82 -0
- package/src/detect/detectors/financial/ibanRegistry.ts +112 -0
- package/src/detect/detectors/financial/index.ts +6 -0
- package/src/detect/detectors/financial/swiftBic.ts +61 -0
- package/src/detect/detectors/index.ts +14 -0
- package/src/detect/detectors/location/coordinates.ts +84 -0
- package/src/detect/detectors/location/index.ts +6 -0
- package/src/detect/detectors/location/postalCode.ts +56 -0
- package/src/detect/detectors/location/postalRegistry.ts +74 -0
- package/src/detect/detectors/location/streetAddress.ts +84 -0
- package/src/detect/detectors/natid/africa.ts +108 -0
- package/src/detect/detectors/natid/ar.ts +62 -0
- package/src/detect/detectors/natid/au.ts +99 -0
- package/src/detect/detectors/natid/be.ts +45 -0
- package/src/detect/detectors/natid/bg.ts +44 -0
- package/src/detect/detectors/natid/br.ts +81 -0
- package/src/detect/detectors/natid/ca.ts +40 -0
- package/src/detect/detectors/natid/cl.ts +47 -0
- package/src/detect/detectors/natid/cn.ts +48 -0
- package/src/detect/detectors/natid/co.ts +46 -0
- package/src/detect/detectors/natid/cz.ts +44 -0
- package/src/detect/detectors/natid/de.ts +75 -0
- package/src/detect/detectors/natid/dk.ts +31 -0
- package/src/detect/detectors/natid/es.ts +95 -0
- package/src/detect/detectors/natid/fi.ts +41 -0
- package/src/detect/detectors/natid/fr.ts +63 -0
- package/src/detect/detectors/natid/gb.ts +70 -0
- package/src/detect/detectors/natid/gr.ts +35 -0
- package/src/detect/detectors/natid/gulf.ts +116 -0
- package/src/detect/detectors/natid/hk.ts +42 -0
- package/src/detect/detectors/natid/hr.ts +32 -0
- package/src/detect/detectors/natid/hu.ts +36 -0
- package/src/detect/detectors/natid/ie.ts +37 -0
- package/src/detect/detectors/natid/il.ts +37 -0
- package/src/detect/detectors/natid/in.ts +67 -0
- package/src/detect/detectors/natid/index.ts +54 -0
- package/src/detect/detectors/natid/is.ts +42 -0
- package/src/detect/detectors/natid/it.ts +65 -0
- package/src/detect/detectors/natid/jp.ts +48 -0
- package/src/detect/detectors/natid/kr.ts +41 -0
- package/src/detect/detectors/natid/kz.ts +44 -0
- package/src/detect/detectors/natid/mx.ts +83 -0
- package/src/detect/detectors/natid/nl.ts +38 -0
- package/src/detect/detectors/natid/no.ts +50 -0
- package/src/detect/detectors/natid/nz.ts +53 -0
- package/src/detect/detectors/natid/pe.ts +28 -0
- package/src/detect/detectors/natid/pl.ts +100 -0
- package/src/detect/detectors/natid/pt.ts +36 -0
- package/src/detect/detectors/natid/ro.ts +47 -0
- package/src/detect/detectors/natid/ru.ts +82 -0
- package/src/detect/detectors/natid/se.ts +42 -0
- package/src/detect/detectors/natid/seasia.ts +174 -0
- package/src/detect/detectors/natid/sg.ts +39 -0
- package/src/detect/detectors/natid/si.ts +42 -0
- package/src/detect/detectors/natid/tr.ts +76 -0
- package/src/detect/detectors/natid/tw.ts +41 -0
- package/src/detect/detectors/natid/ua.ts +38 -0
- package/src/detect/detectors/natid/us.ts +118 -0
- package/src/detect/detectors/natid/za.ts +42 -0
- package/src/detect/detectors/secrets/apiKey.ts +115 -0
- package/src/detect/detectors/secrets/connectionString.ts +71 -0
- package/src/detect/detectors/secrets/genericSecret.ts +81 -0
- package/src/detect/detectors/secrets/index.ts +8 -0
- package/src/detect/detectors/secrets/jwt.ts +101 -0
- package/src/detect/detectors/secrets/pemPrivateKey.ts +59 -0
- package/src/detect/detectors/vat/euVat.ts +280 -0
- package/src/detect/detectors/vat/index.ts +4 -0
- package/src/detect/entropy.ts +60 -0
- package/src/detect/isoCountries.ts +30 -0
- package/src/detect/registry.ts +134 -0
- package/src/detect/runner.ts +187 -0
- package/src/detect/types.ts +296 -0
- package/src/encoding/base58.ts +85 -0
- package/src/encoding/base58monero.ts +90 -0
- package/src/encoding/bech32.ts +125 -0
- package/src/encoding/bytes.ts +48 -0
- package/src/entityFamily.ts +70 -0
- package/src/entityLabel.ts +56 -0
- package/src/entityTypes.ts +107 -0
- package/src/exposure/index.ts +189 -0
- package/src/fuse/calibrate.ts +224 -0
- package/src/fuse/defaultCalibration.ts +71 -0
- package/src/fuse/explain.ts +114 -0
- package/src/fuse/profiles.ts +187 -0
- package/src/fuse/resolve.ts +237 -0
- package/src/gazetteer/index.ts +139 -0
- package/src/generate/bankcodes.ts +82 -0
- package/src/generate/contact.ts +147 -0
- package/src/generate/crypto.ts +91 -0
- package/src/generate/documents.ts +142 -0
- package/src/generate/financial.ts +149 -0
- package/src/generate/index.ts +22 -0
- package/src/generate/location.ts +80 -0
- package/src/generate/natidAmOc.ts +198 -0
- package/src/generate/natidAsia.ts +162 -0
- package/src/generate/natidCee.ts +196 -0
- package/src/generate/natidMeCis.ts +131 -0
- package/src/generate/natidWest.ts +208 -0
- package/src/generate/prng.ts +17 -0
- package/src/generate/secrets.ts +141 -0
- package/src/generate/vat.ts +239 -0
- package/src/index.ts +186 -0
- package/src/mask/egressGuard.ts +88 -0
- package/src/mask/masker.ts +276 -0
- package/src/mask/restorer.ts +284 -0
- package/src/mask/surrogatePools.ts +96 -0
- package/src/mask/surrogates.ts +248 -0
- package/src/mask/vault.ts +153 -0
- package/src/ner/align.ts +86 -0
- package/src/ner/chunk.ts +65 -0
- package/src/ner/chunkCache.ts +110 -0
- package/src/ner/engine.ts +141 -0
- package/src/ner/merge.ts +123 -0
- package/src/ner/runStage2.ts +51 -0
- package/src/ner/stage2b.ts +73 -0
- package/src/ner/transformersClassifier.ts +79 -0
- package/src/ner/types.ts +99 -0
- package/src/normalization.ts +119 -0
- package/src/offsetMap.ts +271 -0
- package/src/pipeline.ts +96 -0
- package/src/protect.ts +284 -0
- package/src/scripts.ts +164 -0
- package/src/transforms/foldDigits.ts +138 -0
- package/src/transforms/graphemes.ts +5 -0
- package/src/transforms/homoglyphFold.ts +221 -0
- package/src/transforms/nfkc.ts +48 -0
- package/src/transforms/stripInvisibles.ts +158 -0
- package/src/transforms/whitespacePunct.ts +100 -0
- package/src/types.ts +339 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canada: Social Insurance Number — nine digits closed by Luhn (a real
|
|
3
|
+
* checksum, HIGH). The leading digit encodes the registration region; 0 is
|
|
4
|
+
* unissued and 8 is not used. The canonical test SIN 046 454 286 (used in
|
|
5
|
+
* every CRA developer document) is non-sensitive.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { luhnValid } 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-ca-sin',
|
|
15
|
+
entityType: 'NATIONAL_ID',
|
|
16
|
+
regions: ['CA'],
|
|
17
|
+
pattern: /\b(\d{3})[- ](\d{3})[- ](\d{3})\b|\b(\d{9})\b/g,
|
|
18
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
19
|
+
description: 'Canadian SINs: Luhn-checksummed, delimited or contiguous.',
|
|
20
|
+
validate(ctx): ValidationResult {
|
|
21
|
+
const before = ctx.start > 0 ? ctx.text[ctx.start - 1] : '';
|
|
22
|
+
if (/[\d-]/.test(before ?? '')) return invalid('fragment of a longer number');
|
|
23
|
+
const after = ctx.text.slice(ctx.end, ctx.end + 2);
|
|
24
|
+
if (/^\d/.test(after) || /^-\d/.test(after)) return invalid('fragment of a longer number');
|
|
25
|
+
|
|
26
|
+
const digits = ctx.match[0].replace(/[- ]/g, '');
|
|
27
|
+
const first = digits[0]!;
|
|
28
|
+
if (first === '8') return invalid('unissued leading digit');
|
|
29
|
+
if (!luhnValid(digits)) return invalid('Luhn checksum failed');
|
|
30
|
+
// Leading 0 is not issued to people — which is exactly why the CRA's
|
|
31
|
+
// documentation specimens (046 454 286 et al.) use it. A Luhn-valid
|
|
32
|
+
// 0-leading SIN is detected but is definitionally not a real SIN.
|
|
33
|
+
return valid({
|
|
34
|
+
canonical: digits,
|
|
35
|
+
sensitive: first !== '0',
|
|
36
|
+
metadata: { scheme: 'sin', country: 'CA' },
|
|
37
|
+
validator: 'luhn',
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chile: RUT/RUN — digits (usually dotted in groups of three) plus a check
|
|
3
|
+
* character 0–9 or K: cycling weights 2,3,4,5,6,7 from the RIGHT, check =
|
|
4
|
+
* 11 − (sum mod 11), with 11 → 0 and 10 → 'K'. Bijective, hard-mutation
|
|
5
|
+
* tested.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { registerDetector } from '../../registry.js';
|
|
9
|
+
import { CONFIDENCE, invalid, valid } from '../../types.js';
|
|
10
|
+
import type { ValidationResult } from '../../types.js';
|
|
11
|
+
|
|
12
|
+
/** The RUT check character for a digit body. */
|
|
13
|
+
export function rutCheckChar(body: string): string | null {
|
|
14
|
+
let sum = 0;
|
|
15
|
+
let weight = 2;
|
|
16
|
+
for (let i = body.length - 1; i >= 0; i--) {
|
|
17
|
+
const d = Number(body[i]);
|
|
18
|
+
if (Number.isNaN(d)) return null;
|
|
19
|
+
sum += d * weight;
|
|
20
|
+
weight = weight === 7 ? 2 : weight + 1;
|
|
21
|
+
}
|
|
22
|
+
const result = 11 - (sum % 11);
|
|
23
|
+
if (result === 11) return '0';
|
|
24
|
+
if (result === 10) return 'K';
|
|
25
|
+
return String(result);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
registerDetector({
|
|
29
|
+
id: 'national-id-cl-rut',
|
|
30
|
+
entityType: 'NATIONAL_ID',
|
|
31
|
+
regions: ['CL'],
|
|
32
|
+
pattern: /\b(\d{1,2}(?:\.\d{3}){2}|\d{7,8})-([\dKk])\b/g,
|
|
33
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
34
|
+
description: 'Chilean RUT with its right-cycling mod-11 check (K for 10).',
|
|
35
|
+
validate(ctx): ValidationResult {
|
|
36
|
+
const body = ctx.match[1]!.replace(/\./g, '');
|
|
37
|
+
const expected = rutCheckChar(body);
|
|
38
|
+
if (expected === null || expected !== ctx.match[2]!.toUpperCase()) {
|
|
39
|
+
return invalid('RUT check character failed');
|
|
40
|
+
}
|
|
41
|
+
return valid({
|
|
42
|
+
canonical: `${body}-${expected}`,
|
|
43
|
+
metadata: { scheme: 'rut', country: 'CL' },
|
|
44
|
+
validator: 'rut-mod11',
|
|
45
|
+
});
|
|
46
|
+
},
|
|
47
|
+
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* China: Resident Identity Card — eighteen characters: a six-digit
|
|
3
|
+
* administrative division whose PROVINCE prefix must be real, an eight-digit
|
|
4
|
+
* birth date validated as a date, three serial digits, and the ISO 7064
|
|
5
|
+
* MOD 11-2 check character (0–9 or X) from the shared library — the
|
|
6
|
+
* combination SPEC.md names.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { mod11_2Valid } from '../../../checksums/index.js';
|
|
10
|
+
import { registerDetector } from '../../registry.js';
|
|
11
|
+
import { CONFIDENCE, invalid, valid } from '../../types.js';
|
|
12
|
+
import type { ValidationResult } from '../../types.js';
|
|
13
|
+
|
|
14
|
+
/** Published province-level division prefixes. */
|
|
15
|
+
const PROVINCES = new Set([
|
|
16
|
+
'11', '12', '13', '14', '15', '21', '22', '23',
|
|
17
|
+
'31', '32', '33', '34', '35', '36', '37',
|
|
18
|
+
'41', '42', '43', '44', '45', '46',
|
|
19
|
+
'50', '51', '52', '53', '54',
|
|
20
|
+
'61', '62', '63', '64', '65',
|
|
21
|
+
'71', '81', '82', '91',
|
|
22
|
+
]);
|
|
23
|
+
|
|
24
|
+
registerDetector({
|
|
25
|
+
id: 'national-id-cn-ric',
|
|
26
|
+
entityType: 'NATIONAL_ID',
|
|
27
|
+
regions: ['CN'],
|
|
28
|
+
pattern: /\b(\d{2})(\d{4})(\d{4})(\d{2})(\d{2})(\d{3})([0-9Xx])\b/g,
|
|
29
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
30
|
+
description: 'Chinese Resident Identity Card: province, birth date, ISO 7064 MOD 11-2.',
|
|
31
|
+
validate(ctx): ValidationResult {
|
|
32
|
+
if (!PROVINCES.has(ctx.match[1]!)) return invalid('not a province prefix');
|
|
33
|
+
const year = Number(ctx.match[3]);
|
|
34
|
+
if (year < 1900 || year > 2029) return invalid('implausible birth year');
|
|
35
|
+
const month = Number(ctx.match[4]);
|
|
36
|
+
if (month < 1 || month > 12) return invalid('month out of range');
|
|
37
|
+
const day = Number(ctx.match[5]);
|
|
38
|
+
if (day < 1 || day > 31) return invalid('day out of range');
|
|
39
|
+
|
|
40
|
+
const value = ctx.match[0].toUpperCase();
|
|
41
|
+
if (!mod11_2Valid(value.slice(0, 17), value[17]!)) return invalid('MOD 11-2 check failed');
|
|
42
|
+
return valid({
|
|
43
|
+
canonical: value,
|
|
44
|
+
metadata: { scheme: 'ric', country: 'CN' },
|
|
45
|
+
validator: 'iso7064-11-2',
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Colombia: NIT — a digit body (typically dotted) plus a DIAN check digit:
|
|
3
|
+
* prime weights 3,7,13,17,19,23,29,37,41,43,47,53,59,67,71 applied from
|
|
4
|
+
* the RIGHT; remainder r = sum mod 11; check = r > 1 ? 11 − r : r. The
|
|
5
|
+
* r ∈ {0,1} identity branch is a fold (check 1 ⇐ r=1 or r=10), so the
|
|
6
|
+
* mutation property is validation-only.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { registerDetector } from '../../registry.js';
|
|
10
|
+
import { CONFIDENCE, invalid, valid } from '../../types.js';
|
|
11
|
+
import type { ValidationResult } from '../../types.js';
|
|
12
|
+
|
|
13
|
+
const NIT_WEIGHTS = [3, 7, 13, 17, 19, 23, 29, 37, 41, 43, 47, 53, 59, 67, 71];
|
|
14
|
+
|
|
15
|
+
/** The DIAN check digit for a NIT body. */
|
|
16
|
+
export function nitCheckDigit(body: string): number | null {
|
|
17
|
+
let sum = 0;
|
|
18
|
+
for (let i = 0; i < body.length; i++) {
|
|
19
|
+
const d = Number(body[body.length - 1 - i]);
|
|
20
|
+
if (Number.isNaN(d)) return null;
|
|
21
|
+
sum += d * NIT_WEIGHTS[i]!;
|
|
22
|
+
}
|
|
23
|
+
const r = sum % 11;
|
|
24
|
+
return r > 1 ? 11 - r : r;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
registerDetector({
|
|
28
|
+
id: 'national-id-co-nit',
|
|
29
|
+
entityType: 'TAX_ID',
|
|
30
|
+
regions: ['CO'],
|
|
31
|
+
pattern: /\b(\d{1,3}(?:\.\d{3}){2,3}|\d{8,10})-(\d)\b/g,
|
|
32
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
33
|
+
description: 'Colombian NIT with the DIAN prime-weight check digit.',
|
|
34
|
+
validate(ctx): ValidationResult {
|
|
35
|
+
const body = ctx.match[1]!.replace(/\./g, '');
|
|
36
|
+
const expected = nitCheckDigit(body);
|
|
37
|
+
if (expected === null || expected !== Number(ctx.match[2])) {
|
|
38
|
+
return invalid('NIT check digit failed');
|
|
39
|
+
}
|
|
40
|
+
return valid({
|
|
41
|
+
canonical: `${body}${ctx.match[2]}`,
|
|
42
|
+
metadata: { scheme: 'nit', country: 'CO' },
|
|
43
|
+
validator: 'nit-mod11',
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
});
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Czechia & Slovakia: Rodné číslo — the shared Czechoslovak birth number.
|
|
3
|
+
*
|
|
4
|
+
* Ten digits (born 1954 onward): the WHOLE number must be divisible by 11.
|
|
5
|
+
* Women add 50 to the month; the +20/+70 extension bands (used when a
|
|
6
|
+
* day's serials ran out) are accepted. The pre-1954 nine-digit form has no
|
|
7
|
+
* check at all and is deliberately not claimed — a bare nine-digit run
|
|
8
|
+
* belongs to checksummated schemes.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { registerDetector } from '../../registry.js';
|
|
12
|
+
import { CONFIDENCE, invalid, valid } from '../../types.js';
|
|
13
|
+
import type { ValidationResult } from '../../types.js';
|
|
14
|
+
|
|
15
|
+
registerDetector({
|
|
16
|
+
id: 'national-id-cz-rodne-cislo',
|
|
17
|
+
entityType: 'NATIONAL_ID',
|
|
18
|
+
regions: ['CZ', 'SK'],
|
|
19
|
+
pattern: /\b(\d{2})(\d{2})(\d{2})\/?(\d{4})\b/g,
|
|
20
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
21
|
+
description: 'Czech/Slovak rodné číslo: month bands plus whole-number divisibility by 11.',
|
|
22
|
+
validate(ctx): ValidationResult {
|
|
23
|
+
const before = ctx.start > 0 ? ctx.text[ctx.start - 1] : '';
|
|
24
|
+
if (/[\d-]/.test(before ?? '')) return invalid('fragment of a longer number');
|
|
25
|
+
const after = ctx.text.slice(ctx.end, ctx.end + 2);
|
|
26
|
+
if (/^\d/.test(after) || /^-\d/.test(after)) return invalid('fragment of a longer number');
|
|
27
|
+
|
|
28
|
+
const month = Number(ctx.match[2]);
|
|
29
|
+
const monthValid =
|
|
30
|
+
(month >= 1 && month <= 12) || (month >= 51 && month <= 62) ||
|
|
31
|
+
(month >= 21 && month <= 32) || (month >= 71 && month <= 82);
|
|
32
|
+
if (!monthValid) return invalid('month outside all bands');
|
|
33
|
+
const day = Number(ctx.match[3]);
|
|
34
|
+
if (day < 1 || day > 31) return invalid('day out of range');
|
|
35
|
+
|
|
36
|
+
const ten = `${ctx.match[1]}${ctx.match[2]}${ctx.match[3]}${ctx.match[4]}`;
|
|
37
|
+
if (Number(ten) % 11 !== 0) return invalid('not divisible by 11');
|
|
38
|
+
return valid({
|
|
39
|
+
canonical: ten,
|
|
40
|
+
metadata: { scheme: 'rodne-cislo', country: 'CZ' },
|
|
41
|
+
validator: 'mod11-divisibility',
|
|
42
|
+
});
|
|
43
|
+
},
|
|
44
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Germany: Steuerliche Identifikationsnummer and Personalausweis number.
|
|
3
|
+
*
|
|
4
|
+
* Steuer-ID: 11 digits, leading digit nonzero, closed by ISO 7064 MOD 11,10
|
|
5
|
+
* (shared library), plus the distinctive digit-frequency rule: among the
|
|
6
|
+
* first ten digits, one digit appears exactly twice or thrice and at least
|
|
7
|
+
* one digit does not appear at all — that rule alone rejects most random
|
|
8
|
+
* digit runs before the checksum even speaks. HIGH.
|
|
9
|
+
*
|
|
10
|
+
* Personalausweis (ID card document number): 9 characters from the
|
|
11
|
+
* C-through-Z-minus-vowels+digits alphabet followed by an ICAO 9303 7-3-1
|
|
12
|
+
* check digit — the same algorithm as the MRZ, reused from the shared
|
|
13
|
+
* library. HIGH.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { mod11_10Valid, mrzCheckValid } from '../../../checksums/index.js';
|
|
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-de-steuerid',
|
|
23
|
+
entityType: 'TAX_ID',
|
|
24
|
+
regions: ['DE'],
|
|
25
|
+
pattern: /\b[1-9]\d{2} ?\d{3} ?\d{3} ?\d{2}\b|\b[1-9]\d{10}\b/g,
|
|
26
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
27
|
+
description: 'German Steuer-IDs: digit-frequency rule plus ISO 7064 MOD 11,10.',
|
|
28
|
+
validate(ctx): ValidationResult {
|
|
29
|
+
const digits = ctx.match[0].replace(/ /g, '');
|
|
30
|
+
if (digits.length !== 11) return invalid('not eleven digits');
|
|
31
|
+
|
|
32
|
+
const counts = new Map<string, number>();
|
|
33
|
+
for (const d of digits.slice(0, 10)) counts.set(d, (counts.get(d) ?? 0) + 1);
|
|
34
|
+
const multiples = [...counts.values()].filter((c) => c > 1);
|
|
35
|
+
if (counts.size === 10) return invalid('all ten digits distinct — rule requires a repeat');
|
|
36
|
+
if (multiples.length !== 1) return invalid('exactly one digit may repeat');
|
|
37
|
+
if (multiples[0]! > 3) return invalid('a digit repeats more than three times');
|
|
38
|
+
|
|
39
|
+
if (!mod11_10Valid(digits.slice(0, 10), digits[10]!)) {
|
|
40
|
+
return invalid('ISO 7064 MOD 11,10 check failed');
|
|
41
|
+
}
|
|
42
|
+
return valid({
|
|
43
|
+
canonical: digits,
|
|
44
|
+
metadata: { scheme: 'steuer-id', country: 'DE' },
|
|
45
|
+
validator: 'iso7064-11-10',
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
/** Document-number alphabet: digits and consonants C–Z (no vowels, no B/Q/S? —
|
|
51
|
+
* the BSI alphabet excludes A, E, I, O, U and B, D, Q, S for legibility). */
|
|
52
|
+
const AUSWEIS_ALPHABET = /^[0-9CFGHJKLMNPRTVWXYZ]{9}$/;
|
|
53
|
+
|
|
54
|
+
registerDetector({
|
|
55
|
+
id: 'national-id-de-personalausweis',
|
|
56
|
+
entityType: 'NATIONAL_ID',
|
|
57
|
+
regions: ['DE'],
|
|
58
|
+
pattern: /\b[0-9CFGHJKLMNPRTVWXYZ]{9}\d\b/g,
|
|
59
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
60
|
+
description: 'German Personalausweis document numbers with the ICAO 7-3-1 check digit.',
|
|
61
|
+
validate(ctx): ValidationResult {
|
|
62
|
+
const value = ctx.match[0];
|
|
63
|
+
const payload = value.slice(0, 9);
|
|
64
|
+
if (!AUSWEIS_ALPHABET.test(payload)) return invalid('character outside the BSI alphabet');
|
|
65
|
+
// All-digit payloads are indistinct from arbitrary ten-digit numbers
|
|
66
|
+
// even with a passing check digit; require at least one letter.
|
|
67
|
+
if (!/[A-Z]/.test(payload)) return invalid('no letter in document number');
|
|
68
|
+
if (!mrzCheckValid(payload, value[9]!)) return invalid('ICAO check digit failed');
|
|
69
|
+
return valid({
|
|
70
|
+
canonical: value,
|
|
71
|
+
metadata: { scheme: 'personalausweis', country: 'DE' },
|
|
72
|
+
validator: 'icao-731',
|
|
73
|
+
});
|
|
74
|
+
},
|
|
75
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Denmark: CPR-nummer — DDMMYY-SSSS. The historical mod-11 check was
|
|
3
|
+
* OFFICIALLY ABANDONED in 2007 (serial capacity ran out), so enforcing it
|
|
4
|
+
* would reject genuine numbers issued since. What remains checkable is the
|
|
5
|
+
* date, so this is a structural detector at MEDIUM, hyphenated writing
|
|
6
|
+
* only, and says so — the same honest posture as the UK sort code.
|
|
7
|
+
*/
|
|
8
|
+
|
|
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-dk-cpr',
|
|
15
|
+
entityType: 'NATIONAL_ID',
|
|
16
|
+
regions: ['DK'],
|
|
17
|
+
pattern: /\b(\d{2})(\d{2})(\d{2})-(\d{4})\b/g,
|
|
18
|
+
baseConfidence: CONFIDENCE.MEDIUM,
|
|
19
|
+
description: 'Danish CPR numbers: date-validated structure (the mod-11 check was abolished in 2007).',
|
|
20
|
+
validate(ctx): ValidationResult {
|
|
21
|
+
const day = Number(ctx.match[1]);
|
|
22
|
+
if (day < 1 || day > 31) return invalid('day out of range');
|
|
23
|
+
const month = Number(ctx.match[2]);
|
|
24
|
+
if (month < 1 || month > 12) return invalid('month out of range');
|
|
25
|
+
return valid({
|
|
26
|
+
canonical: ctx.match[0].replace('-', ''),
|
|
27
|
+
metadata: { scheme: 'cpr', country: 'DK' },
|
|
28
|
+
validator: 'cpr-date-structure',
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
});
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spain: DNI, NIE, CIF — all with real check characters.
|
|
3
|
+
*
|
|
4
|
+
* DNI: 8 digits + letter = "TRWAGMYFPDXBNJZSQVHLCKE"[n mod 23].
|
|
5
|
+
* NIE: X/Y/Z + 7 digits + the same letter check with X→0, Y→1, Z→2
|
|
6
|
+
* prepended. CIF: organization letter + 7 digits + check, where the check
|
|
7
|
+
* is computed Luhn-style over the seven digits and is a digit for some
|
|
8
|
+
* organization classes, a letter ("JABCDEFGHI"[value]) for others, and
|
|
9
|
+
* either for the rest.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { registerDetector } from '../../registry.js';
|
|
13
|
+
import { CONFIDENCE, invalid, valid } from '../../types.js';
|
|
14
|
+
import type { ValidationResult } from '../../types.js';
|
|
15
|
+
|
|
16
|
+
const DNI_LETTERS = 'TRWAGMYFPDXBNJZSQVHLCKE';
|
|
17
|
+
|
|
18
|
+
registerDetector({
|
|
19
|
+
id: 'national-id-es-dni',
|
|
20
|
+
entityType: 'NATIONAL_ID',
|
|
21
|
+
regions: ['ES'],
|
|
22
|
+
pattern: /\b(\d{8})[- ]?([A-Z])\b/g,
|
|
23
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
24
|
+
description: 'Spanish DNI with the mod-23 letter verified.',
|
|
25
|
+
validate(ctx): ValidationResult {
|
|
26
|
+
const expected = DNI_LETTERS[Number(ctx.match[1]) % 23]!;
|
|
27
|
+
if (ctx.match[2] !== expected) return invalid('mod-23 letter failed');
|
|
28
|
+
return valid({
|
|
29
|
+
canonical: `${ctx.match[1]}${ctx.match[2]}`,
|
|
30
|
+
metadata: { scheme: 'dni', country: 'ES' },
|
|
31
|
+
validator: 'dni-mod23',
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
registerDetector({
|
|
37
|
+
id: 'national-id-es-nie',
|
|
38
|
+
entityType: 'NATIONAL_ID',
|
|
39
|
+
regions: ['ES'],
|
|
40
|
+
pattern: /\b([XYZ])[- ]?(\d{7})[- ]?([A-Z])\b/g,
|
|
41
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
42
|
+
description: 'Spanish NIE (foreigner id) with the mod-23 letter verified.',
|
|
43
|
+
validate(ctx): ValidationResult {
|
|
44
|
+
const prefixValue = { X: '0', Y: '1', Z: '2' }[ctx.match[1] as 'X' | 'Y' | 'Z'];
|
|
45
|
+
const numeric = Number(`${prefixValue}${ctx.match[2]}`);
|
|
46
|
+
const expected = DNI_LETTERS[numeric % 23]!;
|
|
47
|
+
if (ctx.match[3] !== expected) return invalid('mod-23 letter failed');
|
|
48
|
+
return valid({
|
|
49
|
+
canonical: `${ctx.match[1]}${ctx.match[2]}${ctx.match[3]}`,
|
|
50
|
+
metadata: { scheme: 'nie', country: 'ES' },
|
|
51
|
+
validator: 'nie-mod23',
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
/** CIF organization letters and which check-character class each takes. */
|
|
57
|
+
const CIF_DIGIT_ONLY = new Set(['A', 'B', 'E', 'H']);
|
|
58
|
+
const CIF_LETTER_ONLY = new Set(['K', 'P', 'Q', 'S', 'N', 'W', 'R']);
|
|
59
|
+
const CIF_ORG = /^[ABCDEFGHJKLMNPQRSUVW]$/;
|
|
60
|
+
const CIF_CHECK_LETTERS = 'JABCDEFGHI';
|
|
61
|
+
|
|
62
|
+
registerDetector({
|
|
63
|
+
id: 'national-id-es-cif',
|
|
64
|
+
entityType: 'TAX_ID',
|
|
65
|
+
regions: ['ES'],
|
|
66
|
+
pattern: /\b([A-HJ-NP-SUVW])[- ]?(\d{7})[- ]?([0-9A-J])\b/g,
|
|
67
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
68
|
+
description: 'Spanish CIF (company tax id) with its Luhn-style check verified.',
|
|
69
|
+
validate(ctx): ValidationResult {
|
|
70
|
+
const org = ctx.match[1]!;
|
|
71
|
+
if (!CIF_ORG.test(org)) return invalid('not a CIF organization letter');
|
|
72
|
+
const digits = ctx.match[2]!;
|
|
73
|
+
let sum = 0;
|
|
74
|
+
for (let i = 0; i < 7; i++) {
|
|
75
|
+
let v = Number(digits[i]);
|
|
76
|
+
if (i % 2 === 0) {
|
|
77
|
+
v *= 2;
|
|
78
|
+
if (v > 9) v -= 9;
|
|
79
|
+
}
|
|
80
|
+
sum += v;
|
|
81
|
+
}
|
|
82
|
+
const value = (10 - (sum % 10)) % 10;
|
|
83
|
+
const check = ctx.match[3]!;
|
|
84
|
+
const digitOk = check === String(value);
|
|
85
|
+
const letterOk = check === CIF_CHECK_LETTERS[value];
|
|
86
|
+
if (CIF_DIGIT_ONLY.has(org) && !digitOk) return invalid('digit check required and failed');
|
|
87
|
+
if (CIF_LETTER_ONLY.has(org) && !letterOk) return invalid('letter check required and failed');
|
|
88
|
+
if (!digitOk && !letterOk) return invalid('check character failed');
|
|
89
|
+
return valid({
|
|
90
|
+
canonical: `${org}${digits}${check}`,
|
|
91
|
+
metadata: { scheme: 'cif', country: 'ES' },
|
|
92
|
+
validator: 'cif-check',
|
|
93
|
+
});
|
|
94
|
+
},
|
|
95
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finland: Henkilötunnus (HETU) — DDMMYY, a century sign, a 3-digit
|
|
3
|
+
* individual number, and a base-31 check character over the nine digits:
|
|
4
|
+
* "0123456789ABCDEFHJKLMNPRSTUVWXY"[DDMMYYNNN mod 31] (G, I, O, Q and Z are
|
|
5
|
+
* excluded from the alphabet). Century signs: '+' 1800s, '-' 1900s, and the
|
|
6
|
+
* letters A–F for the 2000s (the 2023 reform made U–Y valid for the 1900s;
|
|
7
|
+
* accepted).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { registerDetector } from '../../registry.js';
|
|
11
|
+
import { CONFIDENCE, invalid, valid } from '../../types.js';
|
|
12
|
+
import type { ValidationResult } from '../../types.js';
|
|
13
|
+
|
|
14
|
+
const HETU_ALPHABET = '0123456789ABCDEFHJKLMNPRSTUVWXY';
|
|
15
|
+
const CENTURY_SIGNS = /^[-+A-FU-Y]$/;
|
|
16
|
+
|
|
17
|
+
registerDetector({
|
|
18
|
+
id: 'national-id-fi-hetu',
|
|
19
|
+
entityType: 'NATIONAL_ID',
|
|
20
|
+
regions: ['FI'],
|
|
21
|
+
pattern: /\b(\d{2})(\d{2})(\d{2})([-+A-FU-Y])(\d{3})([0-9A-Y])\b/g,
|
|
22
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
23
|
+
description: 'Finnish HETU with the base-31 check character verified.',
|
|
24
|
+
validate(ctx): ValidationResult {
|
|
25
|
+
const day = Number(ctx.match[1]);
|
|
26
|
+
if (day < 1 || day > 31) return invalid('day out of range');
|
|
27
|
+
const month = Number(ctx.match[2]);
|
|
28
|
+
if (month < 1 || month > 12) return invalid('month out of range');
|
|
29
|
+
if (!CENTURY_SIGNS.test(ctx.match[4]!)) return invalid('not a century sign');
|
|
30
|
+
|
|
31
|
+
const nine = Number(`${ctx.match[1]}${ctx.match[2]}${ctx.match[3]}${ctx.match[5]}`);
|
|
32
|
+
const expected = HETU_ALPHABET[nine % 31]!;
|
|
33
|
+
if (ctx.match[6] !== expected) return invalid('base-31 check character failed');
|
|
34
|
+
|
|
35
|
+
return valid({
|
|
36
|
+
canonical: ctx.match[0],
|
|
37
|
+
metadata: { scheme: 'hetu', country: 'FI' },
|
|
38
|
+
validator: 'hetu-mod31',
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* France: INSEE/NIR — 13 digits + 2-digit key, key = 97 − (number mod 97).
|
|
3
|
+
*
|
|
4
|
+
* Corsican departments write 2A/2B in the department field; for the modulo
|
|
5
|
+
* the letter is replaced (2A→19, 2B→18 after subtracting from the numeric
|
|
6
|
+
* reading — the standard rule: replace A with 0 and subtract 1,000,000;
|
|
7
|
+
* B with 0 and subtract 2,000,000 — implemented via string substitution
|
|
8
|
+
* then the documented offsets). Structure gates first: sex digit 1–8,
|
|
9
|
+
* month 01–12 (or the 20+ pseudo-months INSEE uses for late registration).
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { modString } from '../../../checksums/index.js';
|
|
13
|
+
import { registerDetector } from '../../registry.js';
|
|
14
|
+
import { CONFIDENCE, invalid, valid } from '../../types.js';
|
|
15
|
+
import type { ValidationResult } from '../../types.js';
|
|
16
|
+
|
|
17
|
+
registerDetector({
|
|
18
|
+
id: 'national-id-fr-nir',
|
|
19
|
+
entityType: 'NATIONAL_ID',
|
|
20
|
+
regions: ['FR'],
|
|
21
|
+
pattern: /\b([1-8])[ ]?(\d{2})[ ]?(\d{2})[ ]?(\d[0-9AB])[ ]?(\d{3})[ ]?(\d{3})[ ]?(\d{2})\b/gi,
|
|
22
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
23
|
+
description: 'French NIR (INSEE) numbers with the mod-97 key, Corsica handled.',
|
|
24
|
+
validate(ctx): ValidationResult {
|
|
25
|
+
const [, sex, , month, dept, commune, order, key] = ctx.match as unknown as string[];
|
|
26
|
+
const monthNum = Number(month);
|
|
27
|
+
const validMonth = (monthNum >= 1 && monthNum <= 12) || (monthNum >= 20 && monthNum <= 42) || monthNum >= 50;
|
|
28
|
+
if (!validMonth) return invalid('implausible month field');
|
|
29
|
+
|
|
30
|
+
const deptUpper = dept!.toUpperCase();
|
|
31
|
+
let thirteen = `${sex}${ctx.match[2]}${month}${deptUpper}${commune}${order}`;
|
|
32
|
+
let offset = 0n;
|
|
33
|
+
if (deptUpper.includes('A')) {
|
|
34
|
+
thirteen = thirteen.replace('A', '0');
|
|
35
|
+
offset = 1_000_000n;
|
|
36
|
+
} else if (deptUpper.includes('B')) {
|
|
37
|
+
thirteen = thirteen.replace('B', '0');
|
|
38
|
+
offset = 2_000_000n;
|
|
39
|
+
}
|
|
40
|
+
if (!/^\d{13}$/.test(thirteen)) return invalid('malformed NIR body');
|
|
41
|
+
|
|
42
|
+
// key = 97 − ((N − corsicaOffset) mod 97). The offset fits the rule
|
|
43
|
+
// published by INSEE for 2A/2B departments.
|
|
44
|
+
const n = BigInt(thirteen) - offset;
|
|
45
|
+
const expected = 97n - (n % 97n);
|
|
46
|
+
if (Number(expected) !== Number(key)) return invalid('mod-97 key failed');
|
|
47
|
+
|
|
48
|
+
// modString cross-check for the common (non-Corsican) path keeps the
|
|
49
|
+
// BigInt usage honest against the shared library.
|
|
50
|
+
if (offset === 0n) {
|
|
51
|
+
const viaLibrary = modString(thirteen, 97);
|
|
52
|
+
if (viaLibrary === null || 97 - viaLibrary !== Number(expected)) {
|
|
53
|
+
return invalid('internal checksum disagreement');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return valid({
|
|
58
|
+
canonical: `${thirteen.slice(0, 5)}${deptUpper}${commune}${order}${key}`.slice(0, 15),
|
|
59
|
+
metadata: { scheme: 'nir', country: 'FR', sex: sex === '1' ? 'M' : sex === '2' ? 'F' : 'other' },
|
|
60
|
+
validator: 'nir-mod97',
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* United Kingdom: National Insurance Number and NHS Number.
|
|
3
|
+
*
|
|
4
|
+
* NINO has no checksum — validation is the published prefix rules — so it
|
|
5
|
+
* caps at MEDIUM. The NHS Number closes with a real mod-11 check digit
|
|
6
|
+
* (weights 10..2; remainder 10 means the number is never issued) → HIGH.
|
|
7
|
+
* The NHS test range 999xxxxxxx is non-sensitive.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { toDigits, weightedMod } from '../../../checksums/index.js';
|
|
11
|
+
import { registerDetector } from '../../registry.js';
|
|
12
|
+
import { CONFIDENCE, invalid, valid } from '../../types.js';
|
|
13
|
+
import type { ValidationResult } from '../../types.js';
|
|
14
|
+
|
|
15
|
+
/** Letters never used in NINO prefixes, by position. */
|
|
16
|
+
const NINO_BANNED_ANY = /[DFIQUV]/;
|
|
17
|
+
const NINO_BANNED_SECOND = /[DFIQUVO]/;
|
|
18
|
+
const NINO_BANNED_PAIRS = new Set(['BG', 'GB', 'NK', 'KN', 'TN', 'NT', 'ZZ']);
|
|
19
|
+
|
|
20
|
+
registerDetector({
|
|
21
|
+
id: 'national-id-gb-nino',
|
|
22
|
+
entityType: 'NATIONAL_ID',
|
|
23
|
+
regions: ['GB'],
|
|
24
|
+
pattern: /\b([A-Z]{2})[ ]?(\d{2})[ ]?(\d{2})[ ]?(\d{2})[ ]?([A-D])\b/g,
|
|
25
|
+
baseConfidence: CONFIDENCE.MEDIUM,
|
|
26
|
+
description: 'UK National Insurance Numbers: prefix validity rules (no checksum exists).',
|
|
27
|
+
validate(ctx): ValidationResult {
|
|
28
|
+
const prefix = ctx.match[1]!;
|
|
29
|
+
if (NINO_BANNED_ANY.test(prefix[0]!)) return invalid('banned first prefix letter');
|
|
30
|
+
if (NINO_BANNED_SECOND.test(prefix[1]!)) return invalid('banned second prefix letter');
|
|
31
|
+
if (NINO_BANNED_PAIRS.has(prefix)) return invalid('banned prefix pair');
|
|
32
|
+
const digits = `${ctx.match[2]}${ctx.match[3]}${ctx.match[4]}`;
|
|
33
|
+
return valid({
|
|
34
|
+
canonical: `${prefix}${digits}${ctx.match[5]}`,
|
|
35
|
+
metadata: { scheme: 'nino', country: 'GB' },
|
|
36
|
+
validator: 'nino-prefix-rules',
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const NHS_WEIGHTS = [10, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
42
|
+
|
|
43
|
+
registerDetector({
|
|
44
|
+
id: 'national-id-gb-nhs',
|
|
45
|
+
entityType: 'NATIONAL_ID',
|
|
46
|
+
regions: ['GB'],
|
|
47
|
+
pattern: /\b(\d{3})[ -]?(\d{3})[ -]?(\d{4})\b/g,
|
|
48
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
49
|
+
description: 'NHS Numbers: mod-11 check digit (remainder 10 never issued).',
|
|
50
|
+
validate(ctx): ValidationResult {
|
|
51
|
+
const before = ctx.start > 0 ? ctx.text[ctx.start - 1] : '';
|
|
52
|
+
if (/[\d-]/.test(before ?? '')) return invalid('fragment of a longer number');
|
|
53
|
+
const after = ctx.text.slice(ctx.end, ctx.end + 2);
|
|
54
|
+
if (/^\d/.test(after) || /^-\d/.test(after)) return invalid('fragment of a longer number');
|
|
55
|
+
|
|
56
|
+
const digits = ctx.match[0].replace(/[ -]/g, '');
|
|
57
|
+
const payload = toDigits(digits.slice(0, 9))!;
|
|
58
|
+
const remainder = weightedMod(payload, NHS_WEIGHTS, 11)!;
|
|
59
|
+
let check = 11 - remainder;
|
|
60
|
+
if (check === 11) check = 0;
|
|
61
|
+
if (check === 10) return invalid('remainder 10 is never issued');
|
|
62
|
+
if (check !== Number(digits[9])) return invalid('mod-11 check digit failed');
|
|
63
|
+
return valid({
|
|
64
|
+
canonical: digits,
|
|
65
|
+
sensitive: !digits.startsWith('999'), // NHS test range
|
|
66
|
+
metadata: { scheme: 'nhs', country: 'GB' },
|
|
67
|
+
validator: 'nhs-mod11',
|
|
68
|
+
});
|
|
69
|
+
},
|
|
70
|
+
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Greece: AFM (ΑΦΜ) — nine digits, powers-of-two weights: the i-th of the
|
|
3
|
+
* first eight digits (left to right) is multiplied by 2^(8−i), the sum is
|
|
4
|
+
* taken mod 11, and that result mod 10 must equal the ninth digit.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { toDigits, weightedModBy } 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
|
+
registerDetector({
|
|
13
|
+
id: 'national-id-gr-afm',
|
|
14
|
+
entityType: 'TAX_ID',
|
|
15
|
+
regions: ['GR'],
|
|
16
|
+
pattern: /\b\d{9}\b/g,
|
|
17
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
18
|
+
description: 'Greek AFM tax numbers with the power-of-two mod-11 check.',
|
|
19
|
+
validate(ctx): ValidationResult {
|
|
20
|
+
const before = ctx.start > 0 ? ctx.text[ctx.start - 1] : '';
|
|
21
|
+
if (/[\d-]/.test(before ?? '')) return invalid('fragment of a longer number');
|
|
22
|
+
const after = ctx.text.slice(ctx.end, ctx.end + 2);
|
|
23
|
+
if (/^\d/.test(after) || /^-\d/.test(after)) return invalid('fragment of a longer number');
|
|
24
|
+
|
|
25
|
+
const digits = toDigits(ctx.match[0])!;
|
|
26
|
+
if (digits.every((d) => d === 0)) return invalid('all zeros');
|
|
27
|
+
const sum = weightedModBy(digits.slice(0, 8), (i) => 2 ** (8 - i), 11)!;
|
|
28
|
+
if (sum % 10 !== digits[8]) return invalid('AFM checksum failed');
|
|
29
|
+
return valid({
|
|
30
|
+
canonical: ctx.match[0],
|
|
31
|
+
metadata: { scheme: 'afm', country: 'GR' },
|
|
32
|
+
validator: 'afm-mod11',
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
});
|