@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,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* US_NPI — National Provider Identifier.
|
|
3
|
+
*
|
|
4
|
+
* SPEC.md: "US_NPI — Luhn with prefix." Ten digits, closed by Luhn computed
|
|
5
|
+
* over the NPI PREFIXED with the constant 80840 (the ISO 7812 issuer prefix
|
|
6
|
+
* assigned to the NPI system). Omitting the prefix is the classic
|
|
7
|
+
* implementation bug: it produces a different check digit and silently
|
|
8
|
+
* rejects every real NPI, so the prefix is applied here and pinned by tests
|
|
9
|
+
* against published specimen NPIs.
|
|
10
|
+
*
|
|
11
|
+
* Issued NPIs begin with 1 or 2 (3 and 4 are reserved for future use), which
|
|
12
|
+
* is enforced: it removes most of the arbitrary 10-digit runs that pass Luhn
|
|
13
|
+
* by chance.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { luhnValid } from '../../../checksums/index.js';
|
|
17
|
+
import { registerDetector } from '../../registry.js';
|
|
18
|
+
import { CONFIDENCE, invalid, valid } from '../../types.js';
|
|
19
|
+
import type { ValidationContext, ValidationResult } from '../../types.js';
|
|
20
|
+
|
|
21
|
+
/** ISO 7812 issuer identifier for the NPI system. */
|
|
22
|
+
const NPI_PREFIX = '80840';
|
|
23
|
+
|
|
24
|
+
function validateNpi(ctx: ValidationContext): ValidationResult {
|
|
25
|
+
const before = ctx.start > 0 ? ctx.text[ctx.start - 1] : '';
|
|
26
|
+
if (/[\d-]/.test(before ?? '')) return invalid('fragment of a longer number');
|
|
27
|
+
const after = ctx.text.slice(ctx.end, ctx.end + 2);
|
|
28
|
+
if (/^\d/.test(after) || /^-\d/.test(after)) return invalid('fragment of a longer number');
|
|
29
|
+
|
|
30
|
+
const npi = ctx.match[0];
|
|
31
|
+
const first = npi[0]!;
|
|
32
|
+
if (first !== '1' && first !== '2') return invalid('NPIs begin with 1 or 2');
|
|
33
|
+
if (!luhnValid(`${NPI_PREFIX}${npi}`)) return invalid('Luhn checksum (with 80840 prefix) failed');
|
|
34
|
+
|
|
35
|
+
return valid({
|
|
36
|
+
canonical: npi,
|
|
37
|
+
metadata: { scheme: 'npi', country: 'US' },
|
|
38
|
+
validator: 'luhn-80840',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
registerDetector({
|
|
43
|
+
id: 'us-npi',
|
|
44
|
+
entityType: 'US_NPI',
|
|
45
|
+
regions: ['US'],
|
|
46
|
+
pattern: /\b\d{10}\b/g,
|
|
47
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
48
|
+
description: 'US National Provider Identifiers: Luhn over the 80840-prefixed number.',
|
|
49
|
+
validate: validateNpi,
|
|
50
|
+
});
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VIN — ISO 3779 vehicle identification number with its check digit.
|
|
3
|
+
*
|
|
4
|
+
* 17 characters, no I/O/Q anywhere (they are excluded to avoid confusion
|
|
5
|
+
* with 1/0). Position 9 is a check digit computed by transliterating each
|
|
6
|
+
* character to a value, weighting by position, and taking mod 11 — where a
|
|
7
|
+
* remainder of 10 is written 'X'.
|
|
8
|
+
*
|
|
9
|
+
* The check is mandatory in North America and, while technically optional
|
|
10
|
+
* elsewhere, is populated by essentially every manufacturer; requiring it
|
|
11
|
+
* keeps 17-character part numbers and order references out.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { registerDetector } from '../../registry.js';
|
|
15
|
+
import { CONFIDENCE, GLOBAL_REGION, invalid, valid } from '../../types.js';
|
|
16
|
+
import type { ValidationContext, ValidationResult } from '../../types.js';
|
|
17
|
+
|
|
18
|
+
/** ISO 3779 transliteration; I, O and Q are absent by design. */
|
|
19
|
+
const VALUES: Readonly<Record<string, number>> = {
|
|
20
|
+
A: 1, B: 2, C: 3, D: 4, E: 5, F: 6, G: 7, H: 8,
|
|
21
|
+
J: 1, K: 2, L: 3, M: 4, N: 5, P: 7, R: 9,
|
|
22
|
+
S: 2, T: 3, U: 4, V: 5, W: 6, X: 7, Y: 8, Z: 9,
|
|
23
|
+
'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const WEIGHTS: readonly number[] = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
27
|
+
|
|
28
|
+
/** The ISO 3779 check character for a 17-character VIN. */
|
|
29
|
+
export function vinCheckChar(vin: string): string | null {
|
|
30
|
+
if (vin.length !== 17) return null;
|
|
31
|
+
let sum = 0;
|
|
32
|
+
for (let i = 0; i < 17; i++) {
|
|
33
|
+
const v = VALUES[vin[i]!];
|
|
34
|
+
if (v === undefined) return null;
|
|
35
|
+
sum += v * WEIGHTS[i]!;
|
|
36
|
+
}
|
|
37
|
+
const remainder = sum % 11;
|
|
38
|
+
return remainder === 10 ? 'X' : String(remainder);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function validateVin(ctx: ValidationContext): ValidationResult {
|
|
42
|
+
const vin = ctx.match[0].toUpperCase();
|
|
43
|
+
if (/[IOQ]/.test(vin)) return invalid('VIN alphabet excludes I, O and Q');
|
|
44
|
+
|
|
45
|
+
const expected = vinCheckChar(vin);
|
|
46
|
+
if (expected === null) return invalid('character outside the VIN alphabet');
|
|
47
|
+
if (vin[8] !== expected) return invalid('check digit failed');
|
|
48
|
+
|
|
49
|
+
return valid({
|
|
50
|
+
canonical: vin,
|
|
51
|
+
metadata: {
|
|
52
|
+
wmi: vin.slice(0, 3), // world manufacturer identifier
|
|
53
|
+
modelYearCode: vin[9],
|
|
54
|
+
},
|
|
55
|
+
validator: 'iso3779',
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
registerDetector({
|
|
60
|
+
id: 'vin',
|
|
61
|
+
entityType: 'VIN',
|
|
62
|
+
regions: [GLOBAL_REGION],
|
|
63
|
+
pattern: /\b[A-HJ-NPR-Z0-9]{17}\b/g,
|
|
64
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
65
|
+
description: 'Vehicle identification numbers with the ISO 3779 check digit verified.',
|
|
66
|
+
validate: validateVin,
|
|
67
|
+
});
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CREDIT_CARD — Luhn required, plus issuer BIN identification.
|
|
3
|
+
*
|
|
4
|
+
* SPEC.md names the issuer set: Visa, Mastercard, Amex, Discover, JCB,
|
|
5
|
+
* UnionPay, Diners, Maestro, Troy, Mir, RuPay, Elo, Verve. "Known test card
|
|
6
|
+
* numbers matched but classified as non-sensitive."
|
|
7
|
+
*
|
|
8
|
+
* BIN resolution is LONGEST-PREFIX-FIRST: 622126–622925 (six digits,
|
|
9
|
+
* Discover's UnionPay-processed block) beats 62 (UnionPay); 6521–6522
|
|
10
|
+
* (RuPay) beats 65 (Discover); 6011 (Discover) beats 60 (RuPay). Contested
|
|
11
|
+
* short prefixes are classified per the mainstream network documentation;
|
|
12
|
+
* issuer is metadata for substitution and display — Luhn plus per-issuer
|
|
13
|
+
* length is what gates validity.
|
|
14
|
+
*
|
|
15
|
+
* A Luhn-valid digit run with NO recognizable issuer prefix is REJECTED, not
|
|
16
|
+
* emitted at low confidence. Luhn alone has a 10% pass rate on arbitrary
|
|
17
|
+
* digit runs, and IMEIs, tracking numbers and account numbers are all
|
|
18
|
+
* Luhn-closed — issuer identification is the precision gate that keeps them
|
|
19
|
+
* out. (A 15-digit IMEI starting 35 falls in JCB's 3528–3589 window, but
|
|
20
|
+
* JCB issues only 16–19 digit PANs, so the length gate rejects it.)
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { luhnValid } from '../../../checksums/index.js';
|
|
24
|
+
import { registerDetector } from '../../registry.js';
|
|
25
|
+
import { CONFIDENCE, GLOBAL_REGION, invalid, valid } from '../../types.js';
|
|
26
|
+
import type { ValidationContext, ValidationResult } from '../../types.js';
|
|
27
|
+
|
|
28
|
+
interface BinRule {
|
|
29
|
+
readonly lo: number; // inclusive numeric prefix bound
|
|
30
|
+
readonly hi: number; // inclusive
|
|
31
|
+
readonly digits: number; // how many leading digits the bounds cover
|
|
32
|
+
readonly issuer: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Ordered within each prefix length; longer prefixes always win. */
|
|
36
|
+
const BIN_RULES: readonly BinRule[] = [
|
|
37
|
+
// 6-digit rules
|
|
38
|
+
{ lo: 622126, hi: 622925, digits: 6, issuer: 'discover' },
|
|
39
|
+
{ lo: 506099, hi: 506198, digits: 6, issuer: 'verve' },
|
|
40
|
+
{ lo: 507865, hi: 507964, digits: 6, issuer: 'verve' },
|
|
41
|
+
{ lo: 650002, hi: 650027, digits: 6, issuer: 'verve' },
|
|
42
|
+
{ lo: 401178, hi: 401179, digits: 6, issuer: 'elo' },
|
|
43
|
+
{ lo: 431274, hi: 431274, digits: 6, issuer: 'elo' },
|
|
44
|
+
{ lo: 438935, hi: 438935, digits: 6, issuer: 'elo' },
|
|
45
|
+
{ lo: 451416, hi: 451416, digits: 6, issuer: 'elo' },
|
|
46
|
+
{ lo: 457393, hi: 457393, digits: 6, issuer: 'elo' },
|
|
47
|
+
{ lo: 457631, hi: 457632, digits: 6, issuer: 'elo' },
|
|
48
|
+
{ lo: 504175, hi: 504175, digits: 6, issuer: 'elo' },
|
|
49
|
+
{ lo: 506699, hi: 506778, digits: 6, issuer: 'elo' },
|
|
50
|
+
{ lo: 509000, hi: 509999, digits: 6, issuer: 'elo' },
|
|
51
|
+
{ lo: 627780, hi: 627780, digits: 6, issuer: 'elo' },
|
|
52
|
+
{ lo: 636297, hi: 636297, digits: 6, issuer: 'elo' },
|
|
53
|
+
{ lo: 636368, hi: 636368, digits: 6, issuer: 'elo' },
|
|
54
|
+
{ lo: 650031, hi: 650051, digits: 6, issuer: 'elo' },
|
|
55
|
+
{ lo: 650405, hi: 650439, digits: 6, issuer: 'elo' },
|
|
56
|
+
{ lo: 650485, hi: 650538, digits: 6, issuer: 'elo' },
|
|
57
|
+
{ lo: 650541, hi: 650598, digits: 6, issuer: 'elo' },
|
|
58
|
+
{ lo: 650700, hi: 650727, digits: 6, issuer: 'elo' },
|
|
59
|
+
{ lo: 650901, hi: 650978, digits: 6, issuer: 'elo' },
|
|
60
|
+
{ lo: 651652, hi: 651679, digits: 6, issuer: 'elo' },
|
|
61
|
+
{ lo: 655000, hi: 655058, digits: 6, issuer: 'elo' },
|
|
62
|
+
// 4-digit rules
|
|
63
|
+
{ lo: 9792, hi: 9792, digits: 4, issuer: 'troy' },
|
|
64
|
+
{ lo: 2200, hi: 2204, digits: 4, issuer: 'mir' },
|
|
65
|
+
{ lo: 3528, hi: 3589, digits: 4, issuer: 'jcb' },
|
|
66
|
+
{ lo: 2221, hi: 2720, digits: 4, issuer: 'mastercard' },
|
|
67
|
+
{ lo: 6011, hi: 6011, digits: 4, issuer: 'discover' },
|
|
68
|
+
{ lo: 6521, hi: 6522, digits: 4, issuer: 'rupay' },
|
|
69
|
+
{ lo: 3095, hi: 3095, digits: 4, issuer: 'diners' },
|
|
70
|
+
// 3-digit rules
|
|
71
|
+
{ lo: 300, hi: 305, digits: 3, issuer: 'diners' },
|
|
72
|
+
{ lo: 644, hi: 649, digits: 3, issuer: 'discover' },
|
|
73
|
+
{ lo: 508, hi: 508, digits: 3, issuer: 'rupay' },
|
|
74
|
+
// 2-digit rules
|
|
75
|
+
{ lo: 34, hi: 34, digits: 2, issuer: 'amex' },
|
|
76
|
+
{ lo: 37, hi: 37, digits: 2, issuer: 'amex' },
|
|
77
|
+
{ lo: 36, hi: 36, digits: 2, issuer: 'diners' },
|
|
78
|
+
{ lo: 38, hi: 39, digits: 2, issuer: 'diners' },
|
|
79
|
+
{ lo: 51, hi: 55, digits: 2, issuer: 'mastercard' },
|
|
80
|
+
{ lo: 65, hi: 65, digits: 2, issuer: 'discover' },
|
|
81
|
+
{ lo: 62, hi: 62, digits: 2, issuer: 'unionpay' },
|
|
82
|
+
{ lo: 60, hi: 60, digits: 2, issuer: 'rupay' },
|
|
83
|
+
{ lo: 81, hi: 82, digits: 2, issuer: 'rupay' },
|
|
84
|
+
{ lo: 50, hi: 50, digits: 2, issuer: 'maestro' },
|
|
85
|
+
{ lo: 56, hi: 59, digits: 2, issuer: 'maestro' },
|
|
86
|
+
{ lo: 61, hi: 61, digits: 2, issuer: 'maestro' },
|
|
87
|
+
{ lo: 63, hi: 64, digits: 2, issuer: 'maestro' },
|
|
88
|
+
{ lo: 66, hi: 69, digits: 2, issuer: 'maestro' },
|
|
89
|
+
// 1-digit rules
|
|
90
|
+
{ lo: 4, hi: 4, digits: 1, issuer: 'visa' },
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
/** Permitted PAN lengths per issuer. */
|
|
94
|
+
const ISSUER_LENGTHS: Readonly<Record<string, readonly number[]>> = {
|
|
95
|
+
visa: [13, 16, 19],
|
|
96
|
+
mastercard: [16],
|
|
97
|
+
amex: [15],
|
|
98
|
+
discover: [16, 17, 18, 19],
|
|
99
|
+
jcb: [16, 17, 18, 19],
|
|
100
|
+
unionpay: [16, 17, 18, 19],
|
|
101
|
+
diners: [14, 15, 16, 17, 18, 19],
|
|
102
|
+
maestro: [12, 13, 14, 15, 16, 17, 18, 19],
|
|
103
|
+
troy: [16],
|
|
104
|
+
mir: [16, 17, 18, 19],
|
|
105
|
+
rupay: [16],
|
|
106
|
+
elo: [16],
|
|
107
|
+
verve: [16, 18, 19],
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
/** Universally published test PANs: detected, never masked. */
|
|
111
|
+
const TEST_CARDS: ReadonlySet<string> = new Set([
|
|
112
|
+
'4111111111111111', '4012888888881881', '4222222222222', '4000056655665556',
|
|
113
|
+
'4917610000000000',
|
|
114
|
+
'5555555555554444', '5105105105105100', '5200828282828210', '2223003122003222',
|
|
115
|
+
'378282246310005', '371449635398431', '378734493671000',
|
|
116
|
+
'6011111111111117', '6011000990139424', '6011981111111113',
|
|
117
|
+
'3530111333300000', '3566002020360505',
|
|
118
|
+
'30569309025904', '38520000023237',
|
|
119
|
+
'6200000000000005', '6200000000000047',
|
|
120
|
+
'2200000000000053',
|
|
121
|
+
]);
|
|
122
|
+
|
|
123
|
+
function resolveIssuer(pan: string): string | null {
|
|
124
|
+
for (const rule of BIN_RULES) {
|
|
125
|
+
if (pan.length < rule.digits) continue;
|
|
126
|
+
const prefix = Number(pan.slice(0, rule.digits));
|
|
127
|
+
if (prefix >= rule.lo && prefix <= rule.hi) return rule.issuer;
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function validateCreditCard(ctx: ValidationContext): ValidationResult {
|
|
133
|
+
// Digit runs adjacent to more digits (or digit-separator continuations)
|
|
134
|
+
// are fragments of something longer.
|
|
135
|
+
const before = ctx.start > 0 ? ctx.text[ctx.start - 1] : '';
|
|
136
|
+
if (/\d/.test(before ?? '')) return invalid('fragment of a longer digit run');
|
|
137
|
+
const after = ctx.text.slice(ctx.end, ctx.end + 2);
|
|
138
|
+
if (/^\d/.test(after) || /^[ -]\d/.test(after)) return invalid('fragment of a longer digit run');
|
|
139
|
+
|
|
140
|
+
const pan = ctx.match[0].replace(/[ -]/g, '');
|
|
141
|
+
if (!/^\d{12,19}$/.test(pan)) return invalid('not 12-19 digits');
|
|
142
|
+
|
|
143
|
+
const issuer = resolveIssuer(pan);
|
|
144
|
+
if (issuer === null) return invalid('no recognizable issuer prefix');
|
|
145
|
+
if (!ISSUER_LENGTHS[issuer]!.includes(pan.length)) {
|
|
146
|
+
return invalid('length not issued by this network');
|
|
147
|
+
}
|
|
148
|
+
if (!luhnValid(pan)) return invalid('Luhn checksum failed');
|
|
149
|
+
|
|
150
|
+
return valid({
|
|
151
|
+
canonical: pan,
|
|
152
|
+
sensitive: !TEST_CARDS.has(pan),
|
|
153
|
+
metadata: { issuer },
|
|
154
|
+
validator: 'luhn-bin',
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
registerDetector({
|
|
159
|
+
id: 'credit-card',
|
|
160
|
+
entityType: 'CREDIT_CARD',
|
|
161
|
+
regions: [GLOBAL_REGION],
|
|
162
|
+
// 12–19 digits with optional single space/hyphen separators.
|
|
163
|
+
pattern: /\b\d(?:[ -]?\d){11,18}\b/g,
|
|
164
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
165
|
+
description: 'Payment card numbers: Luhn plus issuer BIN identification; test PANs non-sensitive.',
|
|
166
|
+
validate: validateCreditCard,
|
|
167
|
+
});
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IBAN — mod-97 checksum plus the full per-country structure registry.
|
|
3
|
+
*
|
|
4
|
+
* Order of proof: country exists in the registry → length matches that
|
|
5
|
+
* country → BBAN matches that country's structure → mod-97 closes. Each
|
|
6
|
+
* gate alone is insufficient: mod-97 without structure accepts transposed
|
|
7
|
+
* letter/digit segments; structure without mod-97 accepts any typo.
|
|
8
|
+
*
|
|
9
|
+
* SPAN TRIMMING. IBANs are written in groups of four ("GB82 WEST 1234 …"),
|
|
10
|
+
* so the candidate pattern must cross spaces — which lets it absorb the
|
|
11
|
+
* word after the IBAN. The validator counts alphanumerics up to the
|
|
12
|
+
* country's expected length and cuts there, but ONLY at a separator
|
|
13
|
+
* boundary: if the next character is alphanumeric the token simply
|
|
14
|
+
* continues (an account-number-like blob), and that is a rejection, not a
|
|
15
|
+
* trim.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { ibanMod97Valid } from '../../../checksums/index.js';
|
|
19
|
+
import { registerDetector } from '../../registry.js';
|
|
20
|
+
import { CONFIDENCE, GLOBAL_REGION, invalid, valid } from '../../types.js';
|
|
21
|
+
import type { ValidationContext, ValidationResult } from '../../types.js';
|
|
22
|
+
import { DOCUMENTATION_IBANS, IBAN_REGISTRY } from './ibanRegistry.js';
|
|
23
|
+
|
|
24
|
+
function validateIban(ctx: ValidationContext): ValidationResult {
|
|
25
|
+
const raw = ctx.match[0];
|
|
26
|
+
|
|
27
|
+
const country = raw.slice(0, 2).toUpperCase();
|
|
28
|
+
const spec = IBAN_REGISTRY.get(country);
|
|
29
|
+
if (spec === undefined) return invalid('not an IBAN country code');
|
|
30
|
+
|
|
31
|
+
// Walk the raw match, collecting alphanumerics up to the expected length
|
|
32
|
+
// and remembering where in the raw text the last one sits.
|
|
33
|
+
let collected = '';
|
|
34
|
+
let endInRaw = 0;
|
|
35
|
+
for (let i = 0; i < raw.length && collected.length < spec.length; i++) {
|
|
36
|
+
const ch = raw[i]!;
|
|
37
|
+
if (/[A-Za-z0-9]/.test(ch)) {
|
|
38
|
+
collected += ch;
|
|
39
|
+
endInRaw = i + 1;
|
|
40
|
+
} else if (ch !== ' ') {
|
|
41
|
+
break; // only spaces may separate IBAN groups
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (collected.length < spec.length) return invalid('too short for this country');
|
|
45
|
+
|
|
46
|
+
// The character after the cut must not continue the token.
|
|
47
|
+
const nextInRaw = raw[endInRaw];
|
|
48
|
+
if (nextInRaw !== undefined && /[A-Za-z0-9]/.test(nextInRaw)) {
|
|
49
|
+
return invalid('embedded in a longer alphanumeric run');
|
|
50
|
+
}
|
|
51
|
+
const afterMatch = ctx.text[ctx.start + raw.length];
|
|
52
|
+
if (endInRaw === raw.length && afterMatch !== undefined && /[A-Za-z0-9]/.test(afterMatch)) {
|
|
53
|
+
return invalid('embedded in a longer alphanumeric run');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const iban = collected.toUpperCase();
|
|
57
|
+
if (!/^[A-Z]{2}[0-9]{2}/.test(iban)) return invalid('malformed check digits');
|
|
58
|
+
const bban = iban.slice(4);
|
|
59
|
+
if (!spec.bban.test(bban)) return invalid('BBAN structure mismatch for country');
|
|
60
|
+
if (!ibanMod97Valid(iban)) return invalid('mod-97 checksum failed');
|
|
61
|
+
|
|
62
|
+
return valid({
|
|
63
|
+
canonical: iban,
|
|
64
|
+
sensitive: !DOCUMENTATION_IBANS.has(iban),
|
|
65
|
+
metadata: { country },
|
|
66
|
+
validator: 'iban-mod97-structure',
|
|
67
|
+
span: { start: ctx.start, end: ctx.start + endInRaw },
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
registerDetector({
|
|
72
|
+
id: 'iban',
|
|
73
|
+
entityType: 'IBAN',
|
|
74
|
+
regions: [GLOBAL_REGION],
|
|
75
|
+
// Two letters, two digits, then grouped or compact alphanumerics. The 10
|
|
76
|
+
// minimum keeps three-word capitalized prose ("IN 2019 THE…") from ever
|
|
77
|
+
// reaching the validator.
|
|
78
|
+
pattern: /\b[A-Za-z]{2}\d{2}(?: ?[A-Za-z0-9]){10,32}/g,
|
|
79
|
+
baseConfidence: CONFIDENCE.HIGH,
|
|
80
|
+
description: 'IBANs validated against the full registry: country, length, structure, mod-97.',
|
|
81
|
+
validate: validateIban,
|
|
82
|
+
});
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The IBAN registry: per-country length and BBAN structure.
|
|
3
|
+
*
|
|
4
|
+
* SPEC.md: "IBAN — mod-97 checksum plus per-country length and structure
|
|
5
|
+
* table covering all IBAN-registry countries."
|
|
6
|
+
*
|
|
7
|
+
* Structure is encoded as segments — "4a6n8c" reads: 4 letters, 6 digits,
|
|
8
|
+
* 8 alphanumerics — with adjacent same-type runs merged from the official
|
|
9
|
+
* SWIFT registry notation (4!a etc.). One encoding drives BOTH the
|
|
10
|
+
* validator's regex and the test generator's synthesis, so they can never
|
|
11
|
+
* drift apart. Segment types: n = 0-9, a = A-Z, c = A-Z0-9.
|
|
12
|
+
*
|
|
13
|
+
* Entries reflect the SWIFT IBAN Registry (release 98, 2024): 88 countries
|
|
14
|
+
* and territories. Countries using another state's IBAN (Åland → FI, the
|
|
15
|
+
* French overseas collectivities → FR) are covered by that state's entry.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export interface IbanSegment {
|
|
19
|
+
readonly type: 'n' | 'a' | 'c';
|
|
20
|
+
readonly length: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface IbanSpec {
|
|
24
|
+
/** Total IBAN length including country code and check digits. */
|
|
25
|
+
readonly length: number;
|
|
26
|
+
readonly segments: readonly IbanSegment[];
|
|
27
|
+
/** Compiled BBAN validation regex (anchored). */
|
|
28
|
+
readonly bban: RegExp;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const SEGMENT_CLASS: Record<IbanSegment['type'], string> = {
|
|
32
|
+
n: '[0-9]',
|
|
33
|
+
a: '[A-Z]',
|
|
34
|
+
c: '[A-Z0-9]',
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
function parseSegments(encoded: string): IbanSegment[] {
|
|
38
|
+
const out: IbanSegment[] = [];
|
|
39
|
+
const re = /(\d+)([nac])/g;
|
|
40
|
+
let m: RegExpExecArray | null;
|
|
41
|
+
while ((m = re.exec(encoded)) !== null) {
|
|
42
|
+
out.push({ type: m[2] as IbanSegment['type'], length: Number(m[1]) });
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function buildSpec(length: number, encoded: string): IbanSpec {
|
|
48
|
+
const segments = parseSegments(encoded);
|
|
49
|
+
const bbanLength = segments.reduce((sum, s) => sum + s.length, 0);
|
|
50
|
+
if (bbanLength !== length - 4) {
|
|
51
|
+
// Impossible unless the table below is mistyped; fail at module load.
|
|
52
|
+
throw new Error(`IBAN registry entry inconsistent: ${encoded} for length ${length}`);
|
|
53
|
+
}
|
|
54
|
+
const source = `^${segments.map((s) => `${SEGMENT_CLASS[s.type]}{${s.length}}`).join('')}$`;
|
|
55
|
+
return { length, segments, bban: new RegExp(source) };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** country code → [total length, BBAN segment encoding]. */
|
|
59
|
+
const RAW: Readonly<Record<string, readonly [number, string]>> = {
|
|
60
|
+
AD: [24, '8n12c'], AE: [23, '19n'], AL: [28, '8n16c'], AT: [20, '16n'],
|
|
61
|
+
AZ: [28, '4a20c'], BA: [20, '16n'], BE: [16, '12n'], BG: [22, '4a6n8c'],
|
|
62
|
+
BH: [22, '4a14c'], BI: [27, '23n'], BR: [29, '23n1a1c'], BY: [28, '4c4n16c'],
|
|
63
|
+
CH: [21, '5n12c'], CR: [22, '18n'], CY: [28, '8n16c'], CZ: [24, '20n'],
|
|
64
|
+
DE: [22, '18n'], DJ: [27, '23n'], DK: [18, '14n'], DO: [28, '4c20n'],
|
|
65
|
+
EE: [20, '16n'], EG: [29, '25n'], ES: [24, '20n'], FI: [18, '14n'],
|
|
66
|
+
FK: [18, '2a12n'], FO: [18, '14n'], FR: [27, '10n11c2n'], GB: [22, '4a14n'],
|
|
67
|
+
GE: [22, '2a16n'], GI: [23, '4a15c'], GL: [18, '14n'], GR: [27, '7n16c'],
|
|
68
|
+
GT: [28, '4c20c'], HN: [28, '4a20n'], HR: [21, '17n'], HU: [28, '24n'],
|
|
69
|
+
IE: [22, '4a14n'], IL: [23, '19n'], IQ: [23, '4a15n'], IS: [26, '22n'],
|
|
70
|
+
IT: [27, '1a10n12c'], JO: [30, '4a4n18c'], KW: [30, '4a22c'], KZ: [20, '3n13c'],
|
|
71
|
+
LB: [28, '4n20c'], LC: [32, '4a24c'], LI: [21, '5n12c'], LT: [20, '16n'],
|
|
72
|
+
LU: [20, '3n13c'], LV: [21, '4a13c'], LY: [25, '21n'], MC: [27, '10n11c2n'],
|
|
73
|
+
MD: [24, '20c'], ME: [22, '18n'], MK: [19, '3n10c2n'], MN: [20, '16n'],
|
|
74
|
+
MR: [27, '23n'], MT: [31, '4a5n18c'], MU: [30, '4a19n3a'], NI: [28, '4a20n'],
|
|
75
|
+
NL: [18, '4a10n'], NO: [15, '11n'], OM: [23, '3n16c'], PK: [24, '4a16c'],
|
|
76
|
+
PL: [28, '24n'], PS: [29, '4a21c'], PT: [25, '21n'], QA: [29, '4a21c'],
|
|
77
|
+
RO: [24, '4a16c'], RS: [22, '18n'], RU: [33, '14n15c'], SA: [24, '2n18c'],
|
|
78
|
+
SC: [31, '4a20n3a'], SD: [18, '14n'], SE: [24, '20n'], SI: [19, '15n'],
|
|
79
|
+
SK: [24, '20n'], SM: [27, '1a10n12c'], SO: [23, '19n'], ST: [25, '21n'],
|
|
80
|
+
SV: [28, '4a20n'], TL: [23, '19n'], TN: [24, '20n'], TR: [26, '5n17c'],
|
|
81
|
+
UA: [29, '6n19c'], VA: [22, '18n'], VG: [24, '4a16n'], XK: [20, '16n'],
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/** The compiled registry, one spec per IBAN country. */
|
|
85
|
+
export const IBAN_REGISTRY: ReadonlyMap<string, IbanSpec> = new Map(
|
|
86
|
+
Object.entries(RAW).map(([code, [length, encoded]]) => [code, buildSpec(length, encoded)]),
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* IBANs published as documentation specimens (SWIFT registry examples and
|
|
91
|
+
* the ubiquitous tutorial values). Detected, classified non-sensitive.
|
|
92
|
+
*/
|
|
93
|
+
export const DOCUMENTATION_IBANS: ReadonlySet<string> = new Set([
|
|
94
|
+
'GB82WEST12345698765432',
|
|
95
|
+
'GB29NWBK60161331926819',
|
|
96
|
+
'DE89370400440532013000',
|
|
97
|
+
'DE75512108001245126199',
|
|
98
|
+
'FR1420041010050500013M02606',
|
|
99
|
+
'FR7630006000011234567890189',
|
|
100
|
+
'NL91ABNA0417164300',
|
|
101
|
+
'BE68539007547034',
|
|
102
|
+
'ES9121000418450200051332',
|
|
103
|
+
'IT60X0542811101000000123456',
|
|
104
|
+
'CH9300762011623852957',
|
|
105
|
+
'AT611904300234573201',
|
|
106
|
+
'TR330006100519786457841326',
|
|
107
|
+
'PL61109010140000071219812874',
|
|
108
|
+
'SE4550000000058398257466',
|
|
109
|
+
'DK5000400440116243',
|
|
110
|
+
'NO9386011117947',
|
|
111
|
+
'FI2112345600000785',
|
|
112
|
+
]);
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWIFT_BIC — structural validation against country and location code rules.
|
|
3
|
+
*
|
|
4
|
+
* ISO 9362: 4-letter bank code, 2-letter ISO country code, 2-character
|
|
5
|
+
* location code, optional 3-character branch. Location rules: the first
|
|
6
|
+
* location character must not be '0' or '1'; a location code whose SECOND
|
|
7
|
+
* character is '0' designates a TEST BIC (non-production) — detected but
|
|
8
|
+
* classified non-sensitive, like other known test values.
|
|
9
|
+
*
|
|
10
|
+
* A BIC has no checksum, and an 8-character uppercase English word whose
|
|
11
|
+
* characters happen to parse ("FEEDBACK" → bank FEED, country BA, location
|
|
12
|
+
* CK) is structurally a BIC. Confidence therefore reflects the evidence:
|
|
13
|
+
* MEDIUM for the bare all-letter 8-char form, HIGH when the BIC carries a
|
|
14
|
+
* digit or an explicit branch code, which English words do not.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { registerDetector } from '../../registry.js';
|
|
18
|
+
import { CONFIDENCE, GLOBAL_REGION, invalid, valid } from '../../types.js';
|
|
19
|
+
import type { ValidationContext, ValidationResult } from '../../types.js';
|
|
20
|
+
import { ISO_COUNTRY_CODES } from '../../isoCountries.js';
|
|
21
|
+
|
|
22
|
+
function validateBic(ctx: ValidationContext): ValidationResult {
|
|
23
|
+
const raw = ctx.match[0];
|
|
24
|
+
const bic = raw.toUpperCase();
|
|
25
|
+
|
|
26
|
+
const country = bic.slice(4, 6);
|
|
27
|
+
if (!ISO_COUNTRY_CODES.has(country)) return invalid('not an ISO country code');
|
|
28
|
+
|
|
29
|
+
const location = bic.slice(6, 8);
|
|
30
|
+
if (location[0] === '0' || location[0] === '1') {
|
|
31
|
+
return invalid('location code cannot begin with 0 or 1');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const branch = bic.length === 11 ? bic.slice(8) : undefined;
|
|
35
|
+
const hasDigit = /\d/.test(bic);
|
|
36
|
+
const isTest = location[1] === '0';
|
|
37
|
+
|
|
38
|
+
return valid({
|
|
39
|
+
canonical: bic,
|
|
40
|
+
sensitive: !isTest,
|
|
41
|
+
confidence: hasDigit || branch !== undefined ? CONFIDENCE.HIGH : CONFIDENCE.MEDIUM,
|
|
42
|
+
metadata: {
|
|
43
|
+
country,
|
|
44
|
+
...(branch !== undefined ? { branch } : {}),
|
|
45
|
+
...(isTest ? { test: true } : {}),
|
|
46
|
+
},
|
|
47
|
+
validator: 'bic-structural',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
registerDetector({
|
|
52
|
+
id: 'swift-bic',
|
|
53
|
+
entityType: 'SWIFT_BIC',
|
|
54
|
+
regions: [GLOBAL_REGION],
|
|
55
|
+
// Uppercase only: BICs are written uppercase by standard, and admitting
|
|
56
|
+
// lowercase would sweep in ordinary 8-letter words.
|
|
57
|
+
pattern: /\b[A-Z]{6}[A-Z0-9]{2}(?:[A-Z0-9]{3})?\b/g,
|
|
58
|
+
baseConfidence: CONFIDENCE.MEDIUM,
|
|
59
|
+
description: 'SWIFT/BIC codes: country and location rules; test BICs non-sensitive.',
|
|
60
|
+
validate: validateBic,
|
|
61
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every Stage 1 detector family, loaded for registration side effects.
|
|
3
|
+
* Importing this module (directly or via the package root) populates the
|
|
4
|
+
* registry. One line per family; families grow by batch during M2.
|
|
5
|
+
*/
|
|
6
|
+
import './contact/index.js';
|
|
7
|
+
import './financial/index.js';
|
|
8
|
+
import './bankcodes/index.js';
|
|
9
|
+
import './crypto/index.js';
|
|
10
|
+
import './secrets/index.js';
|
|
11
|
+
import './documents/index.js';
|
|
12
|
+
import './location/index.js';
|
|
13
|
+
import './natid/index.js';
|
|
14
|
+
import './vat/index.js';
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* COORDINATES — latitude/longitude in decimal degrees and DMS.
|
|
3
|
+
*
|
|
4
|
+
* This one HAS a real validator (unlike its two siblings): parsed values
|
|
5
|
+
* must lie in [−90, 90] × [−180, 180]. DMS with its degree/minute/second
|
|
6
|
+
* marks is unmistakable → HIGH. A bare decimal pair is weaker evidence even
|
|
7
|
+
* in range — "3.141, 2.718" is a coordinate to no one — so decimal pairs
|
|
8
|
+
* demand ≥3 fraction digits (GPS-typical precision) and earn MEDIUM, with
|
|
9
|
+
* hemisphere suffixes lifting them to HIGH.
|
|
10
|
+
*
|
|
11
|
+
* (0, 0) — "null island" — is the classic placeholder and is rejected.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { registerDetector } from '../../registry.js';
|
|
15
|
+
import { CONFIDENCE, GLOBAL_REGION, invalid, valid } from '../../types.js';
|
|
16
|
+
import type { ValidationContext, ValidationResult } from '../../types.js';
|
|
17
|
+
|
|
18
|
+
const DECIMAL_PAIR =
|
|
19
|
+
/^(-?\d{1,3}\.\d{3,8})°?\s*([NS])?[,;]\s*(-?\d{1,3}\.\d{3,8})°?\s*([EW])?$/;
|
|
20
|
+
|
|
21
|
+
// The seconds mark: detectors see NORMALIZED text, and NFKC decomposes
|
|
22
|
+
// U+2033 DOUBLE PRIME into TWO U+2032 PRIMEs — so ″ arrives here as ′′.
|
|
23
|
+
// Straight quotes pass normalization unchanged; curly ones become straight.
|
|
24
|
+
const SECONDS = String.raw`(?:′′|''|″|")`;
|
|
25
|
+
const DMS_ONE = String.raw`(\d{1,3})°\s?(\d{1,2})[′']\s?(\d{1,2}(?:\.\d+)?)${SECONDS}?\s?([NSEW])`;
|
|
26
|
+
const DMS_PAIR = new RegExp(`^${DMS_ONE}[,;]?\\s*${DMS_ONE}$`);
|
|
27
|
+
|
|
28
|
+
function validateCoordinates(ctx: ValidationContext): ValidationResult {
|
|
29
|
+
const value = ctx.match[0].trim();
|
|
30
|
+
|
|
31
|
+
const dms = DMS_PAIR.exec(value);
|
|
32
|
+
if (dms !== null) {
|
|
33
|
+
const first = dmsToDecimal(Number(dms[1]), Number(dms[2]), Number(dms[3]), dms[4]!);
|
|
34
|
+
const second = dmsToDecimal(Number(dms[5]), Number(dms[6]), Number(dms[7]), dms[8]!);
|
|
35
|
+
if (first === null || second === null) return invalid('DMS component out of range');
|
|
36
|
+
const lat = dms[4] === 'N' || dms[4] === 'S' ? first : second;
|
|
37
|
+
const lon = dms[4] === 'N' || dms[4] === 'S' ? second : first;
|
|
38
|
+
if (Math.abs(lat) > 90 || Math.abs(lon) > 180) return invalid('coordinate out of range');
|
|
39
|
+
return valid({
|
|
40
|
+
confidence: CONFIDENCE.HIGH,
|
|
41
|
+
metadata: { format: 'dms', lat: round6(lat), lon: round6(lon) },
|
|
42
|
+
validator: 'coordinate-range',
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const dec = DECIMAL_PAIR.exec(value);
|
|
47
|
+
if (dec !== null) {
|
|
48
|
+
let lat = Number(dec[1]);
|
|
49
|
+
let lon = Number(dec[3]);
|
|
50
|
+
if (dec[2] === 'S') lat = -lat;
|
|
51
|
+
if (dec[4] === 'W') lon = -lon;
|
|
52
|
+
if (Math.abs(lat) > 90 || Math.abs(lon) > 180) return invalid('coordinate out of range');
|
|
53
|
+
if (lat === 0 && lon === 0) return invalid('null island placeholder');
|
|
54
|
+
const hasHemispheres = dec[2] !== undefined && dec[4] !== undefined;
|
|
55
|
+
return valid({
|
|
56
|
+
confidence: hasHemispheres ? CONFIDENCE.HIGH : CONFIDENCE.MEDIUM,
|
|
57
|
+
metadata: { format: 'decimal', lat: round6(lat), lon: round6(lon) },
|
|
58
|
+
validator: 'coordinate-range',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return invalid('not a coordinate pair');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function dmsToDecimal(deg: number, min: number, sec: number, hemi: string): number | null {
|
|
66
|
+
if (min >= 60 || sec >= 60) return null;
|
|
67
|
+
const value = deg + min / 60 + sec / 3600;
|
|
68
|
+
return hemi === 'S' || hemi === 'W' ? -value : value;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const round6 = (n: number): number => Math.round(n * 1e6) / 1e6;
|
|
72
|
+
|
|
73
|
+
registerDetector({
|
|
74
|
+
id: 'coordinates',
|
|
75
|
+
entityType: 'COORDINATES',
|
|
76
|
+
regions: [GLOBAL_REGION],
|
|
77
|
+
// Hemisphere letters are grouped WITH their leading space so that an
|
|
78
|
+
// absent hemisphere cannot leave a trailing space inside the span.
|
|
79
|
+
pattern:
|
|
80
|
+
/(?<![\d.])(?:-?\d{1,3}\.\d{3,8}°?(?: ?[NS])?[,;]\s*-?\d{1,3}\.\d{3,8}°?(?: ?[EW])?|\d{1,3}° ?\d{1,2}[′'] ?\d{1,2}(?:\.\d+)?(?:′′|''|″|")? ?[NSEW][,;]? ?\d{1,3}° ?\d{1,2}[′'] ?\d{1,2}(?:\.\d+)?(?:′′|''|″|")? ?[NSEW])(?![\d.])/g,
|
|
81
|
+
baseConfidence: CONFIDENCE.MEDIUM,
|
|
82
|
+
description: 'Lat/long pairs in decimal (≥3 fraction digits) and DMS, range-validated.',
|
|
83
|
+
validate: validateCoordinates,
|
|
84
|
+
});
|