opencode-rehydar 0.14.2 → 0.14.3
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/dist/browser.d.ts +54 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +74 -0
- package/dist/browser.js.map +1 -0
- package/dist/core/anonymizer.d.ts +309 -0
- package/dist/core/anonymizer.d.ts.map +1 -0
- package/dist/core/anonymizer.js +555 -0
- package/dist/core/anonymizer.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/crypto/index.d.ts +6 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +6 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/pii-map-crypto.d.ts +114 -0
- package/dist/crypto/pii-map-crypto.d.ts.map +1 -0
- package/dist/crypto/pii-map-crypto.js +228 -0
- package/dist/crypto/pii-map-crypto.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/ner/bio-decoder.d.ts +64 -0
- package/dist/ner/bio-decoder.d.ts.map +1 -0
- package/dist/ner/bio-decoder.js +218 -0
- package/dist/ner/bio-decoder.js.map +1 -0
- package/dist/ner/index.d.ts +12 -0
- package/dist/ner/index.d.ts.map +1 -0
- package/dist/ner/index.js +12 -0
- package/dist/ner/index.js.map +1 -0
- package/dist/ner/inference-server-client.d.ts +81 -0
- package/dist/ner/inference-server-client.d.ts.map +1 -0
- package/dist/ner/inference-server-client.js +120 -0
- package/dist/ner/inference-server-client.js.map +1 -0
- package/dist/ner/inference-server-ner-model.d.ts +43 -0
- package/dist/ner/inference-server-ner-model.d.ts.map +1 -0
- package/dist/ner/inference-server-ner-model.js +119 -0
- package/dist/ner/inference-server-ner-model.js.map +1 -0
- package/dist/ner/model-manager.d.ts +111 -0
- package/dist/ner/model-manager.d.ts.map +1 -0
- package/dist/ner/model-manager.js +334 -0
- package/dist/ner/model-manager.js.map +1 -0
- package/dist/ner/ner-model.d.ts +172 -0
- package/dist/ner/ner-model.d.ts.map +1 -0
- package/dist/ner/ner-model.js +514 -0
- package/dist/ner/ner-model.js.map +1 -0
- package/dist/ner/onnx-runtime.browser.d.ts +46 -0
- package/dist/ner/onnx-runtime.browser.d.ts.map +1 -0
- package/dist/ner/onnx-runtime.browser.js +90 -0
- package/dist/ner/onnx-runtime.browser.js.map +1 -0
- package/dist/ner/onnx-runtime.d.ts +72 -0
- package/dist/ner/onnx-runtime.d.ts.map +1 -0
- package/dist/ner/onnx-runtime.js +132 -0
- package/dist/ner/onnx-runtime.js.map +1 -0
- package/dist/ner/token-window.d.ts +19 -0
- package/dist/ner/token-window.d.ts.map +1 -0
- package/dist/ner/token-window.js +101 -0
- package/dist/ner/token-window.js.map +1 -0
- package/dist/ner/tokenizer.d.ts +142 -0
- package/dist/ner/tokenizer.d.ts.map +1 -0
- package/dist/ner/tokenizer.js +362 -0
- package/dist/ner/tokenizer.js.map +1 -0
- package/dist/opencode-plugin/git-identity.d.ts +3 -0
- package/dist/opencode-plugin/git-identity.d.ts.map +1 -0
- package/dist/opencode-plugin/git-identity.js +37 -0
- package/dist/opencode-plugin/git-identity.js.map +1 -0
- package/dist/opencode-plugin/github-username.d.ts +3 -0
- package/dist/opencode-plugin/github-username.d.ts.map +1 -0
- package/dist/opencode-plugin/github-username.js +41 -0
- package/dist/opencode-plugin/github-username.js.map +1 -0
- package/dist/opencode-plugin/identity-recognizer.d.ts +5 -0
- package/dist/opencode-plugin/identity-recognizer.d.ts.map +1 -0
- package/dist/opencode-plugin/identity-recognizer.js +21 -0
- package/dist/opencode-plugin/identity-recognizer.js.map +1 -0
- package/dist/opencode-plugin/index.d.ts +7 -0
- package/dist/opencode-plugin/index.d.ts.map +1 -0
- package/dist/opencode-plugin/index.js +6 -0
- package/dist/opencode-plugin/index.js.map +1 -0
- package/dist/opencode-plugin/plugin.d.ts +39 -0
- package/dist/opencode-plugin/plugin.d.ts.map +1 -0
- package/dist/opencode-plugin/plugin.js +294 -0
- package/dist/opencode-plugin/plugin.js.map +1 -0
- package/dist/opencode-plugin/types.d.ts +33 -0
- package/dist/opencode-plugin/types.d.ts.map +1 -0
- package/dist/opencode-plugin/types.js +5 -0
- package/dist/opencode-plugin/types.js.map +1 -0
- package/dist/opencode-plugin/v2/anon-state.d.ts +12 -0
- package/dist/opencode-plugin/v2/anon-state.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/anon-state.js +14 -0
- package/dist/opencode-plugin/v2/anon-state.js.map +1 -0
- package/dist/opencode-plugin/v2/deep-rehydrate.d.ts +13 -0
- package/dist/opencode-plugin/v2/deep-rehydrate.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/deep-rehydrate.js +33 -0
- package/dist/opencode-plugin/v2/deep-rehydrate.js.map +1 -0
- package/dist/opencode-plugin/v2/index.d.ts +17 -0
- package/dist/opencode-plugin/v2/index.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/index.js +17 -0
- package/dist/opencode-plugin/v2/index.js.map +1 -0
- package/dist/opencode-plugin/v2/logger.d.ts +24 -0
- package/dist/opencode-plugin/v2/logger.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/logger.js +73 -0
- package/dist/opencode-plugin/v2/logger.js.map +1 -0
- package/dist/opencode-plugin/v2/options.d.ts +63 -0
- package/dist/opencode-plugin/v2/options.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/options.js +183 -0
- package/dist/opencode-plugin/v2/options.js.map +1 -0
- package/dist/opencode-plugin/v2/register-hooks.d.ts +43 -0
- package/dist/opencode-plugin/v2/register-hooks.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/register-hooks.js +160 -0
- package/dist/opencode-plugin/v2/register-hooks.js.map +1 -0
- package/dist/opencode-plugin/v2/rehydrate-tail.d.ts +101 -0
- package/dist/opencode-plugin/v2/rehydrate-tail.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/rehydrate-tail.js +147 -0
- package/dist/opencode-plugin/v2/rehydrate-tail.js.map +1 -0
- package/dist/opencode-plugin/v2/response-rehydrate.d.ts +78 -0
- package/dist/opencode-plugin/v2/response-rehydrate.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/response-rehydrate.js +210 -0
- package/dist/opencode-plugin/v2/response-rehydrate.js.map +1 -0
- package/dist/opencode-plugin/v2/scrub-messages.d.ts +39 -0
- package/dist/opencode-plugin/v2/scrub-messages.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/scrub-messages.js +260 -0
- package/dist/opencode-plugin/v2/scrub-messages.js.map +1 -0
- package/dist/opencode-plugin/v2/sessions.d.ts +17 -0
- package/dist/opencode-plugin/v2/sessions.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/sessions.js +23 -0
- package/dist/opencode-plugin/v2/sessions.js.map +1 -0
- package/dist/opencode-plugin/v2/sse.d.ts +101 -0
- package/dist/opencode-plugin/v2/sse.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/sse.js +235 -0
- package/dist/opencode-plugin/v2/sse.js.map +1 -0
- package/dist/opencode-plugin/v2/types.d.ts +188 -0
- package/dist/opencode-plugin/v2/types.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/types.js +10 -0
- package/dist/opencode-plugin/v2/types.js.map +1 -0
- package/dist/opencode-plugin/vcs-command.d.ts +3 -0
- package/dist/opencode-plugin/vcs-command.d.ts.map +1 -0
- package/dist/opencode-plugin/vcs-command.js +34 -0
- package/dist/opencode-plugin/vcs-command.js.map +1 -0
- package/dist/pipeline/index.d.ts +12 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +12 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/prenormalize.d.ts +48 -0
- package/dist/pipeline/prenormalize.d.ts.map +1 -0
- package/dist/pipeline/prenormalize.js +94 -0
- package/dist/pipeline/prenormalize.js.map +1 -0
- package/dist/pipeline/resolver.d.ts +56 -0
- package/dist/pipeline/resolver.d.ts.map +1 -0
- package/dist/pipeline/resolver.js +239 -0
- package/dist/pipeline/resolver.js.map +1 -0
- package/dist/pipeline/semantic-data-loader.d.ts +171 -0
- package/dist/pipeline/semantic-data-loader.d.ts.map +1 -0
- package/dist/pipeline/semantic-data-loader.js +677 -0
- package/dist/pipeline/semantic-data-loader.js.map +1 -0
- package/dist/pipeline/semantic-enricher.d.ts +112 -0
- package/dist/pipeline/semantic-enricher.d.ts.map +1 -0
- package/dist/pipeline/semantic-enricher.js +322 -0
- package/dist/pipeline/semantic-enricher.js.map +1 -0
- package/dist/pipeline/tagger.d.ts +121 -0
- package/dist/pipeline/tagger.d.ts.map +1 -0
- package/dist/pipeline/tagger.js +545 -0
- package/dist/pipeline/tagger.js.map +1 -0
- package/dist/pipeline/title-extractor.d.ts +79 -0
- package/dist/pipeline/title-extractor.d.ts.map +1 -0
- package/dist/pipeline/title-extractor.js +801 -0
- package/dist/pipeline/title-extractor.js.map +1 -0
- package/dist/pipeline/validator.d.ts +65 -0
- package/dist/pipeline/validator.d.ts.map +1 -0
- package/dist/pipeline/validator.js +292 -0
- package/dist/pipeline/validator.js.map +1 -0
- package/dist/proxy/index.d.ts +13 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +12 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/providers/anthropic.d.ts +28 -0
- package/dist/proxy/providers/anthropic.d.ts.map +1 -0
- package/dist/proxy/providers/anthropic.js +265 -0
- package/dist/proxy/providers/anthropic.js.map +1 -0
- package/dist/proxy/providers/index.d.ts +19 -0
- package/dist/proxy/providers/index.d.ts.map +1 -0
- package/dist/proxy/providers/index.js +41 -0
- package/dist/proxy/providers/index.js.map +1 -0
- package/dist/proxy/providers/openai.d.ts +27 -0
- package/dist/proxy/providers/openai.d.ts.map +1 -0
- package/dist/proxy/providers/openai.js +203 -0
- package/dist/proxy/providers/openai.js.map +1 -0
- package/dist/proxy/providers/streaming-tool-loop.d.ts +12 -0
- package/dist/proxy/providers/streaming-tool-loop.d.ts.map +1 -0
- package/dist/proxy/providers/streaming-tool-loop.js +223 -0
- package/dist/proxy/providers/streaming-tool-loop.js.map +1 -0
- package/dist/proxy/providers/types.d.ts +109 -0
- package/dist/proxy/providers/types.d.ts.map +1 -0
- package/dist/proxy/providers/types.js +2 -0
- package/dist/proxy/providers/types.js.map +1 -0
- package/dist/proxy/proxy-server.d.ts +61 -0
- package/dist/proxy/proxy-server.d.ts.map +1 -0
- package/dist/proxy/proxy-server.js +146 -0
- package/dist/proxy/proxy-server.js.map +1 -0
- package/dist/proxy/rehydra-fetch.d.ts +35 -0
- package/dist/proxy/rehydra-fetch.d.ts.map +1 -0
- package/dist/proxy/rehydra-fetch.js +631 -0
- package/dist/proxy/rehydra-fetch.js.map +1 -0
- package/dist/proxy/rehydra-proxy.d.ts +40 -0
- package/dist/proxy/rehydra-proxy.d.ts.map +1 -0
- package/dist/proxy/rehydra-proxy.js +150 -0
- package/dist/proxy/rehydra-proxy.js.map +1 -0
- package/dist/proxy/sse-parser.d.ts +59 -0
- package/dist/proxy/sse-parser.d.ts.map +1 -0
- package/dist/proxy/sse-parser.js +112 -0
- package/dist/proxy/sse-parser.js.map +1 -0
- package/dist/proxy/system-instruction.d.ts +19 -0
- package/dist/proxy/system-instruction.d.ts.map +1 -0
- package/dist/proxy/system-instruction.js +33 -0
- package/dist/proxy/system-instruction.js.map +1 -0
- package/dist/proxy/tool-loop-stream.d.ts +7 -0
- package/dist/proxy/tool-loop-stream.d.ts.map +1 -0
- package/dist/proxy/tool-loop-stream.js +65 -0
- package/dist/proxy/tool-loop-stream.js.map +1 -0
- package/dist/proxy/types.d.ts +138 -0
- package/dist/proxy/types.d.ts.map +1 -0
- package/dist/proxy/types.js +5 -0
- package/dist/proxy/types.js.map +1 -0
- package/dist/proxy/wrap-client.d.ts +47 -0
- package/dist/proxy/wrap-client.d.ts.map +1 -0
- package/dist/proxy/wrap-client.js +70 -0
- package/dist/proxy/wrap-client.js.map +1 -0
- package/dist/recognizers/address.d.ts +2 -0
- package/dist/recognizers/address.d.ts.map +1 -0
- package/dist/recognizers/address.js +23 -0
- package/dist/recognizers/address.js.map +1 -0
- package/dist/recognizers/base.d.ts +78 -0
- package/dist/recognizers/base.d.ts.map +1 -0
- package/dist/recognizers/base.js +100 -0
- package/dist/recognizers/base.js.map +1 -0
- package/dist/recognizers/bic-swift.d.ts +10 -0
- package/dist/recognizers/bic-swift.d.ts.map +1 -0
- package/dist/recognizers/bic-swift.js +107 -0
- package/dist/recognizers/bic-swift.js.map +1 -0
- package/dist/recognizers/credit-card.d.ts +32 -0
- package/dist/recognizers/credit-card.d.ts.map +1 -0
- package/dist/recognizers/credit-card.js +160 -0
- package/dist/recognizers/credit-card.js.map +1 -0
- package/dist/recognizers/custom-id.d.ts +28 -0
- package/dist/recognizers/custom-id.d.ts.map +1 -0
- package/dist/recognizers/custom-id.js +116 -0
- package/dist/recognizers/custom-id.js.map +1 -0
- package/dist/recognizers/date.d.ts +10 -0
- package/dist/recognizers/date.d.ts.map +1 -0
- package/dist/recognizers/date.js +228 -0
- package/dist/recognizers/date.js.map +1 -0
- package/dist/recognizers/email.d.ts +10 -0
- package/dist/recognizers/email.d.ts.map +1 -0
- package/dist/recognizers/email.js +75 -0
- package/dist/recognizers/email.js.map +1 -0
- package/dist/recognizers/iban.d.ts +14 -0
- package/dist/recognizers/iban.d.ts.map +1 -0
- package/dist/recognizers/iban.js +67 -0
- package/dist/recognizers/iban.js.map +1 -0
- package/dist/recognizers/index.d.ts +25 -0
- package/dist/recognizers/index.d.ts.map +1 -0
- package/dist/recognizers/index.js +53 -0
- package/dist/recognizers/index.js.map +1 -0
- package/dist/recognizers/ip-address.d.ts +14 -0
- package/dist/recognizers/ip-address.d.ts.map +1 -0
- package/dist/recognizers/ip-address.js +183 -0
- package/dist/recognizers/ip-address.js.map +1 -0
- package/dist/recognizers/phone.d.ts +10 -0
- package/dist/recognizers/phone.d.ts.map +1 -0
- package/dist/recognizers/phone.js +145 -0
- package/dist/recognizers/phone.js.map +1 -0
- package/dist/recognizers/postal-code.d.ts +16 -0
- package/dist/recognizers/postal-code.d.ts.map +1 -0
- package/dist/recognizers/postal-code.js +42 -0
- package/dist/recognizers/postal-code.js.map +1 -0
- package/dist/recognizers/registry.d.ts +59 -0
- package/dist/recognizers/registry.d.ts.map +1 -0
- package/dist/recognizers/registry.js +113 -0
- package/dist/recognizers/registry.js.map +1 -0
- package/dist/recognizers/secrets/api-key.d.ts +6 -0
- package/dist/recognizers/secrets/api-key.d.ts.map +1 -0
- package/dist/recognizers/secrets/api-key.js +40 -0
- package/dist/recognizers/secrets/api-key.js.map +1 -0
- package/dist/recognizers/secrets/aws-credentials.d.ts +7 -0
- package/dist/recognizers/secrets/aws-credentials.d.ts.map +1 -0
- package/dist/recognizers/secrets/aws-credentials.js +68 -0
- package/dist/recognizers/secrets/aws-credentials.js.map +1 -0
- package/dist/recognizers/secrets/config-secret.d.ts +8 -0
- package/dist/recognizers/secrets/config-secret.d.ts.map +1 -0
- package/dist/recognizers/secrets/config-secret.js +59 -0
- package/dist/recognizers/secrets/config-secret.js.map +1 -0
- package/dist/recognizers/secrets/connection-string.d.ts +6 -0
- package/dist/recognizers/secrets/connection-string.d.ts.map +1 -0
- package/dist/recognizers/secrets/connection-string.js +40 -0
- package/dist/recognizers/secrets/connection-string.js.map +1 -0
- package/dist/recognizers/secrets/env-var.d.ts +8 -0
- package/dist/recognizers/secrets/env-var.d.ts.map +1 -0
- package/dist/recognizers/secrets/env-var.js +54 -0
- package/dist/recognizers/secrets/env-var.js.map +1 -0
- package/dist/recognizers/secrets/index.d.ts +22 -0
- package/dist/recognizers/secrets/index.d.ts.map +1 -0
- package/dist/recognizers/secrets/index.js +41 -0
- package/dist/recognizers/secrets/index.js.map +1 -0
- package/dist/recognizers/secrets/jwt.d.ts +6 -0
- package/dist/recognizers/secrets/jwt.d.ts.map +1 -0
- package/dist/recognizers/secrets/jwt.js +47 -0
- package/dist/recognizers/secrets/jwt.js.map +1 -0
- package/dist/recognizers/secrets/key-patterns.d.ts +10 -0
- package/dist/recognizers/secrets/key-patterns.d.ts.map +1 -0
- package/dist/recognizers/secrets/key-patterns.js +15 -0
- package/dist/recognizers/secrets/key-patterns.js.map +1 -0
- package/dist/recognizers/secrets/literal-value.d.ts +10 -0
- package/dist/recognizers/secrets/literal-value.d.ts.map +1 -0
- package/dist/recognizers/secrets/literal-value.js +48 -0
- package/dist/recognizers/secrets/literal-value.js.map +1 -0
- package/dist/recognizers/secrets/private-key.d.ts +6 -0
- package/dist/recognizers/secrets/private-key.d.ts.map +1 -0
- package/dist/recognizers/secrets/private-key.js +16 -0
- package/dist/recognizers/secrets/private-key.js.map +1 -0
- package/dist/recognizers/url.d.ts +14 -0
- package/dist/recognizers/url.d.ts.map +1 -0
- package/dist/recognizers/url.js +121 -0
- package/dist/recognizers/url.js.map +1 -0
- package/dist/storage/browser.d.ts +13 -0
- package/dist/storage/browser.d.ts.map +1 -0
- package/dist/storage/browser.js +13 -0
- package/dist/storage/browser.js.map +1 -0
- package/dist/storage/in-memory.d.ts +60 -0
- package/dist/storage/in-memory.d.ts.map +1 -0
- package/dist/storage/in-memory.js +108 -0
- package/dist/storage/in-memory.js.map +1 -0
- package/dist/storage/index.d.ts +11 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +11 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/indexeddb.d.ts +69 -0
- package/dist/storage/indexeddb.d.ts.map +1 -0
- package/dist/storage/indexeddb.js +274 -0
- package/dist/storage/indexeddb.js.map +1 -0
- package/dist/storage/session-base.d.ts +34 -0
- package/dist/storage/session-base.d.ts.map +1 -0
- package/dist/storage/session-base.js +122 -0
- package/dist/storage/session-base.js.map +1 -0
- package/dist/storage/session.d.ts +19 -0
- package/dist/storage/session.d.ts.map +1 -0
- package/dist/storage/session.js +31 -0
- package/dist/storage/session.js.map +1 -0
- package/dist/storage/sqlite.d.ts +80 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +255 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/storage/types.d.ts +208 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +6 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/streaming/anonymizer-stream.d.ts +63 -0
- package/dist/streaming/anonymizer-stream.d.ts.map +1 -0
- package/dist/streaming/anonymizer-stream.js +184 -0
- package/dist/streaming/anonymizer-stream.js.map +1 -0
- package/dist/streaming/index.d.ts +9 -0
- package/dist/streaming/index.d.ts.map +1 -0
- package/dist/streaming/index.js +8 -0
- package/dist/streaming/index.js.map +1 -0
- package/dist/streaming/sentence-buffer.d.ts +78 -0
- package/dist/streaming/sentence-buffer.d.ts.map +1 -0
- package/dist/streaming/sentence-buffer.js +239 -0
- package/dist/streaming/sentence-buffer.js.map +1 -0
- package/dist/streaming/stream-factory.d.ts +38 -0
- package/dist/streaming/stream-factory.d.ts.map +1 -0
- package/dist/streaming/stream-factory.js +69 -0
- package/dist/streaming/stream-factory.js.map +1 -0
- package/dist/streaming/types.d.ts +121 -0
- package/dist/streaming/types.d.ts.map +1 -0
- package/dist/streaming/types.js +5 -0
- package/dist/streaming/types.js.map +1 -0
- package/dist/types/index.d.ts +269 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +95 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/pii-types.d.ts +64 -0
- package/dist/types/pii-types.d.ts.map +1 -0
- package/dist/types/pii-types.js +153 -0
- package/dist/types/pii-types.js.map +1 -0
- package/dist/utils/iban-checksum.d.ts +23 -0
- package/dist/utils/iban-checksum.d.ts.map +1 -0
- package/dist/utils/iban-checksum.js +106 -0
- package/dist/utils/iban-checksum.js.map +1 -0
- package/dist/utils/index.d.ts +11 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +11 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json-walk.d.ts +21 -0
- package/dist/utils/json-walk.d.ts.map +1 -0
- package/dist/utils/json-walk.js +44 -0
- package/dist/utils/json-walk.js.map +1 -0
- package/dist/utils/luhn.d.ts +17 -0
- package/dist/utils/luhn.d.ts.map +1 -0
- package/dist/utils/luhn.js +55 -0
- package/dist/utils/luhn.js.map +1 -0
- package/dist/utils/offsets.d.ts +86 -0
- package/dist/utils/offsets.d.ts.map +1 -0
- package/dist/utils/offsets.js +124 -0
- package/dist/utils/offsets.js.map +1 -0
- package/dist/utils/path.d.ts +34 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +96 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/regex.d.ts +11 -0
- package/dist/utils/regex.d.ts.map +1 -0
- package/dist/utils/regex.js +14 -0
- package/dist/utils/regex.js.map +1 -0
- package/dist/utils/storage-browser.d.ts +51 -0
- package/dist/utils/storage-browser.d.ts.map +1 -0
- package/dist/utils/storage-browser.js +381 -0
- package/dist/utils/storage-browser.js.map +1 -0
- package/dist/utils/storage-node.d.ts +51 -0
- package/dist/utils/storage-node.d.ts.map +1 -0
- package/dist/utils/storage-node.js +153 -0
- package/dist/utils/storage-node.js.map +1 -0
- package/dist/utils/storage.browser.d.ts +75 -0
- package/dist/utils/storage.browser.d.ts.map +1 -0
- package/dist/utils/storage.browser.js +69 -0
- package/dist/utils/storage.browser.js.map +1 -0
- package/dist/utils/storage.d.ts +73 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +69 -0
- package/dist/utils/storage.js.map +1 -0
- package/index.js +6 -4
- package/package.json +19 -5
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proxy Middleware Types
|
|
3
|
+
*/
|
|
4
|
+
import type { AnonymizerConfig } from "../core/anonymizer.js";
|
|
5
|
+
import type { AnonymizationPolicy } from "../types/index.js";
|
|
6
|
+
import type { KeyProvider } from "../crypto/index.js";
|
|
7
|
+
import type { PIIStorageProvider } from "../storage/types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Callback invoked when the LLM requests a tool call during an agentic loop.
|
|
10
|
+
* Receives rehydrated (real PII) arguments. The return value will be
|
|
11
|
+
* automatically anonymized before being sent back to the LLM.
|
|
12
|
+
*
|
|
13
|
+
* @param name - The function/tool name
|
|
14
|
+
* @param args - Parsed tool arguments with real PII values restored
|
|
15
|
+
* @param toolCallId - The unique tool call ID from the LLM
|
|
16
|
+
* @returns The tool execution result (will be JSON-stringified and anonymized)
|
|
17
|
+
*/
|
|
18
|
+
export type OnToolCallFn = (name: string, args: Record<string, unknown>, toolCallId: string) => unknown;
|
|
19
|
+
/**
|
|
20
|
+
* Summary of what an intercepted request anonymized. Passed to the
|
|
21
|
+
* {@link RehydraFetchConfig.onAnonymize} hook for logging/observability.
|
|
22
|
+
*
|
|
23
|
+
* Contains only PII *types* and counts — never the raw PII values.
|
|
24
|
+
*/
|
|
25
|
+
export interface AnonymizeInfo {
|
|
26
|
+
/** HTTP method of the intercepted request (always "POST" in practice) */
|
|
27
|
+
method: string;
|
|
28
|
+
/** Upstream request URL */
|
|
29
|
+
url: string;
|
|
30
|
+
/** Detected entity count per PII type (only types with count > 0) */
|
|
31
|
+
countsByType: Record<string, number>;
|
|
32
|
+
/** Total entities detected across the whole request */
|
|
33
|
+
totalEntities: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Configuration for the Rehydra fetch wrapper
|
|
37
|
+
*/
|
|
38
|
+
export interface RehydraFetchConfig {
|
|
39
|
+
/** Anonymizer configuration */
|
|
40
|
+
anonymizer?: AnonymizerConfig;
|
|
41
|
+
/** Policy override */
|
|
42
|
+
policy?: Partial<AnonymizationPolicy>;
|
|
43
|
+
/** Key provider for encryption (required) */
|
|
44
|
+
keyProvider: KeyProvider;
|
|
45
|
+
/** Storage provider for PII map persistence (required) */
|
|
46
|
+
piiStorageProvider: PIIStorageProvider;
|
|
47
|
+
/** LLM provider name or 'auto' for auto-detection */
|
|
48
|
+
provider?: "openai" | "anthropic" | "auto";
|
|
49
|
+
/**
|
|
50
|
+
* Function to derive session ID from a request.
|
|
51
|
+
* Defaults to a UUID per request.
|
|
52
|
+
*/
|
|
53
|
+
getSessionId?: (request: Request) => string | Promise<string>;
|
|
54
|
+
/**
|
|
55
|
+
* Whether to handle streaming SSE responses.
|
|
56
|
+
* @default true
|
|
57
|
+
*/
|
|
58
|
+
handleStreaming?: boolean;
|
|
59
|
+
/** Locale hint for anonymization */
|
|
60
|
+
locale?: string;
|
|
61
|
+
/**
|
|
62
|
+
* System instruction injected when PII is detected, telling the model
|
|
63
|
+
* to treat PII placeholders as opaque pass-through values.
|
|
64
|
+
*
|
|
65
|
+
* - `undefined` (default): uses the built-in instruction
|
|
66
|
+
* - `string`: uses your custom instruction text
|
|
67
|
+
* - `false`: disables injection entirely
|
|
68
|
+
*/
|
|
69
|
+
systemInstruction?: string | false;
|
|
70
|
+
/**
|
|
71
|
+
* Callback for executing tool calls in an agentic loop.
|
|
72
|
+
* When provided and the LLM returns tool calls, the proxy will:
|
|
73
|
+
* 1. Rehydrate tool call arguments (restore real PII)
|
|
74
|
+
* 2. Call this callback for each tool call
|
|
75
|
+
* 3. Anonymize the return value
|
|
76
|
+
* 4. Send the result back to the LLM in the next round
|
|
77
|
+
* 5. Repeat until the LLM returns a final response (no tool calls)
|
|
78
|
+
*
|
|
79
|
+
* The callback receives real PII values — it runs on your server, not the LLM.
|
|
80
|
+
* OpenAI and Anthropic streaming responses are buffered before tools run.
|
|
81
|
+
* Later rounds use JSON; the final result is emitted as provider-compatible SSE.
|
|
82
|
+
* Single-completion requests only. Cancellation prevents further tool calls.
|
|
83
|
+
*/
|
|
84
|
+
onToolCall?: OnToolCallFn;
|
|
85
|
+
/**
|
|
86
|
+
* Maximum number of tool execution rounds before returning.
|
|
87
|
+
* Prevents infinite loops. Only used when onToolCall is set.
|
|
88
|
+
* @default 10
|
|
89
|
+
*/
|
|
90
|
+
maxToolRounds?: number;
|
|
91
|
+
/** Maximum bytes buffered per response in a tool loop. Default: 8 MiB. */
|
|
92
|
+
maxToolResponseBytes?: number;
|
|
93
|
+
/**
|
|
94
|
+
* Hook invoked once per intercepted request, after anonymization and
|
|
95
|
+
* before forwarding upstream. Receives a summary of detected PII
|
|
96
|
+
* (types and counts only — never the raw values). Useful for verbose
|
|
97
|
+
* logging and observability.
|
|
98
|
+
*/
|
|
99
|
+
onAnonymize?: (info: AnonymizeInfo) => void;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Reported when the upstream base path and the incoming request path share segments
|
|
103
|
+
*/
|
|
104
|
+
export interface PathOverlapWarning {
|
|
105
|
+
/** Configured upstream base URL with its trailing slash removed. */
|
|
106
|
+
upstreamBaseUrl: string;
|
|
107
|
+
/**
|
|
108
|
+
* Segments duplicated between the configured upstream suffix and the
|
|
109
|
+
* incoming request prefix, e.g. ["api", "v1"].
|
|
110
|
+
*/
|
|
111
|
+
overlappingSegments: string[];
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Configuration for the Rehydra proxy middleware
|
|
115
|
+
*/
|
|
116
|
+
export interface RehydraProxyConfig extends RehydraFetchConfig {
|
|
117
|
+
/** Upstream LLM API base URL */
|
|
118
|
+
upstream: string;
|
|
119
|
+
/**
|
|
120
|
+
* Headers to forward to upstream.
|
|
121
|
+
* @default ["authorization", "content-type", "x-api-key", "anthropic-version"]
|
|
122
|
+
*/
|
|
123
|
+
forwardHeaders?: string[];
|
|
124
|
+
/** Path prefix to strip before forwarding to upstream */
|
|
125
|
+
stripPrefix?: string;
|
|
126
|
+
/**
|
|
127
|
+
* API key to inject on upstream requests, replacing any client-sent
|
|
128
|
+
* auth headers. Useful when the client uses OAuth (e.g. Claude Code
|
|
129
|
+
* with Max) but the upstream requires API key auth.
|
|
130
|
+
*
|
|
131
|
+
* For Anthropic: sent as `x-api-key`
|
|
132
|
+
* For OpenAI: sent as `Authorization: Bearer <key>`
|
|
133
|
+
*/
|
|
134
|
+
apiKey?: string;
|
|
135
|
+
/** Hook invoked for each request whose forwarded path overlaps the upstream base path */
|
|
136
|
+
onPathOverlapWarning?: (warning: PathOverlapWarning) => void | Promise<void>;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/proxy/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,MAAM,KACf,OAAO,CAAC;AAEb;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,uDAAuD;IACvD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B,sBAAsB;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAEtC,6CAA6C;IAC7C,WAAW,EAAE,WAAW,CAAC;IAEzB,0DAA0D;IAC1D,kBAAkB,EAAE,kBAAkB,CAAC;IAEvC,qDAAqD;IACrD,QAAQ,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;IAE3C;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE9D;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAEnC;;;;;;;;;;;;;OAaG;IACH,UAAU,CAAC,EAAE,YAAY,CAAC;IAE1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,0EAA0E;IAC1E,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,eAAe,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC5D,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,yFAAyF;IACzF,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/proxy/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Client Wrapper
|
|
3
|
+
* Convenience function to wrap OpenAI/Anthropic SDK clients
|
|
4
|
+
* with automatic PII anonymization and rehydration.
|
|
5
|
+
*/
|
|
6
|
+
import type { RehydraFetchConfig } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Wraps an LLM client (OpenAI, Anthropic, or any SDK that accepts a custom fetch)
|
|
9
|
+
* to automatically anonymize outgoing PII and rehydrate responses.
|
|
10
|
+
*
|
|
11
|
+
* Works by replacing the client's internal fetch with a Rehydra-wrapped version.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import OpenAI from 'openai';
|
|
16
|
+
* import { wrapLLMClient, InMemoryKeyProvider, InMemoryPIIStorageProvider } from 'rehydra';
|
|
17
|
+
*
|
|
18
|
+
* const openai = wrapLLMClient(
|
|
19
|
+
* new OpenAI(),
|
|
20
|
+
* {
|
|
21
|
+
* keyProvider: new InMemoryKeyProvider(),
|
|
22
|
+
* piiStorageProvider: new InMemoryPIIStorageProvider(),
|
|
23
|
+
* },
|
|
24
|
+
* );
|
|
25
|
+
*
|
|
26
|
+
* // PII is now automatically anonymized/rehydrated
|
|
27
|
+
* const response = await openai.chat.completions.create({ ... });
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* import Anthropic from '@anthropic-ai/sdk';
|
|
33
|
+
* import { wrapLLMClient, ConfigKeyProvider, SQLitePIIStorageProvider } from 'rehydra';
|
|
34
|
+
*
|
|
35
|
+
* const anthropic = wrapLLMClient(
|
|
36
|
+
* new Anthropic(),
|
|
37
|
+
* {
|
|
38
|
+
* keyProvider: new ConfigKeyProvider(process.env.PII_KEY!),
|
|
39
|
+
* piiStorageProvider: new SQLitePIIStorageProvider('pii.db'),
|
|
40
|
+
* },
|
|
41
|
+
* );
|
|
42
|
+
*
|
|
43
|
+
* const message = await anthropic.messages.create({ ... });
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare function wrapLLMClient<T>(client: T, config: Omit<RehydraFetchConfig, "provider">): T;
|
|
47
|
+
//# sourceMappingURL=wrap-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap-client.d.ts","sourceRoot":"","sources":["../../src/proxy/wrap-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,GAC3C,CAAC,CAwBH"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Client Wrapper
|
|
3
|
+
* Convenience function to wrap OpenAI/Anthropic SDK clients
|
|
4
|
+
* with automatic PII anonymization and rehydration.
|
|
5
|
+
*/
|
|
6
|
+
import { createRehydraFetch } from "./rehydra-fetch.js";
|
|
7
|
+
/**
|
|
8
|
+
* Wraps an LLM client (OpenAI, Anthropic, or any SDK that accepts a custom fetch)
|
|
9
|
+
* to automatically anonymize outgoing PII and rehydrate responses.
|
|
10
|
+
*
|
|
11
|
+
* Works by replacing the client's internal fetch with a Rehydra-wrapped version.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import OpenAI from 'openai';
|
|
16
|
+
* import { wrapLLMClient, InMemoryKeyProvider, InMemoryPIIStorageProvider } from 'rehydra';
|
|
17
|
+
*
|
|
18
|
+
* const openai = wrapLLMClient(
|
|
19
|
+
* new OpenAI(),
|
|
20
|
+
* {
|
|
21
|
+
* keyProvider: new InMemoryKeyProvider(),
|
|
22
|
+
* piiStorageProvider: new InMemoryPIIStorageProvider(),
|
|
23
|
+
* },
|
|
24
|
+
* );
|
|
25
|
+
*
|
|
26
|
+
* // PII is now automatically anonymized/rehydrated
|
|
27
|
+
* const response = await openai.chat.completions.create({ ... });
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* import Anthropic from '@anthropic-ai/sdk';
|
|
33
|
+
* import { wrapLLMClient, ConfigKeyProvider, SQLitePIIStorageProvider } from 'rehydra';
|
|
34
|
+
*
|
|
35
|
+
* const anthropic = wrapLLMClient(
|
|
36
|
+
* new Anthropic(),
|
|
37
|
+
* {
|
|
38
|
+
* keyProvider: new ConfigKeyProvider(process.env.PII_KEY!),
|
|
39
|
+
* piiStorageProvider: new SQLitePIIStorageProvider('pii.db'),
|
|
40
|
+
* },
|
|
41
|
+
* );
|
|
42
|
+
*
|
|
43
|
+
* const message = await anthropic.messages.create({ ... });
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export function wrapLLMClient(client, config) {
|
|
47
|
+
const rehydraFetch = createRehydraFetch({
|
|
48
|
+
...config,
|
|
49
|
+
provider: "auto",
|
|
50
|
+
});
|
|
51
|
+
// Both OpenAI and Anthropic SDKs store fetch as a property.
|
|
52
|
+
// OpenAI uses `_fetch`, Anthropic uses `fetch`.
|
|
53
|
+
// We try both, and also support any client with a `fetch` property.
|
|
54
|
+
const clientObj = client;
|
|
55
|
+
if ("_fetch" in clientObj) {
|
|
56
|
+
// OpenAI SDK pattern
|
|
57
|
+
clientObj._fetch = rehydraFetch;
|
|
58
|
+
}
|
|
59
|
+
else if ("fetch" in clientObj) {
|
|
60
|
+
// Anthropic SDK pattern (or generic)
|
|
61
|
+
clientObj.fetch = rehydraFetch;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// Fallback: set both common patterns
|
|
65
|
+
clientObj._fetch = rehydraFetch;
|
|
66
|
+
clientObj.fetch = rehydraFetch;
|
|
67
|
+
}
|
|
68
|
+
return client;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=wrap-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap-client.js","sourceRoot":"","sources":["../../src/proxy/wrap-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAS,EACT,MAA4C;IAE5C,MAAM,YAAY,GAAG,kBAAkB,CAAC;QACtC,GAAG,MAAM;QACT,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,4DAA4D;IAC5D,gDAAgD;IAChD,oEAAoE;IACpE,MAAM,SAAS,GAAG,MAAiC,CAAC;IAEpD,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC1B,qBAAqB;QACrB,SAAS,CAAC,MAAM,GAAG,YAAY,CAAC;IAClC,CAAC;SAAM,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,qCAAqC;QACrC,SAAS,CAAC,KAAK,GAAG,YAAY,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,qCAAqC;QACrC,SAAS,CAAC,MAAM,GAAG,YAAY,CAAC;QAChC,SAAS,CAAC,KAAK,GAAG,YAAY,CAAC;IACjC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../src/recognizers/address.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,uBAAuB,gCAOlC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Conservative detection of numbered, English-language street addresses. */
|
|
2
|
+
import { PIIType } from '../types/index.js';
|
|
3
|
+
import { createRegexRecognizer } from './base.js';
|
|
4
|
+
import { UK_POSTAL_CODE_PATTERN } from './postal-code.js';
|
|
5
|
+
const NUMBER = String.raw `[0-9]{1,5}[a-z]?(?:[-/][0-9]{1,5}[a-z]?)?`;
|
|
6
|
+
const WORD = String.raw `[\p{L}][\p{L}.'’\-]*`;
|
|
7
|
+
const STREET = String.raw `${NUMBER}[\t ]+(?:${WORD}[\t ]+){1,6}(?:Road|Rd|Street|St|Avenue|Ave|Lane|Ln|Drive|Dr|Close|Court|Ct|Crescent|Way|Place|Pl|Terrace|Gardens|Grove|Square|Sq|Mews|Row|Hill|Park|Walk|Rise|Green)\b`;
|
|
8
|
+
// An apartment number alone is ambiguous. Require an adjacent numbered street.
|
|
9
|
+
const UNIT = String.raw `(?:(?:Flat|Apartment|Apt|Unit|Suite)[\t ]+${NUMBER}[\t ]*(?:,[\t ]*|\r?\n[\t ]*|[\t ]+))?`;
|
|
10
|
+
// Include locality lines only when a UK postcode terminates the address block.
|
|
11
|
+
// Bounded line/word counts keep prose and separate paragraphs out of the match.
|
|
12
|
+
const LOCALITY = String.raw `(?:${WORD}[\t ]+){0,4}${WORD}`;
|
|
13
|
+
const SEPARATOR = String.raw `[\t ]*(?:,[\t ]*|\r?\n[\t ]*)`;
|
|
14
|
+
const POSTAL_TAIL = String.raw `(?:${SEPARATOR}(?:${LOCALITY}${SEPARATOR}){0,3}${UK_POSTAL_CODE_PATTERN.source})?`;
|
|
15
|
+
export const streetAddressRecognizer = createRegexRecognizer({
|
|
16
|
+
type: PIIType.ADDRESS,
|
|
17
|
+
name: 'Numbered Street Address',
|
|
18
|
+
patterns: [new RegExp(String.raw `(?<![\p{L}\p{N}])${UNIT}${STREET}${POSTAL_TAIL}`, 'giu')],
|
|
19
|
+
defaultConfidence: 0.95,
|
|
20
|
+
// Travel directions describe distances rather than a street number.
|
|
21
|
+
validate: (text) => !/^[0-9]+[\t ]+(?:steps?|miles?|metres?|meters?|kilometres?|kilometers?|blocks?)[\t ]/i.test(text),
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.js","sourceRoot":"","sources":["../../src/recognizers/address.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAA,2CAA2C,CAAC;AACrE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAA,sBAAsB,CAAC;AAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAA,GAAG,MAAM,YAAY,IAAI,yKAAyK,CAAC;AAC5N,+EAA+E;AAC/E,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAA,6CAA6C,MAAM,wCAAwC,CAAC;AACnH,+EAA+E;AAC/E,gFAAgF;AAChF,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAA,MAAM,IAAI,eAAe,IAAI,EAAE,CAAC;AAC3D,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAA,+BAA+B,CAAC;AAC5D,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAA,MAAM,SAAS,MAAM,QAAQ,GAAG,SAAS,SAAS,sBAAsB,CAAC,MAAM,IAAI,CAAC;AAElH,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;IAC3D,IAAI,EAAE,OAAO,CAAC,OAAO;IACrB,IAAI,EAAE,yBAAyB;IAC/B,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,oBAAoB,IAAI,GAAG,MAAM,GAAG,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1F,iBAAiB,EAAE,IAAI;IACvB,oEAAoE;IACpE,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,sFAAsF,CAAC,IAAI,CAAC,IAAI,CAAC;CACvH,CAAC,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Recognizer Interface
|
|
3
|
+
* Defines the contract for all PII recognizers (regex-based)
|
|
4
|
+
*/
|
|
5
|
+
import { PIIType, SpanMatch } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Base interface for all PII recognizers
|
|
8
|
+
*/
|
|
9
|
+
export interface Recognizer {
|
|
10
|
+
/** The PII type this recognizer detects */
|
|
11
|
+
readonly type: PIIType;
|
|
12
|
+
/** Human-readable name for logging/debugging */
|
|
13
|
+
readonly name: string;
|
|
14
|
+
/** Default confidence score for matches (0.0 to 1.0) */
|
|
15
|
+
readonly defaultConfidence: number;
|
|
16
|
+
/**
|
|
17
|
+
* Finds all matches of this PII type in the given text
|
|
18
|
+
* @param text - The text to search
|
|
19
|
+
* @returns Array of span matches
|
|
20
|
+
*/
|
|
21
|
+
find(text: string): SpanMatch[];
|
|
22
|
+
/**
|
|
23
|
+
* Optional validation of a match (e.g., checksum validation)
|
|
24
|
+
* @param match - The matched text
|
|
25
|
+
* @returns true if the match is valid
|
|
26
|
+
*/
|
|
27
|
+
validate?(match: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Optional normalization of a match for storage
|
|
30
|
+
* @param match - The matched text
|
|
31
|
+
* @returns Normalized version of the match
|
|
32
|
+
*/
|
|
33
|
+
normalize?(match: string): string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Base class for regex-based recognizers
|
|
37
|
+
*/
|
|
38
|
+
export declare abstract class RegexRecognizer implements Recognizer {
|
|
39
|
+
abstract readonly type: PIIType;
|
|
40
|
+
abstract readonly name: string;
|
|
41
|
+
readonly defaultConfidence: number;
|
|
42
|
+
/** Compiled regex pattern(s) for matching */
|
|
43
|
+
protected abstract readonly patterns: RegExp[];
|
|
44
|
+
/**
|
|
45
|
+
* Finds all matches using the configured patterns
|
|
46
|
+
*/
|
|
47
|
+
find(text: string): SpanMatch[];
|
|
48
|
+
/**
|
|
49
|
+
* Removes duplicate matches (same span matched by multiple patterns)
|
|
50
|
+
*/
|
|
51
|
+
protected deduplicateMatches(matches: SpanMatch[]): SpanMatch[];
|
|
52
|
+
/**
|
|
53
|
+
* Default validation (always passes)
|
|
54
|
+
* Override in subclasses for checksum validation etc.
|
|
55
|
+
*/
|
|
56
|
+
validate?(match: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Default normalization (returns as-is)
|
|
59
|
+
* Override in subclasses for specific normalization
|
|
60
|
+
*/
|
|
61
|
+
normalize?(match: string): string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Configuration for a regex recognizer created from patterns
|
|
65
|
+
*/
|
|
66
|
+
export interface RegexRecognizerConfig {
|
|
67
|
+
type: PIIType;
|
|
68
|
+
name: string;
|
|
69
|
+
patterns: RegExp[];
|
|
70
|
+
defaultConfidence?: number;
|
|
71
|
+
validate?: (match: string) => boolean;
|
|
72
|
+
normalize?: (match: string) => string;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Creates a simple regex recognizer from configuration
|
|
76
|
+
*/
|
|
77
|
+
export declare function createRegexRecognizer(config: RegexRecognizerConfig): Recognizer;
|
|
78
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/recognizers/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,SAAS,EAAmB,MAAM,mBAAmB,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAEvB,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,wDAAwD;IACxD,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IAEnC;;;;OAIG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;IAEhC;;;;OAIG;IACH,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAElC;;;;OAIG;IACH,SAAS,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACnC;AAED;;GAEG;AACH,8BAAsB,eAAgB,YAAW,UAAU;IACzD,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAQ;IAE1C,6CAA6C;IAC7C,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAE/C;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE;IAiC/B;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;IAe/D;;;OAGG;IACH,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAEjC;;;OAGG;IACH,SAAS,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,UAAU,CA8C/E"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Recognizer Interface
|
|
3
|
+
* Defines the contract for all PII recognizers (regex-based)
|
|
4
|
+
*/
|
|
5
|
+
import { DetectionSource } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Base class for regex-based recognizers
|
|
8
|
+
*/
|
|
9
|
+
export class RegexRecognizer {
|
|
10
|
+
defaultConfidence = 0.95;
|
|
11
|
+
/**
|
|
12
|
+
* Finds all matches using the configured patterns
|
|
13
|
+
*/
|
|
14
|
+
find(text) {
|
|
15
|
+
const matches = [];
|
|
16
|
+
for (const pattern of this.patterns) {
|
|
17
|
+
// Ensure pattern has global flag for matchAll
|
|
18
|
+
const globalPattern = pattern.global
|
|
19
|
+
? pattern
|
|
20
|
+
: new RegExp(pattern.source, pattern.flags + 'g');
|
|
21
|
+
for (const match of text.matchAll(globalPattern)) {
|
|
22
|
+
if (match.index === undefined)
|
|
23
|
+
continue;
|
|
24
|
+
const matchText = match[0];
|
|
25
|
+
// Skip if validation fails
|
|
26
|
+
if (this.validate !== undefined && !this.validate(matchText)) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
matches.push({
|
|
30
|
+
type: this.type,
|
|
31
|
+
start: match.index,
|
|
32
|
+
end: match.index + matchText.length,
|
|
33
|
+
confidence: this.defaultConfidence,
|
|
34
|
+
source: DetectionSource.REGEX,
|
|
35
|
+
text: matchText,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return this.deduplicateMatches(matches);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Removes duplicate matches (same span matched by multiple patterns)
|
|
43
|
+
*/
|
|
44
|
+
deduplicateMatches(matches) {
|
|
45
|
+
const seen = new Set();
|
|
46
|
+
const unique = [];
|
|
47
|
+
for (const match of matches) {
|
|
48
|
+
const key = `${match.start}:${match.end}`;
|
|
49
|
+
if (!seen.has(key)) {
|
|
50
|
+
seen.add(key);
|
|
51
|
+
unique.push(match);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return unique;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Creates a simple regex recognizer from configuration
|
|
59
|
+
*/
|
|
60
|
+
export function createRegexRecognizer(config) {
|
|
61
|
+
return {
|
|
62
|
+
type: config.type,
|
|
63
|
+
name: config.name,
|
|
64
|
+
defaultConfidence: config.defaultConfidence ?? 0.95,
|
|
65
|
+
find(text) {
|
|
66
|
+
const matches = [];
|
|
67
|
+
const seen = new Set();
|
|
68
|
+
for (const pattern of config.patterns) {
|
|
69
|
+
const globalPattern = pattern.global
|
|
70
|
+
? pattern
|
|
71
|
+
: new RegExp(pattern.source, pattern.flags + 'g');
|
|
72
|
+
for (const match of text.matchAll(globalPattern)) {
|
|
73
|
+
if (match.index === undefined)
|
|
74
|
+
continue;
|
|
75
|
+
const matchText = match[0];
|
|
76
|
+
const key = `${match.index}:${match.index + matchText.length}`;
|
|
77
|
+
if (seen.has(key))
|
|
78
|
+
continue;
|
|
79
|
+
// Skip if validation fails
|
|
80
|
+
if (config.validate !== undefined && !config.validate(matchText)) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
seen.add(key);
|
|
84
|
+
matches.push({
|
|
85
|
+
type: config.type,
|
|
86
|
+
start: match.index,
|
|
87
|
+
end: match.index + matchText.length,
|
|
88
|
+
confidence: config.defaultConfidence ?? 0.95,
|
|
89
|
+
source: DetectionSource.REGEX,
|
|
90
|
+
text: matchText,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return matches;
|
|
95
|
+
},
|
|
96
|
+
validate: config.validate,
|
|
97
|
+
normalize: config.normalize,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/recognizers/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bic-swift.d.ts","sourceRoot":"","sources":["../../src/recognizers/bic-swift.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AA2C5C;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,UAsEhC,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BIC/SWIFT Code Recognizer
|
|
3
|
+
* Bank Identifier Code (ISO 9362)
|
|
4
|
+
*/
|
|
5
|
+
import { PIIType, DetectionSource } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* BIC/SWIFT code pattern
|
|
8
|
+
* Format: AAAA BB CC DDD (8 or 11 characters)
|
|
9
|
+
* - AAAA: Bank code (4 letters)
|
|
10
|
+
* - BB: Country code (2 letters, ISO 3166-1)
|
|
11
|
+
* - CC: Location code (2 alphanumeric)
|
|
12
|
+
* - DDD: Branch code (3 alphanumeric, optional)
|
|
13
|
+
*/
|
|
14
|
+
const BIC_PATTERN = /\b[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}(?:[A-Z0-9]{3})?\b/g;
|
|
15
|
+
/**
|
|
16
|
+
* Valid ISO 3166-1 alpha-2 country codes (common subset)
|
|
17
|
+
*/
|
|
18
|
+
const VALID_COUNTRY_CODES = new Set([
|
|
19
|
+
'AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AR', 'AS', 'AT', 'AU', 'AW', 'AZ',
|
|
20
|
+
'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BM', 'BN', 'BO', 'BR', 'BS', 'BT', 'BW', 'BY', 'BZ',
|
|
21
|
+
'CA', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', 'CV', 'CY', 'CZ',
|
|
22
|
+
'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ',
|
|
23
|
+
'EC', 'EE', 'EG', 'ER', 'ES', 'ET',
|
|
24
|
+
'FI', 'FJ', 'FK', 'FM', 'FO', 'FR',
|
|
25
|
+
'GA', 'GB', 'GD', 'GE', 'GF', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GT', 'GU', 'GW', 'GY',
|
|
26
|
+
'HK', 'HN', 'HR', 'HT', 'HU',
|
|
27
|
+
'ID', 'IE', 'IL', 'IN', 'IQ', 'IR', 'IS', 'IT',
|
|
28
|
+
'JM', 'JO', 'JP',
|
|
29
|
+
'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ',
|
|
30
|
+
'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY',
|
|
31
|
+
'MA', 'MC', 'MD', 'ME', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ',
|
|
32
|
+
'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ',
|
|
33
|
+
'OM',
|
|
34
|
+
'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY',
|
|
35
|
+
'QA',
|
|
36
|
+
'RE', 'RO', 'RS', 'RU', 'RW',
|
|
37
|
+
'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SY', 'SZ',
|
|
38
|
+
'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ',
|
|
39
|
+
'UA', 'UG', 'US', 'UY', 'UZ',
|
|
40
|
+
'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU',
|
|
41
|
+
'WF', 'WS',
|
|
42
|
+
'YE', 'YT',
|
|
43
|
+
'ZA', 'ZM', 'ZW',
|
|
44
|
+
]);
|
|
45
|
+
/**
|
|
46
|
+
* BIC/SWIFT code recognizer
|
|
47
|
+
*/
|
|
48
|
+
export const bicSwiftRecognizer = {
|
|
49
|
+
type: PIIType.BIC_SWIFT,
|
|
50
|
+
name: 'BIC/SWIFT Code',
|
|
51
|
+
defaultConfidence: 0.95,
|
|
52
|
+
find(text) {
|
|
53
|
+
const matches = [];
|
|
54
|
+
const pattern = new RegExp(BIC_PATTERN.source, 'g');
|
|
55
|
+
for (const match of text.matchAll(pattern)) {
|
|
56
|
+
if (match.index === undefined)
|
|
57
|
+
continue;
|
|
58
|
+
const bic = match[0];
|
|
59
|
+
// Validate the BIC code
|
|
60
|
+
if (!this.validate(bic))
|
|
61
|
+
continue;
|
|
62
|
+
matches.push({
|
|
63
|
+
type: PIIType.BIC_SWIFT,
|
|
64
|
+
start: match.index,
|
|
65
|
+
end: match.index + bic.length,
|
|
66
|
+
confidence: this.defaultConfidence,
|
|
67
|
+
source: DetectionSource.REGEX,
|
|
68
|
+
text: bic,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return matches;
|
|
72
|
+
},
|
|
73
|
+
validate(bic) {
|
|
74
|
+
const normalized = bic.toUpperCase();
|
|
75
|
+
// Check length (8 or 11 characters)
|
|
76
|
+
if (normalized.length !== 8 && normalized.length !== 11) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
// Extract and validate country code (characters 5-6)
|
|
80
|
+
const countryCode = normalized.slice(4, 6);
|
|
81
|
+
if (!VALID_COUNTRY_CODES.has(countryCode)) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
// Bank code should be letters only
|
|
85
|
+
const bankCode = normalized.slice(0, 4);
|
|
86
|
+
if (!/^[A-Z]{4}$/.test(bankCode)) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
// Location code should be alphanumeric
|
|
90
|
+
const locationCode = normalized.slice(6, 8);
|
|
91
|
+
if (!/^[A-Z0-9]{2}$/.test(locationCode)) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
// Branch code (if present) should be alphanumeric
|
|
95
|
+
if (normalized.length === 11) {
|
|
96
|
+
const branchCode = normalized.slice(8, 11);
|
|
97
|
+
if (!/^[A-Z0-9]{3}$/.test(branchCode)) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
},
|
|
103
|
+
normalize(bic) {
|
|
104
|
+
return bic.toUpperCase().trim();
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=bic-swift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bic-swift.js","sourceRoot":"","sources":["../../src/recognizers/bic-swift.ts"],"names":[],"mappings":"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"}
|