@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,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 4 — OVERLAP RESOLUTION.
|
|
3
|
+
*
|
|
4
|
+
* SPEC.md: "Resolve overlapping candidates: prefer the more specific type,
|
|
5
|
+
* then higher calibrated confidence, then longer span. Never emit overlapping
|
|
6
|
+
* entities."
|
|
7
|
+
*
|
|
8
|
+
* THE SAFETY PROPERTY THAT GOVERNS THIS FILE. Resolution DROPS candidates, so
|
|
9
|
+
* D18 applies to it exactly as it applies to a suppression rule — but it has a
|
|
10
|
+
* failure mode a suppression rule does not. Dropping a WIDE candidate in
|
|
11
|
+
* favour of a narrow one it contains does not merely relabel a span: the
|
|
12
|
+
* characters outside the narrow span stop being masked. A rule that naively
|
|
13
|
+
* "prefers the more specific type" would take CONNECTION_STRING over the
|
|
14
|
+
* credentialled URL containing it and leave the scheme, host and port of a
|
|
15
|
+
* live database URI in the outgoing text.
|
|
16
|
+
*
|
|
17
|
+
* So the ordering here is deliberately NOT SPEC's literal order. It is:
|
|
18
|
+
*
|
|
19
|
+
* 1. WIDEST SPAN first — never reduce masked coverage.
|
|
20
|
+
* 2. then the more specific TYPE, for spans of equal extent.
|
|
21
|
+
* 3. then higher confidence.
|
|
22
|
+
*
|
|
23
|
+
* Coverage is promoted above specificity because coverage is the property
|
|
24
|
+
* that cannot be recovered downstream: a mislabelled span is a cosmetic
|
|
25
|
+
* defect in the review UI, an unmasked one is a leak. Where spans are equal
|
|
26
|
+
* the two orderings agree, which is the case SPEC's wording is really about.
|
|
27
|
+
* `resolveOverlaps` asserts the coverage property on its own output.
|
|
28
|
+
*
|
|
29
|
+
* THE SPECIFICITY ORDER IS MEASURED, NOT ASSUMED. A census over the 2,600
|
|
30
|
+
* document corpus found 66.8% of Stage 1 candidates in at least one cross-type
|
|
31
|
+
* overlap, and for each pair recorded which type ground truth actually agreed
|
|
32
|
+
* with. Every rank below cites that measurement.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import type { EntityType } from '../types.js';
|
|
36
|
+
import type { PipelineCandidate } from '../context/types.js';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Type specificity: LOWER wins a tie between spans of equal extent.
|
|
40
|
+
*
|
|
41
|
+
* Derived from the overlap census — the "which type did ground truth agree
|
|
42
|
+
* with" column — not from intuition about which type sounds more precise.
|
|
43
|
+
*/
|
|
44
|
+
const SPECIFICITY: Readonly<Partial<Record<EntityType, number>>> = {
|
|
45
|
+
// Self-verifying structure. A valid MRZ or PEM block is what it says it is.
|
|
46
|
+
PASSPORT_MRZ: 0,
|
|
47
|
+
PRIVATE_KEY: 0,
|
|
48
|
+
JWT: 0,
|
|
49
|
+
|
|
50
|
+
// A connection string and a credentialled URL claim IDENTICAL spans 140
|
|
51
|
+
// times in the corpus, and ground truth agreed with CONNECTION_STRING in
|
|
52
|
+
// 140 of 140. The DB/queue scheme is the more specific reading of the same
|
|
53
|
+
// characters, exactly as the M7 taxonomy predicted.
|
|
54
|
+
CONNECTION_STRING: 1,
|
|
55
|
+
URL_WITH_CREDENTIALS: 2,
|
|
56
|
+
|
|
57
|
+
// Checksum-validated identifiers.
|
|
58
|
+
IBAN: 3,
|
|
59
|
+
CREDIT_CARD: 3,
|
|
60
|
+
CRYPTO_WALLET: 3,
|
|
61
|
+
API_KEY: 3,
|
|
62
|
+
VAT_NUMBER: 3,
|
|
63
|
+
US_NPI: 3,
|
|
64
|
+
VIN: 3,
|
|
65
|
+
SWIFT_BIC: 3,
|
|
66
|
+
US_ROUTING_NUMBER: 3,
|
|
67
|
+
UK_SORT_CODE: 3,
|
|
68
|
+
CA_TRANSIT_NUMBER: 3,
|
|
69
|
+
AU_BSB: 3,
|
|
70
|
+
IN_IFSC: 3,
|
|
71
|
+
BR_AGENCIA: 3,
|
|
72
|
+
|
|
73
|
+
// Structured but not self-verifying.
|
|
74
|
+
EMAIL: 4,
|
|
75
|
+
PHONE: 4,
|
|
76
|
+
IP_ADDRESS: 4,
|
|
77
|
+
MAC_ADDRESS: 4,
|
|
78
|
+
COORDINATES: 4,
|
|
79
|
+
STREET_ADDRESS: 4,
|
|
80
|
+
HEALTH_DATA: 5,
|
|
81
|
+
|
|
82
|
+
// National and tax identifiers. Deliberately EQUAL: the census found
|
|
83
|
+
// TAX_ID-over-NATIONAL_ID and NATIONAL_ID-over-TAX_ID both occurring on
|
|
84
|
+
// equal spans with ground truth split roughly evenly between them (28/10/10
|
|
85
|
+
// and 19/11/11). No static ordering is honest about that — it is a genuine
|
|
86
|
+
// cross-scheme ambiguity that calibrated confidence has to settle, so they
|
|
87
|
+
// tie here and fall through to the confidence comparison.
|
|
88
|
+
NATIONAL_ID: 6,
|
|
89
|
+
TAX_ID: 6,
|
|
90
|
+
|
|
91
|
+
// Named entities: statistical proposals, not validated claims.
|
|
92
|
+
PERSON: 7,
|
|
93
|
+
ORG: 7,
|
|
94
|
+
LOCATION: 7,
|
|
95
|
+
|
|
96
|
+
// Shape-only, no validator behind it.
|
|
97
|
+
POSTAL_CODE: 8,
|
|
98
|
+
DRIVERS_LICENSE: 8,
|
|
99
|
+
DATE_OF_BIRTH: 8,
|
|
100
|
+
|
|
101
|
+
// Entropy alone. The census is unambiguous: a specific type covering the
|
|
102
|
+
// same characters was right in 2,047 of 2,053 measured overlaps.
|
|
103
|
+
GENERIC_SECRET: 9,
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/** Types absent from the table sort between shape-only and generic. */
|
|
107
|
+
const DEFAULT_SPECIFICITY = 8;
|
|
108
|
+
|
|
109
|
+
function specificityOf(type: EntityType): number {
|
|
110
|
+
return SPECIFICITY[type] ?? DEFAULT_SPECIFICITY;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** A candidate with the confidence Stage 3 gave it. */
|
|
114
|
+
export interface ScoredForResolution {
|
|
115
|
+
readonly candidate: PipelineCandidate;
|
|
116
|
+
readonly confidence: number;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export interface ResolutionResult {
|
|
120
|
+
/** Non-overlapping survivors, in document order. */
|
|
121
|
+
readonly emitted: readonly ScoredForResolution[];
|
|
122
|
+
/** Candidates yielded to a winner, retained so the choice is explainable. */
|
|
123
|
+
readonly dropped: readonly { readonly item: ScoredForResolution; readonly toType: EntityType }[];
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function overlaps(a: PipelineCandidate, b: PipelineCandidate): boolean {
|
|
127
|
+
return a.start < b.end && b.start < a.end;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function width(item: ScoredForResolution): number {
|
|
131
|
+
return item.candidate.end - item.candidate.start;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Resolve a candidate set into a non-overlapping one.
|
|
136
|
+
*
|
|
137
|
+
* Greedy by the ordering above. Because the widest span is always taken
|
|
138
|
+
* first, any candidate it contains is dropped only after its characters are
|
|
139
|
+
* already covered — which is what makes the coverage property hold rather
|
|
140
|
+
* than merely being hoped for.
|
|
141
|
+
*
|
|
142
|
+
* Non-sensitive candidates (known test values) never displace a sensitive
|
|
143
|
+
* one: they are detected so the eval can assert they were seen, and letting
|
|
144
|
+
* one win an overlap would unmask the value it covers.
|
|
145
|
+
*/
|
|
146
|
+
export function resolveOverlaps(items: readonly ScoredForResolution[]): ResolutionResult {
|
|
147
|
+
const ordered = [...items].sort((a, b) => {
|
|
148
|
+
// Sensitive first: a non-sensitive candidate must never displace one that
|
|
149
|
+
// would otherwise be masked.
|
|
150
|
+
if (a.candidate.sensitive !== b.candidate.sensitive) return a.candidate.sensitive ? -1 : 1;
|
|
151
|
+
const byWidth = width(b) - width(a);
|
|
152
|
+
if (byWidth !== 0) return byWidth;
|
|
153
|
+
const bySpecificity = specificityOf(a.candidate.type) - specificityOf(b.candidate.type);
|
|
154
|
+
if (bySpecificity !== 0) return bySpecificity;
|
|
155
|
+
const byConfidence = b.confidence - a.confidence;
|
|
156
|
+
if (byConfidence !== 0) return byConfidence;
|
|
157
|
+
// Total order, so the result cannot depend on input order.
|
|
158
|
+
return a.candidate.start - b.candidate.start || a.candidate.detectorId.localeCompare(b.candidate.detectorId);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
const emitted: ScoredForResolution[] = [];
|
|
162
|
+
const dropped: { item: ScoredForResolution; toType: EntityType }[] = [];
|
|
163
|
+
|
|
164
|
+
for (const item of ordered) {
|
|
165
|
+
const at = emitted.findIndex((kept) => overlaps(kept.candidate, item.candidate));
|
|
166
|
+
if (at === -1) {
|
|
167
|
+
emitted.push(item);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const winner = emitted[at]!;
|
|
172
|
+
const contained =
|
|
173
|
+
winner.candidate.start <= item.candidate.start && item.candidate.end <= winner.candidate.end;
|
|
174
|
+
|
|
175
|
+
// CONTAINED: the winner already covers every character, so dropping the
|
|
176
|
+
// loser costs nothing but a label.
|
|
177
|
+
if (contained || !item.candidate.sensitive) {
|
|
178
|
+
dropped.push({ item, toType: winner.candidate.type });
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// PARTIAL: the loser extends beyond the winner, so dropping it would
|
|
183
|
+
// leave the overhang unmasked. Measured on the corpus, this is rare (8
|
|
184
|
+
// spans in 2,600 documents, every one a Korean street address abutting
|
|
185
|
+
// another entity) but it is a leak, not a mislabelling. The winner
|
|
186
|
+
// absorbs the union instead.
|
|
187
|
+
//
|
|
188
|
+
// Widening in BOTH coordinate spaces is sound without re-consulting the
|
|
189
|
+
// offset map: the map is monotonic, so the union of two mapped spans
|
|
190
|
+
// contains the mapping of the union, and erring wider only ever masks
|
|
191
|
+
// more.
|
|
192
|
+
emitted[at] = {
|
|
193
|
+
...winner,
|
|
194
|
+
candidate: {
|
|
195
|
+
...winner.candidate,
|
|
196
|
+
start: Math.min(winner.candidate.start, item.candidate.start),
|
|
197
|
+
end: Math.max(winner.candidate.end, item.candidate.end),
|
|
198
|
+
originalStart: Math.min(winner.candidate.originalStart, item.candidate.originalStart),
|
|
199
|
+
originalEnd: Math.max(winner.candidate.originalEnd, item.candidate.originalEnd),
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
dropped.push({ item, toType: winner.candidate.type });
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
emitted.sort((a, b) => a.candidate.start - b.candidate.start);
|
|
206
|
+
return { emitted, dropped };
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Every character a sensitive candidate covered is still covered.
|
|
211
|
+
*
|
|
212
|
+
* The invariant resolution exists to preserve, exposed so callers and tests
|
|
213
|
+
* can assert it directly rather than trusting the ordering to imply it.
|
|
214
|
+
*/
|
|
215
|
+
export function coverageHoles(
|
|
216
|
+
before: readonly ScoredForResolution[],
|
|
217
|
+
after: readonly ScoredForResolution[],
|
|
218
|
+
): { readonly start: number; readonly end: number }[] {
|
|
219
|
+
const covered = after
|
|
220
|
+
.filter((i) => i.candidate.sensitive)
|
|
221
|
+
.map((i) => ({ start: i.candidate.start, end: i.candidate.end }))
|
|
222
|
+
.sort((a, b) => a.start - b.start);
|
|
223
|
+
|
|
224
|
+
const holes: { start: number; end: number }[] = [];
|
|
225
|
+
for (const item of before) {
|
|
226
|
+
if (!item.candidate.sensitive) continue;
|
|
227
|
+
let cursor = item.candidate.start;
|
|
228
|
+
for (const span of covered) {
|
|
229
|
+
if (span.end <= cursor) continue;
|
|
230
|
+
if (span.start > cursor) break;
|
|
231
|
+
cursor = Math.max(cursor, span.end);
|
|
232
|
+
if (cursor >= item.candidate.end) break;
|
|
233
|
+
}
|
|
234
|
+
if (cursor < item.candidate.end) holes.push({ start: cursor, end: item.candidate.end });
|
|
235
|
+
}
|
|
236
|
+
return holes;
|
|
237
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 2b — GAZETTEER lookup.
|
|
3
|
+
*
|
|
4
|
+
* SPEC.md: "Bundled compressed lookup sets, checked in parallel with the
|
|
5
|
+
* model … Gazetteer hit alone is medium confidence; gazetteer plus model
|
|
6
|
+
* agreement is high."
|
|
7
|
+
*
|
|
8
|
+
* The bundled sets are Bloom filters (see `@discretion/data`'s
|
|
9
|
+
* gazetteers.ts for why). Two consequences shape this module:
|
|
10
|
+
*
|
|
11
|
+
* • A filter can report a false POSITIVE and never a false negative. So a
|
|
12
|
+
* hit is corroboration, never proof — which is exactly the weight SPEC.md
|
|
13
|
+
* assigns it — while a miss is conclusive.
|
|
14
|
+
* • The hash here must match the builder's byte for byte, so it is written
|
|
15
|
+
* out explicitly rather than pulled from a library that might change.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { GAZETTEERS, type GazetteerFilter } from '@discretion/data';
|
|
19
|
+
import type { EntityType } from '../types.js';
|
|
20
|
+
|
|
21
|
+
/** Entity types a gazetteer can speak to. */
|
|
22
|
+
export type GazetteerType = 'PERSON' | 'ORG' | 'LOCATION';
|
|
23
|
+
|
|
24
|
+
const GAZETTEER_TYPES: readonly GazetteerType[] = ['PERSON', 'ORG', 'LOCATION'];
|
|
25
|
+
|
|
26
|
+
export function isGazetteerType(type: EntityType): type is GazetteerType {
|
|
27
|
+
return (GAZETTEER_TYPES as readonly string[]).includes(type);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Fold a value for lookup: lowercase, then strip combining marks.
|
|
32
|
+
*
|
|
33
|
+
* Identical to the trigger matcher's folding, and to the builder's. Case fold
|
|
34
|
+
* precedes mark stripping so Turkish dotted capital I resolves correctly.
|
|
35
|
+
*/
|
|
36
|
+
function fold(value: string): string {
|
|
37
|
+
return value.toLowerCase().normalize('NFD').replace(/\p{M}+/gu, '').normalize('NFC').trim();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** FNV-1a with two seeds, then double hashing. Must match the builder. */
|
|
41
|
+
function hashPair(value: string): readonly [number, number] {
|
|
42
|
+
let a = 0x811c9dc5;
|
|
43
|
+
let b = 0x01000193;
|
|
44
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
45
|
+
const c = value.charCodeAt(i);
|
|
46
|
+
a = Math.imul(a ^ c, 0x01000193) >>> 0;
|
|
47
|
+
b = Math.imul(b ^ (c + 0x9e3779b9), 0x85ebca6b) >>> 0;
|
|
48
|
+
}
|
|
49
|
+
return [a >>> 0, (b || 1) >>> 0];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function decode(base64: string): Uint8Array {
|
|
53
|
+
// atob is available in browsers and in Node 16+, and keeps core free of
|
|
54
|
+
// Node-only APIs (`Buffer`), which its eslint config bans.
|
|
55
|
+
const binary = atob(base64);
|
|
56
|
+
const bytes = new Uint8Array(binary.length);
|
|
57
|
+
for (let i = 0; i < binary.length; i += 1) bytes[i] = binary.charCodeAt(i);
|
|
58
|
+
return bytes;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
class BloomSet {
|
|
62
|
+
private readonly bytes: Uint8Array;
|
|
63
|
+
|
|
64
|
+
constructor(private readonly filter: GazetteerFilter) {
|
|
65
|
+
this.bytes = decode(filter.base64);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
has(folded: string): boolean {
|
|
69
|
+
const [h1, h2] = hashPair(folded);
|
|
70
|
+
for (let i = 0; i < this.filter.k; i += 1) {
|
|
71
|
+
const bit = ((h1 + Math.imul(i, h2)) >>> 0) % this.filter.bits;
|
|
72
|
+
if ((this.bytes[bit >>> 3]! & (1 << (bit & 7))) === 0) return false;
|
|
73
|
+
}
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Filters are decoded on first use and cached.
|
|
80
|
+
*
|
|
81
|
+
* Decoding all three eagerly costs about 2 MB of base64 work at import time,
|
|
82
|
+
* which a consumer that never runs Stage 2b should not pay.
|
|
83
|
+
*/
|
|
84
|
+
const decoded = new Map<GazetteerType, BloomSet>();
|
|
85
|
+
|
|
86
|
+
function setFor(type: GazetteerType): BloomSet {
|
|
87
|
+
const cached = decoded.get(type);
|
|
88
|
+
if (cached !== undefined) return cached;
|
|
89
|
+
const built = new BloomSet(GAZETTEERS[type]);
|
|
90
|
+
decoded.set(type, built);
|
|
91
|
+
return built;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** How a value matched the gazetteer. */
|
|
95
|
+
export interface GazetteerHit {
|
|
96
|
+
readonly type: GazetteerType;
|
|
97
|
+
/** True when the whole value matched, rather than one of its words. */
|
|
98
|
+
readonly whole: boolean;
|
|
99
|
+
/** Number of the value's words that matched, for multi-word names. */
|
|
100
|
+
readonly matchedWords: number;
|
|
101
|
+
readonly totalWords: number;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Longest multi-word span the gazetteer will consider as a single name. */
|
|
105
|
+
const MAX_WORDS = 5;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Look a value up as `type`.
|
|
109
|
+
*
|
|
110
|
+
* A person's full name is rarely a single gazetteer entry — the sets hold
|
|
111
|
+
* given names and family names separately — so a multi-word value is checked
|
|
112
|
+
* whole first, then word by word. `matchedWords` lets the caller weigh
|
|
113
|
+
* "every word is a known name" differently from "one word out of four is".
|
|
114
|
+
*/
|
|
115
|
+
export function lookupGazetteer(value: string, type: GazetteerType): GazetteerHit | undefined {
|
|
116
|
+
const folded = fold(value);
|
|
117
|
+
if (folded.length < 2) return undefined;
|
|
118
|
+
|
|
119
|
+
const set = setFor(type);
|
|
120
|
+
const words = folded.split(/\s+/).filter((w) => w.length >= 2);
|
|
121
|
+
if (words.length === 0 || words.length > MAX_WORDS) return undefined;
|
|
122
|
+
|
|
123
|
+
if (set.has(folded)) {
|
|
124
|
+
return { type, whole: true, matchedWords: words.length, totalWords: words.length };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const matchedWords = words.filter((w) => set.has(w)).length;
|
|
128
|
+
if (matchedWords === 0) return undefined;
|
|
129
|
+
return { type, whole: false, matchedWords, totalWords: words.length };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Entry counts per set, for reporting and for BENCHMARKS.md. */
|
|
133
|
+
export function gazetteerSizes(): Readonly<Record<GazetteerType, number>> {
|
|
134
|
+
return {
|
|
135
|
+
PERSON: GAZETTEERS.PERSON.entries,
|
|
136
|
+
ORG: GAZETTEERS.ORG.entries,
|
|
137
|
+
LOCATION: GAZETTEERS.LOCATION.entries,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Valid-value generators for the national bank-code family.
|
|
3
|
+
*
|
|
4
|
+
* US routing numbers carry the ABA checksum, so their property test runs the
|
|
5
|
+
* full mutation half. The rest are structure-only formats (stated in each
|
|
6
|
+
* detector); their properties assert validation without mutation.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { abaCheckDigit } from '../checksums/index.js';
|
|
10
|
+
import { mulberry32 } from './prng.js';
|
|
11
|
+
|
|
12
|
+
function pick<T>(rng: () => number, items: readonly T[]): T {
|
|
13
|
+
return items[Math.floor(rng() * items.length)]!;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function int(rng: () => number, min: number, max: number): number {
|
|
17
|
+
return min + Math.floor(rng() * (max - min + 1));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function digits(rng: () => number, count: number): string {
|
|
21
|
+
let out = '';
|
|
22
|
+
for (let i = 0; i < count; i++) out += String(int(rng, 0, 9));
|
|
23
|
+
return out;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Valid Federal Reserve prefixes (mirrors the detector's rule). */
|
|
27
|
+
const FRB_PREFIXES = [
|
|
28
|
+
...Array.from({ length: 12 }, (_, i) => i + 1),
|
|
29
|
+
...Array.from({ length: 12 }, (_, i) => i + 21),
|
|
30
|
+
...Array.from({ length: 12 }, (_, i) => i + 61),
|
|
31
|
+
80,
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
/** An ABA-checksummed routing number with a valid FRB prefix. */
|
|
35
|
+
export function generateValidRouting(seed: number): string {
|
|
36
|
+
const rng = mulberry32(seed);
|
|
37
|
+
const prefix = String(pick(rng, FRB_PREFIXES)).padStart(2, '0');
|
|
38
|
+
const payload = prefix + digits(rng, 6);
|
|
39
|
+
return `${payload}${abaCheckDigit(payload)!}`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** A UK sort code in 00-00-00 notation (no checksum exists). */
|
|
43
|
+
export function generateValidSortCode(seed: number): string {
|
|
44
|
+
const rng = mulberry32(seed);
|
|
45
|
+
return `${digits(rng, 2)}-${digits(rng, 2)}-${digits(rng, 2)}`;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Institution numbers mirrored from the detector's Payments Canada table. */
|
|
49
|
+
const CA_INSTITUTIONS = ['001', '002', '003', '004', '006', '010', '016', '030', '219', '614', '623', '809', '815', '837'];
|
|
50
|
+
|
|
51
|
+
/** A Canadian transit number with a known institution. */
|
|
52
|
+
export function generateValidTransit(seed: number): string {
|
|
53
|
+
const rng = mulberry32(seed);
|
|
54
|
+
return `${digits(rng, 5)}-${pick(rng, CA_INSTITUTIONS)}`;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** An Australian BSB in XXX-XXX notation (no checksum exists). */
|
|
58
|
+
export function generateValidBsb(seed: number): string {
|
|
59
|
+
const rng = mulberry32(seed);
|
|
60
|
+
return `${digits(rng, 3)}-${digits(rng, 3)}`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
64
|
+
|
|
65
|
+
/** An IFSC with the mandatory zero and at least one digit in the branch. */
|
|
66
|
+
export function generateValidIfsc(seed: number): string {
|
|
67
|
+
const rng = mulberry32(seed);
|
|
68
|
+
let bank = '';
|
|
69
|
+
for (let i = 0; i < 4; i++) bank += LETTERS[int(rng, 0, 25)]!;
|
|
70
|
+
// Branch: mostly numeric, as issued in practice; always ≥1 digit.
|
|
71
|
+
return `${bank}0${digits(rng, 6)}`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const AGENCIA_LABELS = ['ag.', 'Ag.', 'agência', 'Agência', 'agencia', 'ag'];
|
|
75
|
+
|
|
76
|
+
/** A labeled Brazilian agência, sometimes with its display check digit. */
|
|
77
|
+
export function generateValidAgencia(seed: number): string {
|
|
78
|
+
const rng = mulberry32(seed);
|
|
79
|
+
const label = pick(rng, AGENCIA_LABELS);
|
|
80
|
+
const check = rng() < 0.4 ? `-${int(rng, 0, 9)}` : '';
|
|
81
|
+
return `${label} ${digits(rng, 4)}${check}`;
|
|
82
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Valid-value generators for the contact & network family.
|
|
3
|
+
*
|
|
4
|
+
* Deterministic by seed, never call the validators they feed (no
|
|
5
|
+
* circularity), and are reused by M3's corpus generator. None of these
|
|
6
|
+
* formats carries a checksum, so the paired property tests assert
|
|
7
|
+
* "generated value always validates" without the single-character-mutation
|
|
8
|
+
* half — a mutated email or IP is usually still a valid email or IP.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { mulberry32 } from './prng.js';
|
|
12
|
+
|
|
13
|
+
function pick<T>(rng: () => number, items: readonly T[]): T {
|
|
14
|
+
return items[Math.floor(rng() * items.length)]!;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function int(rng: () => number, min: number, max: number): number {
|
|
18
|
+
return min + Math.floor(rng() * (max - min + 1));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
22
|
+
// Email
|
|
23
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
24
|
+
|
|
25
|
+
const LOCALS = [
|
|
26
|
+
'john.doe', 'jane_doe', 'a', 'user+tag', 'dev-ops', "o'brien", 'x.y.z',
|
|
27
|
+
'müller', 'björn.b', 'test123', 'first.middle.last', '_service',
|
|
28
|
+
];
|
|
29
|
+
const DOMAINS = [
|
|
30
|
+
'gmail.com', 'yandex.ru', 'firma.de', 'corp.co.uk', 'startup.io',
|
|
31
|
+
'münchen.de', 'xn--bcher-kva.de', 'sub.domain.net', 'a-b.org', 'q2.dev',
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
/** A structurally valid, non-reserved-domain email address. */
|
|
35
|
+
export function generateValidEmail(seed: number): string {
|
|
36
|
+
const rng = mulberry32(seed);
|
|
37
|
+
return `${pick(rng, LOCALS)}@${pick(rng, DOMAINS)}`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
41
|
+
// Phone
|
|
42
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Known-valid E.164 numbers across plans and regions. Sources: numbers in
|
|
46
|
+
* ranges reserved for fiction/drama (UK Ofcom 7946 09xx, US 555-01xx) and
|
|
47
|
+
* carrier example shapes that satisfy libphonenumber's full-metadata
|
|
48
|
+
* isValid(). The pool is itself pinned by a test, so a metadata update that
|
|
49
|
+
* invalidates an entry fails loudly there rather than silently in the
|
|
50
|
+
* property test.
|
|
51
|
+
*/
|
|
52
|
+
export const VALID_E164_POOL: readonly string[] = [
|
|
53
|
+
'+12125550123', // US, NANP fictional range
|
|
54
|
+
'+14155550198', // US
|
|
55
|
+
'+442079460958', // UK, Ofcom drama range (London)
|
|
56
|
+
'+447911123456', // UK mobile
|
|
57
|
+
'+905321234567', // TR mobile
|
|
58
|
+
'+4915123456789', // DE mobile
|
|
59
|
+
'+33612345678', // FR mobile
|
|
60
|
+
'+61412345678', // AU mobile
|
|
61
|
+
'+819012345678', // JP mobile
|
|
62
|
+
'+558121345678', // BR
|
|
63
|
+
'+8613912345678', // CN mobile
|
|
64
|
+
'+918527012345', // IN mobile
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
/** A valid phone number, formatted variably (E.164, spaced, punctuated). */
|
|
68
|
+
export function generateValidPhone(seed: number): string {
|
|
69
|
+
const rng = mulberry32(seed);
|
|
70
|
+
const e164 = pick(rng, VALID_E164_POOL);
|
|
71
|
+
const style = int(rng, 0, 2);
|
|
72
|
+
if (style === 0) return e164;
|
|
73
|
+
const cc = e164.slice(0, e164.length - 10 >= 2 ? e164.length - 10 : 3);
|
|
74
|
+
const rest = e164.slice(cc.length);
|
|
75
|
+
if (style === 1) {
|
|
76
|
+
// Space-grouped: +90 532 123 45 67 style.
|
|
77
|
+
const parts: string[] = [];
|
|
78
|
+
for (let i = 0; i < rest.length; i += 3) parts.push(rest.slice(i, i + 3));
|
|
79
|
+
return `${cc} ${parts.join(' ')}`;
|
|
80
|
+
}
|
|
81
|
+
// Hyphen-grouped.
|
|
82
|
+
const mid = Math.floor(rest.length / 2);
|
|
83
|
+
return `${cc} ${rest.slice(0, mid)}-${rest.slice(mid)}`;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
87
|
+
// IP addresses
|
|
88
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
89
|
+
|
|
90
|
+
/** A valid IPv4 address (octets 1–254 to stay clear of edge constants). */
|
|
91
|
+
export function generateValidIpv4(seed: number): string {
|
|
92
|
+
const rng = mulberry32(seed);
|
|
93
|
+
return [int(rng, 1, 223), int(rng, 0, 254), int(rng, 0, 254), int(rng, 1, 254)].join('.');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** A valid IPv6 address, sometimes zero-compressed, never unspecified. */
|
|
97
|
+
export function generateValidIpv6(seed: number): string {
|
|
98
|
+
const rng = mulberry32(seed);
|
|
99
|
+
const groups: number[] = [];
|
|
100
|
+
for (let i = 0; i < 8; i++) groups.push(int(rng, 0, 0xffff));
|
|
101
|
+
if (groups[0] === 0) groups[0] = 0x2001; // never all-zero / leading-zero edge
|
|
102
|
+
// Half the time, zero a run and write it compressed.
|
|
103
|
+
if (rng() < 0.5) {
|
|
104
|
+
const start = int(rng, 2, 5);
|
|
105
|
+
const len = int(rng, 2, 3);
|
|
106
|
+
for (let i = start; i < Math.min(start + len, 8); i++) groups[i] = 0;
|
|
107
|
+
const hex = groups.map((g) => g.toString(16));
|
|
108
|
+
return `${hex.slice(0, start).join(':')}::${hex.slice(Math.min(start + len, 8)).join(':')}`;
|
|
109
|
+
}
|
|
110
|
+
return groups.map((g) => g.toString(16)).join(':');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
114
|
+
// MAC
|
|
115
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
116
|
+
|
|
117
|
+
/** A valid MAC in colon, hyphen, or Cisco notation. Never all-00/all-ff. */
|
|
118
|
+
export function generateValidMac(seed: number): string {
|
|
119
|
+
const rng = mulberry32(seed);
|
|
120
|
+
const bytes: number[] = [];
|
|
121
|
+
for (let i = 0; i < 6; i++) bytes.push(int(rng, 0, 255));
|
|
122
|
+
bytes[2] = int(rng, 1, 254); // guarantees neither all-zero nor all-ff
|
|
123
|
+
const hex = bytes.map((b) => b.toString(16).padStart(2, '0'));
|
|
124
|
+
const style = int(rng, 0, 2);
|
|
125
|
+
if (style === 0) return hex.join(':');
|
|
126
|
+
if (style === 1) return hex.join('-').toUpperCase();
|
|
127
|
+
const h = hex.join('');
|
|
128
|
+
return `${h.slice(0, 4)}.${h.slice(4, 8)}.${h.slice(8, 12)}`;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
132
|
+
// URL with credentials
|
|
133
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
134
|
+
|
|
135
|
+
const CRED_USERS = ['admin', 'deploy', 'svc-backup', 'root', 'ci'];
|
|
136
|
+
const CRED_PASSWORDS = ['hunter2secret', 'P4ssw0rd!x', 'tOk3n-v4lue-9', 's3cr3t_key_77'];
|
|
137
|
+
const CRED_HOSTS = ['db.internal.corp', 'api.prod.net', 'cache.svc.local', 'build.ci.dev'];
|
|
138
|
+
const CRED_PARAMS = ['token', 'api_key', 'access_token', 'client_secret'];
|
|
139
|
+
|
|
140
|
+
/** A URL that genuinely carries a credential (userinfo or query form). */
|
|
141
|
+
export function generateValidCredentialUrl(seed: number): string {
|
|
142
|
+
const rng = mulberry32(seed);
|
|
143
|
+
if (rng() < 0.5) {
|
|
144
|
+
return `https://${pick(rng, CRED_USERS)}:${pick(rng, CRED_PASSWORDS)}@${pick(rng, CRED_HOSTS)}/app`;
|
|
145
|
+
}
|
|
146
|
+
return `https://${pick(rng, CRED_HOSTS)}/v1/data?${pick(rng, CRED_PARAMS)}=Ab9${Math.floor(rng() * 1e12).toString(36)}xQ7tk`;
|
|
147
|
+
}
|