@blamejs/blamejs-shop 0.0.44
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 +87 -0
- package/LICENSE +17 -0
- package/README.md +117 -0
- package/SECURITY.md +139 -0
- package/lib/admin.js +952 -0
- package/lib/analytics.js +267 -0
- package/lib/cart.js +279 -0
- package/lib/catalog-import.js +344 -0
- package/lib/catalog.js +769 -0
- package/lib/checkout.js +320 -0
- package/lib/config.js +151 -0
- package/lib/customers.js +322 -0
- package/lib/email.js +242 -0
- package/lib/externaldb-d1.js +283 -0
- package/lib/index.js +57 -0
- package/lib/inventory-alerts.js +198 -0
- package/lib/newsletter.js +142 -0
- package/lib/order.js +380 -0
- package/lib/payment.js +318 -0
- package/lib/pricing.js +185 -0
- package/lib/r2-bridge.js +169 -0
- package/lib/shipping.js +185 -0
- package/lib/storefront.js +2160 -0
- package/lib/subscriptions.js +410 -0
- package/lib/tax.js +161 -0
- package/lib/theme.js +194 -0
- package/lib/vendor/MANIFEST.json +19 -0
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +23 -0
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +34 -0
- package/lib/vendor/blamejs/.clusterfuzzlite/project.yaml +16 -0
- package/lib/vendor/blamejs/.dockerignore +45 -0
- package/lib/vendor/blamejs/.gitattributes +42 -0
- package/lib/vendor/blamejs/.github/CODEOWNERS +4 -0
- package/lib/vendor/blamejs/.github/FUNDING.yml +2 -0
- package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/bug_report.md +58 -0
- package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/feature_request.md +99 -0
- package/lib/vendor/blamejs/.github/PULL_REQUEST_TEMPLATE.md +77 -0
- package/lib/vendor/blamejs/.github/dependabot.yml +37 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +148 -0
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +107 -0
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +122 -0
- package/lib/vendor/blamejs/.github/workflows/ci.yml +511 -0
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +50 -0
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +655 -0
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +406 -0
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +101 -0
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +134 -0
- package/lib/vendor/blamejs/.gitignore +102 -0
- package/lib/vendor/blamejs/.gitleaks.toml +166 -0
- package/lib/vendor/blamejs/.hadolint.yaml +18 -0
- package/lib/vendor/blamejs/.npmrc +5 -0
- package/lib/vendor/blamejs/.pinact.yaml +17 -0
- package/lib/vendor/blamejs/ARCHITECTURE.md +158 -0
- package/lib/vendor/blamejs/CHANGELOG.md +1351 -0
- package/lib/vendor/blamejs/CODE_OF_CONDUCT.md +86 -0
- package/lib/vendor/blamejs/CONTRIBUTING.md +156 -0
- package/lib/vendor/blamejs/GOVERNANCE.md +201 -0
- package/lib/vendor/blamejs/LICENSE +201 -0
- package/lib/vendor/blamejs/LTS-CALENDAR.md +29 -0
- package/lib/vendor/blamejs/MIGRATING.md +29 -0
- package/lib/vendor/blamejs/NOTICE +81 -0
- package/lib/vendor/blamejs/README.md +304 -0
- package/lib/vendor/blamejs/SECURITY.md +432 -0
- package/lib/vendor/blamejs/api-snapshot.json +48709 -0
- package/lib/vendor/blamejs/assets/BlameJS_Logo.png +0 -0
- package/lib/vendor/blamejs/assets/BlameJS_Logo.svg +129 -0
- package/lib/vendor/blamejs/bench/README.md +77 -0
- package/lib/vendor/blamejs/bench/_helpers.js +70 -0
- package/lib/vendor/blamejs/bench/baseline.json +183 -0
- package/lib/vendor/blamejs/bench/crypto-hash.bench.js +19 -0
- package/lib/vendor/blamejs/bench/crypto-symmetric.bench.js +28 -0
- package/lib/vendor/blamejs/bench/run.js +140 -0
- package/lib/vendor/blamejs/bench/safe-json.bench.js +31 -0
- package/lib/vendor/blamejs/bin/blamejs.js +13 -0
- package/lib/vendor/blamejs/docker/caddy/Caddyfile +46 -0
- package/lib/vendor/blamejs/docker/coredns/Corefile +37 -0
- package/lib/vendor/blamejs/docker/haproxy/haproxy.cfg +52 -0
- package/lib/vendor/blamejs/docker/init/generate-certs.sh +118 -0
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +87 -0
- package/lib/vendor/blamejs/docker/mitmproxy/config.yaml +16 -0
- package/lib/vendor/blamejs/docker/mongo/init-tls.sh +17 -0
- package/lib/vendor/blamejs/docker/mysql/my.cnf +12 -0
- package/lib/vendor/blamejs/docker/nats/nats.conf +33 -0
- package/lib/vendor/blamejs/docker/postgres/init-tls.sh +17 -0
- package/lib/vendor/blamejs/docker/postgres/postgresql.conf +18 -0
- package/lib/vendor/blamejs/docker/rabbitmq/rabbitmq.conf +18 -0
- package/lib/vendor/blamejs/docker/redis/redis.conf +15 -0
- package/lib/vendor/blamejs/docker/squid/squid.conf +24 -0
- package/lib/vendor/blamejs/docker/syslog/syslog-ng.conf +34 -0
- package/lib/vendor/blamejs/docker-compose.test.yml +545 -0
- package/lib/vendor/blamejs/docs/cis-postgres-crosswalk.md +102 -0
- package/lib/vendor/blamejs/docs/cis-sqlite-equivalent.md +92 -0
- package/lib/vendor/blamejs/eslint.config.mjs +204 -0
- package/lib/vendor/blamejs/examples/wiki/Caddyfile +40 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +218 -0
- package/lib/vendor/blamejs/examples/wiki/Dockerfile +120 -0
- package/lib/vendor/blamejs/examples/wiki/README.md +157 -0
- package/lib/vendor/blamejs/examples/wiki/cli-snapshot.json +250 -0
- package/lib/vendor/blamejs/examples/wiki/docker-compose.prod.yml +231 -0
- package/lib/vendor/blamejs/examples/wiki/docker-compose.yml +166 -0
- package/lib/vendor/blamejs/examples/wiki/env-snapshot.json +217 -0
- package/lib/vendor/blamejs/examples/wiki/lib/auto-site-entries.js +139 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +555 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-cli.js +507 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-env-vars.js +435 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-errors.js +282 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-vendored-deps.js +321 -0
- package/lib/vendor/blamejs/examples/wiki/lib/nav.js +15 -0
- package/lib/vendor/blamejs/examples/wiki/lib/opts-resolver.js +75 -0
- package/lib/vendor/blamejs/examples/wiki/lib/page-generator.js +508 -0
- package/lib/vendor/blamejs/examples/wiki/lib/section.js +276 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +587 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-doc-parser.js +318 -0
- package/lib/vendor/blamejs/examples/wiki/lib/symbol-index.js +122 -0
- package/lib/vendor/blamejs/examples/wiki/migrations/0001-pages-schema.js +74 -0
- package/lib/vendor/blamejs/examples/wiki/package.json +18 -0
- package/lib/vendor/blamejs/examples/wiki/public/img/blamejs-logo.png +0 -0
- package/lib/vendor/blamejs/examples/wiki/public/img/blamejs-logo.svg +129 -0
- package/lib/vendor/blamejs/examples/wiki/public/robots.txt +5 -0
- package/lib/vendor/blamejs/examples/wiki/public/vendor/MANIFEST.json +30 -0
- package/lib/vendor/blamejs/examples/wiki/public/vendor/prism.css +1 -0
- package/lib/vendor/blamejs/examples/wiki/public/vendor/prism.js +15 -0
- package/lib/vendor/blamejs/examples/wiki/public/wiki.css +1250 -0
- package/lib/vendor/blamejs/examples/wiki/routes/admin.js +366 -0
- package/lib/vendor/blamejs/examples/wiki/routes/integration.js +230 -0
- package/lib/vendor/blamejs/examples/wiki/routes/pages.js +266 -0
- package/lib/vendor/blamejs/examples/wiki/scripts/backfill-module-metadata.js +214 -0
- package/lib/vendor/blamejs/examples/wiki/seeders/prod/0001-default-pages.js +35 -0
- package/lib/vendor/blamejs/examples/wiki/seeders/prod/pages/_index.js +34 -0
- package/lib/vendor/blamejs/examples/wiki/seeders/prod/pages/api.js +76 -0
- package/lib/vendor/blamejs/examples/wiki/server.js +129 -0
- package/lib/vendor/blamejs/examples/wiki/site.config.js +197 -0
- package/lib/vendor/blamejs/examples/wiki/snippets/README.md +38 -0
- package/lib/vendor/blamejs/examples/wiki/snippets/auth/password-hash.example.js +15 -0
- package/lib/vendor/blamejs/examples/wiki/src/editor.js +103 -0
- package/lib/vendor/blamejs/examples/wiki/src/wiki.js +349 -0
- package/lib/vendor/blamejs/examples/wiki/test/AUDIT.md +155 -0
- package/lib/vendor/blamejs/examples/wiki/test/codebase-patterns.test.js +594 -0
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +741 -0
- package/lib/vendor/blamejs/examples/wiki/test/find-missing-pages.js +254 -0
- package/lib/vendor/blamejs/examples/wiki/test/integration.js +391 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-cli-snapshot.js +379 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-env-snapshot.js +346 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-nav-coverage.js +212 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-site-coverage.js +252 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-source-comment-blocks.js +107 -0
- package/lib/vendor/blamejs/examples/wiki/views/_layout.html +115 -0
- package/lib/vendor/blamejs/examples/wiki/views/admin/api-keys.html +51 -0
- package/lib/vendor/blamejs/examples/wiki/views/admin/dashboard.html +22 -0
- package/lib/vendor/blamejs/examples/wiki/views/admin/edit.html +17 -0
- package/lib/vendor/blamejs/examples/wiki/views/home.html +85 -0
- package/lib/vendor/blamejs/examples/wiki/views/login.html +18 -0
- package/lib/vendor/blamejs/examples/wiki/views/page.html +5 -0
- package/lib/vendor/blamejs/examples/wiki/views/partials/nav.html +13 -0
- package/lib/vendor/blamejs/examples/wiki/views/search.html +19 -0
- package/lib/vendor/blamejs/examples/wiki/wiki.config.js +15 -0
- package/lib/vendor/blamejs/fuzz/README.md +137 -0
- package/lib/vendor/blamejs/fuzz/_expected.js +35 -0
- package/lib/vendor/blamejs/fuzz/guard-agent-registry.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-csv.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/01-basic.csv +3 -0
- package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/02-formula.csv +1 -0
- package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/03-hyperlink.csv +1 -0
- package/lib/vendor/blamejs/fuzz/guard-dsn.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-email.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-email_seed_corpus/01-basic.eml +5 -0
- package/lib/vendor/blamejs/fuzz/guard-envelope.fuzz.js +24 -0
- package/lib/vendor/blamejs/fuzz/guard-event-bus-payload.fuzz.js +24 -0
- package/lib/vendor/blamejs/fuzz/guard-event-bus-topic.fuzz.js +20 -0
- package/lib/vendor/blamejs/fuzz/guard-html.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/01-basic.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/02-script.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/03-event.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/04-jsurl.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-idempotency-key.fuzz.js +20 -0
- package/lib/vendor/blamejs/fuzz/guard-imap-command.fuzz.js +35 -0
- package/lib/vendor/blamejs/fuzz/guard-jmap.fuzz.js +41 -0
- package/lib/vendor/blamejs/fuzz/guard-json.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/01-basic.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/02-proto.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/03-dupkey.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/04-nan.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/05-bom.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-list-id.fuzz.js +21 -0
- package/lib/vendor/blamejs/fuzz/guard-list-unsubscribe.fuzz.js +25 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-compose.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-move.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-query.fuzz.js +27 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-reply.fuzz.js +23 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-sieve.fuzz.js +36 -0
- package/lib/vendor/blamejs/fuzz/guard-managesieve-command.fuzz.js +26 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/01-basic.md +2 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/02-jsurl.md +1 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/03-jsimg.md +1 -0
- package/lib/vendor/blamejs/fuzz/guard-message-id.fuzz.js +26 -0
- package/lib/vendor/blamejs/fuzz/guard-pop3-command.fuzz.js +23 -0
- package/lib/vendor/blamejs/fuzz/guard-posture-chain.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-saga-config.fuzz.js +32 -0
- package/lib/vendor/blamejs/fuzz/guard-smtp-command.fuzz.js +27 -0
- package/lib/vendor/blamejs/fuzz/guard-snapshot-envelope.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-stream-args.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-svg.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-svg_seed_corpus/01-basic.svg +1 -0
- package/lib/vendor/blamejs/fuzz/guard-svg_seed_corpus/02-script.svg +1 -0
- package/lib/vendor/blamejs/fuzz/guard-tenant-id.fuzz.js +20 -0
- package/lib/vendor/blamejs/fuzz/guard-trace-context.fuzz.js +30 -0
- package/lib/vendor/blamejs/fuzz/guard-xml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-xml_seed_corpus/01-basic.xml +1 -0
- package/lib/vendor/blamejs/fuzz/guard-xml_seed_corpus/02-xxe.xml +1 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/01-basic.yaml +2 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/02-anchor.yaml +2 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/03-norway.yaml +1 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/04-multidoc.yaml +4 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-ini.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-ini_seed_corpus/01-basic.ini +2 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-toml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-toml_seed_corpus/01-basic.toml +4 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-xml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-xml_seed_corpus/01-basic.xml +1 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-yaml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-yaml_seed_corpus/01-basic.yaml +4 -0
- package/lib/vendor/blamejs/fuzz/safe-decompress.fuzz.js +49 -0
- package/lib/vendor/blamejs/fuzz/safe-dns.fuzz.js +29 -0
- package/lib/vendor/blamejs/fuzz/safe-ical.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/safe-icap.fuzz.js +42 -0
- package/lib/vendor/blamejs/fuzz/safe-json.fuzz.js +25 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/01-object.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/02-array.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/03-string.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/04-proto.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/05-deep.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/01-basic.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/02-filter.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/03-deepscan.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/04-slice.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-mime.fuzz.js +27 -0
- package/lib/vendor/blamejs/fuzz/safe-mount-info.fuzz.js +33 -0
- package/lib/vendor/blamejs/fuzz/safe-sieve.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/safe-smtp.fuzz.js +64 -0
- package/lib/vendor/blamejs/fuzz/safe-url.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/01-basic.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/02-userinfo.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/03-dangerous.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/04-data.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/05-ipv6.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/06-idn.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-vcard.fuzz.js +16 -0
- package/lib/vendor/blamejs/index.js +678 -0
- package/lib/vendor/blamejs/keys/release-pqc-pub.json +7 -0
- package/lib/vendor/blamejs/lib/_test/crypto-fixtures.js +67 -0
- package/lib/vendor/blamejs/lib/a2a-tasks.js +598 -0
- package/lib/vendor/blamejs/lib/a2a.js +407 -0
- package/lib/vendor/blamejs/lib/acme.js +1448 -0
- package/lib/vendor/blamejs/lib/agent-audit.js +45 -0
- package/lib/vendor/blamejs/lib/agent-event-bus.js +382 -0
- package/lib/vendor/blamejs/lib/agent-idempotency.js +497 -0
- package/lib/vendor/blamejs/lib/agent-orchestrator.js +717 -0
- package/lib/vendor/blamejs/lib/agent-posture-chain.js +366 -0
- package/lib/vendor/blamejs/lib/agent-saga.js +321 -0
- package/lib/vendor/blamejs/lib/agent-snapshot.js +676 -0
- package/lib/vendor/blamejs/lib/agent-stream.js +269 -0
- package/lib/vendor/blamejs/lib/agent-tenant.js +632 -0
- package/lib/vendor/blamejs/lib/agent-trace.js +281 -0
- package/lib/vendor/blamejs/lib/ai-adverse-decision.js +184 -0
- package/lib/vendor/blamejs/lib/ai-content-detect.js +268 -0
- package/lib/vendor/blamejs/lib/ai-input.js +201 -0
- package/lib/vendor/blamejs/lib/ai-model-manifest.js +363 -0
- package/lib/vendor/blamejs/lib/ai-pref.js +340 -0
- package/lib/vendor/blamejs/lib/api-key.js +721 -0
- package/lib/vendor/blamejs/lib/api-snapshot.js +458 -0
- package/lib/vendor/blamejs/lib/app-shutdown.js +557 -0
- package/lib/vendor/blamejs/lib/app.js +365 -0
- package/lib/vendor/blamejs/lib/archive.js +547 -0
- package/lib/vendor/blamejs/lib/arg-parser.js +697 -0
- package/lib/vendor/blamejs/lib/argon2-builtin.js +173 -0
- package/lib/vendor/blamejs/lib/asn1-der.js +424 -0
- package/lib/vendor/blamejs/lib/asyncapi-bindings.js +160 -0
- package/lib/vendor/blamejs/lib/asyncapi-traits.js +143 -0
- package/lib/vendor/blamejs/lib/asyncapi.js +575 -0
- package/lib/vendor/blamejs/lib/atomic-file.js +1023 -0
- package/lib/vendor/blamejs/lib/audit-chain.js +266 -0
- package/lib/vendor/blamejs/lib/audit-daily-review.js +389 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +751 -0
- package/lib/vendor/blamejs/lib/audit-tools.js +1113 -0
- package/lib/vendor/blamejs/lib/audit.js +1671 -0
- package/lib/vendor/blamejs/lib/auth/aal.js +169 -0
- package/lib/vendor/blamejs/lib/auth/access-lock.js +220 -0
- package/lib/vendor/blamejs/lib/auth/acr-vocabulary.js +265 -0
- package/lib/vendor/blamejs/lib/auth/ato-kill-switch.js +112 -0
- package/lib/vendor/blamejs/lib/auth/auth-time-tracker.js +111 -0
- package/lib/vendor/blamejs/lib/auth/bot-challenge.js +573 -0
- package/lib/vendor/blamejs/lib/auth/ciba.js +637 -0
- package/lib/vendor/blamejs/lib/auth/dpop.js +516 -0
- package/lib/vendor/blamejs/lib/auth/elevation-grant.js +306 -0
- package/lib/vendor/blamejs/lib/auth/fal.js +229 -0
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +681 -0
- package/lib/vendor/blamejs/lib/auth/jwt-external.js +519 -0
- package/lib/vendor/blamejs/lib/auth/jwt.js +430 -0
- package/lib/vendor/blamejs/lib/auth/lockout.js +449 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +2141 -0
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +657 -0
- package/lib/vendor/blamejs/lib/auth/oid4vp.js +531 -0
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +600 -0
- package/lib/vendor/blamejs/lib/auth/passkey.js +676 -0
- package/lib/vendor/blamejs/lib/auth/password.js +693 -0
- package/lib/vendor/blamejs/lib/auth/saml.js +2109 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-disclosure.js +95 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-holder.js +225 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-issuer.js +197 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +728 -0
- package/lib/vendor/blamejs/lib/auth/status-list.js +272 -0
- package/lib/vendor/blamejs/lib/auth/step-up-policy.js +335 -0
- package/lib/vendor/blamejs/lib/auth/step-up.js +454 -0
- package/lib/vendor/blamejs/lib/auth-bot-challenge.js +505 -0
- package/lib/vendor/blamejs/lib/auth-header.js +148 -0
- package/lib/vendor/blamejs/lib/backup/bundle.js +265 -0
- package/lib/vendor/blamejs/lib/backup/crypto.js +176 -0
- package/lib/vendor/blamejs/lib/backup/index.js +1001 -0
- package/lib/vendor/blamejs/lib/backup/manifest.js +443 -0
- package/lib/vendor/blamejs/lib/boot-gates.js +174 -0
- package/lib/vendor/blamejs/lib/breach-deadline.js +272 -0
- package/lib/vendor/blamejs/lib/break-glass.js +1753 -0
- package/lib/vendor/blamejs/lib/budr.js +205 -0
- package/lib/vendor/blamejs/lib/bundler.js +461 -0
- package/lib/vendor/blamejs/lib/cache-redis.js +256 -0
- package/lib/vendor/blamejs/lib/cache-status.js +288 -0
- package/lib/vendor/blamejs/lib/cache.js +1331 -0
- package/lib/vendor/blamejs/lib/calendar.js +1240 -0
- package/lib/vendor/blamejs/lib/canonical-json.js +143 -0
- package/lib/vendor/blamejs/lib/cdn-cache-control.js +473 -0
- package/lib/vendor/blamejs/lib/cert.js +763 -0
- package/lib/vendor/blamejs/lib/chain-writer.js +259 -0
- package/lib/vendor/blamejs/lib/circuit-breaker.js +101 -0
- package/lib/vendor/blamejs/lib/cli-helpers.js +237 -0
- package/lib/vendor/blamejs/lib/cli.js +2328 -0
- package/lib/vendor/blamejs/lib/client-hints.js +318 -0
- package/lib/vendor/blamejs/lib/cloud-events.js +277 -0
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +317 -0
- package/lib/vendor/blamejs/lib/cluster-storage.js +351 -0
- package/lib/vendor/blamejs/lib/cluster.js +1017 -0
- package/lib/vendor/blamejs/lib/cms-codec.js +826 -0
- package/lib/vendor/blamejs/lib/codepoint-class.js +262 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-logging.js +190 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +205 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-risk.js +189 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +200 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +821 -0
- package/lib/vendor/blamejs/lib/compliance-eaa.js +204 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions-aliases.js +167 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions-fetcher.js +206 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions-fuzzy.js +297 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions.js +569 -0
- package/lib/vendor/blamejs/lib/compliance.js +1558 -0
- package/lib/vendor/blamejs/lib/config-drift.js +426 -0
- package/lib/vendor/blamejs/lib/config.js +446 -0
- package/lib/vendor/blamejs/lib/consent.js +369 -0
- package/lib/vendor/blamejs/lib/constants.js +209 -0
- package/lib/vendor/blamejs/lib/content-credentials.js +704 -0
- package/lib/vendor/blamejs/lib/cookies.js +560 -0
- package/lib/vendor/blamejs/lib/cra-report.js +299 -0
- package/lib/vendor/blamejs/lib/credential-hash.js +394 -0
- package/lib/vendor/blamejs/lib/crypto-field.js +1017 -0
- package/lib/vendor/blamejs/lib/crypto-hpke-pq.js +187 -0
- package/lib/vendor/blamejs/lib/crypto-hpke.js +256 -0
- package/lib/vendor/blamejs/lib/crypto.js +1908 -0
- package/lib/vendor/blamejs/lib/csp.js +271 -0
- package/lib/vendor/blamejs/lib/csv.js +418 -0
- package/lib/vendor/blamejs/lib/daemon.js +481 -0
- package/lib/vendor/blamejs/lib/dark-patterns.js +488 -0
- package/lib/vendor/blamejs/lib/data-act.js +328 -0
- package/lib/vendor/blamejs/lib/db-collection.js +587 -0
- package/lib/vendor/blamejs/lib/db-declare-row-policy.js +267 -0
- package/lib/vendor/blamejs/lib/db-declare-view.js +420 -0
- package/lib/vendor/blamejs/lib/db-file-lifecycle.js +333 -0
- package/lib/vendor/blamejs/lib/db-query.js +802 -0
- package/lib/vendor/blamejs/lib/db-role-context.js +50 -0
- package/lib/vendor/blamejs/lib/db-schema.js +322 -0
- package/lib/vendor/blamejs/lib/db.js +3111 -0
- package/lib/vendor/blamejs/lib/dbsc.js +299 -0
- package/lib/vendor/blamejs/lib/ddl-change-control.js +523 -0
- package/lib/vendor/blamejs/lib/deprecate.js +377 -0
- package/lib/vendor/blamejs/lib/dev.js +405 -0
- package/lib/vendor/blamejs/lib/dora.js +402 -0
- package/lib/vendor/blamejs/lib/dr-runbook.js +368 -0
- package/lib/vendor/blamejs/lib/dsr.js +1188 -0
- package/lib/vendor/blamejs/lib/dual-control.js +526 -0
- package/lib/vendor/blamejs/lib/early-hints.js +212 -0
- package/lib/vendor/blamejs/lib/error-page.js +420 -0
- package/lib/vendor/blamejs/lib/events.js +214 -0
- package/lib/vendor/blamejs/lib/external-db-migrate.js +659 -0
- package/lib/vendor/blamejs/lib/external-db.js +1877 -0
- package/lib/vendor/blamejs/lib/fapi2.js +394 -0
- package/lib/vendor/blamejs/lib/fda-21cfr11.js +395 -0
- package/lib/vendor/blamejs/lib/fdx.js +370 -0
- package/lib/vendor/blamejs/lib/fedcm.js +264 -0
- package/lib/vendor/blamejs/lib/file-type.js +360 -0
- package/lib/vendor/blamejs/lib/file-upload.js +1256 -0
- package/lib/vendor/blamejs/lib/flag-cache.js +136 -0
- package/lib/vendor/blamejs/lib/flag-evaluation-context.js +135 -0
- package/lib/vendor/blamejs/lib/flag-providers.js +279 -0
- package/lib/vendor/blamejs/lib/flag-targeting.js +210 -0
- package/lib/vendor/blamejs/lib/flag.js +346 -0
- package/lib/vendor/blamejs/lib/forms.js +525 -0
- package/lib/vendor/blamejs/lib/framework-error.js +724 -0
- package/lib/vendor/blamejs/lib/framework-schema.js +845 -0
- package/lib/vendor/blamejs/lib/framework-sha1-hibp.js +34 -0
- package/lib/vendor/blamejs/lib/fsm.js +469 -0
- package/lib/vendor/blamejs/lib/gate-contract.js +1661 -0
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +261 -0
- package/lib/vendor/blamejs/lib/graphql-federation.js +234 -0
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +179 -0
- package/lib/vendor/blamejs/lib/guard-all.js +555 -0
- package/lib/vendor/blamejs/lib/guard-archive.js +901 -0
- package/lib/vendor/blamejs/lib/guard-auth.js +451 -0
- package/lib/vendor/blamejs/lib/guard-cidr.js +676 -0
- package/lib/vendor/blamejs/lib/guard-csv.js +1176 -0
- package/lib/vendor/blamejs/lib/guard-domain.js +814 -0
- package/lib/vendor/blamejs/lib/guard-dsn.js +382 -0
- package/lib/vendor/blamejs/lib/guard-email.js +951 -0
- package/lib/vendor/blamejs/lib/guard-envelope.js +294 -0
- package/lib/vendor/blamejs/lib/guard-event-bus-payload.js +217 -0
- package/lib/vendor/blamejs/lib/guard-event-bus-topic.js +150 -0
- package/lib/vendor/blamejs/lib/guard-filename.js +956 -0
- package/lib/vendor/blamejs/lib/guard-graphql.js +731 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-aria.js +164 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-forms.js +144 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-tables.js +154 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-tagwalk.js +44 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag.js +470 -0
- package/lib/vendor/blamejs/lib/guard-html.js +1209 -0
- package/lib/vendor/blamejs/lib/guard-idempotency-key.js +151 -0
- package/lib/vendor/blamejs/lib/guard-image.js +584 -0
- package/lib/vendor/blamejs/lib/guard-imap-command.js +337 -0
- package/lib/vendor/blamejs/lib/guard-jmap.js +321 -0
- package/lib/vendor/blamejs/lib/guard-json.js +935 -0
- package/lib/vendor/blamejs/lib/guard-jsonpath.js +512 -0
- package/lib/vendor/blamejs/lib/guard-jwt.js +772 -0
- package/lib/vendor/blamejs/lib/guard-list-id.js +318 -0
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +412 -0
- package/lib/vendor/blamejs/lib/guard-mail-compose.js +282 -0
- package/lib/vendor/blamejs/lib/guard-mail-move.js +202 -0
- package/lib/vendor/blamejs/lib/guard-mail-query.js +310 -0
- package/lib/vendor/blamejs/lib/guard-mail-reply.js +172 -0
- package/lib/vendor/blamejs/lib/guard-mail-sieve.js +207 -0
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +566 -0
- package/lib/vendor/blamejs/lib/guard-markdown.js +768 -0
- package/lib/vendor/blamejs/lib/guard-message-id.js +267 -0
- package/lib/vendor/blamejs/lib/guard-mime.js +609 -0
- package/lib/vendor/blamejs/lib/guard-oauth.js +650 -0
- package/lib/vendor/blamejs/lib/guard-pdf.js +569 -0
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +317 -0
- package/lib/vendor/blamejs/lib/guard-posture-chain.js +201 -0
- package/lib/vendor/blamejs/lib/guard-regex.js +632 -0
- package/lib/vendor/blamejs/lib/guard-saga-config.js +157 -0
- package/lib/vendor/blamejs/lib/guard-shell.js +522 -0
- package/lib/vendor/blamejs/lib/guard-smtp-command.js +594 -0
- package/lib/vendor/blamejs/lib/guard-snapshot-envelope.js +168 -0
- package/lib/vendor/blamejs/lib/guard-stream-args.js +166 -0
- package/lib/vendor/blamejs/lib/guard-svg.js +1163 -0
- package/lib/vendor/blamejs/lib/guard-template.js +490 -0
- package/lib/vendor/blamejs/lib/guard-tenant-id.js +138 -0
- package/lib/vendor/blamejs/lib/guard-time.js +586 -0
- package/lib/vendor/blamejs/lib/guard-trace-context.js +172 -0
- package/lib/vendor/blamejs/lib/guard-uuid.js +548 -0
- package/lib/vendor/blamejs/lib/guard-xml.js +666 -0
- package/lib/vendor/blamejs/lib/guard-yaml.js +726 -0
- package/lib/vendor/blamejs/lib/hal.js +125 -0
- package/lib/vendor/blamejs/lib/handlers.js +350 -0
- package/lib/vendor/blamejs/lib/honeytoken.js +168 -0
- package/lib/vendor/blamejs/lib/html-balance.js +347 -0
- package/lib/vendor/blamejs/lib/http-client-cache.js +923 -0
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +519 -0
- package/lib/vendor/blamejs/lib/http-client.js +2152 -0
- package/lib/vendor/blamejs/lib/http-message-signature.js +589 -0
- package/lib/vendor/blamejs/lib/http2-teardown.js +34 -0
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +398 -0
- package/lib/vendor/blamejs/lib/i18n.js +931 -0
- package/lib/vendor/blamejs/lib/iab-mspa.js +257 -0
- package/lib/vendor/blamejs/lib/iab-tcf.js +461 -0
- package/lib/vendor/blamejs/lib/importmap-integrity.js +90 -0
- package/lib/vendor/blamejs/lib/inbox.js +435 -0
- package/lib/vendor/blamejs/lib/incident-report.js +314 -0
- package/lib/vendor/blamejs/lib/ip-utils.js +102 -0
- package/lib/vendor/blamejs/lib/jobs.js +185 -0
- package/lib/vendor/blamejs/lib/jose-jwe-experimental.js +228 -0
- package/lib/vendor/blamejs/lib/jsonapi.js +230 -0
- package/lib/vendor/blamejs/lib/keychain.js +865 -0
- package/lib/vendor/blamejs/lib/lazy-require.js +48 -0
- package/lib/vendor/blamejs/lib/legal-hold.js +374 -0
- package/lib/vendor/blamejs/lib/local-db-thin.js +321 -0
- package/lib/vendor/blamejs/lib/log-stream-cloudwatch.js +369 -0
- package/lib/vendor/blamejs/lib/log-stream-local.js +146 -0
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +410 -0
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +286 -0
- package/lib/vendor/blamejs/lib/log-stream-syslog.js +310 -0
- package/lib/vendor/blamejs/lib/log-stream-webhook.js +199 -0
- package/lib/vendor/blamejs/lib/log-stream.js +584 -0
- package/lib/vendor/blamejs/lib/log.js +625 -0
- package/lib/vendor/blamejs/lib/lro.js +200 -0
- package/lib/vendor/blamejs/lib/mail-agent.js +786 -0
- package/lib/vendor/blamejs/lib/mail-arc-sign.js +417 -0
- package/lib/vendor/blamejs/lib/mail-arf.js +343 -0
- package/lib/vendor/blamejs/lib/mail-auth.js +2144 -0
- package/lib/vendor/blamejs/lib/mail-bimi.js +1047 -0
- package/lib/vendor/blamejs/lib/mail-bounce.js +955 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +1286 -0
- package/lib/vendor/blamejs/lib/mail-crypto-smime.js +789 -0
- package/lib/vendor/blamejs/lib/mail-crypto.js +108 -0
- package/lib/vendor/blamejs/lib/mail-dav.js +1224 -0
- package/lib/vendor/blamejs/lib/mail-deploy.js +1119 -0
- package/lib/vendor/blamejs/lib/mail-dkim.js +1250 -0
- package/lib/vendor/blamejs/lib/mail-greylist.js +448 -0
- package/lib/vendor/blamejs/lib/mail-helo.js +473 -0
- package/lib/vendor/blamejs/lib/mail-journal.js +435 -0
- package/lib/vendor/blamejs/lib/mail-mdn.js +424 -0
- package/lib/vendor/blamejs/lib/mail-rbl.js +392 -0
- package/lib/vendor/blamejs/lib/mail-require-tls.js +198 -0
- package/lib/vendor/blamejs/lib/mail-scan.js +502 -0
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +629 -0
- package/lib/vendor/blamejs/lib/mail-server-imap.js +1858 -0
- package/lib/vendor/blamejs/lib/mail-server-jmap.js +1565 -0
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +908 -0
- package/lib/vendor/blamejs/lib/mail-server-mx.js +969 -0
- package/lib/vendor/blamejs/lib/mail-server-pop3.js +915 -0
- package/lib/vendor/blamejs/lib/mail-server-rate-limit.js +315 -0
- package/lib/vendor/blamejs/lib/mail-server-registry.js +378 -0
- package/lib/vendor/blamejs/lib/mail-server-submission.js +1396 -0
- package/lib/vendor/blamejs/lib/mail-server-tls.js +445 -0
- package/lib/vendor/blamejs/lib/mail-sieve.js +557 -0
- package/lib/vendor/blamejs/lib/mail-spam-score.js +284 -0
- package/lib/vendor/blamejs/lib/mail-srs.js +248 -0
- package/lib/vendor/blamejs/lib/mail-store-fts.js +394 -0
- package/lib/vendor/blamejs/lib/mail-store.js +929 -0
- package/lib/vendor/blamejs/lib/mail-unsubscribe.js +400 -0
- package/lib/vendor/blamejs/lib/mail.js +1971 -0
- package/lib/vendor/blamejs/lib/mcp-tool-registry.js +473 -0
- package/lib/vendor/blamejs/lib/mcp.js +950 -0
- package/lib/vendor/blamejs/lib/metrics.js +1503 -0
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +177 -0
- package/lib/vendor/blamejs/lib/middleware/ai-act-disclosure.js +203 -0
- package/lib/vendor/blamejs/lib/middleware/api-encrypt.js +981 -0
- package/lib/vendor/blamejs/lib/middleware/assetlinks.js +137 -0
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +171 -0
- package/lib/vendor/blamejs/lib/middleware/attach-user.js +220 -0
- package/lib/vendor/blamejs/lib/middleware/bearer-auth.js +293 -0
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +1519 -0
- package/lib/vendor/blamejs/lib/middleware/bot-disclose.js +183 -0
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +217 -0
- package/lib/vendor/blamejs/lib/middleware/clear-site-data.js +122 -0
- package/lib/vendor/blamejs/lib/middleware/compose-pipeline.js +355 -0
- package/lib/vendor/blamejs/lib/middleware/compression.js +489 -0
- package/lib/vendor/blamejs/lib/middleware/cookies.js +130 -0
- package/lib/vendor/blamejs/lib/middleware/cors.js +386 -0
- package/lib/vendor/blamejs/lib/middleware/csp-nonce.js +388 -0
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +167 -0
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +499 -0
- package/lib/vendor/blamejs/lib/middleware/daily-byte-quota.js +243 -0
- package/lib/vendor/blamejs/lib/middleware/db-role-for.js +304 -0
- package/lib/vendor/blamejs/lib/middleware/dpop.js +402 -0
- package/lib/vendor/blamejs/lib/middleware/error-handler.js +69 -0
- package/lib/vendor/blamejs/lib/middleware/fetch-metadata.js +168 -0
- package/lib/vendor/blamejs/lib/middleware/flag-context.js +110 -0
- package/lib/vendor/blamejs/lib/middleware/gpc.js +153 -0
- package/lib/vendor/blamejs/lib/middleware/headers.js +242 -0
- package/lib/vendor/blamejs/lib/middleware/health.js +438 -0
- package/lib/vendor/blamejs/lib/middleware/host-allowlist.js +189 -0
- package/lib/vendor/blamejs/lib/middleware/idempotency-key.js +964 -0
- package/lib/vendor/blamejs/lib/middleware/index.js +183 -0
- package/lib/vendor/blamejs/lib/middleware/nel.js +214 -0
- package/lib/vendor/blamejs/lib/middleware/network-allowlist.js +237 -0
- package/lib/vendor/blamejs/lib/middleware/no-cache.js +106 -0
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +177 -0
- package/lib/vendor/blamejs/lib/middleware/protected-resource-metadata.js +277 -0
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +556 -0
- package/lib/vendor/blamejs/lib/middleware/request-id.js +79 -0
- package/lib/vendor/blamejs/lib/middleware/request-log.js +205 -0
- package/lib/vendor/blamejs/lib/middleware/require-aal.js +138 -0
- package/lib/vendor/blamejs/lib/middleware/require-auth.js +144 -0
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +290 -0
- package/lib/vendor/blamejs/lib/middleware/require-content-type.js +113 -0
- package/lib/vendor/blamejs/lib/middleware/require-methods.js +97 -0
- package/lib/vendor/blamejs/lib/middleware/require-mtls.js +212 -0
- package/lib/vendor/blamejs/lib/middleware/require-step-up.js +226 -0
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +375 -0
- package/lib/vendor/blamejs/lib/middleware/security-headers.js +285 -0
- package/lib/vendor/blamejs/lib/middleware/security-txt.js +170 -0
- package/lib/vendor/blamejs/lib/middleware/span-http-server.js +280 -0
- package/lib/vendor/blamejs/lib/middleware/speculation-rules.js +323 -0
- package/lib/vendor/blamejs/lib/middleware/sse.js +200 -0
- package/lib/vendor/blamejs/lib/middleware/trace-log-correlation.js +167 -0
- package/lib/vendor/blamejs/lib/middleware/trace-propagate.js +148 -0
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +749 -0
- package/lib/vendor/blamejs/lib/middleware/web-app-manifest.js +164 -0
- package/lib/vendor/blamejs/lib/migration-files.js +37 -0
- package/lib/vendor/blamejs/lib/migrations.js +385 -0
- package/lib/vendor/blamejs/lib/mime-parse.js +198 -0
- package/lib/vendor/blamejs/lib/money.js +699 -0
- package/lib/vendor/blamejs/lib/mtls-ca.js +572 -0
- package/lib/vendor/blamejs/lib/mtls-engine-default.js +501 -0
- package/lib/vendor/blamejs/lib/network-byte-quota.js +308 -0
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +533 -0
- package/lib/vendor/blamejs/lib/network-dns.js +1930 -0
- package/lib/vendor/blamejs/lib/network-heartbeat.js +425 -0
- package/lib/vendor/blamejs/lib/network-nts.js +574 -0
- package/lib/vendor/blamejs/lib/network-proxy.js +265 -0
- package/lib/vendor/blamejs/lib/network-smtp-policy.js +836 -0
- package/lib/vendor/blamejs/lib/network-tls.js +3126 -0
- package/lib/vendor/blamejs/lib/network.js +346 -0
- package/lib/vendor/blamejs/lib/nis2-report.js +181 -0
- package/lib/vendor/blamejs/lib/nist-crosswalk.js +293 -0
- package/lib/vendor/blamejs/lib/nonce-store.js +177 -0
- package/lib/vendor/blamejs/lib/notify.js +683 -0
- package/lib/vendor/blamejs/lib/ntp-check.js +458 -0
- package/lib/vendor/blamejs/lib/numeric-bounds.js +111 -0
- package/lib/vendor/blamejs/lib/numeric-checks.js +40 -0
- package/lib/vendor/blamejs/lib/object-store/azure-blob-bucket-ops.js +349 -0
- package/lib/vendor/blamejs/lib/object-store/azure-blob.js +488 -0
- package/lib/vendor/blamejs/lib/object-store/gcs-bucket-ops.js +351 -0
- package/lib/vendor/blamejs/lib/object-store/gcs.js +515 -0
- package/lib/vendor/blamejs/lib/object-store/http-put.js +153 -0
- package/lib/vendor/blamejs/lib/object-store/http-request.js +38 -0
- package/lib/vendor/blamejs/lib/object-store/index.js +197 -0
- package/lib/vendor/blamejs/lib/object-store/local.js +163 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4-bucket-ops.js +1133 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +957 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +420 -0
- package/lib/vendor/blamejs/lib/observability-tracer.js +395 -0
- package/lib/vendor/blamejs/lib/observability.js +720 -0
- package/lib/vendor/blamejs/lib/openapi-paths-builder.js +248 -0
- package/lib/vendor/blamejs/lib/openapi-schema-walk.js +192 -0
- package/lib/vendor/blamejs/lib/openapi-security.js +169 -0
- package/lib/vendor/blamejs/lib/openapi-yaml.js +154 -0
- package/lib/vendor/blamejs/lib/openapi.js +489 -0
- package/lib/vendor/blamejs/lib/otel-export.js +278 -0
- package/lib/vendor/blamejs/lib/outbox.js +547 -0
- package/lib/vendor/blamejs/lib/pagination.js +542 -0
- package/lib/vendor/blamejs/lib/parsers/index.js +91 -0
- package/lib/vendor/blamejs/lib/parsers/safe-env.js +642 -0
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +293 -0
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +784 -0
- package/lib/vendor/blamejs/lib/parsers/safe-xml.js +390 -0
- package/lib/vendor/blamejs/lib/parsers/safe-yaml.js +1015 -0
- package/lib/vendor/blamejs/lib/permissions.js +793 -0
- package/lib/vendor/blamejs/lib/pick.js +105 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +351 -0
- package/lib/vendor/blamejs/lib/pqc-gate.js +279 -0
- package/lib/vendor/blamejs/lib/pqc-software.js +271 -0
- package/lib/vendor/blamejs/lib/problem-details.js +482 -0
- package/lib/vendor/blamejs/lib/process-spawn.js +196 -0
- package/lib/vendor/blamejs/lib/promise-pool.js +162 -0
- package/lib/vendor/blamejs/lib/protobuf-encoder.js +190 -0
- package/lib/vendor/blamejs/lib/protocol-dispatcher.js +161 -0
- package/lib/vendor/blamejs/lib/public-suffix.js +403 -0
- package/lib/vendor/blamejs/lib/pubsub-cluster.js +154 -0
- package/lib/vendor/blamejs/lib/pubsub-redis.js +167 -0
- package/lib/vendor/blamejs/lib/pubsub.js +463 -0
- package/lib/vendor/blamejs/lib/queue-local.js +476 -0
- package/lib/vendor/blamejs/lib/queue-redis.js +745 -0
- package/lib/vendor/blamejs/lib/queue-sqs.js +319 -0
- package/lib/vendor/blamejs/lib/queue.js +1016 -0
- package/lib/vendor/blamejs/lib/redact.js +1007 -0
- package/lib/vendor/blamejs/lib/redis-client.js +520 -0
- package/lib/vendor/blamejs/lib/render.js +285 -0
- package/lib/vendor/blamejs/lib/request-helpers.js +767 -0
- package/lib/vendor/blamejs/lib/resource-access-lock.js +116 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +340 -0
- package/lib/vendor/blamejs/lib/restore-rollback.js +365 -0
- package/lib/vendor/blamejs/lib/restore.js +409 -0
- package/lib/vendor/blamejs/lib/retention.js +640 -0
- package/lib/vendor/blamejs/lib/retry.js +523 -0
- package/lib/vendor/blamejs/lib/router.js +1289 -0
- package/lib/vendor/blamejs/lib/safe-async.js +1184 -0
- package/lib/vendor/blamejs/lib/safe-buffer.js +562 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +297 -0
- package/lib/vendor/blamejs/lib/safe-dns.js +665 -0
- package/lib/vendor/blamejs/lib/safe-ical.js +634 -0
- package/lib/vendor/blamejs/lib/safe-icap.js +502 -0
- package/lib/vendor/blamejs/lib/safe-json.js +946 -0
- package/lib/vendor/blamejs/lib/safe-jsonpath.js +285 -0
- package/lib/vendor/blamejs/lib/safe-mime.js +831 -0
- package/lib/vendor/blamejs/lib/safe-mount-info.js +306 -0
- package/lib/vendor/blamejs/lib/safe-path.js +254 -0
- package/lib/vendor/blamejs/lib/safe-redirect.js +106 -0
- package/lib/vendor/blamejs/lib/safe-schema.js +1810 -0
- package/lib/vendor/blamejs/lib/safe-sieve.js +684 -0
- package/lib/vendor/blamejs/lib/safe-smtp.js +185 -0
- package/lib/vendor/blamejs/lib/safe-sql.js +363 -0
- package/lib/vendor/blamejs/lib/safe-url.js +428 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +473 -0
- package/lib/vendor/blamejs/lib/sandbox-worker.js +135 -0
- package/lib/vendor/blamejs/lib/sandbox.js +358 -0
- package/lib/vendor/blamejs/lib/scheduler.js +827 -0
- package/lib/vendor/blamejs/lib/sd-notify.js +269 -0
- package/lib/vendor/blamejs/lib/sec-cyber.js +214 -0
- package/lib/vendor/blamejs/lib/security-assert.js +395 -0
- package/lib/vendor/blamejs/lib/seeders.js +620 -0
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +309 -0
- package/lib/vendor/blamejs/lib/self-update.js +804 -0
- package/lib/vendor/blamejs/lib/server-timing.js +174 -0
- package/lib/vendor/blamejs/lib/session-device-binding.js +431 -0
- package/lib/vendor/blamejs/lib/session-stores.js +138 -0
- package/lib/vendor/blamejs/lib/session.js +1162 -0
- package/lib/vendor/blamejs/lib/slug.js +381 -0
- package/lib/vendor/blamejs/lib/sse.js +349 -0
- package/lib/vendor/blamejs/lib/ssrf-guard.js +792 -0
- package/lib/vendor/blamejs/lib/standard-webhooks.js +183 -0
- package/lib/vendor/blamejs/lib/static.js +1249 -0
- package/lib/vendor/blamejs/lib/storage.js +1272 -0
- package/lib/vendor/blamejs/lib/stream-throttle.js +235 -0
- package/lib/vendor/blamejs/lib/structured-fields.js +244 -0
- package/lib/vendor/blamejs/lib/subject.js +667 -0
- package/lib/vendor/blamejs/lib/tcpa-10dlc.js +175 -0
- package/lib/vendor/blamejs/lib/template.js +931 -0
- package/lib/vendor/blamejs/lib/tenant-quota.js +545 -0
- package/lib/vendor/blamejs/lib/test-harness.js +275 -0
- package/lib/vendor/blamejs/lib/testing.js +1185 -0
- package/lib/vendor/blamejs/lib/time.js +578 -0
- package/lib/vendor/blamejs/lib/tls-exporter.js +239 -0
- package/lib/vendor/blamejs/lib/totp.js +318 -0
- package/lib/vendor/blamejs/lib/tracing.js +546 -0
- package/lib/vendor/blamejs/lib/uuid.js +207 -0
- package/lib/vendor/blamejs/lib/validate-opts.js +381 -0
- package/lib/vendor/blamejs/lib/vault/index.js +638 -0
- package/lib/vendor/blamejs/lib/vault/passphrase-ops.js +311 -0
- package/lib/vendor/blamejs/lib/vault/passphrase-source.js +198 -0
- package/lib/vendor/blamejs/lib/vault/rotate.js +803 -0
- package/lib/vendor/blamejs/lib/vault/seal-pem-file.js +471 -0
- package/lib/vendor/blamejs/lib/vault/wrap.js +296 -0
- package/lib/vendor/blamejs/lib/vault-aad.js +259 -0
- package/lib/vendor/blamejs/lib/vendor/.vendor-data-pubkey +4 -0
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +161 -0
- package/lib/vendor/blamejs/lib/vendor/bimi-trust-anchors.data.js +68 -0
- package/lib/vendor/blamejs/lib/vendor/bimi-trust-anchors.pem +33 -0
- package/lib/vendor/blamejs/lib/vendor/common-passwords-top-10000.data.js +1325 -0
- package/lib/vendor/blamejs/lib/vendor/common-passwords-top-10000.txt +10002 -0
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +9 -0
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +18 -0
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +181 -0
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +16382 -0
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5881 -0
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +328 -0
- package/lib/vendor/blamejs/lib/vendor/vendor-data-pubkey.js +16 -0
- package/lib/vendor/blamejs/lib/vendor-data.js +520 -0
- package/lib/vendor/blamejs/lib/vex.js +630 -0
- package/lib/vendor/blamejs/lib/watcher.js +608 -0
- package/lib/vendor/blamejs/lib/web-push-vapid.js +322 -0
- package/lib/vendor/blamejs/lib/webhook.js +977 -0
- package/lib/vendor/blamejs/lib/websocket-channels.js +327 -0
- package/lib/vendor/blamejs/lib/websocket.js +1561 -0
- package/lib/vendor/blamejs/lib/wiki-concepts.js +338 -0
- package/lib/vendor/blamejs/lib/worker-pool.js +464 -0
- package/lib/vendor/blamejs/lib/ws-client.js +978 -0
- package/lib/vendor/blamejs/lib/xml-c14n.js +506 -0
- package/lib/vendor/blamejs/memory/specs/node-26-map-getorinsert-migration.md +164 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +19 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/README.md +88 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/build.sh +26 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/project.yaml +28 -0
- package/lib/vendor/blamejs/package.json +81 -0
- package/lib/vendor/blamejs/release-notes/v0.0.x.json +310 -0
- package/lib/vendor/blamejs/release-notes/v0.1.x.json +1798 -0
- package/lib/vendor/blamejs/release-notes/v0.10.x.json +1288 -0
- package/lib/vendor/blamejs/release-notes/v0.11.x.json +2551 -0
- package/lib/vendor/blamejs/release-notes/v0.12.0.json +64 -0
- package/lib/vendor/blamejs/release-notes/v0.12.1.json +32 -0
- package/lib/vendor/blamejs/release-notes/v0.12.2.json +45 -0
- package/lib/vendor/blamejs/release-notes/v0.2.x.json +706 -0
- package/lib/vendor/blamejs/release-notes/v0.3.x.json +786 -0
- package/lib/vendor/blamejs/release-notes/v0.4.x.json +588 -0
- package/lib/vendor/blamejs/release-notes/v0.5.x.json +390 -0
- package/lib/vendor/blamejs/release-notes/v0.6.x.json +1947 -0
- package/lib/vendor/blamejs/release-notes/v0.7.x.json +3811 -0
- package/lib/vendor/blamejs/release-notes/v0.8.x.json +3318 -0
- package/lib/vendor/blamejs/release-notes/v0.9.x.json +2257 -0
- package/lib/vendor/blamejs/scripts/build-vendored-sbom.js +325 -0
- package/lib/vendor/blamejs/scripts/check-api-snapshot.js +62 -0
- package/lib/vendor/blamejs/scripts/check-changelog-extract.js +108 -0
- package/lib/vendor/blamejs/scripts/check-pack-against-gitignore.js +83 -0
- package/lib/vendor/blamejs/scripts/check-services.js +483 -0
- package/lib/vendor/blamejs/scripts/check-vendor-currency.js +349 -0
- package/lib/vendor/blamejs/scripts/consolidate-release-notes.js +216 -0
- package/lib/vendor/blamejs/scripts/gen-migrating.js +275 -0
- package/lib/vendor/blamejs/scripts/generate-changelog-entry.js +577 -0
- package/lib/vendor/blamejs/scripts/generate-release-signing-key.js +79 -0
- package/lib/vendor/blamejs/scripts/publish-dep-confusion-placeholder.sh +101 -0
- package/lib/vendor/blamejs/scripts/refresh-api-snapshot.js +31 -0
- package/lib/vendor/blamejs/scripts/refresh-vendor-manifest.js +132 -0
- package/lib/vendor/blamejs/scripts/release.js +652 -0
- package/lib/vendor/blamejs/scripts/sha3-digest.js +62 -0
- package/lib/vendor/blamejs/scripts/sign-release-artifact.js +92 -0
- package/lib/vendor/blamejs/scripts/test-integration.js +181 -0
- package/lib/vendor/blamejs/scripts/test-wiki-integration.js +126 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +77 -0
- package/lib/vendor/blamejs/scripts/vendor-data-gen.js +186 -0
- package/lib/vendor/blamejs/scripts/vendor-data-keygen.js +101 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +278 -0
- package/lib/vendor/blamejs/test/00-primitives.js +19075 -0
- package/lib/vendor/blamejs/test/10-state.js +622 -0
- package/lib/vendor/blamejs/test/20-db.js +561 -0
- package/lib/vendor/blamejs/test/30-chain.js +2110 -0
- package/lib/vendor/blamejs/test/40-consumers.js +2453 -0
- package/lib/vendor/blamejs/test/50-integration.js +486 -0
- package/lib/vendor/blamejs/test/_helpers.js +10 -0
- package/lib/vendor/blamejs/test/_smoke-worker.js +69 -0
- package/lib/vendor/blamejs/test/fixtures/exploit-corpus/corpus.json +368 -0
- package/lib/vendor/blamejs/test/fixtures/http-client-stream-payload.txt +2 -0
- package/lib/vendor/blamejs/test/fixtures/worker-pool/echo.js +52 -0
- package/lib/vendor/blamejs/test/helpers/_codebase-shingle-worker.js +24 -0
- package/lib/vendor/blamejs/test/helpers/_codebase-shingle.js +203 -0
- package/lib/vendor/blamejs/test/helpers/_shape-match.js +513 -0
- package/lib/vendor/blamejs/test/helpers/check.js +36 -0
- package/lib/vendor/blamejs/test/helpers/cluster.js +70 -0
- package/lib/vendor/blamejs/test/helpers/db.js +143 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +207 -0
- package/lib/vendor/blamejs/test/helpers/fs-watch.js +101 -0
- package/lib/vendor/blamejs/test/helpers/http.js +14 -0
- package/lib/vendor/blamejs/test/helpers/index.js +93 -0
- package/lib/vendor/blamejs/test/helpers/json-round-trip.js +120 -0
- package/lib/vendor/blamejs/test/helpers/mocks.js +20 -0
- package/lib/vendor/blamejs/test/helpers/otel.js +13 -0
- package/lib/vendor/blamejs/test/helpers/services.js +380 -0
- package/lib/vendor/blamejs/test/helpers/wait.js +206 -0
- package/lib/vendor/blamejs/test/integration/cache.test.js +235 -0
- package/lib/vendor/blamejs/test/integration/cluster-provider-mysql.test.js +174 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +611 -0
- package/lib/vendor/blamejs/test/integration/http-client.test.js +129 -0
- package/lib/vendor/blamejs/test/integration/log-stream.test.js +219 -0
- package/lib/vendor/blamejs/test/integration/mail-crypto-smime.test.js +181 -0
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +152 -0
- package/lib/vendor/blamejs/test/integration/mail-smtp.test.js +161 -0
- package/lib/vendor/blamejs/test/integration/mtls-ca.test.js +289 -0
- package/lib/vendor/blamejs/test/integration/network-dns.test.js +123 -0
- package/lib/vendor/blamejs/test/integration/network-heartbeat.test.js +101 -0
- package/lib/vendor/blamejs/test/integration/ntp-check.test.js +89 -0
- package/lib/vendor/blamejs/test/integration/object-store-sigv4.test.js +403 -0
- package/lib/vendor/blamejs/test/integration/pqc-pkcs8-forward-compat.test.js +271 -0
- package/lib/vendor/blamejs/test/integration/pubsub.test.js +137 -0
- package/lib/vendor/blamejs/test/integration/queue-redis.test.js +352 -0
- package/lib/vendor/blamejs/test/integration/redis-client-tls.test.js +96 -0
- package/lib/vendor/blamejs/test/integration/ssrf-guard.test.js +98 -0
- package/lib/vendor/blamejs/test/integration/websocket-permessage-deflate.test.js +261 -0
- package/lib/vendor/blamejs/test/integration/ws-client-roundtrip.test.js +230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +211 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a.test.js +59 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/access-lock.test.js +136 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +219 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +69 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-event-bus.test.js +266 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-orchestrator.test.js +390 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-posture-chain.test.js +174 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +279 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +322 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-stream.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-tenant.test.js +302 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-trace.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-adverse-decision.test.js +44 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-content-detect.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-input.test.js +50 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-model-manifest.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-pref.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +1080 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +311 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-zip-stream.test.js +291 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +267 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asyncapi.test.js +929 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file-conflict-path.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-cve-defensive.test.js +176 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-daily-review.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-export-cadf.test.js +97 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-framework-namespaces.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-segregation.test.js +115 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-ml-dsa-65.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-use-store.test.js +246 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-bot-challenge-verifier.test.js +485 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-bot-challenge.test.js +331 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-lockout.test.js +572 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password-audit.test.js +61 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/azure-blob-bucket-ops.test.js +258 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-worker.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/bearer-auth.test.js +107 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/body-parser-chunked-malformed.test.js +131 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/body-parser-smuggling.test.js +118 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/boot-gates.test.js +85 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/breach-deadline.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +861 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/budr.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/bundler-engine.test.js +209 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache-status.test.js +129 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +871 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/canonical-json-jcs.test.js +43 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cdn-cache-control.test.js +243 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +107 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-api-key.test.js +147 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-audit-verify-chain.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-backup.test.js +135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-config-drift.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +75 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-file-type.test.js +98 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-helpers.test.js +145 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-mtls.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-password.test.js +97 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-restore.test.js +160 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-retention.test.js +84 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-security.test.js +69 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-vault.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/client-hints.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +237 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +9600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-cascade.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-eaa.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +712 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance.test.js +278 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/config-drift.test.js +97 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/config.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cors.test.js +357 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cra-report.test.js +31 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/credential-hash.test.js +226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-base64url.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-envelope.test.js +85 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +193 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +98 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hpke-pq.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hpke.test.js +155 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-mlkem768-x25519.test.js +129 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-namespace-hash.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-random-int.test.js +72 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-builder.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-nonce.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +180 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +210 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daily-byte-quota.test.js +153 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/data-act.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-collection-extensions.test.js +226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-collection.test.js +136 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-init-extensions.test.js +165 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query-cross-schema.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query-extensions.test.js +191 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-role-for.test.js +228 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-vacuum.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-worm.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +184 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/declare-row-policy.test.js +203 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/declare-view.test.js +303 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dns-dnssec-algorithm.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dns-null-mx.test.js +39 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dora.test.js +165 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dr-runbook.test.js +59 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr-state-rules.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +786 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/early-hints.test.js +147 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/events.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/exploit-replay.test.js +243 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-hardening.test.js +181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-routing.test.js +531 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +118 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fapi2.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fda-21cfr11.test.js +156 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fdx.test.js +79 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +216 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +434 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +432 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-type.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +887 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forensic-snapshot.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fsm.test.js +375 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gcs-bucket-ops.test.js +321 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/graphql-federation.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-agent-registry.test.js +87 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-all.test.js +328 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +339 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-csv.test.js +694 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-dsn.test.js +296 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-email.test.js +234 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-envelope.test.js +192 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-event-bus-payload.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-event-bus-topic.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +386 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html-wcag.test.js +859 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +357 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +174 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-json.test.js +317 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-list-id.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-list-unsubscribe.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-compose.test.js +111 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-move.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-query.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-reply.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-sieve.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +301 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +265 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-message-id.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +161 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-posture-chain.test.js +100 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-saga-config.test.js +79 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-smtp-command.test.js +269 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-snapshot-envelope.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-stream-args.test.js +78 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +288 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-tenant-id.test.js +69 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-trace-context.test.js +102 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-xml.test.js +202 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-yaml.test.js +203 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/hal.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/honeytoken.test.js +50 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +37 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +692 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-stream.test.js +280 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +225 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +203 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +991 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/iab-mspa.test.js +63 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/iab-tcf.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +612 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/importmap-integrity.test.js +56 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/inbox.test.js +166 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/incident-report.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jose-jwe-experimental.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-api.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-round-trip-helper.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +159 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/legal-hold.test.js +118 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/local-db-thin.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-cloudwatch.test.js +489 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-otlp-grpc.test.js +207 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-otlp.test.js +283 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/lro.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +417 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-arf.test.js +208 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +910 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +502 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +680 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-canspam.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +149 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +297 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +514 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy-tlsrpt.test.js +369 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +627 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-feedback-id.test.js +56 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-greylist.test.js +217 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +283 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-journal.test.js +217 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-mdn.test.js +334 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-rbl.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-require-tls.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +336 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +732 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +840 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +130 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +285 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +229 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +394 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-tls.test.js +147 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-spam-score.test.js +204 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-srs.test.js +152 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +279 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-unsubscribe.test.js +165 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +439 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-tool-registry.test.js +202 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +155 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-shadow-registry.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +224 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-compose-pipeline.test.js +278 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/money.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-paths.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nel.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-allowlist.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-byte-quota.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +372 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +635 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-heartbeat-passive.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls-build-options.test.js +130 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls-ct-inclusion.test.js +179 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +447 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +369 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nis2-report.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nist-crosswalk.test.js +42 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/no-cache.test.js +98 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/notify.test.js +707 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/numeric-bounds.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oauth-callback.test.js +72 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +597 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openapi.test.js +877 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/otel-export.test.js +257 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pagination.test.js +522 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +216 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +324 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +546 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +153 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-software.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/problem-details.test.js +195 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/process-spawn.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/promise-pool.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/protected-resource-metadata.test.js +68 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/protobuf-encoder.test.js +138 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/protocol-dispatcher.test.js +174 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/public-suffix.test.js +197 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +232 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-dlq-extend-lease.test.js +178 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +322 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-priority-rate-progress.test.js +266 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-sqs.test.js +300 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-cluster.test.js +338 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-registry.test.js +75 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact-dlp.test.js +246 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redis-client.test.js +130 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +335 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-log.test.js +170 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-auth-cache-control.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-mtls.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/resource-access-lock.test.js +52 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention-floor.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retry.test.js +535 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-cross-origin-redirect.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async-loops.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async-parallel.test.js +170 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +248 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +451 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +289 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-icap.test.js +206 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-jsonpath.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +339 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mount-info.test.js +180 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +78 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sieve.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-smtp.test.js +95 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url-idn-homograph.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +257 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/saml-slo.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sandbox.test.js +228 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler-exactly-once.test.js +238 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +700 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-notify.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sec-cyber.test.js +85 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +107 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-headers.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/seeders.test.js +816 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update-standalone-verifier.test.js +168 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +302 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/server-timing.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +247 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-extensions.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/shape-match.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +952 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-multipart-sse.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/slug.test.js +330 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/smtp-policy.test.js +233 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/source-comment-blocks.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/speculation-rules.test.js +319 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sse.test.js +148 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +283 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/standard-webhooks.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +266 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/step-up.test.js +487 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-chunk-scratch.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +773 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/stream-throttle.test.js +173 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/structured-fields.test.js +180 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tcpa-10dlc.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +571 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/test-harness.test.js +190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/testing-request.test.js +119 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/testing.test.js +522 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-exporter.test.js +168 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-ocsp-ct.test.js +275 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-ocsp-verify.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-pinset-drift.test.js +35 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-preferred-groups.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tracing.test.js +280 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/uuid.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-aad.test.js +277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-seal-pem-file.test.js +252 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vendor-data.test.js +149 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vendor-manifest.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vex.test.js +661 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +308 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/web-push-vapid.test.js +144 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +674 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket-channels.test.js +360 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/worker-pool.test.js +302 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +349 -0
- package/lib/vendor/blamejs/test/layer-1-state/api-key.test.js +717 -0
- package/lib/vendor/blamejs/test/layer-5-integration/bundler-output.test.js +444 -0
- package/lib/vendor/blamejs/test/layer-5-integration/guard-host-integration.test.js +597 -0
- package/lib/vendor/blamejs/test/layer-5-integration/security-chaos.test.js +308 -0
- package/lib/vendor/blamejs/test/smoke.js +431 -0
- package/lib/webhooks.js +305 -0
- package/package.json +43 -0
|
@@ -0,0 +1,1017 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @module b.cryptoField
|
|
4
|
+
* @nav Crypto
|
|
5
|
+
* @title Field-Level Crypto
|
|
6
|
+
*
|
|
7
|
+
* @intro
|
|
8
|
+
* Per-column field-level encryption with AAD-bound envelopes. Apps
|
|
9
|
+
* declare which columns hold PHI / PCI / personal data via
|
|
10
|
+
* `b.db.init({ schema })`; the framework then auto-protects those
|
|
11
|
+
* columns on every write (`sealRow`) and reverses on every read
|
|
12
|
+
* (`unsealRow`). Sealed values are produced by `b.vault.seal`, which
|
|
13
|
+
* wraps an XChaCha20-Poly1305 ciphertext under the framework's PQC
|
|
14
|
+
* envelope (ML-KEM + ECDH hybrid) — every encryption uses a fresh
|
|
15
|
+
* random nonce, so two seals of the same plaintext never collide.
|
|
16
|
+
*
|
|
17
|
+
* Per-row key (K_row) derivation is opt-in via `declarePerRowKey`.
|
|
18
|
+
* Tables that opt in get a fresh K_row per INSERT, stored sealed in
|
|
19
|
+
* `_blamejs_per_row_keys`. AAD on the K_row binds (table, rowId,
|
|
20
|
+
* info-label) — copying a wrapped K_row from one row to another
|
|
21
|
+
* fails Poly1305 verification, so a DB-write attacker cannot move
|
|
22
|
+
* ciphertext between rows to bypass row-scoped erasure. This is the
|
|
23
|
+
* crypto-shred substrate for `b.subject.eraseHard`: deleting the
|
|
24
|
+
* K_row entry leaves WAL / replica residual ciphertext mathematically
|
|
25
|
+
* undecryptable.
|
|
26
|
+
*
|
|
27
|
+
* Derived hashes (`derivedHashes`) provide indexed lookup for sealed
|
|
28
|
+
* columns: a normalized SHA3 of the plaintext, salted by the vault's
|
|
29
|
+
* per-deployment salt + a per-field namespace, so dictionary /
|
|
30
|
+
* rainbow attacks across fields and across deployments fail. Sealed
|
|
31
|
+
* columns without a derived hash are unindexable — queries on them
|
|
32
|
+
* silently return zero rows.
|
|
33
|
+
*
|
|
34
|
+
* Per-column residency (`declareColumnResidency`) declares EU / US /
|
|
35
|
+
* global tags; the storage-write gate (`assertColumnResidency`)
|
|
36
|
+
* refuses writes to a backend whose tag doesn't satisfy the column
|
|
37
|
+
* under gdpr / dpdp / pipl-cn / uk-gdpr postures.
|
|
38
|
+
*
|
|
39
|
+
* No mutation of the input row — every operation returns a new
|
|
40
|
+
* object, suitable for direct insertion into the audit chain.
|
|
41
|
+
*
|
|
42
|
+
* @card
|
|
43
|
+
* Per-column field-level encryption with AAD-bound envelopes.
|
|
44
|
+
*/
|
|
45
|
+
var lazyRequire = require("./lazy-require");
|
|
46
|
+
var vault = require("./vault");
|
|
47
|
+
var vaultAad = require("./vault-aad");
|
|
48
|
+
var { sha3Hash, kdf } = require("./crypto");
|
|
49
|
+
var { HASH_PREFIX, VAULT_PREFIX, TIME } = require("./constants");
|
|
50
|
+
|
|
51
|
+
var compliance = lazyRequire(function () { return require("./compliance"); });
|
|
52
|
+
var db = lazyRequire(function () { return require("./db"); });
|
|
53
|
+
var audit = lazyRequire(function () { return require("./audit"); });
|
|
54
|
+
|
|
55
|
+
// F-POSTURE-1 cascade hook + F-RTBF-2 integration. Recording the
|
|
56
|
+
// posture lets eraseRow call b.db.vacuumAfterErase({ mode: "full" })
|
|
57
|
+
// automatically under postures whose POSTURE_DEFAULTS sets
|
|
58
|
+
// requireVacuumAfterErase: true (gdpr / dpdp / pipl-cn / lgpd-br /
|
|
59
|
+
// hipaa). Without the vacuum, freed B-tree index pages keep sealed-
|
|
60
|
+
// column ciphertext readable from a forensic disk image — defeats the
|
|
61
|
+
// "right to erasure" the regulatory regime guarantees.
|
|
62
|
+
var _activePosture = null;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @primitive b.cryptoField.applyPosture
|
|
66
|
+
* @signature b.cryptoField.applyPosture(posture)
|
|
67
|
+
* @since 0.7.27
|
|
68
|
+
* @compliance gdpr, hipaa
|
|
69
|
+
* @related b.cryptoField.getActivePosture, b.cryptoField.eraseRow
|
|
70
|
+
*
|
|
71
|
+
* Records the active compliance posture so `eraseRow` can cascade into
|
|
72
|
+
* `b.db.vacuumAfterErase({ mode: "full" })` under regimes whose
|
|
73
|
+
* `POSTURE_DEFAULTS` sets `requireVacuumAfterErase: true` (gdpr / dpdp /
|
|
74
|
+
* pipl-cn / lgpd-br / hipaa). Without the vacuum, freed B-tree index
|
|
75
|
+
* pages keep sealed-column ciphertext readable from a forensic disk
|
|
76
|
+
* image — defeating the "right to erasure" the regime guarantees.
|
|
77
|
+
* Returns null when posture is empty/non-string; otherwise returns
|
|
78
|
+
* `{ posture, requireVacuumAfterErase }`.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* var info = b.cryptoField.applyPosture("gdpr");
|
|
82
|
+
* info.posture; // → "gdpr"
|
|
83
|
+
* info.requireVacuumAfterErase; // → true
|
|
84
|
+
*
|
|
85
|
+
* b.cryptoField.applyPosture(""); // → null (no-op)
|
|
86
|
+
*/
|
|
87
|
+
function applyPosture(posture) {
|
|
88
|
+
if (typeof posture !== "string" || posture.length === 0) return null;
|
|
89
|
+
_activePosture = posture;
|
|
90
|
+
var requireVacuum = false;
|
|
91
|
+
try {
|
|
92
|
+
requireVacuum = compliance().postureDefault(posture, "requireVacuumAfterErase") === true;
|
|
93
|
+
} catch (_e) { /* compliance not loaded — record posture only */ }
|
|
94
|
+
return { posture: posture, requireVacuumAfterErase: requireVacuum };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* @primitive b.cryptoField.getActivePosture
|
|
99
|
+
* @signature b.cryptoField.getActivePosture()
|
|
100
|
+
* @since 0.7.27
|
|
101
|
+
* @related b.cryptoField.applyPosture
|
|
102
|
+
*
|
|
103
|
+
* Returns the posture string most recently recorded via `applyPosture`,
|
|
104
|
+
* or null when no posture has been applied. Read-only — does not
|
|
105
|
+
* mutate state. Used by storage backends to gate cross-border writes.
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* b.cryptoField.applyPosture("hipaa");
|
|
109
|
+
* b.cryptoField.getActivePosture(); // → "hipaa"
|
|
110
|
+
*/
|
|
111
|
+
function getActivePosture() { return _activePosture; }
|
|
112
|
+
|
|
113
|
+
// Per-table registry, populated by db.init()
|
|
114
|
+
var schemas = Object.create(null);
|
|
115
|
+
|
|
116
|
+
// F-CBT-1 — per-COLUMN data residency registry. Real GDPR / DPDP
|
|
117
|
+
// deployments have row-level mixed residency: a `users.name` column
|
|
118
|
+
// may be global, but `users.addressLine1` must stay in EU storage.
|
|
119
|
+
// db.init({ schema }) carries the operator's residency declaration
|
|
120
|
+
// per table; this registry stores it for cross-region check at the
|
|
121
|
+
// storage-write boundary.
|
|
122
|
+
//
|
|
123
|
+
// { tableName: { columnName: "eu" | "us" | "global" | <tag> } }
|
|
124
|
+
var columnResidency = Object.create(null);
|
|
125
|
+
|
|
126
|
+
// F-RTBF-3 — per-row key declaration registry. For tables that opt
|
|
127
|
+
// into per-row keying, b.subject.eraseHard deletes the wrapped K_row
|
|
128
|
+
// from _blamejs_per_row_keys, leaving WAL/replica residual ciphertext
|
|
129
|
+
// undecryptable.
|
|
130
|
+
//
|
|
131
|
+
// { tableName: { keySize, info, residencyTag } }
|
|
132
|
+
var perRowKeyTables = Object.create(null);
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* @primitive b.cryptoField.registerTable
|
|
136
|
+
* @signature b.cryptoField.registerTable(name, opts)
|
|
137
|
+
* @since 0.4.0
|
|
138
|
+
* @related b.cryptoField.getSchema, b.cryptoField.sealRow
|
|
139
|
+
*
|
|
140
|
+
* Registers a table's sealed-column declaration. Called from
|
|
141
|
+
* `b.db.init({ schema })` at boot — operators rarely call directly.
|
|
142
|
+
* Stores the per-table list of sealed fields, the derived-hash specs
|
|
143
|
+
* (mapping `derivedField -> { from, normalize }`), and any per-field
|
|
144
|
+
* hash namespaces. Subsequent `sealRow` / `unsealRow` / `eraseRow`
|
|
145
|
+
* calls dispatch through this registry.
|
|
146
|
+
*
|
|
147
|
+
* @opts
|
|
148
|
+
* sealedFields: string[], // column names sealed via vault.seal
|
|
149
|
+
* derivedHashes: { [hashCol]: { from: string, normalize?: fn } },
|
|
150
|
+
* hashNamespaces: { [field]: string }, // override default rainbow-defense ns
|
|
151
|
+
* aad: boolean, // when true, route seal/unseal through
|
|
152
|
+
* // b.vault.aad — AEAD-binds the ciphertext
|
|
153
|
+
* // to (table, rowIdField=primary key, column)
|
|
154
|
+
* // so a DB-write attacker can't copy a
|
|
155
|
+
* // sealed value between rows. CRYPTO-1.
|
|
156
|
+
* rowIdField: string, // when aad=true, the column name carrying
|
|
157
|
+
* // the row identity. Default "id". The row
|
|
158
|
+
* // passed to sealRow MUST already have this
|
|
159
|
+
* // column populated; sealRow refuses when
|
|
160
|
+
* // missing (an AAD bound to a placeholder
|
|
161
|
+
* // would silently fail every unseal).
|
|
162
|
+
* schemaVersion: string|number, // when aad=true, the schema version
|
|
163
|
+
* // threaded into AAD. Default "1". Bump
|
|
164
|
+
* // when the column layout changes to
|
|
165
|
+
* // invalidate all prior ciphertext.
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* b.cryptoField.registerTable("patients", {
|
|
169
|
+
* sealedFields: ["ssn", "diagnosis"],
|
|
170
|
+
* derivedHashes: {
|
|
171
|
+
* ssnHash: { from: "ssn", normalize: function (s) { return String(s).replace(/-/g, ""); } }
|
|
172
|
+
* }
|
|
173
|
+
* });
|
|
174
|
+
* b.cryptoField.getSealedFields("patients"); // → ["ssn", "diagnosis"]
|
|
175
|
+
*
|
|
176
|
+
* // AAD-bound table (recommended for new schemas — CRYPTO-1).
|
|
177
|
+
* b.cryptoField.registerTable("idempotency_keys", {
|
|
178
|
+
* sealedFields: ["headers", "body"],
|
|
179
|
+
* aad: true,
|
|
180
|
+
* rowIdField: "k", // primary key column
|
|
181
|
+
* });
|
|
182
|
+
*/
|
|
183
|
+
function registerTable(name, opts) {
|
|
184
|
+
var aadOn = opts.aad === true;
|
|
185
|
+
var rowIdField = typeof opts.rowIdField === "string" && opts.rowIdField.length > 0
|
|
186
|
+
? opts.rowIdField : "id";
|
|
187
|
+
var schemaVersion = opts.schemaVersion != null ? String(opts.schemaVersion) : "1";
|
|
188
|
+
schemas[name] = {
|
|
189
|
+
sealedFields: Array.isArray(opts.sealedFields) ? opts.sealedFields.slice() : [],
|
|
190
|
+
derivedHashes: Object.assign({}, opts.derivedHashes || {}),
|
|
191
|
+
hashNamespaces: Object.assign({}, opts.hashNamespaces || {}),
|
|
192
|
+
aad: aadOn,
|
|
193
|
+
rowIdField: rowIdField,
|
|
194
|
+
schemaVersion: schemaVersion,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* @primitive b.cryptoField.getSchema
|
|
200
|
+
* @signature b.cryptoField.getSchema(table)
|
|
201
|
+
* @since 0.4.0
|
|
202
|
+
* @related b.cryptoField.registerTable, b.cryptoField.getSealedFields
|
|
203
|
+
*
|
|
204
|
+
* Returns the registered schema record for `table` — `{ sealedFields,
|
|
205
|
+
* derivedHashes, hashNamespaces }` — or null when the table was never
|
|
206
|
+
* registered. Read-only; mutations to the returned object do not
|
|
207
|
+
* affect future calls (the inner arrays/objects are shared, so
|
|
208
|
+
* operators should treat the result as read-only).
|
|
209
|
+
*
|
|
210
|
+
* @example
|
|
211
|
+
* b.cryptoField.registerTable("patients", { sealedFields: ["ssn"] });
|
|
212
|
+
* var schema = b.cryptoField.getSchema("patients");
|
|
213
|
+
* schema.sealedFields; // → ["ssn"]
|
|
214
|
+
*
|
|
215
|
+
* b.cryptoField.getSchema("unknown"); // → null
|
|
216
|
+
*/
|
|
217
|
+
function getSchema(table) {
|
|
218
|
+
return schemas[table] || null;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* @primitive b.cryptoField.getSealedFields
|
|
223
|
+
* @signature b.cryptoField.getSealedFields(table)
|
|
224
|
+
* @since 0.4.0
|
|
225
|
+
* @related b.cryptoField.getSchema, b.cryptoField.sealRow
|
|
226
|
+
*
|
|
227
|
+
* Returns the array of sealed column names for `table`, or an empty
|
|
228
|
+
* array when the table is unregistered. Convenience accessor used by
|
|
229
|
+
* storage backends to know which columns to wrap in `vault.seal` on
|
|
230
|
+
* write and `vault.unseal` on read.
|
|
231
|
+
*
|
|
232
|
+
* @example
|
|
233
|
+
* b.cryptoField.registerTable("patients", { sealedFields: ["ssn", "diagnosis"] });
|
|
234
|
+
* b.cryptoField.getSealedFields("patients"); // → ["ssn", "diagnosis"]
|
|
235
|
+
* b.cryptoField.getSealedFields("public"); // → []
|
|
236
|
+
*/
|
|
237
|
+
function getSealedFields(table) {
|
|
238
|
+
var s = schemas[table];
|
|
239
|
+
return s ? s.sealedFields : [];
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* @primitive b.cryptoField.clearForTest
|
|
244
|
+
* @signature b.cryptoField.clearForTest()
|
|
245
|
+
* @since 0.4.0
|
|
246
|
+
* @status experimental
|
|
247
|
+
* @related b.cryptoField.registerTable
|
|
248
|
+
*
|
|
249
|
+
* Test-only helper. Drops every entry from the per-table schema
|
|
250
|
+
* registry so a test fixture can re-register tables under different
|
|
251
|
+
* sealed-field declarations between cases. Operator code never calls
|
|
252
|
+
* this — production schemas come from `b.db.init({ schema })` once at
|
|
253
|
+
* boot.
|
|
254
|
+
*
|
|
255
|
+
* @example
|
|
256
|
+
* b.cryptoField.registerTable("patients", { sealedFields: ["ssn"] });
|
|
257
|
+
* b.cryptoField.clearForTest();
|
|
258
|
+
* b.cryptoField.getSchema("patients"); // → null
|
|
259
|
+
*/
|
|
260
|
+
function clearForTest() {
|
|
261
|
+
for (var k in schemas) delete schemas[k];
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// ---- Hash helpers ----
|
|
265
|
+
|
|
266
|
+
// Default hash namespace lookup — falls back to the framework's HASH_PREFIX
|
|
267
|
+
// registry, then to a per-table `bj-<table>-<field>:` namespace if neither is
|
|
268
|
+
// registered. The namespace prevents rainbow attacks across fields.
|
|
269
|
+
function namespaceFor(table, field, registered) {
|
|
270
|
+
if (registered && registered[field]) return registered[field];
|
|
271
|
+
var fieldUpper = field.toUpperCase();
|
|
272
|
+
if (HASH_PREFIX[fieldUpper]) return HASH_PREFIX[fieldUpper];
|
|
273
|
+
return "bj-" + table + "-" + field + ":";
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* @primitive b.cryptoField.computeDerived
|
|
278
|
+
* @signature b.cryptoField.computeDerived(table, sourceField, sourceValue)
|
|
279
|
+
* @since 0.4.0
|
|
280
|
+
* @related b.cryptoField.lookupHash, b.cryptoField.sealRow
|
|
281
|
+
*
|
|
282
|
+
* Computes the derived hash for a (table, sourceField) pair when the
|
|
283
|
+
* schema declares a derived-hash mirror of that source. Returns
|
|
284
|
+
* `{ field, value }` naming the derived column and its hash, or null
|
|
285
|
+
* when no derived hash is declared. Hashes are SHA3 of
|
|
286
|
+
* `vaultSalt + namespace + normalizedValue`, where the per-deployment
|
|
287
|
+
* vault salt prevents cross-deployment correlation and the per-field
|
|
288
|
+
* namespace prevents cross-field rainbow attacks.
|
|
289
|
+
*
|
|
290
|
+
* @example
|
|
291
|
+
* b.cryptoField.registerTable("users", {
|
|
292
|
+
* sealedFields: ["email"],
|
|
293
|
+
* derivedHashes: { emailHash: { from: "email" } }
|
|
294
|
+
* });
|
|
295
|
+
* var d = b.cryptoField.computeDerived("users", "email", "alice@example.com");
|
|
296
|
+
* d.field; // → "emailHash"
|
|
297
|
+
* typeof d.value; // → "string"
|
|
298
|
+
*
|
|
299
|
+
* b.cryptoField.computeDerived("users", "email", null); // → null
|
|
300
|
+
*/
|
|
301
|
+
function computeDerived(table, sourceField, sourceValue) {
|
|
302
|
+
if (sourceValue === undefined || sourceValue === null) return null;
|
|
303
|
+
var s = schemas[table];
|
|
304
|
+
if (!s || !s.derivedHashes) return null;
|
|
305
|
+
|
|
306
|
+
for (var derivedField in s.derivedHashes) {
|
|
307
|
+
var spec = s.derivedHashes[derivedField];
|
|
308
|
+
if (spec.from === sourceField) {
|
|
309
|
+
var ns = namespaceFor(table, sourceField, s.hashNamespaces);
|
|
310
|
+
var normalized = spec.normalize ? spec.normalize(sourceValue) : String(sourceValue);
|
|
311
|
+
var saltHex = vault.getDerivedHashSalt().toString("hex");
|
|
312
|
+
return { field: derivedField, value: sha3Hash(saltHex + ns + normalized) };
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// ---- Row sealing / unsealing ----
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* @primitive b.cryptoField.sealRow
|
|
322
|
+
* @signature b.cryptoField.sealRow(table, row)
|
|
323
|
+
* @since 0.4.0
|
|
324
|
+
* @compliance hipaa, gdpr, pci-dss
|
|
325
|
+
* @related b.cryptoField.unsealRow, b.cryptoField.eraseRow, b.vault.seal
|
|
326
|
+
*
|
|
327
|
+
* Returns a copy of `row` with every sealed column wrapped in
|
|
328
|
+
* `vault.seal()` and every derived-hash mirror computed from the
|
|
329
|
+
* pre-seal plaintext. The input row is never mutated. `vault.seal` is
|
|
330
|
+
* idempotent — already-sealed values pass through unchanged so
|
|
331
|
+
* round-trips through the storage layer are safe. Derived hashes are
|
|
332
|
+
* computed BEFORE sealing the source so the indexed lookup column
|
|
333
|
+
* captures the plaintext digest.
|
|
334
|
+
*
|
|
335
|
+
* @example
|
|
336
|
+
* b.cryptoField.registerTable("patients", {
|
|
337
|
+
* sealedFields: ["ssn"],
|
|
338
|
+
* derivedHashes: { ssnHash: { from: "ssn" } }
|
|
339
|
+
* });
|
|
340
|
+
* var row = { id: 1, name: "Alice", ssn: "123-45-6789" };
|
|
341
|
+
* var sealed = b.cryptoField.sealRow("patients", row);
|
|
342
|
+
* String(sealed.ssn).startsWith("vault:"); // → true
|
|
343
|
+
* typeof sealed.ssnHash; // → "string"
|
|
344
|
+
* row.ssn; // → "123-45-6789" (input untouched)
|
|
345
|
+
*/
|
|
346
|
+
function sealRow(table, row) {
|
|
347
|
+
if (!row) return row;
|
|
348
|
+
var s = schemas[table];
|
|
349
|
+
if (!s) return row;
|
|
350
|
+
var out = Object.assign({}, row);
|
|
351
|
+
|
|
352
|
+
// Compute derived hashes from plaintext source values BEFORE sealing those
|
|
353
|
+
// sources. If a source value arrives already sealed (e.g. from an internal
|
|
354
|
+
// call passing through), unseal it to get the plaintext for hashing.
|
|
355
|
+
if (s.derivedHashes) {
|
|
356
|
+
for (var derivedField in s.derivedHashes) {
|
|
357
|
+
var spec = s.derivedHashes[derivedField];
|
|
358
|
+
var raw = out[spec.from];
|
|
359
|
+
if (raw === undefined || raw === null) continue;
|
|
360
|
+
var plain;
|
|
361
|
+
if (typeof raw === "string" && raw.startsWith(VAULT_PREFIX)) {
|
|
362
|
+
plain = vault.unseal(raw);
|
|
363
|
+
} else if (typeof raw === "string" && vaultAad.isAadSealed(raw)) {
|
|
364
|
+
plain = vaultAad.unseal(raw, _aadParts(s, table, spec.from, out));
|
|
365
|
+
} else {
|
|
366
|
+
plain = raw;
|
|
367
|
+
}
|
|
368
|
+
var ns = namespaceFor(table, spec.from, s.hashNamespaces);
|
|
369
|
+
var normalized = spec.normalize ? spec.normalize(plain) : String(plain);
|
|
370
|
+
var saltHex2 = vault.getDerivedHashSalt().toString("hex");
|
|
371
|
+
out[derivedField] = sha3Hash(saltHex2 + ns + normalized);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// CRYPTO-1 — AAD-bound table requires the row's identity column to
|
|
376
|
+
// be populated BEFORE sealRow runs. Sealing under a placeholder /
|
|
377
|
+
// missing rowId produces ciphertext that no later unseal can open
|
|
378
|
+
// because the AAD on read is computed against the row's actual id.
|
|
379
|
+
if (s.aad) {
|
|
380
|
+
var rowId = out[s.rowIdField];
|
|
381
|
+
if (rowId === undefined || rowId === null || String(rowId).length === 0) {
|
|
382
|
+
throw new Error("cryptoField.sealRow: table '" + table +
|
|
383
|
+
"' is AAD-bound (registerTable({aad:true})); the row's identity " +
|
|
384
|
+
"column '" + s.rowIdField + "' must be populated BEFORE sealRow. " +
|
|
385
|
+
"Generate the primary key first (e.g. uuid / sequence INSERT … RETURNING), " +
|
|
386
|
+
"set row." + s.rowIdField + ", then sealRow.");
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Seal fields. Plain mode: vault.seal (idempotent — already-sealed
|
|
391
|
+
// values pass through). AAD mode: vault.aad.seal binds the AEAD tag
|
|
392
|
+
// to (table, rowId, column, schemaVersion) — cross-row copy of a
|
|
393
|
+
// ciphertext fails Poly1305 on read. CRYPTO-1.
|
|
394
|
+
for (var i = 0; i < s.sealedFields.length; i++) {
|
|
395
|
+
var field = s.sealedFields[i];
|
|
396
|
+
if (out[field] !== undefined && out[field] !== null) {
|
|
397
|
+
if (s.aad) {
|
|
398
|
+
// Idempotent: already-AAD-sealed values pass through unchanged.
|
|
399
|
+
if (typeof out[field] === "string" && vaultAad.isAadSealed(out[field])) {
|
|
400
|
+
continue;
|
|
401
|
+
}
|
|
402
|
+
out[field] = vaultAad.seal(String(out[field]),
|
|
403
|
+
_aadParts(s, table, field, out));
|
|
404
|
+
} else {
|
|
405
|
+
// allow:seal-without-aad — plain-mode legacy table; operator
|
|
406
|
+
// opts into AAD via registerTable({aad:true})
|
|
407
|
+
out[field] = vault.seal(String(out[field]));
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
return out;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// _aadParts — build the canonical AAD object for an AAD-bound table.
|
|
416
|
+
// Threads (table, rowId, column, schemaVersion) so seal + unseal
|
|
417
|
+
// produce the same AAD bytes. Centralized so the seal path and the
|
|
418
|
+
// unseal path can never drift.
|
|
419
|
+
function _aadParts(schema, table, column, row) {
|
|
420
|
+
return {
|
|
421
|
+
table: table,
|
|
422
|
+
rowId: String(row[schema.rowIdField]),
|
|
423
|
+
column: column,
|
|
424
|
+
schemaVersion: schema.schemaVersion,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* @primitive b.cryptoField.unsealRow
|
|
430
|
+
* @signature b.cryptoField.unsealRow(table, row)
|
|
431
|
+
* @since 0.4.0
|
|
432
|
+
* @compliance hipaa, gdpr, pci-dss
|
|
433
|
+
* @related b.cryptoField.sealRow, b.vault.unseal
|
|
434
|
+
*
|
|
435
|
+
* Returns a copy of `row` with every sealed column unwrapped via
|
|
436
|
+
* `vault.unseal()`. Round-trips with `sealRow`. When `vault.unseal`
|
|
437
|
+
* throws (DB-write attacker forging a `vault:<crafted>` payload to
|
|
438
|
+
* force ML-KEM decapsulation on attacker-controlled bytes), the
|
|
439
|
+
* failure is recorded on the audit chain as
|
|
440
|
+
* `system.crypto.unseal_failed` and the field is replaced with null
|
|
441
|
+
* so downstream code sees "no value" instead of crashing the request.
|
|
442
|
+
* The input row is never mutated.
|
|
443
|
+
*
|
|
444
|
+
* @example
|
|
445
|
+
* b.cryptoField.registerTable("patients", { sealedFields: ["ssn"] });
|
|
446
|
+
* var sealed = b.cryptoField.sealRow("patients", { id: 1, ssn: "123-45-6789" });
|
|
447
|
+
* var clear = b.cryptoField.unsealRow("patients", sealed);
|
|
448
|
+
* clear.ssn; // → "123-45-6789"
|
|
449
|
+
*/
|
|
450
|
+
function unsealRow(table, row) {
|
|
451
|
+
if (!row) return row;
|
|
452
|
+
var s = schemas[table];
|
|
453
|
+
if (!s || s.sealedFields.length === 0) return row;
|
|
454
|
+
var out = Object.assign({}, row);
|
|
455
|
+
|
|
456
|
+
for (var i = 0; i < s.sealedFields.length; i++) {
|
|
457
|
+
var field = s.sealedFields[i];
|
|
458
|
+
if (out[field]) {
|
|
459
|
+
var unsealed;
|
|
460
|
+
try {
|
|
461
|
+
// Auto-detect the envelope shape so an AAD-bound table that
|
|
462
|
+
// contains pre-migration plain-vault rows still reads. Read-
|
|
463
|
+
// side migration is lazy; the next sealRow re-emits AAD-bound.
|
|
464
|
+
if (typeof out[field] === "string" && vaultAad.isAadSealed(out[field])) {
|
|
465
|
+
unsealed = vaultAad.unseal(out[field],
|
|
466
|
+
_aadParts(s, table, field, out));
|
|
467
|
+
} else if (typeof out[field] === "string" && out[field].startsWith(VAULT_PREFIX)) {
|
|
468
|
+
unsealed = vault.unseal(out[field]);
|
|
469
|
+
} else {
|
|
470
|
+
// Not a sealed value — pass through.
|
|
471
|
+
unsealed = out[field];
|
|
472
|
+
}
|
|
473
|
+
} catch (e) {
|
|
474
|
+
// A DB-write attacker who can write `vault:<crafted>` /
|
|
475
|
+
// `vault.aad:<crafted>` payloads to sealed columns can force
|
|
476
|
+
// KEM decapsulation / AEAD verify on attacker-controlled
|
|
477
|
+
// bytes via this read path. Surface the failure as a chain
|
|
478
|
+
// row so operators alert on burst patterns; null the field
|
|
479
|
+
// so downstream code sees "no value" instead of crashing the
|
|
480
|
+
// request. AAD-shape failures additionally indicate cross-
|
|
481
|
+
// row copy attempts — the audit metadata flags the shape so
|
|
482
|
+
// operators can write alert rules.
|
|
483
|
+
try {
|
|
484
|
+
audit().safeEmit({
|
|
485
|
+
action: "system.crypto.unseal_failed",
|
|
486
|
+
outcome: "failure",
|
|
487
|
+
metadata: {
|
|
488
|
+
table: table,
|
|
489
|
+
field: field,
|
|
490
|
+
rowId: out[s.rowIdField] || out._id || null,
|
|
491
|
+
shape: s.aad ? "aad" : "plain",
|
|
492
|
+
reason: (e && e.message) || String(e),
|
|
493
|
+
},
|
|
494
|
+
});
|
|
495
|
+
} catch (_e) { /* drop-silent */ }
|
|
496
|
+
unsealed = null;
|
|
497
|
+
}
|
|
498
|
+
// If the value wasn't actually sealed, vault.unseal returns the input
|
|
499
|
+
// unchanged — keep the original.
|
|
500
|
+
out[field] = unsealed !== undefined && unsealed !== null ? unsealed : out[field];
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
return out;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// ---- Erasure (GDPR Art. 17 / "right to be forgotten") ----
|
|
508
|
+
//
|
|
509
|
+
// eraseRow(table, row) returns a tombstoned copy of the row: every
|
|
510
|
+
// sealed column is replaced with NULL, every derived hash column
|
|
511
|
+
// (computed from a sealed source) is replaced with NULL, and a
|
|
512
|
+
// `__erasedAt` field is added carrying the erasure timestamp. The
|
|
513
|
+
// row itself stays in the table (referential integrity), but the
|
|
514
|
+
// sealed cleartext is unrecoverable — even with the vault key, NULL
|
|
515
|
+
// decrypts to NULL.
|
|
516
|
+
//
|
|
517
|
+
// Callers that need the row removed entirely should DELETE; eraseRow
|
|
518
|
+
// is for the case where downstream FKs / audit references make
|
|
519
|
+
// outright deletion infeasible.
|
|
520
|
+
|
|
521
|
+
/**
|
|
522
|
+
* @primitive b.cryptoField.eraseRow
|
|
523
|
+
* @signature b.cryptoField.eraseRow(table, row)
|
|
524
|
+
* @since 0.7.10
|
|
525
|
+
* @compliance gdpr, hipaa
|
|
526
|
+
* @related b.cryptoField.sealRow, b.subject.eraseHard, b.db.vacuumAfterErase
|
|
527
|
+
*
|
|
528
|
+
* Returns a tombstoned copy of `row`: every sealed column NULLed,
|
|
529
|
+
* every derived-hash mirror NULLed, and `__erasedAt` set to a
|
|
530
|
+
* 1-day-bucketed UTC ms timestamp (sub-day timing is intentionally
|
|
531
|
+
* fuzzed to defeat audit-log exfiltration + cross-tenant correlation
|
|
532
|
+
* attacks like "this row was erased 2.3s before that one"). Under
|
|
533
|
+
* regulatory postures whose `POSTURE_DEFAULTS` sets
|
|
534
|
+
* `requireVacuumAfterErase: true` (gdpr / dpdp / pipl-cn / lgpd-br /
|
|
535
|
+
* hipaa), automatically schedules `b.db.vacuumAfterErase({ mode:
|
|
536
|
+
* "full" })` so freed B-tree pages don't linger with sealed-column
|
|
537
|
+
* ciphertext readable from a forensic disk image. The row stays in
|
|
538
|
+
* the table for referential integrity; outright DELETE remains the
|
|
539
|
+
* caller's choice when FKs allow.
|
|
540
|
+
*
|
|
541
|
+
* @example
|
|
542
|
+
* b.cryptoField.registerTable("patients", {
|
|
543
|
+
* sealedFields: ["ssn"],
|
|
544
|
+
* derivedHashes: { ssnHash: { from: "ssn" } }
|
|
545
|
+
* });
|
|
546
|
+
* var sealed = b.cryptoField.sealRow("patients", { id: 1, ssn: "123-45-6789" });
|
|
547
|
+
* var erased = b.cryptoField.eraseRow("patients", sealed);
|
|
548
|
+
* erased.ssn; // → null
|
|
549
|
+
* erased.ssnHash; // → null
|
|
550
|
+
* typeof erased.__erasedAt; // → "number"
|
|
551
|
+
*/
|
|
552
|
+
function eraseRow(table, row) {
|
|
553
|
+
if (!row) return row;
|
|
554
|
+
var s = schemas[table];
|
|
555
|
+
if (!s) return row;
|
|
556
|
+
var out = Object.assign({}, row);
|
|
557
|
+
// Erase sealed columns — set to null. After this, unsealRow on the
|
|
558
|
+
// erased row returns null for these columns; no key recovers them
|
|
559
|
+
// because there's no ciphertext to decrypt.
|
|
560
|
+
for (var i = 0; i < s.sealedFields.length; i++) {
|
|
561
|
+
out[s.sealedFields[i]] = null;
|
|
562
|
+
}
|
|
563
|
+
// Erase derived hashes — they're indexed lookup mirrors of sealed
|
|
564
|
+
// sources and would otherwise let an attacker reverse the cleartext
|
|
565
|
+
// via dictionary enumeration of the hash.
|
|
566
|
+
if (s.derivedHashes) {
|
|
567
|
+
for (var derivedField in s.derivedHashes) {
|
|
568
|
+
out[derivedField] = null;
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
// F-RTBF-4 — `__erasedAt` was previously a plaintext UTC ms integer.
|
|
572
|
+
// That value alone fingerprints the erasure event (audit-log
|
|
573
|
+
// exfiltration + cross-tenant correlation: "this row was erased
|
|
574
|
+
// 2.3s before that one"). Bucket the timestamp to a 1-day floor so
|
|
575
|
+
// the event still surfaces "erased before / after this date" for
|
|
576
|
+
// operational use without leaking sub-day timing. Operators who
|
|
577
|
+
// genuinely need the precise instant pull the audit-chain row
|
|
578
|
+
// (which is itself sealed under the audit-sign keypair).
|
|
579
|
+
var dayMs = TIME.days(1);
|
|
580
|
+
out.__erasedAt = Math.floor(Date.now() / dayMs) * dayMs;
|
|
581
|
+
|
|
582
|
+
// F-RTBF-2 — under regulatory postures whose POSTURE_DEFAULTS sets
|
|
583
|
+
// requireVacuumAfterErase: true (gdpr / dpdp / pipl-cn / lgpd-br /
|
|
584
|
+
// hipaa), the B-tree index pages freed by the upcoming UPDATE/DELETE
|
|
585
|
+
// would otherwise linger with sealed-column ciphertext readable
|
|
586
|
+
// from a forensic disk image. The cascade-installed posture (set by
|
|
587
|
+
// b.compliance.set) drives an automatic VACUUM after the in-memory
|
|
588
|
+
// tombstone — the actual write happens at the operator's call site,
|
|
589
|
+
// and the framework only schedules the vacuum AFTER the next write.
|
|
590
|
+
// Each erase emits cryptofield.erase.row + (when vacuum runs)
|
|
591
|
+
// db.vacuum_after_erase so the audit trail covers both halves.
|
|
592
|
+
if (_activePosture) {
|
|
593
|
+
var requireVacuum = false;
|
|
594
|
+
try {
|
|
595
|
+
requireVacuum = compliance().postureDefault(
|
|
596
|
+
_activePosture, "requireVacuumAfterErase") === true;
|
|
597
|
+
} catch (_e) { /* compliance lookup best-effort */ }
|
|
598
|
+
if (requireVacuum) {
|
|
599
|
+
try {
|
|
600
|
+
var dbInst = db();
|
|
601
|
+
if (dbInst && typeof dbInst.vacuumAfterErase === "function") {
|
|
602
|
+
dbInst.vacuumAfterErase({ mode: "full" });
|
|
603
|
+
}
|
|
604
|
+
} catch (_vacErr) {
|
|
605
|
+
// VACUUM is best-effort at the eraseRow seam — DB might not be
|
|
606
|
+
// initialized yet (cluster mode, test fixture). The cascade row
|
|
607
|
+
// captures the skip; operators on regulated postures wire the
|
|
608
|
+
// sweep through b.retention which gates erasure on db.init().
|
|
609
|
+
try {
|
|
610
|
+
audit().safeEmit({
|
|
611
|
+
action: "cryptofield.vacuum.skipped",
|
|
612
|
+
outcome: "failure",
|
|
613
|
+
metadata: {
|
|
614
|
+
posture: _activePosture,
|
|
615
|
+
reason: (_vacErr && _vacErr.message) ? _vacErr.message : String(_vacErr),
|
|
616
|
+
},
|
|
617
|
+
});
|
|
618
|
+
} catch (_ae) { /* audit best-effort */ }
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
return out;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
// ---- Lookup translation ----
|
|
626
|
+
|
|
627
|
+
/**
|
|
628
|
+
* @primitive b.cryptoField.lookupHash
|
|
629
|
+
* @signature b.cryptoField.lookupHash(table, field, value)
|
|
630
|
+
* @since 0.4.0
|
|
631
|
+
* @related b.cryptoField.computeDerived, b.cryptoField.sealRow
|
|
632
|
+
*
|
|
633
|
+
* Translates a plaintext-keyed lookup (e.g. `where({ email: "..." })`)
|
|
634
|
+
* into the derived-hash form (`where({ emailHash: hash(...) })`).
|
|
635
|
+
* Returns `{ field, value }` naming the derived column and its hash,
|
|
636
|
+
* or null when no derived hash is declared for that source field.
|
|
637
|
+
* Sealed columns without a declared derived hash are unindexable —
|
|
638
|
+
* every encryption uses a fresh random nonce, so the ciphertext alone
|
|
639
|
+
* cannot anchor a query.
|
|
640
|
+
*
|
|
641
|
+
* @example
|
|
642
|
+
* b.cryptoField.registerTable("users", {
|
|
643
|
+
* sealedFields: ["email"],
|
|
644
|
+
* derivedHashes: { emailHash: { from: "email" } }
|
|
645
|
+
* });
|
|
646
|
+
* var lookup = b.cryptoField.lookupHash("users", "email", "alice@example.com");
|
|
647
|
+
* lookup.field; // → "emailHash"
|
|
648
|
+
* typeof lookup.value; // → "string"
|
|
649
|
+
*
|
|
650
|
+
* b.cryptoField.lookupHash("users", "name", "Alice"); // → null (no derived hash)
|
|
651
|
+
*/
|
|
652
|
+
function lookupHash(table, field, value) {
|
|
653
|
+
var s = schemas[table];
|
|
654
|
+
if (!s || !s.derivedHashes) return null;
|
|
655
|
+
for (var derivedField in s.derivedHashes) {
|
|
656
|
+
var spec = s.derivedHashes[derivedField];
|
|
657
|
+
if (spec.from === field) {
|
|
658
|
+
var ns = namespaceFor(table, field, s.hashNamespaces);
|
|
659
|
+
var normalized = spec.normalize ? spec.normalize(value) : String(value);
|
|
660
|
+
var saltHex = vault.getDerivedHashSalt().toString("hex");
|
|
661
|
+
return { field: derivedField, value: sha3Hash(saltHex + ns + normalized) };
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
return null;
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
/**
|
|
668
|
+
* @primitive b.cryptoField.declareColumnResidency
|
|
669
|
+
* @signature b.cryptoField.declareColumnResidency(table, opts)
|
|
670
|
+
* @since 0.7.27
|
|
671
|
+
* @compliance gdpr
|
|
672
|
+
* @related b.cryptoField.assertColumnResidency, b.cryptoField.getColumnResidency
|
|
673
|
+
*
|
|
674
|
+
* Declares per-column data residency for `table`. Real GDPR / DPDP /
|
|
675
|
+
* pipl-cn deployments have row-level mixed residency: a `users.name`
|
|
676
|
+
* column may be globally replicable, but `users.addressLine1` must
|
|
677
|
+
* stay in EU storage. At write time
|
|
678
|
+
* (`b.db.set` / `b.db.from(...).insert` / `.update`), the framework
|
|
679
|
+
* consults this registry; if the storage backend's tag doesn't satisfy
|
|
680
|
+
* the column's tag, the write is refused under gdpr / dpdp / pipl-cn /
|
|
681
|
+
* uk-gdpr postures. Throws on bad input (config-time fail-loud).
|
|
682
|
+
*
|
|
683
|
+
* @opts
|
|
684
|
+
* columnResidency: { [columnName]: "eu" | "us" | "global" | <tag> },
|
|
685
|
+
*
|
|
686
|
+
* @example
|
|
687
|
+
* b.cryptoField.declareColumnResidency("users", {
|
|
688
|
+
* columnResidency: {
|
|
689
|
+
* name: "global",
|
|
690
|
+
* addressLine1: "eu",
|
|
691
|
+
* addressLine2: "eu"
|
|
692
|
+
* }
|
|
693
|
+
* });
|
|
694
|
+
* var got = b.cryptoField.getColumnResidency("users");
|
|
695
|
+
* got.addressLine1; // → "eu"
|
|
696
|
+
*/
|
|
697
|
+
function declareColumnResidency(table, opts) {
|
|
698
|
+
if (typeof table !== "string" || table.length === 0) {
|
|
699
|
+
throw new Error("declareColumnResidency: table must be a non-empty string");
|
|
700
|
+
}
|
|
701
|
+
if (opts === null || opts === undefined || typeof opts !== "object" || Array.isArray(opts)) {
|
|
702
|
+
throw new Error("declareColumnResidency: opts must be a plain object");
|
|
703
|
+
}
|
|
704
|
+
var map = opts.columnResidency;
|
|
705
|
+
if (!map || typeof map !== "object" || Array.isArray(map)) {
|
|
706
|
+
throw new Error("declareColumnResidency: opts.columnResidency must be an object");
|
|
707
|
+
}
|
|
708
|
+
var entry = Object.create(null);
|
|
709
|
+
for (var col in map) {
|
|
710
|
+
if (!Object.prototype.hasOwnProperty.call(map, col)) continue;
|
|
711
|
+
var tag = map[col];
|
|
712
|
+
if (typeof tag !== "string" || tag.length === 0) {
|
|
713
|
+
throw new Error("declareColumnResidency: column '" + col +
|
|
714
|
+
"' residency tag must be a non-empty string");
|
|
715
|
+
}
|
|
716
|
+
entry[col] = tag;
|
|
717
|
+
}
|
|
718
|
+
columnResidency[table] = entry;
|
|
719
|
+
return { table: table, columnResidency: Object.assign({}, entry) };
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
/**
|
|
723
|
+
* @primitive b.cryptoField.getColumnResidency
|
|
724
|
+
* @signature b.cryptoField.getColumnResidency(table)
|
|
725
|
+
* @since 0.7.27
|
|
726
|
+
* @related b.cryptoField.declareColumnResidency
|
|
727
|
+
*
|
|
728
|
+
* Returns the residency map declared for `table`, or null when the
|
|
729
|
+
* table has no residency declaration. Read-only — does not mutate
|
|
730
|
+
* state. Storage backends use this to inspect residency at the
|
|
731
|
+
* write boundary.
|
|
732
|
+
*
|
|
733
|
+
* @example
|
|
734
|
+
* b.cryptoField.declareColumnResidency("users", {
|
|
735
|
+
* columnResidency: { addressLine1: "eu" }
|
|
736
|
+
* });
|
|
737
|
+
* b.cryptoField.getColumnResidency("users"); // → { addressLine1: "eu" }
|
|
738
|
+
* b.cryptoField.getColumnResidency("unknown"); // → null
|
|
739
|
+
*/
|
|
740
|
+
function getColumnResidency(table) {
|
|
741
|
+
return columnResidency[table] || null;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
/**
|
|
745
|
+
* @primitive b.cryptoField.assertColumnResidency
|
|
746
|
+
* @signature b.cryptoField.assertColumnResidency(table, row, args)
|
|
747
|
+
* @since 0.7.27
|
|
748
|
+
* @compliance gdpr
|
|
749
|
+
* @related b.cryptoField.declareColumnResidency
|
|
750
|
+
*
|
|
751
|
+
* Storage-write gate. Storage backends call this with the proposed
|
|
752
|
+
* row before the SQL hits the wire; refusal under regulated postures
|
|
753
|
+
* surfaces a config-time error rather than a silent cross-border leak.
|
|
754
|
+
* Returns null on pass; returns
|
|
755
|
+
* `{ error, table, column, want, got }` on refusal so the storage
|
|
756
|
+
* backend can wrap it in its own error class. Columns tagged "global"
|
|
757
|
+
* or "unrestricted" pass any backend; columns tagged with a region
|
|
758
|
+
* (e.g. "eu") refuse mismatched backends.
|
|
759
|
+
*
|
|
760
|
+
* @opts
|
|
761
|
+
* backendTag: string, // tag of the storage backend ("eu" | "us" | "unrestricted")
|
|
762
|
+
*
|
|
763
|
+
* @example
|
|
764
|
+
* b.cryptoField.declareColumnResidency("users", {
|
|
765
|
+
* columnResidency: { addressLine1: "eu" }
|
|
766
|
+
* });
|
|
767
|
+
* var refusal = b.cryptoField.assertColumnResidency(
|
|
768
|
+
* "users",
|
|
769
|
+
* { id: 1, addressLine1: "10 Rue de Rivoli" },
|
|
770
|
+
* { backendTag: "us" }
|
|
771
|
+
* );
|
|
772
|
+
* refusal.error; // → "column-residency-mismatch"
|
|
773
|
+
* refusal.column; // → "addressLine1"
|
|
774
|
+
* refusal.want; // → "eu"
|
|
775
|
+
* refusal.got; // → "us"
|
|
776
|
+
*
|
|
777
|
+
* b.cryptoField.assertColumnResidency(
|
|
778
|
+
* "users",
|
|
779
|
+
* { id: 1, addressLine1: "10 Rue de Rivoli" },
|
|
780
|
+
* { backendTag: "eu" }
|
|
781
|
+
* ); // → null (pass)
|
|
782
|
+
*/
|
|
783
|
+
function assertColumnResidency(table, row, args) {
|
|
784
|
+
var entry = columnResidency[table];
|
|
785
|
+
if (!entry || !row || !args) return null;
|
|
786
|
+
var backendTag = args.backendTag || "unrestricted";
|
|
787
|
+
for (var col in entry) {
|
|
788
|
+
var want = entry[col];
|
|
789
|
+
if (row[col] === undefined || row[col] === null) continue;
|
|
790
|
+
if (want === "global" || want === "unrestricted") continue;
|
|
791
|
+
if (backendTag === "unrestricted") continue;
|
|
792
|
+
if (backendTag !== want) {
|
|
793
|
+
return {
|
|
794
|
+
error: "column-residency-mismatch",
|
|
795
|
+
table: table,
|
|
796
|
+
column: col,
|
|
797
|
+
want: want,
|
|
798
|
+
got: backendTag,
|
|
799
|
+
};
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
return null;
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
/**
|
|
806
|
+
* @primitive b.cryptoField.declarePerRowKey
|
|
807
|
+
* @signature b.cryptoField.declarePerRowKey(table, opts)
|
|
808
|
+
* @since 0.7.27
|
|
809
|
+
* @compliance gdpr, hipaa
|
|
810
|
+
* @related b.cryptoField.materializePerRowKey, b.cryptoField.destroyPerRowKey, b.subject.eraseHard
|
|
811
|
+
*
|
|
812
|
+
* Opts a table into per-row keying (K_row crypto-shred substrate).
|
|
813
|
+
* After registration, every INSERT generates a fresh K_row and stores
|
|
814
|
+
* it sealed in `_blamejs_per_row_keys (table, rowId, wrapped)`. AAD on
|
|
815
|
+
* the K_row binds (table, rowId, info-label) — copy-row attacks fail
|
|
816
|
+
* Poly1305 verification. `b.subject.eraseHard(subjectId)` deletes the
|
|
817
|
+
* per-row key entries for the subject's rows; WAL / replica residual
|
|
818
|
+
* ciphertext becomes mathematically undecryptable because K_row is
|
|
819
|
+
* gone everywhere it ever lived. Throws on bad input (config-time
|
|
820
|
+
* fail-loud).
|
|
821
|
+
*
|
|
822
|
+
* @opts
|
|
823
|
+
* keySize: number, // bytes; default 32 (XChaCha20-Poly1305 key length); minimum 16
|
|
824
|
+
* info: string, // HKDF info label; default "blamejs-per-row-key:<table>"
|
|
825
|
+
*
|
|
826
|
+
* @example
|
|
827
|
+
* var spec = b.cryptoField.declarePerRowKey("orders", {
|
|
828
|
+
* keySize: 32,
|
|
829
|
+
* info: "blamejs-per-row-key:orders"
|
|
830
|
+
* });
|
|
831
|
+
* spec.keySize; // → 32
|
|
832
|
+
* b.cryptoField.hasPerRowKey("orders"); // → true
|
|
833
|
+
*/
|
|
834
|
+
function declarePerRowKey(table, opts) {
|
|
835
|
+
if (typeof table !== "string" || table.length === 0) {
|
|
836
|
+
throw new Error("declarePerRowKey: table must be a non-empty string");
|
|
837
|
+
}
|
|
838
|
+
opts = opts || {};
|
|
839
|
+
var keySize = opts.keySize === undefined ? 32 : opts.keySize; // allow:raw-byte-literal — XChaCha20-Poly1305 key length in bytes
|
|
840
|
+
if (typeof keySize !== "number" || !isFinite(keySize) ||
|
|
841
|
+
keySize < 16 || Math.floor(keySize) !== keySize) { // allow:raw-byte-literal — minimum AES-128 key length in bytes
|
|
842
|
+
throw new Error("declarePerRowKey: opts.keySize must be an integer >= 16 (bytes)");
|
|
843
|
+
}
|
|
844
|
+
var info = opts.info || ("blamejs-per-row-key:" + table);
|
|
845
|
+
if (typeof info !== "string" || info.length === 0) {
|
|
846
|
+
throw new Error("declarePerRowKey: opts.info must be a non-empty string");
|
|
847
|
+
}
|
|
848
|
+
perRowKeyTables[table] = { keySize: keySize, info: info };
|
|
849
|
+
return { table: table, keySize: keySize, info: info };
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
/**
|
|
853
|
+
* @primitive b.cryptoField.hasPerRowKey
|
|
854
|
+
* @signature b.cryptoField.hasPerRowKey(table)
|
|
855
|
+
* @since 0.7.27
|
|
856
|
+
* @related b.cryptoField.declarePerRowKey
|
|
857
|
+
*
|
|
858
|
+
* Returns `true` when `table` has been registered for per-row keying
|
|
859
|
+
* via `declarePerRowKey`, `false` otherwise. Storage backends gate
|
|
860
|
+
* the K_row materialize/destroy paths through this check.
|
|
861
|
+
*
|
|
862
|
+
* @example
|
|
863
|
+
* b.cryptoField.hasPerRowKey("orders"); // → false
|
|
864
|
+
* b.cryptoField.declarePerRowKey("orders", { keySize: 32 });
|
|
865
|
+
* b.cryptoField.hasPerRowKey("orders"); // → true
|
|
866
|
+
*/
|
|
867
|
+
function hasPerRowKey(table) {
|
|
868
|
+
return !!perRowKeyTables[table];
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
/**
|
|
872
|
+
* @primitive b.cryptoField.materializePerRowKey
|
|
873
|
+
* @signature b.cryptoField.materializePerRowKey(table, rowId, dbHandle)
|
|
874
|
+
* @since 0.7.27
|
|
875
|
+
* @compliance gdpr, hipaa
|
|
876
|
+
* @related b.cryptoField.declarePerRowKey, b.cryptoField.destroyPerRowKey
|
|
877
|
+
*
|
|
878
|
+
* Derive-and-store: called by the storage backend on INSERT. Generates
|
|
879
|
+
* `K_row = SHAKE256(vaultSalt + table + rowId + info, keySize)`, seals
|
|
880
|
+
* it via `vault.seal`, and inserts into `_blamejs_per_row_keys`.
|
|
881
|
+
* Returns the unwrapped K_row Buffer for the caller to use to encrypt
|
|
882
|
+
* sealed columns under the row-scoped key. Idempotent on UPSERT — if
|
|
883
|
+
* a K_row already exists for (table, rowId), returns the unwrapped
|
|
884
|
+
* existing key. The AAD-bound envelope rejects copy-row attacks: a
|
|
885
|
+
* wrapped K_row pasted under a different rowId fails Poly1305
|
|
886
|
+
* verification at unseal time.
|
|
887
|
+
*
|
|
888
|
+
* @example
|
|
889
|
+
* b.cryptoField.declarePerRowKey("orders", { keySize: 32 });
|
|
890
|
+
* var dbHandle = b.db.handle();
|
|
891
|
+
* var kRow = b.cryptoField.materializePerRowKey("orders", "ord-42", dbHandle);
|
|
892
|
+
* Buffer.isBuffer(kRow); // → true
|
|
893
|
+
* kRow.length; // → 32
|
|
894
|
+
*
|
|
895
|
+
* // Idempotent — second call returns the same key.
|
|
896
|
+
* var kRowAgain = b.cryptoField.materializePerRowKey("orders", "ord-42", dbHandle);
|
|
897
|
+
* kRow.equals(kRowAgain); // → true
|
|
898
|
+
*/
|
|
899
|
+
function materializePerRowKey(table, rowId, dbHandle) {
|
|
900
|
+
var spec = perRowKeyTables[table];
|
|
901
|
+
if (!spec) return null;
|
|
902
|
+
if (!dbHandle || typeof dbHandle.prepare !== "function") {
|
|
903
|
+
throw new Error("materializePerRowKey: dbHandle (b.db) is required");
|
|
904
|
+
}
|
|
905
|
+
// Existing key? Re-use to support idempotent UPSERTs.
|
|
906
|
+
var existing = dbHandle.prepare(
|
|
907
|
+
'SELECT wrappedKey FROM "_blamejs_per_row_keys" WHERE tableName = ? AND rowId = ?'
|
|
908
|
+
).get(table, rowId);
|
|
909
|
+
if (existing) {
|
|
910
|
+
return vault.unseal(existing.wrappedKey);
|
|
911
|
+
}
|
|
912
|
+
// Derive K_row from the table-level vault key salt + rowId via
|
|
913
|
+
// SHAKE256 expand. This is a one-shot derivation (HKDF-shaped) that
|
|
914
|
+
// matches the framework's PQC-first kdf — no HMAC-SHA3 dependency.
|
|
915
|
+
var saltHex = vault.getDerivedHashSalt().toString("hex");
|
|
916
|
+
var ikm = Buffer.from(saltHex + ":" + table + ":" + rowId + ":" + spec.info, "utf8");
|
|
917
|
+
var kRow = kdf(ikm, spec.keySize);
|
|
918
|
+
// allow:seal-without-aad — per-row K_row wrap; row identity is the
|
|
919
|
+
// K_row KDF input, not the AEAD AAD on the wrap. Copy-attacks fail
|
|
920
|
+
// because the wrapped K_row only decrypts data sealed under it.
|
|
921
|
+
var sealed = vault.seal(kRow.toString("base64"));
|
|
922
|
+
dbHandle.prepare(
|
|
923
|
+
'INSERT INTO "_blamejs_per_row_keys" (tableName, rowId, wrappedKey, createdAt) ' +
|
|
924
|
+
'VALUES (?, ?, ?, ?)'
|
|
925
|
+
).run(table, rowId, sealed, Date.now());
|
|
926
|
+
return kRow;
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
/**
|
|
930
|
+
* @primitive b.cryptoField.destroyPerRowKey
|
|
931
|
+
* @signature b.cryptoField.destroyPerRowKey(table, rowId, dbHandle)
|
|
932
|
+
* @since 0.7.27
|
|
933
|
+
* @compliance gdpr, hipaa
|
|
934
|
+
* @related b.cryptoField.materializePerRowKey, b.subject.eraseHard
|
|
935
|
+
*
|
|
936
|
+
* Crypto-shred: drops the per-row K_row entry from
|
|
937
|
+
* `_blamejs_per_row_keys`. Called by `b.subject.eraseHard` for each
|
|
938
|
+
* row mapped to the erased subject. Returns
|
|
939
|
+
* `{ destroyed: <rowsAffected> }`. After destruction, any WAL /
|
|
940
|
+
* replica residual ciphertext for the row is mathematically
|
|
941
|
+
* undecryptable — even with the vault root key — because K_row is
|
|
942
|
+
* gone everywhere it ever lived. No-op when the table is not
|
|
943
|
+
* registered for per-row keying.
|
|
944
|
+
*
|
|
945
|
+
* @example
|
|
946
|
+
* b.cryptoField.declarePerRowKey("orders", { keySize: 32 });
|
|
947
|
+
* var dbHandle = b.db.handle();
|
|
948
|
+
* b.cryptoField.materializePerRowKey("orders", "ord-42", dbHandle);
|
|
949
|
+
*
|
|
950
|
+
* var result = b.cryptoField.destroyPerRowKey("orders", "ord-42", dbHandle);
|
|
951
|
+
* result.destroyed; // → 1
|
|
952
|
+
*
|
|
953
|
+
* // Subsequent destroy is a no-op.
|
|
954
|
+
* b.cryptoField.destroyPerRowKey("orders", "ord-42", dbHandle).destroyed; // → 0
|
|
955
|
+
*/
|
|
956
|
+
function destroyPerRowKey(table, rowId, dbHandle) {
|
|
957
|
+
if (!perRowKeyTables[table]) return { destroyed: 0 };
|
|
958
|
+
if (!dbHandle || typeof dbHandle.prepare !== "function") {
|
|
959
|
+
throw new Error("destroyPerRowKey: dbHandle (b.db) is required");
|
|
960
|
+
}
|
|
961
|
+
var result = dbHandle.prepare(
|
|
962
|
+
'DELETE FROM "_blamejs_per_row_keys" WHERE tableName = ? AND rowId = ?'
|
|
963
|
+
).run(table, rowId);
|
|
964
|
+
return { destroyed: (result && result.changes) || 0 };
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
/**
|
|
968
|
+
* @primitive b.cryptoField.clearResidencyForTest
|
|
969
|
+
* @signature b.cryptoField.clearResidencyForTest()
|
|
970
|
+
* @since 0.7.27
|
|
971
|
+
* @status experimental
|
|
972
|
+
* @related b.cryptoField.declareColumnResidency, b.cryptoField.declarePerRowKey
|
|
973
|
+
*
|
|
974
|
+
* Test-only helper. Drops every entry from the per-column residency
|
|
975
|
+
* registry AND the per-row-key registry so a test fixture can
|
|
976
|
+
* re-declare both between cases. Operator code never calls this —
|
|
977
|
+
* production declarations come from `b.db.init({ schema })` once at
|
|
978
|
+
* boot.
|
|
979
|
+
*
|
|
980
|
+
* @example
|
|
981
|
+
* b.cryptoField.declareColumnResidency("users", {
|
|
982
|
+
* columnResidency: { addressLine1: "eu" }
|
|
983
|
+
* });
|
|
984
|
+
* b.cryptoField.clearResidencyForTest();
|
|
985
|
+
* b.cryptoField.getColumnResidency("users"); // → null
|
|
986
|
+
*/
|
|
987
|
+
function clearResidencyForTest() {
|
|
988
|
+
for (var t in columnResidency) delete columnResidency[t];
|
|
989
|
+
for (var u in perRowKeyTables) delete perRowKeyTables[u];
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
module.exports = {
|
|
993
|
+
registerTable: registerTable,
|
|
994
|
+
getSchema: getSchema,
|
|
995
|
+
getSealedFields: getSealedFields,
|
|
996
|
+
sealRow: sealRow,
|
|
997
|
+
unsealRow: unsealRow,
|
|
998
|
+
// Doc-shaped aliases — operators / tests preparing a JS document
|
|
999
|
+
// object (vs. a SQL row) reach for sealDoc / unsealDoc naming. Same
|
|
1000
|
+
// function, identical shape, returns a new object (input untouched).
|
|
1001
|
+
sealDoc: sealRow,
|
|
1002
|
+
unsealDoc: unsealRow,
|
|
1003
|
+
eraseRow: eraseRow,
|
|
1004
|
+
applyPosture: applyPosture,
|
|
1005
|
+
getActivePosture: getActivePosture,
|
|
1006
|
+
computeDerived: computeDerived,
|
|
1007
|
+
lookupHash: lookupHash,
|
|
1008
|
+
clearForTest: clearForTest,
|
|
1009
|
+
declareColumnResidency: declareColumnResidency,
|
|
1010
|
+
getColumnResidency: getColumnResidency,
|
|
1011
|
+
assertColumnResidency: assertColumnResidency,
|
|
1012
|
+
declarePerRowKey: declarePerRowKey,
|
|
1013
|
+
hasPerRowKey: hasPerRowKey,
|
|
1014
|
+
materializePerRowKey: materializePerRowKey,
|
|
1015
|
+
destroyPerRowKey: destroyPerRowKey,
|
|
1016
|
+
clearResidencyForTest: clearResidencyForTest,
|
|
1017
|
+
};
|