@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,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Stage 1 runner: executes registered detectors over normalized text and
|
|
3
|
+
* emits candidates carrying both normalized and original-text offsets.
|
|
4
|
+
*
|
|
5
|
+
* Three responsibilities, none of which belong in individual detectors:
|
|
6
|
+
*
|
|
7
|
+
* 1. OFFSET RESOLUTION. Detectors match against normalized text; masking
|
|
8
|
+
* edits the original. Every candidate is resolved through
|
|
9
|
+
* `mapNormalizedSpan` here, once, so no detector can get it wrong.
|
|
10
|
+
*
|
|
11
|
+
* 2. CONFIDENCE ENFORCEMENT. SPEC.md's rule that "a pattern match without
|
|
12
|
+
* validation is at most low confidence" is applied mechanically rather
|
|
13
|
+
* than trusted to 145 separate authors.
|
|
14
|
+
*
|
|
15
|
+
* 3. FAIL-CLOSED ERROR HANDLING. SPEC.md non-negotiable #2: "If detection
|
|
16
|
+
* errors, exceeds its time budget … BLOCK the send." The runner therefore
|
|
17
|
+
* never swallows a detector exception and never returns partial results
|
|
18
|
+
* on timeout — it throws, and the caller blocks.
|
|
19
|
+
*
|
|
20
|
+
* Overlap between candidates is NOT resolved here. SPEC.md assigns that to
|
|
21
|
+
* Stage 4 fusion ("Resolve overlapping candidates: prefer the more specific
|
|
22
|
+
* type, then higher calibrated confidence, then longer span"), which needs
|
|
23
|
+
* calibrated scores this stage cannot produce.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import type { NormalizationResult } from '../types.js';
|
|
27
|
+
import { mapNormalizedSpan } from '../offsetMap.js';
|
|
28
|
+
import { allDetectors, detectorsForRegion } from './registry.js';
|
|
29
|
+
import { CONFIDENCE } from './types.js';
|
|
30
|
+
import type { ContextSignal, Detector, RegionCode, Stage1Candidate, ValidationContext } from './types.js';
|
|
31
|
+
|
|
32
|
+
/** Thrown when detection exceeds its time budget. Callers must fail closed. */
|
|
33
|
+
export class DetectionTimeoutError extends Error {
|
|
34
|
+
constructor(
|
|
35
|
+
readonly budgetMs: number,
|
|
36
|
+
readonly elapsedMs: number,
|
|
37
|
+
) {
|
|
38
|
+
super(`Stage 1 detection exceeded its ${budgetMs}ms budget (took ${elapsedMs}ms).`);
|
|
39
|
+
this.name = 'DetectionTimeoutError';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Thrown when a detector itself throws. Names the detector; never the value. */
|
|
44
|
+
export class DetectorError extends Error {
|
|
45
|
+
constructor(
|
|
46
|
+
readonly detectorId: string,
|
|
47
|
+
override readonly cause: unknown,
|
|
48
|
+
) {
|
|
49
|
+
super(`Detector "${detectorId}" threw during validation.`);
|
|
50
|
+
this.name = 'DetectorError';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface Stage1Options {
|
|
55
|
+
/**
|
|
56
|
+
* Restrict to detectors applicable to this region, plus all GLOBAL ones.
|
|
57
|
+
* Omit to run every detector, which is the right default — a user pasting a
|
|
58
|
+
* foreign colleague's identifier still deserves protection.
|
|
59
|
+
*/
|
|
60
|
+
readonly region?: RegionCode;
|
|
61
|
+
/** The user's default region, passed to validators for ambiguous formats
|
|
62
|
+
* such as phone numbers. */
|
|
63
|
+
readonly defaultRegion?: RegionCode;
|
|
64
|
+
/** Explicit detector set, overriding the registry. For focused tests. */
|
|
65
|
+
readonly detectors?: readonly Detector[];
|
|
66
|
+
/** Wall-clock budget in milliseconds. Exceeding it throws. */
|
|
67
|
+
readonly budgetMs?: number;
|
|
68
|
+
/** Stage 3 evidence, per candidate span. Absent until M7. */
|
|
69
|
+
readonly contextFor?: (start: number, end: number) => ContextSignal | undefined;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Run Stage 1 over an already-normalized text.
|
|
74
|
+
*
|
|
75
|
+
* Takes the whole `NormalizationResult` rather than a bare string because the
|
|
76
|
+
* offset map is not optional: a candidate without a correct original-text span
|
|
77
|
+
* cannot be masked, and accepting a string would let a caller forget it.
|
|
78
|
+
*/
|
|
79
|
+
export function runStage1(
|
|
80
|
+
normalization: NormalizationResult,
|
|
81
|
+
options: Stage1Options = {},
|
|
82
|
+
): Stage1Candidate[] {
|
|
83
|
+
const { normalizedText, offsetMap } = normalization;
|
|
84
|
+
const detectors =
|
|
85
|
+
options.detectors ?? (options.region === undefined ? allDetectors() : detectorsForRegion(options.region));
|
|
86
|
+
|
|
87
|
+
const started = Date.now();
|
|
88
|
+
const candidates: Stage1Candidate[] = [];
|
|
89
|
+
|
|
90
|
+
for (const detector of detectors) {
|
|
91
|
+
if (options.budgetMs !== undefined) {
|
|
92
|
+
const elapsed = Date.now() - started;
|
|
93
|
+
if (elapsed > options.budgetMs) throw new DetectionTimeoutError(options.budgetMs, elapsed);
|
|
94
|
+
}
|
|
95
|
+
collectFrom(detector, normalizedText, offsetMap, options, candidates);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return candidates;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Run one detector over the text, appending every surviving candidate. */
|
|
102
|
+
function collectFrom(
|
|
103
|
+
detector: Detector,
|
|
104
|
+
text: string,
|
|
105
|
+
offsetMap: Int32Array,
|
|
106
|
+
options: Stage1Options,
|
|
107
|
+
out: Stage1Candidate[],
|
|
108
|
+
): void {
|
|
109
|
+
// Clone the pattern so `lastIndex` is never shared between scans. Module-
|
|
110
|
+
// scope /g regexes that keep state across calls are a classic source of
|
|
111
|
+
// intermittent, order-dependent misses.
|
|
112
|
+
const pattern = new RegExp(detector.pattern.source, detector.pattern.flags);
|
|
113
|
+
pattern.lastIndex = 0;
|
|
114
|
+
|
|
115
|
+
let match: RegExpExecArray | null;
|
|
116
|
+
while ((match = pattern.exec(text)) !== null) {
|
|
117
|
+
// A zero-length match would spin forever; step past it.
|
|
118
|
+
if (match[0].length === 0) {
|
|
119
|
+
pattern.lastIndex += 1;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const matchStart = match.index;
|
|
124
|
+
const matchEnd = matchStart + match[0].length;
|
|
125
|
+
|
|
126
|
+
const context = options.contextFor?.(matchStart, matchEnd);
|
|
127
|
+
const ctx: ValidationContext = {
|
|
128
|
+
text,
|
|
129
|
+
start: matchStart,
|
|
130
|
+
end: matchEnd,
|
|
131
|
+
match,
|
|
132
|
+
...(options.defaultRegion !== undefined ? { defaultRegion: options.defaultRegion } : {}),
|
|
133
|
+
...(context !== undefined ? { context } : {}),
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
let result;
|
|
137
|
+
try {
|
|
138
|
+
result = detector.validate(ctx);
|
|
139
|
+
} catch (cause) {
|
|
140
|
+
// Fail closed: surface the fault rather than dropping the candidate and
|
|
141
|
+
// reporting a clean scan of text that was never fully examined.
|
|
142
|
+
throw new DetectorError(detector.id, cause);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (!result.valid) continue;
|
|
146
|
+
|
|
147
|
+
// A validator may narrow the span to exclude anchoring context that the
|
|
148
|
+
// pattern needed but which must not be masked.
|
|
149
|
+
const start = result.span?.start ?? matchStart;
|
|
150
|
+
const end = result.span?.end ?? matchEnd;
|
|
151
|
+
if (!(start >= 0 && start < end && end <= text.length)) {
|
|
152
|
+
throw new DetectorError(
|
|
153
|
+
detector.id,
|
|
154
|
+
new Error(`validator returned an out-of-range span [${start}, ${end}) for text of length ${text.length}`),
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const original = mapNormalizedSpan(offsetMap, start, end);
|
|
159
|
+
|
|
160
|
+
let confidence = result.confidence ?? detector.baseConfidence;
|
|
161
|
+
// SPEC.md: detectors that "require context boost" cannot exceed low
|
|
162
|
+
// confidence until Stage 3 supplies the signal. This is what stops
|
|
163
|
+
// GENERIC_SECRET from firing on entropy alone.
|
|
164
|
+
if (detector.requiresContext === true && context === undefined) {
|
|
165
|
+
confidence = Math.min(confidence, CONFIDENCE.LOW);
|
|
166
|
+
}
|
|
167
|
+
confidence = Math.min(Math.max(confidence, 0), 1);
|
|
168
|
+
|
|
169
|
+
const matchedText = text.slice(start, end);
|
|
170
|
+
|
|
171
|
+
out.push({
|
|
172
|
+
text: matchedText,
|
|
173
|
+
type: detector.entityType,
|
|
174
|
+
start,
|
|
175
|
+
end,
|
|
176
|
+
originalStart: original.start,
|
|
177
|
+
originalEnd: original.end,
|
|
178
|
+
rawConfidence: confidence,
|
|
179
|
+
stage: 'stage1-validated-identifier',
|
|
180
|
+
detectorId: detector.id,
|
|
181
|
+
sensitive: result.sensitive ?? true,
|
|
182
|
+
canonical: result.canonical ?? matchedText,
|
|
183
|
+
...(result.metadata !== undefined ? { metadata: result.metadata } : {}),
|
|
184
|
+
...(result.validator !== undefined ? { validatorPassed: result.validator } : {}),
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Stage 1 detector contract.
|
|
3
|
+
*
|
|
4
|
+
* SPEC.md, Stage 1: "Structure this as a registry: each detector declares its
|
|
5
|
+
* id, entity type, supported regions, candidate pattern, validator function,
|
|
6
|
+
* and base confidence. Adding a new national identifier must require touching
|
|
7
|
+
* exactly one new file."
|
|
8
|
+
*
|
|
9
|
+
* That last sentence is the design constraint everything here answers to.
|
|
10
|
+
* A new detector is one file that builds a `Detector` object and calls
|
|
11
|
+
* `registerDetector`. It does not edit a union type (EntityType models
|
|
12
|
+
* national identifiers as families precisely so it never has to — see
|
|
13
|
+
* ARCHITECTURE.md D4), a central list, or this file.
|
|
14
|
+
*
|
|
15
|
+
* THE CENTRAL RULE. SPEC.md: "Regex is only the candidate generator.
|
|
16
|
+
* Emission at high confidence requires passing a validator. A pattern match
|
|
17
|
+
* without validation is at most low confidence." The runner enforces this
|
|
18
|
+
* mechanically rather than trusting each detector to remember it: a detector
|
|
19
|
+
* cannot emit above `CONFIDENCE.LOW` unless its validator returned success,
|
|
20
|
+
* and one that declares `requiresContext` cannot exceed `CONFIDENCE.LOW` at
|
|
21
|
+
* all until Stage 3 supplies the missing signal.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import type { EntityType } from '../types.js';
|
|
25
|
+
|
|
26
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
27
|
+
// Confidence
|
|
28
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Named confidence levels shared by every detector.
|
|
32
|
+
*
|
|
33
|
+
* These are RAW, detector-local scores, not calibrated probabilities. Stage 4
|
|
34
|
+
* calibrates them against the eval corpus so that 0.8 empirically means ~80%
|
|
35
|
+
* precision; until then they are only meaningfully ordered, not absolute.
|
|
36
|
+
* Detectors use these constants rather than bare numbers so that recalibrating
|
|
37
|
+
* the scale is one edit here instead of a sweep across 145 files.
|
|
38
|
+
*/
|
|
39
|
+
export const CONFIDENCE = {
|
|
40
|
+
/** A pattern matched but nothing corroborates it. The ceiling for an
|
|
41
|
+
* unvalidated match, and for anything awaiting a Stage 3 context signal. */
|
|
42
|
+
LOW: 0.3,
|
|
43
|
+
/** A structural check passed, but the format is weak enough that false
|
|
44
|
+
* positives are expected (short identifiers, no checksum). */
|
|
45
|
+
MEDIUM: 0.6,
|
|
46
|
+
/** A real checksum or structural validator passed. The normal ceiling. */
|
|
47
|
+
HIGH: 0.85,
|
|
48
|
+
/** Reserved for formats that are self-verifying to the point that a false
|
|
49
|
+
* positive is implausible — SPEC.md names a valid passport MRZ, "every
|
|
50
|
+
* field is checksummed; treat a valid MRZ as maximum confidence". */
|
|
51
|
+
MAXIMUM: 0.99,
|
|
52
|
+
} as const;
|
|
53
|
+
|
|
54
|
+
export type ConfidenceLevel = (typeof CONFIDENCE)[keyof typeof CONFIDENCE];
|
|
55
|
+
|
|
56
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
57
|
+
// Regions
|
|
58
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* An ISO 3166-1 alpha-2 country code, or `GLOBAL` for detectors that are not
|
|
62
|
+
* jurisdiction-specific (email, IP address, JWT, credit card).
|
|
63
|
+
*
|
|
64
|
+
* Kept as a widened string rather than a closed union so adding a country
|
|
65
|
+
* genuinely touches one file. The registry validates the shape at
|
|
66
|
+
* registration time.
|
|
67
|
+
*/
|
|
68
|
+
export type RegionCode = string;
|
|
69
|
+
|
|
70
|
+
/** The sentinel region for detectors that apply everywhere. */
|
|
71
|
+
export const GLOBAL_REGION = 'GLOBAL';
|
|
72
|
+
|
|
73
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
74
|
+
// Context (Stage 3 hook)
|
|
75
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Evidence from a candidate's surroundings.
|
|
79
|
+
*
|
|
80
|
+
* Stage 3 does not exist yet (it arrives in M7), so this is always `undefined`
|
|
81
|
+
* during M2. It is defined now, and threaded through `ValidationContext`, so
|
|
82
|
+
* that detectors which SPEC.md says "require context boost" —
|
|
83
|
+
* GENERIC_SECRET, POSTAL_CODE, STREET_ADDRESS — can be written once with
|
|
84
|
+
* their context branch in place, rather than being rewritten when Stage 3
|
|
85
|
+
* lands.
|
|
86
|
+
*
|
|
87
|
+
* SPEC.md on GENERIC_SECRET: "Require a Shannon entropy threshold AND an
|
|
88
|
+
* assignment-context signal (see Stage 3)". The entropy half is implemented
|
|
89
|
+
* in M2; `assignment` below is the half that stays dormant.
|
|
90
|
+
*/
|
|
91
|
+
export interface ContextSignal {
|
|
92
|
+
/** A nearby label matched a trigger lexicon entry ("SSN:", "IBAN", "kimlik"). */
|
|
93
|
+
readonly trigger?: string;
|
|
94
|
+
/** The candidate sits on the value side of an assignment or key-value pair
|
|
95
|
+
* (`api_key = …`, a JSON key, a .env line, a CSV column header). */
|
|
96
|
+
readonly assignment?: boolean;
|
|
97
|
+
/** Negative evidence: documentation example, test fixture, lorem ipsum,
|
|
98
|
+
* a UUID in a log line. Actively suppresses rather than merely failing to
|
|
99
|
+
* boost. */
|
|
100
|
+
readonly negative?: boolean;
|
|
101
|
+
/** Detected document type, which shifts weights (code raises secret
|
|
102
|
+
* sensitivity and lowers person-name sensitivity). */
|
|
103
|
+
readonly documentType?: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* What a validator is given alongside the matched text.
|
|
108
|
+
*
|
|
109
|
+
* Carries the surrounding text because several validators genuinely need it:
|
|
110
|
+
* a passport MRZ spans multiple lines and must look at its siblings, and an
|
|
111
|
+
* IP address must know whether it is inside a URL.
|
|
112
|
+
*/
|
|
113
|
+
export interface ValidationContext {
|
|
114
|
+
/** The full normalized text the runner is scanning. */
|
|
115
|
+
readonly text: string;
|
|
116
|
+
/** Start offset of the match within `text` (inclusive). */
|
|
117
|
+
readonly start: number;
|
|
118
|
+
/** End offset of the match within `text` (exclusive). */
|
|
119
|
+
readonly end: number;
|
|
120
|
+
/** The regex match that produced this candidate, including capture groups. */
|
|
121
|
+
readonly match: RegExpExecArray;
|
|
122
|
+
/** The user's configured default region, used for ambiguous formats such as
|
|
123
|
+
* phone numbers. `undefined` when unset. */
|
|
124
|
+
readonly defaultRegion?: RegionCode;
|
|
125
|
+
/** Stage 3 evidence. Always `undefined` in M2. */
|
|
126
|
+
readonly context?: ContextSignal;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
130
|
+
// Validation results
|
|
131
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
132
|
+
|
|
133
|
+
/** The match is not an instance of this entity type. It is not emitted. */
|
|
134
|
+
export interface ValidationFailure {
|
|
135
|
+
readonly valid: false;
|
|
136
|
+
/** Why it failed, for eval error analysis. Never contains the value itself. */
|
|
137
|
+
readonly reason: string;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** The match is an instance of this entity type. */
|
|
141
|
+
export interface ValidationSuccess {
|
|
142
|
+
readonly valid: true;
|
|
143
|
+
/**
|
|
144
|
+
* Confidence for this specific match, overriding the detector's
|
|
145
|
+
* `baseConfidence`. Use when one detector's certainty varies by case — a
|
|
146
|
+
* public/reserved IP range is a weaker signal than a routable address.
|
|
147
|
+
*/
|
|
148
|
+
readonly confidence?: number;
|
|
149
|
+
/**
|
|
150
|
+
* Canonical form of the value: separators stripped, case normalized. Later
|
|
151
|
+
* milestones key the vault on this so that `4111 1111 1111 1111` and
|
|
152
|
+
* `4111-1111-1111-1111` resolve to one entry.
|
|
153
|
+
*/
|
|
154
|
+
readonly canonical?: string;
|
|
155
|
+
/**
|
|
156
|
+
* Whether this value is actually sensitive.
|
|
157
|
+
*
|
|
158
|
+
* SPEC.md requires known test values to be "matched but classified as
|
|
159
|
+
* non-sensitive" — the documentation IBAN GB82WEST…, the Visa test card
|
|
160
|
+
* 4111…, reserved example domains. They are detected so the eval corpus can
|
|
161
|
+
* assert they were seen, and marked non-sensitive so they are never masked.
|
|
162
|
+
* Defaults to `true`.
|
|
163
|
+
*/
|
|
164
|
+
readonly sensitive?: boolean;
|
|
165
|
+
/**
|
|
166
|
+
* Scheme details for Stage 4 fusion and M4 substitution. For a national
|
|
167
|
+
* identifier this carries the concrete scheme and country, which is how the
|
|
168
|
+
* family design stays extensible: `{ scheme: 'tckn', country: 'TR' }`.
|
|
169
|
+
*/
|
|
170
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
171
|
+
/**
|
|
172
|
+
* Name of the validator that passed, surfaced in `EntityExplanation
|
|
173
|
+
* .validatorPassed`. SPEC.md: every emitted entity carries an explanation
|
|
174
|
+
* of "which validator passed".
|
|
175
|
+
*/
|
|
176
|
+
readonly validator?: string;
|
|
177
|
+
/**
|
|
178
|
+
* Narrow the span to a sub-range of the regex match, in offsets relative to
|
|
179
|
+
* the full scanned text. Patterns often need leading context to anchor
|
|
180
|
+
* (a label, a delimiter) that must not be masked along with the value.
|
|
181
|
+
*/
|
|
182
|
+
readonly span?: { readonly start: number; readonly end: number };
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export type ValidationResult = ValidationSuccess | ValidationFailure;
|
|
186
|
+
|
|
187
|
+
/** Convenience constructor for the common failure case. */
|
|
188
|
+
export function invalid(reason: string): ValidationFailure {
|
|
189
|
+
return { valid: false, reason };
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** Convenience constructor for the common success case. */
|
|
193
|
+
export function valid(fields: Omit<ValidationSuccess, 'valid'> = {}): ValidationSuccess {
|
|
194
|
+
return { valid: true, ...fields };
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
198
|
+
// The detector
|
|
199
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
200
|
+
|
|
201
|
+
export interface Detector {
|
|
202
|
+
/**
|
|
203
|
+
* Stable, unique, kebab-case identifier — `"national-id-tr-tckn"`,
|
|
204
|
+
* `"credit-card"`, `"iban"`. Appears in `Candidate.detectorId`, in eval
|
|
205
|
+
* error analysis, and in regression-gate config, so it must not churn.
|
|
206
|
+
*/
|
|
207
|
+
readonly id: string;
|
|
208
|
+
|
|
209
|
+
/** The entity type emitted. For national schemes this is the FAMILY
|
|
210
|
+
* (`NATIONAL_ID`), with the concrete scheme carried in metadata. */
|
|
211
|
+
readonly entityType: EntityType;
|
|
212
|
+
|
|
213
|
+
/** Jurisdictions this detector applies to, or `[GLOBAL_REGION]`. */
|
|
214
|
+
readonly regions: readonly RegionCode[];
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* The candidate generator. Must carry the `g` flag; the runner never
|
|
218
|
+
* mutates it, cloning per scan so a shared `lastIndex` cannot leak state
|
|
219
|
+
* between calls — a notorious source of intermittent misses with `/g`
|
|
220
|
+
* regexes held at module scope.
|
|
221
|
+
*
|
|
222
|
+
* Patterns should over-generate. Precision is the validator's job.
|
|
223
|
+
*/
|
|
224
|
+
readonly pattern: RegExp;
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Confidence when the validator passes and no per-match confidence is
|
|
228
|
+
* returned. The runner clamps this to `CONFIDENCE.LOW` when
|
|
229
|
+
* `requiresContext` is set and no context signal is present.
|
|
230
|
+
*/
|
|
231
|
+
readonly baseConfidence: number;
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Decide whether a match is genuinely an instance of `entityType`.
|
|
235
|
+
*
|
|
236
|
+
* Detectors with a real checksum return failure for a wrong checksum, and
|
|
237
|
+
* the candidate is dropped — a mistyped SSN is not a low-confidence SSN, it
|
|
238
|
+
* is not an SSN. Detectors for formats with no checksum (drivers' licences,
|
|
239
|
+
* postal codes) return success at a low confidence instead.
|
|
240
|
+
*/
|
|
241
|
+
validate(ctx: ValidationContext): ValidationResult;
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* This detector cannot reach its base confidence without Stage 3 evidence.
|
|
245
|
+
*
|
|
246
|
+
* SPEC.md marks GENERIC_SECRET, POSTAL_CODE and STREET_ADDRESS this way.
|
|
247
|
+
* Until Stage 3 exists the runner caps them at `CONFIDENCE.LOW`, which is
|
|
248
|
+
* what keeps GENERIC_SECRET from "firing on entropy alone".
|
|
249
|
+
*/
|
|
250
|
+
readonly requiresContext?: boolean;
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Human-readable description, shown in the options UI's per-entity toggles
|
|
254
|
+
* and in eval reports.
|
|
255
|
+
*/
|
|
256
|
+
readonly description: string;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
260
|
+
// Runner output
|
|
261
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* A Stage 1 candidate, extending the shared `Candidate` with the original-text
|
|
265
|
+
* span.
|
|
266
|
+
*
|
|
267
|
+
* `Candidate.start`/`end` are offsets into the NORMALIZED text, which is the
|
|
268
|
+
* M1 contract every offset-map invariant is written against. Substitution
|
|
269
|
+
* however edits the ORIGINAL text, so the runner resolves both up front via
|
|
270
|
+
* `mapNormalizedSpan` and carries them together. Recorded as ARCHITECTURE.md
|
|
271
|
+
* D7: the alternative — redefining `Candidate.start` to mean original offsets
|
|
272
|
+
* — would silently invalidate the M1 offset-map tests.
|
|
273
|
+
*/
|
|
274
|
+
export interface Stage1Candidate {
|
|
275
|
+
readonly text: string;
|
|
276
|
+
readonly type: EntityType;
|
|
277
|
+
/** Start offset in the NORMALIZED text (inclusive). */
|
|
278
|
+
readonly start: number;
|
|
279
|
+
/** End offset in the NORMALIZED text (exclusive). */
|
|
280
|
+
readonly end: number;
|
|
281
|
+
/** Start offset in the ORIGINAL text (inclusive), via the Stage 0 map. */
|
|
282
|
+
readonly originalStart: number;
|
|
283
|
+
/** End offset in the ORIGINAL text (exclusive), via the Stage 0 map. */
|
|
284
|
+
readonly originalEnd: number;
|
|
285
|
+
readonly rawConfidence: number;
|
|
286
|
+
readonly stage: 'stage1-validated-identifier';
|
|
287
|
+
readonly detectorId: string;
|
|
288
|
+
/** False for known test/documentation values, which are detected but must
|
|
289
|
+
* never be masked. */
|
|
290
|
+
readonly sensitive: boolean;
|
|
291
|
+
/** Canonical form, separators stripped and case normalized. */
|
|
292
|
+
readonly canonical: string;
|
|
293
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
294
|
+
/** Which validator passed, for the entity explanation. */
|
|
295
|
+
readonly validatorPassed?: string;
|
|
296
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base58 and base58check (Bitcoin alphabet).
|
|
3
|
+
*
|
|
4
|
+
* Decoding goes through BigInt — short inputs, validation-only, and the
|
|
5
|
+
* arithmetic formulation is obviously faithful to the definition. Leading
|
|
6
|
+
* '1' characters map to leading zero bytes, which matters: the Bitcoin
|
|
7
|
+
* genesis address starts with one.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { sha256d } from '../crypto/sha256.js';
|
|
11
|
+
|
|
12
|
+
const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
|
|
13
|
+
|
|
14
|
+
const VALUES: ReadonlyMap<string, bigint> = new Map(
|
|
15
|
+
[...ALPHABET].map((ch, i) => [ch, BigInt(i)]),
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
/** Decode base58 to bytes; null on any non-alphabet character. */
|
|
19
|
+
export function base58Decode(s: string): Uint8Array | null {
|
|
20
|
+
if (s.length === 0) return null;
|
|
21
|
+
let acc = 0n;
|
|
22
|
+
for (const ch of s) {
|
|
23
|
+
const v = VALUES.get(ch);
|
|
24
|
+
if (v === undefined) return null;
|
|
25
|
+
acc = acc * 58n + v;
|
|
26
|
+
}
|
|
27
|
+
const body: number[] = [];
|
|
28
|
+
while (acc > 0n) {
|
|
29
|
+
body.push(Number(acc & 0xffn));
|
|
30
|
+
acc >>= 8n;
|
|
31
|
+
}
|
|
32
|
+
body.reverse();
|
|
33
|
+
let leadingZeros = 0;
|
|
34
|
+
for (const ch of s) {
|
|
35
|
+
if (ch !== '1') break;
|
|
36
|
+
leadingZeros++;
|
|
37
|
+
}
|
|
38
|
+
return Uint8Array.from([...new Array<number>(leadingZeros).fill(0), ...body]);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Encode bytes as base58. */
|
|
42
|
+
export function base58Encode(bytes: Uint8Array): string {
|
|
43
|
+
let acc = 0n;
|
|
44
|
+
for (const b of bytes) acc = (acc << 8n) | BigInt(b);
|
|
45
|
+
let out = '';
|
|
46
|
+
while (acc > 0n) {
|
|
47
|
+
out = ALPHABET[Number(acc % 58n)]! + out;
|
|
48
|
+
acc /= 58n;
|
|
49
|
+
}
|
|
50
|
+
for (const b of bytes) {
|
|
51
|
+
if (b !== 0) break;
|
|
52
|
+
out = '1' + out;
|
|
53
|
+
}
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface Base58CheckResult {
|
|
58
|
+
/** The version byte. */
|
|
59
|
+
readonly version: number;
|
|
60
|
+
/** Payload between the version byte and the checksum. */
|
|
61
|
+
readonly payload: Uint8Array;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Decode and verify a base58check string: version ‖ payload ‖ first four
|
|
66
|
+
* bytes of SHA-256d(version ‖ payload). Null when the checksum fails.
|
|
67
|
+
*/
|
|
68
|
+
export function base58CheckDecode(s: string): Base58CheckResult | null {
|
|
69
|
+
const bytes = base58Decode(s);
|
|
70
|
+
if (bytes === null || bytes.length < 5) return null;
|
|
71
|
+
const body = bytes.slice(0, bytes.length - 4);
|
|
72
|
+
const checksum = bytes.slice(bytes.length - 4);
|
|
73
|
+
const expected = sha256d(body);
|
|
74
|
+
for (let i = 0; i < 4; i++) {
|
|
75
|
+
if (checksum[i] !== expected[i]) return null;
|
|
76
|
+
}
|
|
77
|
+
return { version: body[0]!, payload: body.slice(1) };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Encode version ‖ payload with its base58check checksum. */
|
|
81
|
+
export function base58CheckEncode(version: number, payload: Uint8Array): string {
|
|
82
|
+
const body = Uint8Array.from([version, ...payload]);
|
|
83
|
+
const checksum = sha256d(body).slice(0, 4);
|
|
84
|
+
return base58Encode(Uint8Array.from([...body, ...checksum]));
|
|
85
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monero's base58 variant.
|
|
3
|
+
*
|
|
4
|
+
* Monero does NOT use Bitcoin's stream base58: it encodes fixed 8-byte
|
|
5
|
+
* blocks as exactly 11 characters (padding with the alphabet's zero, '1'),
|
|
6
|
+
* with a shorter final block whose decoded size is determined by its
|
|
7
|
+
* encoded length. The alphabet itself is Bitcoin's. A standard address is
|
|
8
|
+
* 95 characters = 8 full blocks + one 7-character tail, decoding to 69
|
|
9
|
+
* bytes: network byte ‖ two 32-byte keys ‖ 4-byte Keccak-256 checksum.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
|
|
13
|
+
const VALUES: ReadonlyMap<string, bigint> = new Map(
|
|
14
|
+
[...ALPHABET].map((ch, i) => [ch, BigInt(i)]),
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
const FULL_ENCODED = 11;
|
|
18
|
+
const FULL_DECODED = 8;
|
|
19
|
+
|
|
20
|
+
/** decoded byte count for a partial block, indexed by encoded length. */
|
|
21
|
+
const PARTIAL_DECODED: readonly (number | null)[] = [
|
|
22
|
+
0, null, 1, 2, 3, 4, null, 5, 6, 7, null,
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
function decodeBlock(block: string, decodedSize: number): Uint8Array | null {
|
|
26
|
+
let acc = 0n;
|
|
27
|
+
for (const ch of block) {
|
|
28
|
+
const v = VALUES.get(ch);
|
|
29
|
+
if (v === undefined) return null;
|
|
30
|
+
acc = acc * 58n + v;
|
|
31
|
+
}
|
|
32
|
+
const max = 1n << BigInt(8 * decodedSize);
|
|
33
|
+
if (acc >= max) return null; // overflows the declared block size
|
|
34
|
+
const out = new Uint8Array(decodedSize);
|
|
35
|
+
for (let i = decodedSize - 1; i >= 0; i--) {
|
|
36
|
+
out[i] = Number(acc & 0xffn);
|
|
37
|
+
acc >>= 8n;
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Decode a Monero base58 string to bytes; null on malformed input. */
|
|
43
|
+
export function moneroBase58Decode(s: string): Uint8Array | null {
|
|
44
|
+
if (s.length === 0) return null;
|
|
45
|
+
const fullBlocks = Math.floor(s.length / FULL_ENCODED);
|
|
46
|
+
const tailLength = s.length % FULL_ENCODED;
|
|
47
|
+
const tailDecoded = PARTIAL_DECODED[tailLength];
|
|
48
|
+
if (tailDecoded === null || tailDecoded === undefined) return null;
|
|
49
|
+
|
|
50
|
+
const out = new Uint8Array(fullBlocks * FULL_DECODED + tailDecoded);
|
|
51
|
+
for (let i = 0; i < fullBlocks; i++) {
|
|
52
|
+
const block = decodeBlock(s.slice(i * FULL_ENCODED, (i + 1) * FULL_ENCODED), FULL_DECODED);
|
|
53
|
+
if (block === null) return null;
|
|
54
|
+
out.set(block, i * FULL_DECODED);
|
|
55
|
+
}
|
|
56
|
+
if (tailLength > 0) {
|
|
57
|
+
const block = decodeBlock(s.slice(fullBlocks * FULL_ENCODED), tailDecoded);
|
|
58
|
+
if (block === null) return null;
|
|
59
|
+
out.set(block, fullBlocks * FULL_DECODED);
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Encoded char count for a partial block, indexed by decoded length. */
|
|
65
|
+
const PARTIAL_ENCODED: readonly number[] = [0, 2, 3, 5, 6, 7, 9, 10];
|
|
66
|
+
|
|
67
|
+
function encodeBlock(bytes: Uint8Array, encodedSize: number): string {
|
|
68
|
+
let acc = 0n;
|
|
69
|
+
for (const b of bytes) acc = (acc << 8n) | BigInt(b);
|
|
70
|
+
let out = '';
|
|
71
|
+
for (let i = 0; i < encodedSize; i++) {
|
|
72
|
+
out = ALPHABET[Number(acc % 58n)]! + out;
|
|
73
|
+
acc /= 58n;
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Encode bytes in Monero's block-wise base58. */
|
|
79
|
+
export function moneroBase58Encode(bytes: Uint8Array): string {
|
|
80
|
+
const fullBlocks = Math.floor(bytes.length / FULL_DECODED);
|
|
81
|
+
const tail = bytes.length % FULL_DECODED;
|
|
82
|
+
let out = '';
|
|
83
|
+
for (let i = 0; i < fullBlocks; i++) {
|
|
84
|
+
out += encodeBlock(bytes.slice(i * FULL_DECODED, (i + 1) * FULL_DECODED), FULL_ENCODED);
|
|
85
|
+
}
|
|
86
|
+
if (tail > 0) {
|
|
87
|
+
out += encodeBlock(bytes.slice(fullBlocks * FULL_DECODED), PARTIAL_ENCODED[tail]!);
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
}
|