@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
package/src/scripts.ts
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script detection using native Unicode property escapes (\p{Script=...}).
|
|
3
|
+
* No external library.
|
|
4
|
+
*
|
|
5
|
+
* Characters are classified by CODE POINT (never by UTF-16 code unit), so
|
|
6
|
+
* astral-plane characters — e.g. CJK Extension B ideographs — are handled
|
|
7
|
+
* correctly.
|
|
8
|
+
*/
|
|
9
|
+
import type { ScriptInfo, ScriptName } from './types.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Script membership tests, checked in this order. Kana merges Hiragana and
|
|
13
|
+
* Katakana into one bucket because the pipeline treats Japanese syllabaries
|
|
14
|
+
* as a unit.
|
|
15
|
+
*/
|
|
16
|
+
const SCRIPT_PATTERNS: ReadonlyArray<readonly [ScriptName, RegExp]> = [
|
|
17
|
+
['latin', /\p{Script=Latin}/u],
|
|
18
|
+
['cyrillic', /\p{Script=Cyrillic}/u],
|
|
19
|
+
['greek', /\p{Script=Greek}/u],
|
|
20
|
+
['arabic', /\p{Script=Arabic}/u],
|
|
21
|
+
['hebrew', /\p{Script=Hebrew}/u],
|
|
22
|
+
// Han and Kana use Script_Extensions, not Script: CJK letters like ー
|
|
23
|
+
// (U+30FC, the prolonged sound mark) and 々 (U+3005, the iteration mark)
|
|
24
|
+
// have Script=Common but scx of {Hiragana,Katakana} / {Han}. Classifying
|
|
25
|
+
// them 'other' made them look script-anomalous inside ordinary Japanese
|
|
26
|
+
// words — and anomalous letters are folding candidates, which is exactly
|
|
27
|
+
// wrong for these.
|
|
28
|
+
['han', /\p{Script_Extensions=Han}/u],
|
|
29
|
+
['kana', /[\p{Script_Extensions=Hiragana}\p{Script_Extensions=Katakana}]/u],
|
|
30
|
+
['hangul', /\p{Script=Hangul}/u],
|
|
31
|
+
['devanagari', /\p{Script=Devanagari}/u],
|
|
32
|
+
['thai', /\p{Script=Thai}/u],
|
|
33
|
+
['armenian', /\p{Script=Armenian}/u],
|
|
34
|
+
['georgian', /\p{Script=Georgian}/u],
|
|
35
|
+
['ethiopic', /\p{Script=Ethiopic}/u],
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
const LETTER = /\p{L}/u;
|
|
39
|
+
|
|
40
|
+
/** All supported scripts, i.e. every ScriptName except 'other'. */
|
|
41
|
+
const REAL_SCRIPTS = SCRIPT_PATTERNS.map(([name]) => name);
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Classification of one code point:
|
|
45
|
+
* - 'neutral' — not a letter (whitespace, digits, punctuation, symbols,
|
|
46
|
+
* combining marks, controls). Ignored for dominance because
|
|
47
|
+
* it would skew the result.
|
|
48
|
+
* - a ScriptName — a letter of that script ('other' for unsupported scripts).
|
|
49
|
+
*/
|
|
50
|
+
export type CodePointClass = ScriptName | 'neutral';
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Memo of code point → class. Script property lookups go through regexes,
|
|
54
|
+
* which is too slow to repeat per character on large inputs; real-world text
|
|
55
|
+
* has few distinct code points, so a memo makes classification ~O(1).
|
|
56
|
+
* Capped so adversarial input (e.g. fuzzing across the whole Unicode range)
|
|
57
|
+
* cannot grow it without bound.
|
|
58
|
+
*/
|
|
59
|
+
const classMemo = new Map<number, CodePointClass>();
|
|
60
|
+
const CLASS_MEMO_MAX = 0x10000;
|
|
61
|
+
|
|
62
|
+
/** Classify a single code point. Exported for use by the fold transform. */
|
|
63
|
+
export function classifyCodePoint(cp: number): CodePointClass {
|
|
64
|
+
// ASCII fast path — the overwhelmingly common case.
|
|
65
|
+
if (cp < 0x80) {
|
|
66
|
+
if ((cp >= 0x41 && cp <= 0x5a) || (cp >= 0x61 && cp <= 0x7a)) return 'latin';
|
|
67
|
+
return 'neutral';
|
|
68
|
+
}
|
|
69
|
+
const memoized = classMemo.get(cp);
|
|
70
|
+
if (memoized !== undefined) return memoized;
|
|
71
|
+
|
|
72
|
+
const char = String.fromCodePoint(cp);
|
|
73
|
+
let result: CodePointClass = 'neutral';
|
|
74
|
+
if (LETTER.test(char)) {
|
|
75
|
+
result = 'other';
|
|
76
|
+
for (const [name, pattern] of SCRIPT_PATTERNS) {
|
|
77
|
+
if (pattern.test(char)) {
|
|
78
|
+
result = name;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (classMemo.size < CLASS_MEMO_MAX) classMemo.set(cp, result);
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* The ScriptName for a single character (the first code point of `char`).
|
|
89
|
+
* Script-neutral characters and letters of unsupported scripts both report
|
|
90
|
+
* 'other'.
|
|
91
|
+
*/
|
|
92
|
+
export function getCharScript(char: string): ScriptName {
|
|
93
|
+
const cp = char.codePointAt(0);
|
|
94
|
+
if (cp === undefined) return 'other';
|
|
95
|
+
const cls = classifyCodePoint(cp);
|
|
96
|
+
return cls === 'neutral' ? 'other' : cls;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Script compatibility groups for token-level dominance decisions (ratified):
|
|
101
|
+
* ordinary Japanese prose freely mixes Han, Hiragana/Katakana, and embedded
|
|
102
|
+
* Latin (acronyms, romaji), and Korean prose mixes Hangul with Han (hanja).
|
|
103
|
+
* Characters of co-occurring scripts within one group are NEVER treated as
|
|
104
|
+
* script-anomalous with respect to each other, so such text is never a
|
|
105
|
+
* homoglyph-folding candidate.
|
|
106
|
+
*/
|
|
107
|
+
const COMPATIBLE_GROUPS: ReadonlyArray<ReadonlySet<ScriptName>> = [
|
|
108
|
+
new Set<ScriptName>(['han', 'kana', 'latin']),
|
|
109
|
+
new Set<ScriptName>(['hangul', 'han']),
|
|
110
|
+
];
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Whether two scripts may legitimately co-occur in one token (same script,
|
|
114
|
+
* or both members of a compatibility group).
|
|
115
|
+
*/
|
|
116
|
+
export function scriptsCompatible(a: ScriptName, b: ScriptName): boolean {
|
|
117
|
+
if (a === b) return true;
|
|
118
|
+
if (a === 'other' || b === 'other') return false;
|
|
119
|
+
return COMPATIBLE_GROUPS.some((group) => group.has(a) && group.has(b));
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function emptyCounts(): Record<ScriptName, number> {
|
|
123
|
+
const counts = {} as Record<ScriptName, number>;
|
|
124
|
+
for (const name of REAL_SCRIPTS) counts[name] = 0;
|
|
125
|
+
counts.other = 0;
|
|
126
|
+
return counts;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Per-script letter counts, the dominant script, and whether the text mixes
|
|
131
|
+
* scripts. Whitespace, digits, and punctuation are ignored — they are
|
|
132
|
+
* script-neutral and would skew dominance.
|
|
133
|
+
*/
|
|
134
|
+
export function detectScripts(text: string): ScriptInfo {
|
|
135
|
+
const counts = emptyCounts();
|
|
136
|
+
// for..of iterates CODE POINTS, so surrogate pairs are never split.
|
|
137
|
+
for (const char of text) {
|
|
138
|
+
const cls = classifyCodePoint(char.codePointAt(0)!);
|
|
139
|
+
if (cls === 'neutral') continue;
|
|
140
|
+
counts[cls] += 1;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
let dominant: ScriptName | null = null;
|
|
144
|
+
let best = 0;
|
|
145
|
+
let tied = false;
|
|
146
|
+
let present = 0;
|
|
147
|
+
for (const name of REAL_SCRIPTS) {
|
|
148
|
+
const count = counts[name];
|
|
149
|
+
if (count > 0) present += 1;
|
|
150
|
+
if (count > best) {
|
|
151
|
+
best = count;
|
|
152
|
+
dominant = name;
|
|
153
|
+
tied = false;
|
|
154
|
+
} else if (count === best && count > 0) {
|
|
155
|
+
tied = true;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
counts,
|
|
160
|
+
// Dominance requires a strict maximum; a tie means "no dominant script".
|
|
161
|
+
dominant: tied ? null : dominant,
|
|
162
|
+
mixed: present > 1,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transform 5: DECIMAL DIGIT FOLDING.
|
|
3
|
+
*
|
|
4
|
+
* Every Unicode decimal digit is folded to its ASCII equivalent: Arabic-Indic
|
|
5
|
+
* ٠١٢, Extended Arabic-Indic ۰۱۲, Devanagari ०१२, Bengali ০১২, Thai ๐๑๒,
|
|
6
|
+
* Tamil, Telugu, Myanmar, Khmer, and the rest.
|
|
7
|
+
*
|
|
8
|
+
* WHY THIS EXISTS. NFKC folds FULLWIDTH digits, because those are
|
|
9
|
+
* compatibility variants of ASCII — but Arabic-Indic and Devanagari digits are
|
|
10
|
+
* not compatibility variants of anything. They are the ordinary digits of
|
|
11
|
+
* living scripts, and NFKC leaves them exactly as they are, correctly.
|
|
12
|
+
*
|
|
13
|
+
* The consequence for this pipeline was silent un-redaction. Every Stage 1
|
|
14
|
+
* detector matches `\d` or an explicit `[0-9]` class, so before this transform
|
|
15
|
+
* existed a Turkish national identity number written `٣٠٢١٤٥٦٤٦٤١٢`, an
|
|
16
|
+
* Iranian phone number in Extended Arabic-Indic, a Hindi Aadhaar number in
|
|
17
|
+
* Devanagari, a Thai national ID and a Bengali credit card were ALL reported
|
|
18
|
+
* as clean documents — measured, not assumed. That is the same class of
|
|
19
|
+
* failure as an identifier hidden inside HTML markup, and it landed on
|
|
20
|
+
* precisely the Arabic, Persian, Urdu, Hindi, Bengali and Thai users the
|
|
21
|
+
* multilingual work exists to serve.
|
|
22
|
+
*
|
|
23
|
+
* WHERE IT RUNS, and why last. After homoglyph folding, not before. Folding
|
|
24
|
+
* digits changes a token's script census — Arabic-Indic digits are Arabic,
|
|
25
|
+
* ASCII digits are not — so folding them earlier would alter the
|
|
26
|
+
* dominant-script decision that homoglyph folding depends on, and could flip
|
|
27
|
+
* a fold that D3 deliberately declines to make. Running afterwards leaves
|
|
28
|
+
* that decision on the original scripts. ASCII digits are NFKC-stable, so no
|
|
29
|
+
* further normalization pass is owed.
|
|
30
|
+
*
|
|
31
|
+
* THE USER'S TEXT IS NOT REWRITTEN. Folding happens in the NORMALIZED text
|
|
32
|
+
* only; masking edits the ORIGINAL through the offset map, so a Persian user
|
|
33
|
+
* sees their own digits back. That separation is the entire point of the
|
|
34
|
+
* offset-map contract.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
import { MappedTextBuilder, type StepChange, type TransformStepResult } from '../offsetMap.js';
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The first code point of every Unicode decimal-digit block.
|
|
41
|
+
*
|
|
42
|
+
* Each block is ten consecutive code points whose first has value zero, so a
|
|
43
|
+
* digit's value is `codePoint - blockZero`. Generated by scanning the whole
|
|
44
|
+
* code space for `\p{Nd}` runs of ten; 72 blocks in the Unicode version
|
|
45
|
+
* shipped with the runtime. Sorted, which `blockZeroFor` relies on.
|
|
46
|
+
*/
|
|
47
|
+
const DIGIT_BLOCK_ZEROS: readonly number[] = [
|
|
48
|
+
0x30, 0x660, 0x6f0, 0x7c0, 0x966, 0x9e6, 0xa66, 0xae6,
|
|
49
|
+
0xb66, 0xbe6, 0xc66, 0xce6, 0xd66, 0xde6, 0xe50, 0xed0,
|
|
50
|
+
0xf20, 0x1040, 0x1090, 0x17e0, 0x1810, 0x1946, 0x19d0, 0x1a80,
|
|
51
|
+
0x1a90, 0x1b50, 0x1bb0, 0x1c40, 0x1c50, 0xa620, 0xa8d0, 0xa900,
|
|
52
|
+
0xa9d0, 0xa9f0, 0xaa50, 0xabf0, 0xff10, 0x104a0, 0x10d30, 0x10d40,
|
|
53
|
+
0x11066, 0x110f0, 0x11136, 0x111d0, 0x112f0, 0x11450, 0x114d0, 0x11650,
|
|
54
|
+
0x116c0, 0x116d0, 0x11730, 0x118e0, 0x11950, 0x11bf0, 0x11c50, 0x11d50,
|
|
55
|
+
0x11da0, 0x11de0, 0x11f50, 0x16130, 0x16a60, 0x16ac0, 0x16b50, 0x16d70,
|
|
56
|
+
0x1ccf0, 0x1d7ce, 0x1e140, 0x1e2f0, 0x1e4f0, 0x1e5f1, 0x1e950, 0x1fbf0,
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
/** ASCII '0', whose block is skipped: it is already what we fold to. */
|
|
60
|
+
const ASCII_ZERO = 0x30;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The zero of the decimal-digit block containing `codePoint`, or undefined.
|
|
64
|
+
* Binary search over the sorted block list.
|
|
65
|
+
*/
|
|
66
|
+
function blockZeroFor(codePoint: number): number | undefined {
|
|
67
|
+
let low = 0;
|
|
68
|
+
let high = DIGIT_BLOCK_ZEROS.length - 1;
|
|
69
|
+
while (low <= high) {
|
|
70
|
+
const mid = (low + high) >> 1;
|
|
71
|
+
const zero = DIGIT_BLOCK_ZEROS[mid]!;
|
|
72
|
+
if (codePoint < zero) high = mid - 1;
|
|
73
|
+
else if (codePoint > zero + 9) low = mid + 1;
|
|
74
|
+
else return zero;
|
|
75
|
+
}
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** The ASCII digit for a code point, or undefined if it is not a decimal digit. */
|
|
80
|
+
export function asciiDigitFor(codePoint: number): string | undefined {
|
|
81
|
+
const zero = blockZeroFor(codePoint);
|
|
82
|
+
if (zero === undefined || zero === ASCII_ZERO) return undefined;
|
|
83
|
+
return String.fromCharCode(ASCII_ZERO + (codePoint - zero));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Fold every non-ASCII decimal digit to ASCII.
|
|
88
|
+
*
|
|
89
|
+
* Most blocks are BMP and fold one code unit to one, leaving offsets
|
|
90
|
+
* untouched. A few are astral (Osmanya, Brahmi, mathematical digits) and fold
|
|
91
|
+
* a surrogate PAIR to a single character, so this is not a 1:1 transform and
|
|
92
|
+
* goes through `MappedTextBuilder` rather than assuming equal lengths — the
|
|
93
|
+
* same machinery NFKC's expansions use.
|
|
94
|
+
*/
|
|
95
|
+
export function foldDigits(text: string): TransformStepResult | null {
|
|
96
|
+
// Fast path: the overwhelming majority of text has no non-ASCII digit, and
|
|
97
|
+
// must not pay for a builder or a map.
|
|
98
|
+
let first = -1;
|
|
99
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
100
|
+
const cp = text.codePointAt(i)!;
|
|
101
|
+
if (cp > 0xffff) i += 1;
|
|
102
|
+
if (cp !== ASCII_ZERO && asciiDigitFor(cp) !== undefined) {
|
|
103
|
+
first = i - (cp > 0xffff ? 1 : 0);
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (first === -1) return null;
|
|
108
|
+
|
|
109
|
+
const builder = new MappedTextBuilder();
|
|
110
|
+
const changes: StepChange[] = [];
|
|
111
|
+
let cursor = 0;
|
|
112
|
+
|
|
113
|
+
for (let i = first; i < text.length; i += 1) {
|
|
114
|
+
const codePoint = text.codePointAt(i)!;
|
|
115
|
+
const width = codePoint > 0xffff ? 2 : 1;
|
|
116
|
+
const replacement = asciiDigitFor(codePoint);
|
|
117
|
+
if (replacement === undefined) {
|
|
118
|
+
i += width - 1;
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
builder.copyVerbatim(text, cursor, i);
|
|
123
|
+
builder.replaceRange(replacement, i, i + width);
|
|
124
|
+
changes.push({
|
|
125
|
+
kind: 'fold-digits',
|
|
126
|
+
start: i,
|
|
127
|
+
end: i + width,
|
|
128
|
+
before: text.slice(i, i + width),
|
|
129
|
+
after: replacement,
|
|
130
|
+
});
|
|
131
|
+
cursor = i + width;
|
|
132
|
+
i += width - 1;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
builder.copyVerbatim(text, cursor, text.length);
|
|
136
|
+
const { text: out, map } = builder.finish(text.length);
|
|
137
|
+
return { text: out, map, changes };
|
|
138
|
+
}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transform 3: SELECTIVE HOMOGLYPH FOLDING.
|
|
3
|
+
*
|
|
4
|
+
* THE RULE — and why it is selective:
|
|
5
|
+
* Blanket folding would be a severe bug: folding every Cyrillic а to Latin a
|
|
6
|
+
* would turn an entire Russian document into unreadable Latin nonsense and
|
|
7
|
+
* destroy detection for every non-Latin user. A character is folded ONLY when
|
|
8
|
+
* it is script-anomalous within its own token:
|
|
9
|
+
*
|
|
10
|
+
* 1. Split the text into tokens on whitespace and punctuation.
|
|
11
|
+
* 2. Determine each token's dominant script (strict majority of its
|
|
12
|
+
* letters; neutral characters don't count).
|
|
13
|
+
* 3. Fold a character only if its script differs from the token's dominant
|
|
14
|
+
* script AND the confusables table gives it a mapping into that script.
|
|
15
|
+
*
|
|
16
|
+
* A token that is wholly Cyrillic / Greek / Arabic / … has no anomalous
|
|
17
|
+
* characters and is left completely untouched.
|
|
18
|
+
*
|
|
19
|
+
* • "pаssword" (Cyrillic а in a Latin token) → folds to "password".
|
|
20
|
+
* • "пароль" (ordinary Cyrillic word) → byte-identical.
|
|
21
|
+
*
|
|
22
|
+
* Mapping INTO the dominant script works in both directions:
|
|
23
|
+
* - directly: the character's Unicode skeleton is in the dominant script
|
|
24
|
+
* (Cyrillic а → skeleton "a", Latin) — replace with the skeleton;
|
|
25
|
+
* - via equivalence: some character OF the dominant script shares the same
|
|
26
|
+
* skeleton (Latin o inside a Greek token → Greek ο, whose skeleton is
|
|
27
|
+
* also "o") — replace with that character.
|
|
28
|
+
*
|
|
29
|
+
* Replacements are restricted to letters/marks/digits: a replacement that
|
|
30
|
+
* introduced punctuation or whitespace would change tokenization on a second
|
|
31
|
+
* pass and break idempotency.
|
|
32
|
+
*
|
|
33
|
+
* This transform runs AFTER NFKC, so the confusables data's skeletons are
|
|
34
|
+
* NFKC-normalized at generation time; normalize() additionally re-runs NFKC
|
|
35
|
+
* after folding (see normalization.ts) so a folded character can compose
|
|
36
|
+
* with a following combining mark exactly as it would have in pass one.
|
|
37
|
+
*/
|
|
38
|
+
import { CONFUSABLES, type ConfusableEntry } from '@discretion/data';
|
|
39
|
+
import { classifyCodePoint, scriptsCompatible } from '../scripts.js';
|
|
40
|
+
import type { ScriptName } from '../types.js';
|
|
41
|
+
import { MappedTextBuilder, type TransformStepResult, type StepChange } from '../offsetMap.js';
|
|
42
|
+
|
|
43
|
+
/** Tokens are maximal runs of characters that are neither whitespace nor punctuation. */
|
|
44
|
+
const TOKEN = /[^\s\p{P}]+/gu;
|
|
45
|
+
|
|
46
|
+
/** Replacements may only contain letters, combining marks, and digits. */
|
|
47
|
+
const SAFE_REPLACEMENT = /^[\p{L}\p{M}\p{N}]+$/u;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* skeleton → script → representative character of that script sharing the
|
|
51
|
+
* skeleton. Built lazily on first use from the confusables table (plus each
|
|
52
|
+
* skeleton itself as the representative of its own script). Where several
|
|
53
|
+
* characters of one script share a skeleton, the lowest code point wins so
|
|
54
|
+
* regeneration of the data cannot reorder results.
|
|
55
|
+
*/
|
|
56
|
+
let skeletonIndex: Map<string, Map<ScriptName, string>> | null = null;
|
|
57
|
+
|
|
58
|
+
function getSkeletonIndex(): Map<string, Map<ScriptName, string>> {
|
|
59
|
+
if (skeletonIndex) return skeletonIndex;
|
|
60
|
+
const index = new Map<string, Map<ScriptName, string>>();
|
|
61
|
+
const consider = (skeleton: string, script: ScriptName, repr: string): void => {
|
|
62
|
+
if (script === 'other') return;
|
|
63
|
+
// A representative becomes replacement text, so it must survive the rest
|
|
64
|
+
// of the pipeline unchanged: NFKC-stable (U+037A GREEK YPOGEGRAMMENI, for
|
|
65
|
+
// instance, decomposes to space + combining mark and would smuggle
|
|
66
|
+
// whitespace into a token) and free of punctuation/whitespace that would
|
|
67
|
+
// change tokenization on a second pass.
|
|
68
|
+
if (repr.normalize('NFKC') !== repr) return;
|
|
69
|
+
if (!SAFE_REPLACEMENT.test(repr)) return;
|
|
70
|
+
let byScript = index.get(skeleton);
|
|
71
|
+
if (!byScript) {
|
|
72
|
+
byScript = new Map<ScriptName, string>();
|
|
73
|
+
index.set(skeleton, byScript);
|
|
74
|
+
}
|
|
75
|
+
const existing = byScript.get(script);
|
|
76
|
+
if (existing === undefined || repr.codePointAt(0)! < existing.codePointAt(0)!) {
|
|
77
|
+
byScript.set(script, repr);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
for (const [cp, entry] of CONFUSABLES) {
|
|
81
|
+
// The confusable character itself represents its script for this skeleton…
|
|
82
|
+
consider(entry.skeleton, entry.sourceScript, String.fromCodePoint(cp));
|
|
83
|
+
// …and the skeleton represents its own script (preferred when reachable:
|
|
84
|
+
// for single-char skeletons it is usually the lowest code point anyway).
|
|
85
|
+
consider(entry.skeleton, entry.skeletonScript, entry.skeleton);
|
|
86
|
+
}
|
|
87
|
+
skeletonIndex = index;
|
|
88
|
+
return index;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Test hook: drop the memoized index (e.g. around mocked data). */
|
|
92
|
+
export function resetSkeletonIndexForTests(): void {
|
|
93
|
+
skeletonIndex = null;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* The replacement for folding `cp` into `dominant`, or null when the
|
|
98
|
+
* confusables table offers no mapping into that script.
|
|
99
|
+
*/
|
|
100
|
+
function foldTarget(cp: number, dominant: ScriptName): string | null {
|
|
101
|
+
const entry: ConfusableEntry | undefined = CONFUSABLES.get(cp);
|
|
102
|
+
// A character absent from the table is its own skeleton: it can still be
|
|
103
|
+
// the skeleton OF characters in the dominant script — e.g. Latin 'o' has
|
|
104
|
+
// no entry, but inside a Greek token it folds to Greek omicron, whose
|
|
105
|
+
// skeleton is 'o' (the equivalence direction).
|
|
106
|
+
const skeleton = entry ? entry.skeleton : String.fromCodePoint(cp);
|
|
107
|
+
let replacement: string | undefined;
|
|
108
|
+
if (entry && entry.skeletonScript === dominant) {
|
|
109
|
+
replacement = entry.skeleton;
|
|
110
|
+
} else {
|
|
111
|
+
replacement = getSkeletonIndex().get(skeleton)?.get(dominant);
|
|
112
|
+
}
|
|
113
|
+
if (replacement === undefined) return null;
|
|
114
|
+
if (replacement === String.fromCodePoint(cp)) return null; // no-op
|
|
115
|
+
// Defense in depth (the index already filters its representatives, and
|
|
116
|
+
// generated skeletons are NFKC-normalized): a replacement must not change
|
|
117
|
+
// tokenization or decay under the NFKC re-pass, or folding would not be
|
|
118
|
+
// idempotent.
|
|
119
|
+
if (!SAFE_REPLACEMENT.test(replacement)) return null;
|
|
120
|
+
if (replacement.normalize('NFKC') !== replacement) return null;
|
|
121
|
+
return replacement;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
interface Fold {
|
|
125
|
+
/** Offset of the character within the token. */
|
|
126
|
+
offset: number;
|
|
127
|
+
/** Length of the character in code units. */
|
|
128
|
+
length: number;
|
|
129
|
+
before: string;
|
|
130
|
+
after: string;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const ZWNJ = String.fromCharCode(0x200c);
|
|
134
|
+
|
|
135
|
+
/** Compute the folds for one token; empty when the token is not mixed-script. */
|
|
136
|
+
function computeFolds(token: string): Fold[] {
|
|
137
|
+
// A ZWNJ surviving the strip stage marks joining-script morphology
|
|
138
|
+
// (Persian, Hindi, …). Folding inside such a token could change the script
|
|
139
|
+
// of a ZWNJ neighbor and flip the preservation decision on the next pass —
|
|
140
|
+
// so these tokens are never folding candidates.
|
|
141
|
+
if (token.includes(ZWNJ)) return [];
|
|
142
|
+
|
|
143
|
+
// First pass: per-script letter counts to find the token's dominant script.
|
|
144
|
+
const counts = new Map<ScriptName, number>();
|
|
145
|
+
for (const char of token) {
|
|
146
|
+
const cls = classifyCodePoint(char.codePointAt(0)!);
|
|
147
|
+
if (cls === 'neutral' || cls === 'other') continue;
|
|
148
|
+
counts.set(cls, (counts.get(cls) ?? 0) + 1);
|
|
149
|
+
}
|
|
150
|
+
let dominant: ScriptName | null = null;
|
|
151
|
+
let best = 0;
|
|
152
|
+
let tied = false;
|
|
153
|
+
for (const [script, count] of counts) {
|
|
154
|
+
if (count > best) {
|
|
155
|
+
best = count;
|
|
156
|
+
dominant = script;
|
|
157
|
+
tied = false;
|
|
158
|
+
} else if (count === best) {
|
|
159
|
+
tied = true;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// No dominant script (all-neutral, unsupported-script, or tied token):
|
|
163
|
+
// be conservative and leave the token alone. The tie rule is ratified —
|
|
164
|
+
// an evenly split token gives no evidence of which script is "home".
|
|
165
|
+
if (dominant === null || tied) return [];
|
|
166
|
+
|
|
167
|
+
// Second pass: fold script-anomalous characters that can map into `dominant`.
|
|
168
|
+
const folds: Fold[] = [];
|
|
169
|
+
let offset = 0;
|
|
170
|
+
for (const char of token) {
|
|
171
|
+
const cp = char.codePointAt(0)!;
|
|
172
|
+
const cls = classifyCodePoint(cp);
|
|
173
|
+
// Neutral characters (digits, marks) are never anomalous. Letters of the
|
|
174
|
+
// dominant script — or of a script COMPATIBLE with it (Han/Kana/Latin in
|
|
175
|
+
// Japanese text, Hangul/Han in Korean; see scriptsCompatible) — are at
|
|
176
|
+
// home. Everything else, including letters of unsupported scripts like
|
|
177
|
+
// Cherokee (classified 'other'), is anomalous and folds if mappable.
|
|
178
|
+
if (cls !== 'neutral' && !scriptsCompatible(cls, dominant)) {
|
|
179
|
+
const after = foldTarget(cp, dominant);
|
|
180
|
+
if (after !== null) {
|
|
181
|
+
folds.push({ offset, length: char.length, before: char, after });
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
offset += char.length;
|
|
185
|
+
}
|
|
186
|
+
return folds;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export function foldHomoglyphs(text: string): TransformStepResult | null {
|
|
190
|
+
const builder = new MappedTextBuilder();
|
|
191
|
+
const changes: StepChange[] = [];
|
|
192
|
+
let cursor = 0;
|
|
193
|
+
|
|
194
|
+
TOKEN.lastIndex = 0;
|
|
195
|
+
for (const match of text.matchAll(TOKEN)) {
|
|
196
|
+
const token = match[0];
|
|
197
|
+
const tokenStart = match.index!;
|
|
198
|
+
const folds = computeFolds(token);
|
|
199
|
+
if (folds.length === 0) continue;
|
|
200
|
+
// Copy everything between the previous fold and this token, then splice
|
|
201
|
+
// the folds in at their exact offsets.
|
|
202
|
+
for (const fold of folds) {
|
|
203
|
+
const foldStart = tokenStart + fold.offset;
|
|
204
|
+
builder.copyVerbatim(text, cursor, foldStart);
|
|
205
|
+
builder.replaceRange(fold.after, foldStart, foldStart + fold.length);
|
|
206
|
+
changes.push({
|
|
207
|
+
kind: 'homoglyph-fold',
|
|
208
|
+
start: foldStart,
|
|
209
|
+
end: foldStart + fold.length,
|
|
210
|
+
before: fold.before,
|
|
211
|
+
after: fold.after,
|
|
212
|
+
});
|
|
213
|
+
cursor = foldStart + fold.length;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (changes.length === 0) return null;
|
|
217
|
+
|
|
218
|
+
builder.copyVerbatim(text, cursor, text.length);
|
|
219
|
+
const { text: out, map } = builder.finish(text.length);
|
|
220
|
+
return { text: out, map, changes };
|
|
221
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transform 2: UNICODE NFKC, applied PER GRAPHEME CLUSTER.
|
|
3
|
+
*
|
|
4
|
+
* Normalizing cluster-by-cluster is what makes an exact offset map possible:
|
|
5
|
+
* each cluster's output is recorded against that cluster's input range as we
|
|
6
|
+
* go. (Normalizing the whole string at once and reconstructing the alignment
|
|
7
|
+
* afterwards is guesswork — expansions, contractions and reorderings make the
|
|
8
|
+
* aligned diff ambiguous — so it is deliberately NOT done that way.)
|
|
9
|
+
*
|
|
10
|
+
* Cluster-local NFKC is sound because canonical composition only happens
|
|
11
|
+
* between a base and its combining marks, and UAX #29 never splits a base
|
|
12
|
+
* from its marks (nor a Hangul jamo sequence) across cluster boundaries.
|
|
13
|
+
*
|
|
14
|
+
* Expansions (fi → "fi", ½ → "1⁄2"): every output unit maps to the cluster
|
|
15
|
+
* start. Contractions (e + U+0301 → é): the single output unit maps to the
|
|
16
|
+
* cluster start and the sentinel/next cluster provides the end.
|
|
17
|
+
*/
|
|
18
|
+
import { MappedTextBuilder, type TransformStepResult, type StepChange } from '../offsetMap.js';
|
|
19
|
+
import { graphemeSegmenter } from './graphemes.js';
|
|
20
|
+
|
|
21
|
+
export function nfkcByGrapheme(text: string): TransformStepResult | null {
|
|
22
|
+
// Fast path: already NFKC-normalized (covers pure ASCII instantly).
|
|
23
|
+
if (text.normalize('NFKC') === text) return null;
|
|
24
|
+
|
|
25
|
+
const builder = new MappedTextBuilder();
|
|
26
|
+
const changes: StepChange[] = [];
|
|
27
|
+
|
|
28
|
+
for (const { segment, index } of graphemeSegmenter.segment(text)) {
|
|
29
|
+
const segmentEnd = index + segment.length;
|
|
30
|
+
const normalized = segment.normalize('NFKC');
|
|
31
|
+
if (normalized === segment) {
|
|
32
|
+
builder.copyVerbatim(text, index, segmentEnd);
|
|
33
|
+
} else {
|
|
34
|
+
builder.replaceRange(normalized, index, segmentEnd);
|
|
35
|
+
changes.push({
|
|
36
|
+
kind: 'nfkc',
|
|
37
|
+
start: index,
|
|
38
|
+
end: segmentEnd,
|
|
39
|
+
before: segment,
|
|
40
|
+
after: normalized,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (changes.length === 0) return null;
|
|
46
|
+
const { text: out, map } = builder.finish(text.length);
|
|
47
|
+
return { text: out, map, changes };
|
|
48
|
+
}
|