@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,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The surrogate registry: given a detected entity, produce a same-shape
|
|
3
|
+
* replacement value.
|
|
4
|
+
*
|
|
5
|
+
* SPEC.md, substitution: replace a value with "a realistic value of the same
|
|
6
|
+
* type and shape" so the model reasons over coherent text, and for
|
|
7
|
+
* identifiers "a value passing that country's checksum, so downstream
|
|
8
|
+
* validation in the model's reasoning still behaves". We reuse the M2/M3
|
|
9
|
+
* generators as the source — a surrogate IBAN needs exactly the checksum
|
|
10
|
+
* validity a real one has, and that generator already exists.
|
|
11
|
+
*
|
|
12
|
+
* Two SPEC judgement calls, recorded in ARCHITECTURE.md D12:
|
|
13
|
+
*
|
|
14
|
+
* • "Same country / same issuer." Honored where the detector's metadata
|
|
15
|
+
* carries it: IBAN → same country, CREDIT_CARD → same issuer, national
|
|
16
|
+
* identifiers → the SAME scheme's generator (a TCKN surrogate for a TCKN),
|
|
17
|
+
* VAT → same member state, crypto → same chain, IP → same version.
|
|
18
|
+
*
|
|
19
|
+
* • "SECRET → a same-shape dummy that is clearly non-functional." The reused
|
|
20
|
+
* generators produce syntactically valid but RANDOM values (a JWT with a
|
|
21
|
+
* random signature, a PEM with a random body, a provider token with a
|
|
22
|
+
* random body) — non-functional because random, not because marked. That
|
|
23
|
+
* satisfies "non-functional"; if a visibly-marked dummy is later wanted it
|
|
24
|
+
* is a pool swap, not a structural change. Flagged, not silently resolved.
|
|
25
|
+
*
|
|
26
|
+
* `chooseSurrogate` returns `null` when no sensible surrogate exists for the
|
|
27
|
+
* type — the masker then falls back to a bracket token and records it, per
|
|
28
|
+
* SPEC.md's FALLBACK rule.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import * as generate from '../generate/index.js';
|
|
32
|
+
import { detectScripts } from '../scripts.js';
|
|
33
|
+
import type { EntityType, ScriptName } from '../types.js';
|
|
34
|
+
import { PERSON_POOLS, DEFAULT_PERSON_POOL, ORG_POOL, LOCATION_POOL } from './surrogatePools.js';
|
|
35
|
+
|
|
36
|
+
const g = generate;
|
|
37
|
+
|
|
38
|
+
/** What the masker gives the registry about one detected value. */
|
|
39
|
+
export interface SurrogateRequest {
|
|
40
|
+
readonly type: EntityType;
|
|
41
|
+
/** The matched text (normalized). Used for shape and script inference. */
|
|
42
|
+
readonly text: string;
|
|
43
|
+
/** Detector metadata: scheme, country, issuer, chain, version, kind. */
|
|
44
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const meta = (req: SurrogateRequest, key: string): string | undefined => {
|
|
48
|
+
const v = req.metadata?.[key];
|
|
49
|
+
return typeof v === 'string' ? v : undefined;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/** National/tax/vat scheme → the generator that produces a valid instance. */
|
|
53
|
+
const SCHEME_GENERATORS: Readonly<Record<string, (seed: number) => string>> = {
|
|
54
|
+
ssn: g.generateValidSsn, sin: g.generateValidSin, nino: g.generateValidNino, nhs: g.generateValidNhs,
|
|
55
|
+
pps: g.generateValidPps, 'steuer-id': g.generateValidSteuerId, personalausweis: g.generateValidAusweis,
|
|
56
|
+
nir: g.generateValidNir, dni: g.generateValidDni, nie: g.generateValidNie,
|
|
57
|
+
'codice-fiscale': g.generateValidCodiceFiscale, bsn: g.generateValidBsn, rijksregister: g.generateValidBeRrn,
|
|
58
|
+
pesel: g.generateValidPesel, nip: g.generateValidNip, regon: g.generateValidRegon,
|
|
59
|
+
personnummer: g.generateValidPersonnummer, fodselsnummer: g.generateValidFodselsnummer, cpr: g.generateValidCpr,
|
|
60
|
+
hetu: g.generateValidHetu, kennitala: g.generateValidKennitala, nif: g.generateValidPtNif, afm: g.generateValidAfm,
|
|
61
|
+
'rodne-cislo': g.generateValidRodneCislo, 'szemelyi-szam': g.generateValidSzemelyi, cnp: g.generateValidCnp,
|
|
62
|
+
egn: g.generateValidEgn, oib: g.generateValidOib, emso: g.generateValidEmso, tckn: g.generateValidTckn,
|
|
63
|
+
vkn: g.generateValidVkn, inn: g.generateValidInn12, snils: g.generateValidSnils, rnokpp: g.generateValidRnokpp,
|
|
64
|
+
iin: g.generateValidIin, 'teudat-zehut': g.generateValidTeudatZehut, 'saudi-id': g.generateValidSaudiId,
|
|
65
|
+
'emirates-id': g.generateValidEmiratesId, qid: g.generateValidQid, 'civil-id': g.generateValidKwCivilId,
|
|
66
|
+
aadhaar: g.generateValidAadhaar, pan: g.generateValidPan, ric: g.generateValidRic, 'tw-id': g.generateValidTwId,
|
|
67
|
+
'my-number': g.generateValidMyNumber, rrn: g.generateValidKrRrn, nric: g.generateValidNric, hkid: g.generateValidHkid,
|
|
68
|
+
cnic: g.generateValidCnic, nid: g.generateValidBdNid, mykad: g.generateValidMykad, nik: g.generateValidNik,
|
|
69
|
+
'thai-id': g.generateValidThaiId, cccd: g.generateValidCccd, psn: g.generateValidPsn, tfn: g.generateValidTfn,
|
|
70
|
+
medicare: g.generateValidMedicare, abn: g.generateValidAbn, ird: g.generateValidIrd, cpf: g.generateValidCpf,
|
|
71
|
+
cnpj: g.generateValidCnpj, curp: g.generateValidCurp, rfc: g.generateValidRfc, cuit: g.generateValidCuit,
|
|
72
|
+
rut: g.generateValidRut, nit: g.generateValidNit, 'za-id': g.generateValidZaId,
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/** Bare-number schemes whose detector span is value-only but whose generator
|
|
76
|
+
* emits a label — produce the bare value directly. */
|
|
77
|
+
const BARE_VALUE_SCHEMES: Readonly<Record<string, (seed: number) => string>> = {
|
|
78
|
+
cnie: (s) => {
|
|
79
|
+
const rng = g.mulberry32(s);
|
|
80
|
+
const L = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
81
|
+
const prefix = rng() < 0.5 ? L[Math.floor(rng() * 26)]! : L[Math.floor(rng() * 26)]! + L[Math.floor(rng() * 26)]!;
|
|
82
|
+
let d = '';
|
|
83
|
+
for (let i = 0; i < 6; i++) d += Math.floor(rng() * 10);
|
|
84
|
+
return `${prefix}${d}`;
|
|
85
|
+
},
|
|
86
|
+
nin: (s) => {
|
|
87
|
+
const rng = g.mulberry32(s);
|
|
88
|
+
let d = '';
|
|
89
|
+
for (let i = 0; i < 11; i++) d += Math.floor(rng() * 10);
|
|
90
|
+
return d;
|
|
91
|
+
},
|
|
92
|
+
'ke-id': (s) => {
|
|
93
|
+
const rng = g.mulberry32(s);
|
|
94
|
+
let d = '';
|
|
95
|
+
for (let i = 0; i < 8; i++) d += Math.floor(rng() * 10);
|
|
96
|
+
return d;
|
|
97
|
+
},
|
|
98
|
+
'ar-dni': (s) => {
|
|
99
|
+
const rng = g.mulberry32(s);
|
|
100
|
+
const n = 10_000_000 + Math.floor(rng() * 89_999_999);
|
|
101
|
+
return String(n).replace(/\B(?=(\d{3})+(?!\d))/g, '.');
|
|
102
|
+
},
|
|
103
|
+
'pe-dni': (s) => {
|
|
104
|
+
const rng = g.mulberry32(s);
|
|
105
|
+
let d = '';
|
|
106
|
+
for (let i = 0; i < 8; i++) d += Math.floor(rng() * 10);
|
|
107
|
+
return d;
|
|
108
|
+
},
|
|
109
|
+
agencia: (s) => {
|
|
110
|
+
const rng = g.mulberry32(s);
|
|
111
|
+
let d = '';
|
|
112
|
+
for (let i = 0; i < 4; i++) d += Math.floor(rng() * 10);
|
|
113
|
+
return rng() < 0.4 ? `${d}-${Math.floor(rng() * 10)}` : d;
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/** Dominant script of the detected text, for PERSON surrogate matching. */
|
|
118
|
+
function scriptOf(text: string): ScriptName {
|
|
119
|
+
return detectScripts(text).dominant ?? 'latin';
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function personSurrogate(text: string, seed: number): string {
|
|
123
|
+
const script = scriptOf(text);
|
|
124
|
+
const pool = PERSON_POOLS.find((p) => p.script === script) ?? DEFAULT_PERSON_POOL;
|
|
125
|
+
const rng = g.mulberry32(seed);
|
|
126
|
+
const given = pool.given[Math.floor(rng() * pool.given.length)]!;
|
|
127
|
+
const surname = pool.surnames[Math.floor(rng() * pool.surnames.length)]!;
|
|
128
|
+
return pool.order === 'given-first' ? `${given}${pool.sep}${surname}` : `${surname}${pool.sep}${given}`;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** A plausible ICD-10 code (letter + 2 digits + optional .subcode). */
|
|
132
|
+
function icd10Surrogate(seed: number): string {
|
|
133
|
+
const rng = g.mulberry32(seed);
|
|
134
|
+
const letters = 'ABCDEFGHIJKLMNOPRSTUVWXYZ';
|
|
135
|
+
const head = `${letters[Math.floor(rng() * letters.length)]}${Math.floor(rng() * 10)}${Math.floor(rng() * 10)}`;
|
|
136
|
+
return rng() < 0.6 ? `${head}.${Math.floor(rng() * 10)}` : head;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Choose a surrogate for a detected entity. Returns the surrogate string, or
|
|
141
|
+
* `null` when the type has no sensible surrogate (masker → bracket token).
|
|
142
|
+
* `seed` varies across collision retries so a fresh value is produced.
|
|
143
|
+
*/
|
|
144
|
+
export function chooseSurrogate(req: SurrogateRequest, seed: number): string | null {
|
|
145
|
+
switch (req.type) {
|
|
146
|
+
case 'EMAIL':
|
|
147
|
+
return g.generateValidEmail(seed);
|
|
148
|
+
case 'PHONE':
|
|
149
|
+
return g.generateValidPhone(seed);
|
|
150
|
+
case 'IP_ADDRESS':
|
|
151
|
+
return meta(req, 'version') === '6' || req.text.includes(':')
|
|
152
|
+
? g.generateValidIpv6(seed)
|
|
153
|
+
: g.generateValidIpv4(seed);
|
|
154
|
+
case 'MAC_ADDRESS':
|
|
155
|
+
return g.generateValidMac(seed);
|
|
156
|
+
case 'URL_WITH_CREDENTIALS':
|
|
157
|
+
return g.generateValidCredentialUrl(seed);
|
|
158
|
+
case 'CREDIT_CARD':
|
|
159
|
+
return g.generateValidCardForIssuer(meta(req, 'issuer') ?? 'visa', seed);
|
|
160
|
+
case 'IBAN': {
|
|
161
|
+
const country = meta(req, 'country') ?? req.text.slice(0, 2).toUpperCase();
|
|
162
|
+
return g.generateValidIbanForCountry(country, seed);
|
|
163
|
+
}
|
|
164
|
+
case 'SWIFT_BIC':
|
|
165
|
+
return g.generateValidBic(seed);
|
|
166
|
+
case 'US_ROUTING_NUMBER':
|
|
167
|
+
return g.generateValidRouting(seed);
|
|
168
|
+
case 'UK_SORT_CODE':
|
|
169
|
+
return g.generateValidSortCode(seed);
|
|
170
|
+
case 'CA_TRANSIT_NUMBER':
|
|
171
|
+
return g.generateValidTransit(seed);
|
|
172
|
+
case 'AU_BSB':
|
|
173
|
+
return g.generateValidBsb(seed);
|
|
174
|
+
case 'IN_IFSC':
|
|
175
|
+
return g.generateValidIfsc(seed);
|
|
176
|
+
case 'BR_AGENCIA':
|
|
177
|
+
return BARE_VALUE_SCHEMES['agencia']!(seed);
|
|
178
|
+
case 'CRYPTO_WALLET': {
|
|
179
|
+
const chain = meta(req, 'chain');
|
|
180
|
+
const byChain: Record<string, (s: number) => string> = {
|
|
181
|
+
btc: g.generateValidBtc, eth: g.generateValidEth, ltc: g.generateValidLtc, trx: g.generateValidTrx,
|
|
182
|
+
xmr: g.generateValidXmr, sol: g.generateValidSol, ada: g.generateValidAda, dot: g.generateValidDot,
|
|
183
|
+
};
|
|
184
|
+
return (chain !== undefined ? byChain[chain] : undefined)?.(seed) ?? g.generateValidBtc(seed);
|
|
185
|
+
}
|
|
186
|
+
case 'API_KEY':
|
|
187
|
+
return g.generateValidProviderToken(seed);
|
|
188
|
+
case 'JWT':
|
|
189
|
+
return g.generateValidJwt(seed);
|
|
190
|
+
case 'PRIVATE_KEY':
|
|
191
|
+
return g.generateValidPem(seed);
|
|
192
|
+
case 'GENERIC_SECRET':
|
|
193
|
+
return g.generateHighEntropySecret(seed);
|
|
194
|
+
case 'CONNECTION_STRING':
|
|
195
|
+
return g.generateValidConnectionString(seed);
|
|
196
|
+
case 'PASSPORT_MRZ':
|
|
197
|
+
return g.generateValidTd3(seed);
|
|
198
|
+
case 'DRIVERS_LICENSE':
|
|
199
|
+
return g.generateValidDvla(seed);
|
|
200
|
+
case 'VIN':
|
|
201
|
+
return g.generateValidVin(seed);
|
|
202
|
+
case 'US_NPI':
|
|
203
|
+
return g.generateValidNpi(seed);
|
|
204
|
+
case 'HEALTH_DATA': {
|
|
205
|
+
const kind = meta(req, 'kind');
|
|
206
|
+
if (kind === 'snomed') return g.generateValidSctid(seed);
|
|
207
|
+
if (kind === 'lab-result') return g.generateValidLabResult(seed);
|
|
208
|
+
if (kind === 'icd10') return icd10Surrogate(seed);
|
|
209
|
+
return null; // bare-number SNOMED without kind, or an unmodeled shape
|
|
210
|
+
}
|
|
211
|
+
case 'POSTAL_CODE':
|
|
212
|
+
return g.generateValidPostal(seed);
|
|
213
|
+
case 'STREET_ADDRESS':
|
|
214
|
+
return g.generateValidStreet(seed);
|
|
215
|
+
case 'COORDINATES':
|
|
216
|
+
return g.generateValidCoordinates(seed);
|
|
217
|
+
case 'NATIONAL_ID':
|
|
218
|
+
case 'TAX_ID': {
|
|
219
|
+
const scheme = meta(req, 'scheme');
|
|
220
|
+
if (scheme !== undefined) {
|
|
221
|
+
const bare = BARE_VALUE_SCHEMES[scheme];
|
|
222
|
+
if (bare !== undefined) return bare(seed);
|
|
223
|
+
const gen = SCHEME_GENERATORS[scheme];
|
|
224
|
+
if (gen !== undefined) return gen(seed);
|
|
225
|
+
}
|
|
226
|
+
return null; // unknown scheme → token
|
|
227
|
+
}
|
|
228
|
+
case 'VAT_NUMBER': {
|
|
229
|
+
const country = meta(req, 'country') ?? req.text.slice(0, 2).toUpperCase();
|
|
230
|
+
const c = country === 'GR' ? 'EL' : country;
|
|
231
|
+
if (g.VAT_COUNTRIES.includes(c)) return g.generateValidVatFor(c, seed);
|
|
232
|
+
return g.generateValidEuVat(seed);
|
|
233
|
+
}
|
|
234
|
+
case 'PERSON':
|
|
235
|
+
return personSurrogate(req.text, seed);
|
|
236
|
+
case 'ORG':
|
|
237
|
+
return ORG_POOL[seed % ORG_POOL.length]!;
|
|
238
|
+
case 'LOCATION':
|
|
239
|
+
return LOCATION_POOL[seed % LOCATION_POOL.length]!;
|
|
240
|
+
case 'DATE_OF_BIRTH':
|
|
241
|
+
// Ordering-preserving date shifting needs a date detector (absent until
|
|
242
|
+
// a later milestone) and a session offset; until then no surrogate,
|
|
243
|
+
// so the masker uses a token. Recorded in ARCHITECTURE.md D12.
|
|
244
|
+
return null;
|
|
245
|
+
default:
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vault.ts — the in-memory bidirectional map between originals and their
|
|
3
|
+
* replacements.
|
|
4
|
+
*
|
|
5
|
+
* SPEC.md contract: deterministic and referentially consistent; normalized
|
|
6
|
+
* lookup so trivial variants (case, surrounding whitespace) resolve to one
|
|
7
|
+
* entry; clear() wipes it; and NO method exposes the full plaintext set
|
|
8
|
+
* except the egress guard, which needs it.
|
|
9
|
+
*
|
|
10
|
+
* That last rule is enforced by shape, not convention: the only bulk
|
|
11
|
+
* accessor is `createEgressAuditor()`, which returns a capability object
|
|
12
|
+
* whose sole consumer is `guardEgress`. Every other read requires already
|
|
13
|
+
* knowing the value being looked up (`getByOriginal`) or holds no plaintext
|
|
14
|
+
* (`getBySurrogate` returns the entry, whose `original` the restorer needs
|
|
15
|
+
* one at a time — that is restoration's whole job). There is deliberately
|
|
16
|
+
* no `entries()` / iteration API. (TypeScript cannot stop a caller from
|
|
17
|
+
* invoking the auditor factory, but the single, loudly-named door makes any
|
|
18
|
+
* misuse a visible code-review event rather than an accident. Recorded in
|
|
19
|
+
* ARCHITECTURE.md D11.)
|
|
20
|
+
*
|
|
21
|
+
* NORMALIZED LOOKUP is deliberately conservative. The lookup key folds
|
|
22
|
+
* case and trims/collapses whitespace, but a normalized key may be shared
|
|
23
|
+
* by DIFFERENT exact originals (two base58 values differing only in case
|
|
24
|
+
* are different values). The exact map always wins; the normalized index
|
|
25
|
+
* resolves a variant only when it maps to exactly one entry — an ambiguous
|
|
26
|
+
* normalized hit returns undefined rather than guessing.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import type { EntityType, VaultEntry } from '../types.js';
|
|
30
|
+
|
|
31
|
+
/** Case-folded, trimmed, inner-whitespace-collapsed lookup key. */
|
|
32
|
+
export function normalizedKey(value: string): string {
|
|
33
|
+
return value.trim().replace(/\s+/g, ' ').toLowerCase();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** What the egress guard receives: the one deliberate door to plaintext. */
|
|
37
|
+
export interface EgressAuditor {
|
|
38
|
+
/** Every entry: (exact original, canonical, id, type). Guard-only. */
|
|
39
|
+
auditEntries(): readonly { original: string; canonical: string; id: string; type: EntityType }[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export class Vault {
|
|
43
|
+
private readonly byOriginal = new Map<string, VaultEntry>();
|
|
44
|
+
private readonly byCanonical = new Map<string, VaultEntry>();
|
|
45
|
+
private readonly byNormalized = new Map<string, Set<VaultEntry>>();
|
|
46
|
+
private readonly byReplacement = new Map<string, VaultEntry>();
|
|
47
|
+
private counter = 0;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Register a new masked value. The caller (the masker) has already
|
|
51
|
+
* resolved consistency — `register` throws on a duplicate original or
|
|
52
|
+
* replacement rather than silently merging, because reaching that point
|
|
53
|
+
* means the masker's lookup logic is broken and restoration would be
|
|
54
|
+
* ambiguous.
|
|
55
|
+
*/
|
|
56
|
+
register(entry: Omit<VaultEntry, 'id' | 'createdAt'>): VaultEntry {
|
|
57
|
+
if (this.byOriginal.has(entry.original)) {
|
|
58
|
+
throw new Error('vault: original already registered');
|
|
59
|
+
}
|
|
60
|
+
if (this.byReplacement.has(entry.replacement)) {
|
|
61
|
+
throw new Error('vault: replacement already in use');
|
|
62
|
+
}
|
|
63
|
+
const full: VaultEntry = {
|
|
64
|
+
...entry,
|
|
65
|
+
id: `v${++this.counter}`,
|
|
66
|
+
createdAt: Date.now(),
|
|
67
|
+
};
|
|
68
|
+
this.byOriginal.set(full.original, full);
|
|
69
|
+
if (full.canonical !== undefined) {
|
|
70
|
+
if (!this.byCanonical.has(full.canonical)) this.byCanonical.set(full.canonical, full);
|
|
71
|
+
}
|
|
72
|
+
const key = normalizedKey(full.original);
|
|
73
|
+
let set = this.byNormalized.get(key);
|
|
74
|
+
if (set === undefined) {
|
|
75
|
+
set = new Set();
|
|
76
|
+
this.byNormalized.set(key, set);
|
|
77
|
+
}
|
|
78
|
+
set.add(full);
|
|
79
|
+
this.byReplacement.set(full.replacement, full);
|
|
80
|
+
return full;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Find the entry for an original: exact writing first, then the
|
|
85
|
+
* detector's canonical form (separator variants of one identifier), then
|
|
86
|
+
* the case/whitespace-normalized index — which only resolves when
|
|
87
|
+
* unambiguous.
|
|
88
|
+
*/
|
|
89
|
+
getByOriginal(original: string, canonical?: string): VaultEntry | undefined {
|
|
90
|
+
const exact = this.byOriginal.get(original);
|
|
91
|
+
if (exact !== undefined) return exact;
|
|
92
|
+
if (canonical !== undefined) {
|
|
93
|
+
const viaCanonical = this.byCanonical.get(canonical);
|
|
94
|
+
if (viaCanonical !== undefined) return viaCanonical;
|
|
95
|
+
}
|
|
96
|
+
const set = this.byNormalized.get(normalizedKey(original));
|
|
97
|
+
if (set !== undefined && set.size === 1) {
|
|
98
|
+
return set.values().next().value;
|
|
99
|
+
}
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Find the entry whose replacement is exactly `replacement`. */
|
|
104
|
+
getBySurrogate(replacement: string): VaultEntry | undefined {
|
|
105
|
+
return this.byReplacement.get(replacement);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** True when `value` is already in use as a replacement or an original —
|
|
109
|
+
* the collision check surrogate selection runs before committing. */
|
|
110
|
+
wouldCollide(value: string): boolean {
|
|
111
|
+
if (this.byReplacement.has(value)) return true;
|
|
112
|
+
if (this.byOriginal.has(value)) return true;
|
|
113
|
+
// Case-insensitive replacement uniqueness: the restorer's fuzzy pass
|
|
114
|
+
// (case-changed surrogates) is only sound when no two replacements
|
|
115
|
+
// collide case-insensitively.
|
|
116
|
+
const key = normalizedKey(value);
|
|
117
|
+
for (const replacement of this.byReplacement.keys()) {
|
|
118
|
+
if (normalizedKey(replacement) === key) return true;
|
|
119
|
+
}
|
|
120
|
+
return this.byNormalized.has(key);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** All current replacements (surrogates/tokens) — contains no originals;
|
|
124
|
+
* the restorer builds its match tables from this. */
|
|
125
|
+
replacements(): readonly string[] {
|
|
126
|
+
return [...this.byReplacement.keys()];
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
get size(): number {
|
|
130
|
+
return this.byOriginal.size;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Wipe everything. Called on navigation away and conversation switch. */
|
|
134
|
+
clear(): void {
|
|
135
|
+
this.byOriginal.clear();
|
|
136
|
+
this.byCanonical.clear();
|
|
137
|
+
this.byNormalized.clear();
|
|
138
|
+
this.byReplacement.clear();
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** THE one deliberate door to the plaintext set. Egress guard only. */
|
|
142
|
+
createEgressAuditor(): EgressAuditor {
|
|
143
|
+
return {
|
|
144
|
+
auditEntries: () =>
|
|
145
|
+
[...this.byOriginal.values()].map((e) => ({
|
|
146
|
+
original: e.original,
|
|
147
|
+
canonical: e.canonical ?? e.original,
|
|
148
|
+
id: e.id,
|
|
149
|
+
type: e.type,
|
|
150
|
+
})),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
package/src/ner/align.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* align.ts — map model token pieces back to exact character spans.
|
|
3
|
+
*
|
|
4
|
+
* Transformers.js exposes no offset mapping, so spans are recovered by
|
|
5
|
+
* scanning the input LEFT TO RIGHT and matching each piece at (or just
|
|
6
|
+
* after) the cursor. This is exact for pieces that are verbatim substrings
|
|
7
|
+
* — the overwhelming case, since Stage 2 runs on Stage-0-normalized text
|
|
8
|
+
* and the candidate models' tokenizers (mBERT WordPiece, XLM-R
|
|
9
|
+
* SentencePiece) do NFKC-compatible normalization the input has already
|
|
10
|
+
* been through. The exceptions are handled explicitly:
|
|
11
|
+
*
|
|
12
|
+
* • '##piece' — WordPiece continuation: match the bare piece.
|
|
13
|
+
* • '▁piece' — SentencePiece word start: match the bare piece ('▁'
|
|
14
|
+
* alone is a zero-width word boundary).
|
|
15
|
+
* • '[UNK]' / '<unk>' — unlocatable: recorded as zero-width at the
|
|
16
|
+
* cursor; the entity merger bridges across them.
|
|
17
|
+
* • normalization stragglers — a bounded forward search (SEARCH_WINDOW)
|
|
18
|
+
* recovers when the tokenizer skipped or rewrote a
|
|
19
|
+
* character; a piece not found within the window is
|
|
20
|
+
* treated like [UNK] rather than being guessed at.
|
|
21
|
+
*
|
|
22
|
+
* Whitespace between pieces is consumed by skipping it before each match.
|
|
23
|
+
* Greedy left-to-right matching is order-safe because pieces arrive in
|
|
24
|
+
* input order.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/** How far past the cursor a piece may be found before we refuse to guess. */
|
|
28
|
+
const SEARCH_WINDOW = 24;
|
|
29
|
+
|
|
30
|
+
const UNKNOWN_PIECES = new Set(['[UNK]', '<unk>']);
|
|
31
|
+
|
|
32
|
+
export interface AlignedPiece {
|
|
33
|
+
/** Start offset in the input (inclusive); equals `end` when unlocated. */
|
|
34
|
+
readonly start: number;
|
|
35
|
+
/** End offset in the input (exclusive). */
|
|
36
|
+
readonly end: number;
|
|
37
|
+
/** False for [UNK]/unfindable pieces — zero-width placeholders. */
|
|
38
|
+
readonly located: boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const WHITESPACE = /\s/;
|
|
42
|
+
|
|
43
|
+
function skipWhitespace(text: string, from: number): number {
|
|
44
|
+
let i = from;
|
|
45
|
+
while (i < text.length && WHITESPACE.test(text[i]!)) i += 1;
|
|
46
|
+
return i;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Strip subword markers down to the piece's surface text. */
|
|
50
|
+
function surfaceOf(piece: string): string {
|
|
51
|
+
if (piece.startsWith('##')) return piece.slice(2);
|
|
52
|
+
if (piece.startsWith('▁')) return piece.slice(1); // '▁'
|
|
53
|
+
return piece;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Align every piece to its character span in `text`. */
|
|
57
|
+
export function alignPieces(text: string, pieces: readonly string[]): AlignedPiece[] {
|
|
58
|
+
const aligned: AlignedPiece[] = [];
|
|
59
|
+
let cursor = 0;
|
|
60
|
+
|
|
61
|
+
for (const raw of pieces) {
|
|
62
|
+
const piece = surfaceOf(raw);
|
|
63
|
+
if (piece.length === 0 || UNKNOWN_PIECES.has(raw)) {
|
|
64
|
+
aligned.push({ start: cursor, end: cursor, located: false });
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const from = skipWhitespace(text, cursor);
|
|
69
|
+
let at = -1;
|
|
70
|
+
if (text.startsWith(piece, from)) {
|
|
71
|
+
at = from;
|
|
72
|
+
} else {
|
|
73
|
+
const found = text.indexOf(piece, from);
|
|
74
|
+
if (found !== -1 && found - from <= SEARCH_WINDOW) at = found;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (at === -1) {
|
|
78
|
+
aligned.push({ start: cursor, end: cursor, located: false });
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
aligned.push({ start: at, end: at + piece.length, located: true });
|
|
82
|
+
cursor = at + piece.length;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return aligned;
|
|
86
|
+
}
|
package/src/ner/chunk.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* chunk.ts — window long inputs so the model sees ALL of the text.
|
|
3
|
+
*
|
|
4
|
+
* Transformer runtimes silently truncate past their token limit (verified
|
|
5
|
+
* against the actual runtime: a 3000-character input stopped producing
|
|
6
|
+
* predictions at token 512 with no error). Undetected text would be
|
|
7
|
+
* undetected sensitive data, so the engine windows the input in CHARACTER
|
|
8
|
+
* units — safe because the worst tokenizer ratio is one token per
|
|
9
|
+
* character (CJK) — with an overlap wide enough that any entity split by
|
|
10
|
+
* one window boundary lies fully inside a neighbouring window.
|
|
11
|
+
*
|
|
12
|
+
* De-duplication rule for the overlap: a window "owns" the entities whose
|
|
13
|
+
* span midpoint falls in its core (the window minus half an overlap at
|
|
14
|
+
* each interior edge). Every midpoint lands in exactly one core, so each
|
|
15
|
+
* entity is emitted exactly once, and — because overlap/2 exceeds any
|
|
16
|
+
* plausible entity length — the owning window saw the whole entity.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
export interface Chunk {
|
|
20
|
+
/** Offset of this window's first character in the full text. */
|
|
21
|
+
readonly offset: number;
|
|
22
|
+
readonly text: string;
|
|
23
|
+
/** Core region (absolute offsets): this window owns midpoints in it. */
|
|
24
|
+
readonly coreStart: number;
|
|
25
|
+
readonly coreEnd: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Look this far back from a hard cut for a whitespace break. */
|
|
29
|
+
const BREAK_LOOKBACK = 80;
|
|
30
|
+
|
|
31
|
+
export function chunkText(text: string, maxChars: number, overlapChars: number): Chunk[] {
|
|
32
|
+
if (maxChars <= overlapChars * 2) {
|
|
33
|
+
throw new Error(`chunkText: maxChars ${maxChars} must exceed twice the overlap ${overlapChars}`);
|
|
34
|
+
}
|
|
35
|
+
if (text.length <= maxChars) {
|
|
36
|
+
return [{ offset: 0, text, coreStart: 0, coreEnd: text.length }];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const chunks: Chunk[] = [];
|
|
40
|
+
let start = 0;
|
|
41
|
+
while (start < text.length) {
|
|
42
|
+
let end = Math.min(start + maxChars, text.length);
|
|
43
|
+
if (end < text.length) {
|
|
44
|
+
// Prefer to cut at whitespace so a word (and usually an entity) is
|
|
45
|
+
// not split at the hard boundary of BOTH neighbouring windows.
|
|
46
|
+
for (let i = end; i > end - BREAK_LOOKBACK && i > start + overlapChars; i--) {
|
|
47
|
+
if (/\s/.test(text[i - 1]!)) {
|
|
48
|
+
end = i;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const isFirst = start === 0;
|
|
54
|
+
const isLast = end === text.length;
|
|
55
|
+
chunks.push({
|
|
56
|
+
offset: start,
|
|
57
|
+
text: text.slice(start, end),
|
|
58
|
+
coreStart: isFirst ? 0 : start + Math.floor(overlapChars / 2),
|
|
59
|
+
coreEnd: isLast ? text.length : end - Math.floor(overlapChars / 2),
|
|
60
|
+
});
|
|
61
|
+
if (isLast) break;
|
|
62
|
+
start = end - overlapChars;
|
|
63
|
+
}
|
|
64
|
+
return chunks;
|
|
65
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-session reuse of Stage 2 results for unchanged chunks.
|
|
3
|
+
*
|
|
4
|
+
* ─────────────────────────────────────────────────────────────────────────
|
|
5
|
+
* WHY THIS EXISTS, WHICH IS AN OMISSION BEING CLOSED RATHER THAN A FEATURE
|
|
6
|
+
*
|
|
7
|
+
* ARCHITECTURE.md D28 reasons about window size using "the content-hash cache
|
|
8
|
+
* keys on chunk text", and BENCHMARKS.md's incremental figures — the ones
|
|
9
|
+
* SPEC's "pressing send is instant" rests on — were measured against exactly
|
|
10
|
+
* that behaviour. It did not exist. The benchmark harness SIMULATED it, by
|
|
11
|
+
* computing which chunks an edit invalidated and re-inferring only those,
|
|
12
|
+
* while `NerEngine.recognize()` re-inferred every chunk on every call.
|
|
13
|
+
*
|
|
14
|
+
* So the published incremental number described a design, and the shipped
|
|
15
|
+
* behaviour was the cold number on every debounced keystroke. This closes the
|
|
16
|
+
* gap so that the two agree.
|
|
17
|
+
*
|
|
18
|
+
* ─────────────────────────────────────────────────────────────────────────
|
|
19
|
+
* IT IS PER SESSION, AND THAT IS A PRIVACY CONSTRAINT, NOT A SIZE ONE
|
|
20
|
+
*
|
|
21
|
+
* The keys ARE the user's text, and the values are the entities found in it.
|
|
22
|
+
* SPEC.md: "Originals live in memory only, per-tab-session, cleared on
|
|
23
|
+
* nav-away/close." The model lives in an offscreen document that outlives any
|
|
24
|
+
* one tab and is shared by all of them, so a cache owned by the ENGINE would
|
|
25
|
+
* quietly retain one tab's composer text after that tab was gone, and expose
|
|
26
|
+
* it to the next.
|
|
27
|
+
*
|
|
28
|
+
* Ownership therefore sits with the caller, one instance per connection, so
|
|
29
|
+
* its lifetime is the connection's: the content script's session opens it and
|
|
30
|
+
* closing that session destroys it. That is the same lifetime the unmask vault
|
|
31
|
+
* already has, so this adds no new retention — it just must not be allowed to
|
|
32
|
+
* add any.
|
|
33
|
+
*
|
|
34
|
+
* NOT KEYED BY HASH. A 64-bit digest would shorten the keys and remove the
|
|
35
|
+
* plaintext, and a collision would return one chunk's entities for a different
|
|
36
|
+
* chunk's text — silently attaching the wrong spans at the wrong offsets. The
|
|
37
|
+
* retention question is settled by the per-connection lifetime above; trading
|
|
38
|
+
* a correctness risk for a privacy property already held would be a bad deal.
|
|
39
|
+
*
|
|
40
|
+
* SPANS ARE STORED WITHOUT THEIR TEXT and it is re-sliced on read. Not for
|
|
41
|
+
* privacy — the key is the text anyway — but because a stored `text` could
|
|
42
|
+
* drift from the chunk it is served against, and re-slicing makes that
|
|
43
|
+
* impossible by construction.
|
|
44
|
+
* ─────────────────────────────────────────────────────────────────────────
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
import type { NerSpan } from './types.js';
|
|
48
|
+
|
|
49
|
+
/** A span with its text elided; re-derived from the chunk on read. */
|
|
50
|
+
type StoredSpan = Omit<NerSpan, 'text'>;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* How many chunks one session may keep.
|
|
54
|
+
*
|
|
55
|
+
* A 2,000-character message is 7 chunks at the shipped 400-character window,
|
|
56
|
+
* so this holds a long message plus the history of edits that produced it.
|
|
57
|
+
* Bounded because a session lasts as long as a tab does, and an unbounded map
|
|
58
|
+
* keyed on everything a user has typed is exactly what SPEC's memory-only rule
|
|
59
|
+
* is trying to avoid.
|
|
60
|
+
*/
|
|
61
|
+
const MAX_ENTRIES = 256;
|
|
62
|
+
|
|
63
|
+
export class ChunkCache {
|
|
64
|
+
/** Insertion order IS the LRU order: Map iterates oldest-first. */
|
|
65
|
+
private readonly entries = new Map<string, readonly StoredSpan[]>();
|
|
66
|
+
private hitCount = 0;
|
|
67
|
+
private missCount = 0;
|
|
68
|
+
|
|
69
|
+
get(chunkText: string): NerSpan[] | undefined {
|
|
70
|
+
const stored = this.entries.get(chunkText);
|
|
71
|
+
if (stored === undefined) {
|
|
72
|
+
this.missCount += 1;
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
// Re-inserted so a chunk that keeps being reused stays warm.
|
|
76
|
+
this.entries.delete(chunkText);
|
|
77
|
+
this.entries.set(chunkText, stored);
|
|
78
|
+
this.hitCount += 1;
|
|
79
|
+
return stored.map((span) => ({ ...span, text: chunkText.slice(span.start, span.end) }));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
set(chunkText: string, spans: readonly NerSpan[]): void {
|
|
83
|
+
if (this.entries.has(chunkText)) this.entries.delete(chunkText);
|
|
84
|
+
this.entries.set(
|
|
85
|
+
chunkText,
|
|
86
|
+
spans.map((span) => ({
|
|
87
|
+
type: span.type,
|
|
88
|
+
start: span.start,
|
|
89
|
+
end: span.end,
|
|
90
|
+
score: span.score,
|
|
91
|
+
...(span.gazetteer === undefined ? {} : { gazetteer: span.gazetteer }),
|
|
92
|
+
})),
|
|
93
|
+
);
|
|
94
|
+
while (this.entries.size > MAX_ENTRIES) {
|
|
95
|
+
const oldest = this.entries.keys().next();
|
|
96
|
+
if (oldest.done === true) break;
|
|
97
|
+
this.entries.delete(oldest.value);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Drops every original. Called when the session it belongs to ends. */
|
|
102
|
+
clear(): void {
|
|
103
|
+
this.entries.clear();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Counts only — never keys, never values. For the diagnostic. */
|
|
107
|
+
get stats(): { readonly size: number; readonly hits: number; readonly misses: number } {
|
|
108
|
+
return { size: this.entries.size, hits: this.hitCount, misses: this.missCount };
|
|
109
|
+
}
|
|
110
|
+
}
|