@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,1023 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @module b.atomicFile
|
|
4
|
+
* @nav Data
|
|
5
|
+
* @title Atomic File
|
|
6
|
+
*
|
|
7
|
+
* @intro
|
|
8
|
+
* Atomic file I/O with integrity verification, retry on transient
|
|
9
|
+
* errors, and cross-process locking.
|
|
10
|
+
*
|
|
11
|
+
* Every write goes through the same crash-safe sequence:
|
|
12
|
+
* 1. write payload to a sibling temp file (`<filepath>.tmp-<token>`)
|
|
13
|
+
* 2. fsync the file descriptor before close
|
|
14
|
+
* 3. fs.rename() the temp file over the destination — POSIX rename
|
|
15
|
+
* is atomic on the same filesystem; on Windows, fs.rename uses
|
|
16
|
+
* MoveFileEx with REPLACE_EXISTING for the same guarantee
|
|
17
|
+
* 4. fsync the parent directory so the rename itself is durable
|
|
18
|
+
*
|
|
19
|
+
* Result: a partially-written file NEVER survives a crash to the
|
|
20
|
+
* caller. Either the new contents are fully on disk (rename
|
|
21
|
+
* succeeded) or the original (or absence) remains. No torn writes,
|
|
22
|
+
* no half-flushed pages.
|
|
23
|
+
*
|
|
24
|
+
* fsync calls are best-effort across platforms — Windows rejects
|
|
25
|
+
* directory fsync, some FUSE filesystems no-op file fsync — but the
|
|
26
|
+
* rename remains atomic at the FS level regardless. The framework
|
|
27
|
+
* already uses this primitive internally for vault.key.sealed and
|
|
28
|
+
* audit.tip; this module exposes the same surface for any caller
|
|
29
|
+
* that needs durable write-replace semantics.
|
|
30
|
+
*
|
|
31
|
+
* Optional `computeHash: true` returns SHA3-512 over the written
|
|
32
|
+
* bytes; passing the same digest as `expectedHash` on a later read
|
|
33
|
+
* gates retrieval on integrity. Transient FS errors (EBUSY / EAGAIN /
|
|
34
|
+
* ENFILE / EMFILE / EPERM) retry with exponential backoff via
|
|
35
|
+
* b.retry.withRetry — sync paths skip the loop because they can't
|
|
36
|
+
* usefully await a backoff.
|
|
37
|
+
*
|
|
38
|
+
* @card
|
|
39
|
+
* Atomic file I/O with integrity verification, retry on transient errors, and cross-process locking.
|
|
40
|
+
*/
|
|
41
|
+
var nodeFs = require("node:fs");
|
|
42
|
+
var nodePath = require("node:path");
|
|
43
|
+
var { generateToken, sha3Hash } = require("./crypto");
|
|
44
|
+
var safeJson = require("./safe-json");
|
|
45
|
+
var C = require("./constants");
|
|
46
|
+
var { boot } = require("./log");
|
|
47
|
+
var safeBuffer = require("./safe-buffer");
|
|
48
|
+
var numericBounds = require("./numeric-bounds");
|
|
49
|
+
var safeAsync = require("./safe-async");
|
|
50
|
+
var retryHelper = require("./retry");
|
|
51
|
+
var { FrameworkError } = require("./framework-error");
|
|
52
|
+
|
|
53
|
+
var log = boot("atomic-file");
|
|
54
|
+
|
|
55
|
+
var DEFAULTS = {
|
|
56
|
+
maxBytes: C.BYTES.mib(64), // 64 MiB ceiling on read
|
|
57
|
+
retryAttempts: 5,
|
|
58
|
+
retryBaseMs: 50,
|
|
59
|
+
retryMaxMs: C.TIME.seconds(2),
|
|
60
|
+
fileMode: 0o600,
|
|
61
|
+
computeHash: false,
|
|
62
|
+
lockTimeoutMs: C.TIME.seconds(30),
|
|
63
|
+
lockPollMs: 50,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
class AtomicFileError extends FrameworkError {
|
|
67
|
+
constructor(message, code) {
|
|
68
|
+
super(message);
|
|
69
|
+
this.name = "AtomicFileError";
|
|
70
|
+
this.code = code || "atomic-file/error";
|
|
71
|
+
this.isAtomicFileError = true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ---- Retry helper for transient FS errors ----
|
|
76
|
+
//
|
|
77
|
+
// Routes through b.retry.withRetry with an FS-specific classifier — the
|
|
78
|
+
// errnos that mean "try again" on Linux/macOS/Windows file systems differ
|
|
79
|
+
// from the HTTP/network-shaped default classifier. atomic-file's public
|
|
80
|
+
// opts (retryAttempts/retryBaseMs/retryMaxMs) are mapped to the retry
|
|
81
|
+
// primitive's standard names; jitterFactor 0.5 reproduces the original
|
|
82
|
+
// `delay * (0.5 + Math.random()/2)` range of [delay/2, delay].
|
|
83
|
+
|
|
84
|
+
var TRANSIENT_FS_ERRNOS = new Set(["EBUSY", "EAGAIN", "ENFILE", "EMFILE", "EPERM"]);
|
|
85
|
+
|
|
86
|
+
function _isFsRetryable(e) {
|
|
87
|
+
return e != null && TRANSIENT_FS_ERRNOS.has(e.code);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function _withRetry(fn, opts) {
|
|
91
|
+
opts = Object.assign({}, DEFAULTS, opts || {});
|
|
92
|
+
return retryHelper.withRetry(function () { return fn(); }, {
|
|
93
|
+
maxAttempts: opts.retryAttempts,
|
|
94
|
+
baseDelayMs: opts.retryBaseMs,
|
|
95
|
+
maxDelayMs: opts.retryMaxMs,
|
|
96
|
+
jitterFactor: 0.5,
|
|
97
|
+
isRetryable: _isFsRetryable,
|
|
98
|
+
signal: opts.signal,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ---- Sync helpers (best effort) ----
|
|
103
|
+
//
|
|
104
|
+
// fsync / fsyncDir / ensureDir / copyDirRecursive / pathTimestamp are
|
|
105
|
+
// public surface — they were previously underscore-prefixed, and other
|
|
106
|
+
// modules (vault-passphrase-ops, vault-rotate, backup-bundle, restore-
|
|
107
|
+
// bundle, restore-rollback, bundler) duplicated them inline. Hoisted
|
|
108
|
+
// here so the framework has one shared implementation per concern.
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* @primitive b.atomicFile.fsync
|
|
112
|
+
* @signature b.atomicFile.fsync(fd)
|
|
113
|
+
* @since 0.7.0
|
|
114
|
+
* @status stable
|
|
115
|
+
* @related b.atomicFile.fsyncDir, b.atomicFile.write
|
|
116
|
+
*
|
|
117
|
+
* Best-effort fs.fsyncSync wrapper. Silently swallows errors because
|
|
118
|
+
* not every platform / fd type supports fsync (some FUSE mounts, some
|
|
119
|
+
* device fds). Use this when you want the durability hint but don't
|
|
120
|
+
* want a non-fsyncable target to crash the caller.
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* var fs = require("fs");
|
|
124
|
+
* var fd = fs.openSync("/tmp/note.txt", "w");
|
|
125
|
+
* fs.writeSync(fd, "hello\n");
|
|
126
|
+
* b.atomicFile.fsync(fd);
|
|
127
|
+
* fs.closeSync(fd);
|
|
128
|
+
*/
|
|
129
|
+
function fsync(fd) {
|
|
130
|
+
try { nodeFs.fsyncSync(fd); } catch (_e) { /* not all platforms support fsync on every fd type */ }
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* @primitive b.atomicFile.fsyncDir
|
|
135
|
+
* @signature b.atomicFile.fsyncDir(dirPath)
|
|
136
|
+
* @since 0.7.0
|
|
137
|
+
* @status stable
|
|
138
|
+
* @related b.atomicFile.fsync, b.atomicFile.write
|
|
139
|
+
*
|
|
140
|
+
* Best-effort fsync of a directory inode. Required after a rename to
|
|
141
|
+
* make the directory entry itself durable on POSIX filesystems.
|
|
142
|
+
* Windows refuses directory fsync — the call is wrapped so the caller
|
|
143
|
+
* can run the same code on every platform without branching.
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* b.atomicFile.fsyncDir("/var/lib/blamejs/data");
|
|
147
|
+
*/
|
|
148
|
+
function fsyncDir(dirPath) {
|
|
149
|
+
// CodeQL js/insecure-temporary-file: dirPath is an operator-supplied
|
|
150
|
+
// framework data directory (e.g. /var/lib/blamejs/data) — never an
|
|
151
|
+
// os.tmpdir-reachable path. The fd is used solely for fsync and is
|
|
152
|
+
// closed immediately; no read or write occurs through it, so the
|
|
153
|
+
// tmp-file heuristic does not apply. Owner-only 0o700 dataDir
|
|
154
|
+
// perms are set by ensureDir.
|
|
155
|
+
try {
|
|
156
|
+
var fd = nodeFs.openSync(dirPath, "r");
|
|
157
|
+
try { nodeFs.fsyncSync(fd); } catch (_e) { /* Windows rejects directory fsync */ }
|
|
158
|
+
finally { nodeFs.closeSync(fd); }
|
|
159
|
+
} catch (_e) { /* dir fsync is best-effort across filesystems */ }
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Internal aliases so existing code in this file keeps working
|
|
163
|
+
function _fsync(fd) { return fsync(fd); }
|
|
164
|
+
function _fsyncDir(dirPath) { return fsyncDir(dirPath); }
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* @primitive b.atomicFile.ensureDir
|
|
168
|
+
* @signature b.atomicFile.ensureDir(dirPath, mode)
|
|
169
|
+
* @since 0.7.0
|
|
170
|
+
* @status stable
|
|
171
|
+
* @related b.atomicFile.write, b.atomicFile.copyDirRecursive
|
|
172
|
+
*
|
|
173
|
+
* Create `dirPath` (recursive) with a chosen mode. Default mode is
|
|
174
|
+
* 0o700 — owner-only — suitable for framework data directories
|
|
175
|
+
* holding sealed vaults, audit chains, or session state. Returns the
|
|
176
|
+
* dirPath unchanged so calls compose into path-building chains.
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* var dir = b.atomicFile.ensureDir("/var/lib/blamejs/audit", 0o700);
|
|
180
|
+
* // → "/var/lib/blamejs/audit"
|
|
181
|
+
*
|
|
182
|
+
* // Less-restricted dir for a public asset folder:
|
|
183
|
+
* b.atomicFile.ensureDir("/var/www/uploads", 0o755);
|
|
184
|
+
*/
|
|
185
|
+
function ensureDir(dirPath, mode) {
|
|
186
|
+
if (typeof dirPath !== "string" || dirPath.length === 0) {
|
|
187
|
+
throw new AtomicFileError("ensureDir: path must be a non-empty string", "atomic-file/bad-path");
|
|
188
|
+
}
|
|
189
|
+
nodeFs.mkdirSync(dirPath, { recursive: true, mode: typeof mode === "number" ? mode : 0o700 });
|
|
190
|
+
return dirPath;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* @primitive b.atomicFile.copyDirRecursive
|
|
195
|
+
* @signature b.atomicFile.copyDirRecursive(src, dest, opts)
|
|
196
|
+
* @since 0.7.0
|
|
197
|
+
* @status stable
|
|
198
|
+
* @related b.atomicFile.copy, b.atomicFile.ensureDir
|
|
199
|
+
*
|
|
200
|
+
* Synchronous, file-by-file copy that mirrors the source directory
|
|
201
|
+
* structure. Skips symlinks, sockets, and devices — operators wanting
|
|
202
|
+
* symlink preservation should use a real archive tool. Refuses to
|
|
203
|
+
* overwrite existing files at dest by default; pass `overwrite: true`
|
|
204
|
+
* to replace. The dest tree is created with mode 0o700 by default
|
|
205
|
+
* (override with `dirMode`). Returns `{ fileCount, byteCount }`.
|
|
206
|
+
*
|
|
207
|
+
* @opts
|
|
208
|
+
* overwrite: false, // when true, overwrite files that already exist at dest
|
|
209
|
+
* dirMode: 0o700, // mode for newly-created destination directories
|
|
210
|
+
*
|
|
211
|
+
* @example
|
|
212
|
+
* var stats = b.atomicFile.copyDirRecursive(
|
|
213
|
+
* "/var/lib/blamejs/data",
|
|
214
|
+
* "/var/lib/blamejs/snapshot-2026-01-01",
|
|
215
|
+
* { overwrite: false, dirMode: 0o700 }
|
|
216
|
+
* );
|
|
217
|
+
* // → { fileCount: 42, byteCount: 1048576 }
|
|
218
|
+
*/
|
|
219
|
+
function copyDirRecursive(src, dest, opts) {
|
|
220
|
+
if (typeof src !== "string" || src.length === 0) {
|
|
221
|
+
throw new AtomicFileError("copyDirRecursive: src must be a non-empty string", "atomic-file/bad-path");
|
|
222
|
+
}
|
|
223
|
+
if (typeof dest !== "string" || dest.length === 0) {
|
|
224
|
+
throw new AtomicFileError("copyDirRecursive: dest must be a non-empty string", "atomic-file/bad-path");
|
|
225
|
+
}
|
|
226
|
+
if (!nodeFs.existsSync(src)) {
|
|
227
|
+
throw new AtomicFileError("copyDirRecursive: src does not exist: " + src, "atomic-file/missing-src");
|
|
228
|
+
}
|
|
229
|
+
opts = opts || {};
|
|
230
|
+
var dirMode = typeof opts.dirMode === "number" ? opts.dirMode : 0o700;
|
|
231
|
+
var overwrite = !!opts.overwrite;
|
|
232
|
+
var copyFlags = overwrite ? 0 : nodeFs.constants.COPYFILE_EXCL;
|
|
233
|
+
|
|
234
|
+
ensureDir(dest, dirMode);
|
|
235
|
+
var entries = nodeFs.readdirSync(src, { withFileTypes: true });
|
|
236
|
+
var fileCount = 0;
|
|
237
|
+
var byteCount = 0;
|
|
238
|
+
for (var i = 0; i < entries.length; i++) {
|
|
239
|
+
var name = entries[i].name;
|
|
240
|
+
var s = nodePath.join(src, name);
|
|
241
|
+
var d = nodePath.join(dest, name);
|
|
242
|
+
if (entries[i].isDirectory()) {
|
|
243
|
+
var sub = copyDirRecursive(s, d, opts);
|
|
244
|
+
fileCount += sub.fileCount;
|
|
245
|
+
byteCount += sub.byteCount;
|
|
246
|
+
} else if (entries[i].isFile()) {
|
|
247
|
+
nodeFs.copyFileSync(s, d, copyFlags);
|
|
248
|
+
try { byteCount += nodeFs.statSync(d).size; } catch (_e) { /* size best-effort */ }
|
|
249
|
+
fileCount++;
|
|
250
|
+
}
|
|
251
|
+
// Symlinks, sockets, devices: deliberately skipped
|
|
252
|
+
}
|
|
253
|
+
return { fileCount: fileCount, byteCount: byteCount };
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* @primitive b.atomicFile.pathTimestamp
|
|
258
|
+
* @signature b.atomicFile.pathTimestamp(date)
|
|
259
|
+
* @since 0.7.0
|
|
260
|
+
* @status stable
|
|
261
|
+
* @related b.atomicFile.ensureDir, b.atomicFile.write
|
|
262
|
+
*
|
|
263
|
+
* Filesystem-safe ISO-8601 timestamp. Standard Date.toISOString()
|
|
264
|
+
* embeds ':' and '.' which Windows reserves for drive letters and
|
|
265
|
+
* extension separators; this helper substitutes both with '-' so the
|
|
266
|
+
* result is portable as a path segment. String sort still gives
|
|
267
|
+
* chronological order. Pass a Date to format a specific instant;
|
|
268
|
+
* omit it for `new Date()`.
|
|
269
|
+
*
|
|
270
|
+
* @example
|
|
271
|
+
* var stamp = b.atomicFile.pathTimestamp(new Date(0));
|
|
272
|
+
* // → "1970-01-01T00-00-00-000Z"
|
|
273
|
+
*
|
|
274
|
+
* var fixed = b.atomicFile.pathTimestamp(new Date(Date.UTC(2026, 0, 1)));
|
|
275
|
+
* // → "2026-01-01T00-00-00-000Z"
|
|
276
|
+
*/
|
|
277
|
+
function pathTimestamp(date) {
|
|
278
|
+
var d = (date instanceof Date) ? date : new Date();
|
|
279
|
+
return d.toISOString().replace(/[:.]/g, "-");
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Generic [A-Za-z0-9_-]+ identifier shape used by conflictPath tag /
|
|
283
|
+
// suffix validation. The pattern collides with similar shapes in
|
|
284
|
+
// safe-buffer / redact / etc.; keeping the regex literal local to
|
|
285
|
+
// atomic-file rather than pulling in a cross-module dependency for a
|
|
286
|
+
// 30-byte regex keeps this file's lazy-load chain short.
|
|
287
|
+
var IDENT_RE = /^[A-Za-z0-9_-]+$/; // allow:regex-no-length-cap — caller bounds length before .test() // allow:duplicate-regex — generic [A-Za-z0-9_-]+ identifier shape; extracting a one-line regex into a cross-module dependency would lengthen atomic-file's boot-time lazy chain for no behavioral win
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* @primitive b.atomicFile.conflictPath
|
|
291
|
+
* @signature b.atomicFile.conflictPath(originalPath, opts?)
|
|
292
|
+
* @since 0.10.8
|
|
293
|
+
* @status stable
|
|
294
|
+
* @related b.atomicFile.pathTimestamp, b.atomicFile.write
|
|
295
|
+
*
|
|
296
|
+
* Build a filesystem-portable conflict-suffix path next to
|
|
297
|
+
* `originalPath`, e.g. `notes.md` → `notes.conflict-2026-05-17T19-30-00Z.md`.
|
|
298
|
+
* Drop-in name for last-write-wins reconciliation in sync / backup /
|
|
299
|
+
* dual-control workflows. Preserves the original extension. Inserts a
|
|
300
|
+
* caller-supplied `tag` (default `conflict`) between the basename and
|
|
301
|
+
* the timestamp. The timestamp uses `pathTimestamp` so the result is
|
|
302
|
+
* portable across Windows (no `:` / `.`), macOS, and Linux. Same-second
|
|
303
|
+
* collision handling: pass `opts.suffix` (e.g. a per-row crypto-random
|
|
304
|
+
* hex) when multiple conflicts may land in the same second; otherwise
|
|
305
|
+
* the timestamp's millisecond field disambiguates.
|
|
306
|
+
*
|
|
307
|
+
* @opts
|
|
308
|
+
* tag: string, // default "conflict"; sandwiched between basename and timestamp
|
|
309
|
+
* timestamp: Date, // default `new Date()`
|
|
310
|
+
* suffix: string, // optional extra disambiguator appended after timestamp
|
|
311
|
+
*
|
|
312
|
+
* @example
|
|
313
|
+
* var p = b.atomicFile.conflictPath("/srv/notes.md");
|
|
314
|
+
* // → "/srv/notes.conflict-2026-05-17T20-30-00-123Z.md"
|
|
315
|
+
*
|
|
316
|
+
* var withSuffix = b.atomicFile.conflictPath("/srv/notes.md", {
|
|
317
|
+
* tag: "merge", suffix: "abc123",
|
|
318
|
+
* });
|
|
319
|
+
* // → "/srv/notes.merge-2026-05-17T20-30-00-123Z.abc123.md"
|
|
320
|
+
*/
|
|
321
|
+
function conflictPath(originalPath, opts) {
|
|
322
|
+
if (typeof originalPath !== "string" || originalPath.length === 0) {
|
|
323
|
+
throw new TypeError("b.atomicFile.conflictPath: originalPath must be a non-empty string");
|
|
324
|
+
}
|
|
325
|
+
opts = opts || {};
|
|
326
|
+
var tag = typeof opts.tag === "string" && opts.tag.length > 0 ? opts.tag : "conflict";
|
|
327
|
+
if (typeof tag !== "string" || tag.length === 0 || tag.length > 64) { // allow:raw-byte-literal — tag length cap, not bytes
|
|
328
|
+
throw new TypeError("b.atomicFile.conflictPath: tag must be a 1-64 char string");
|
|
329
|
+
}
|
|
330
|
+
if (!IDENT_RE.test(tag)) { // allow:regex-no-length-cap — length-bounded immediately above
|
|
331
|
+
throw new TypeError("b.atomicFile.conflictPath: tag must match [A-Za-z0-9_-]+");
|
|
332
|
+
}
|
|
333
|
+
var stamp = pathTimestamp(opts.timestamp);
|
|
334
|
+
var suffix = "";
|
|
335
|
+
if (opts.suffix !== undefined) {
|
|
336
|
+
if (typeof opts.suffix !== "string" || opts.suffix.length === 0 ||
|
|
337
|
+
opts.suffix.length > 64) { // allow:raw-byte-literal — suffix length cap, not bytes
|
|
338
|
+
throw new TypeError("b.atomicFile.conflictPath: suffix must be a 1-64 char string");
|
|
339
|
+
}
|
|
340
|
+
if (!IDENT_RE.test(opts.suffix)) { // allow:regex-no-length-cap — length-bounded immediately above
|
|
341
|
+
throw new TypeError("b.atomicFile.conflictPath: suffix must match [A-Za-z0-9_-]+");
|
|
342
|
+
}
|
|
343
|
+
suffix = "." + opts.suffix;
|
|
344
|
+
}
|
|
345
|
+
// Walk from the rightmost `.` to split base + ext. POSIX `path` module
|
|
346
|
+
// does it portably; using string ops here keeps the helper free of
|
|
347
|
+
// additional require()s in the hot atomic-file file (which is loaded
|
|
348
|
+
// before most of the framework's lazy chain). Extension preservation
|
|
349
|
+
// walks ONLY the basename — a directory containing a `.` doesn't
|
|
350
|
+
// confuse the suffix.
|
|
351
|
+
var sep = originalPath.lastIndexOf("/");
|
|
352
|
+
var bsep = originalPath.lastIndexOf("\\");
|
|
353
|
+
var lastSep = sep > bsep ? sep : bsep;
|
|
354
|
+
var dir = lastSep >= 0 ? originalPath.slice(0, lastSep + 1) : "";
|
|
355
|
+
var name = lastSep >= 0 ? originalPath.slice(lastSep + 1) : originalPath;
|
|
356
|
+
var dotIdx = name.lastIndexOf(".");
|
|
357
|
+
// Treat a leading dot (dotfile, e.g. `.env`) as part of the base, not
|
|
358
|
+
// as an extension separator. `dotIdx === 0` → no extension.
|
|
359
|
+
var base = dotIdx > 0 ? name.slice(0, dotIdx) : name;
|
|
360
|
+
var ext = dotIdx > 0 ? name.slice(dotIdx) : "";
|
|
361
|
+
return dir + base + "." + tag + "-" + stamp + suffix + ext;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* @primitive b.atomicFile.writeSync
|
|
366
|
+
* @signature b.atomicFile.writeSync(filepath, data, opts)
|
|
367
|
+
* @since 0.7.0
|
|
368
|
+
* @status stable
|
|
369
|
+
* @related b.atomicFile.write, b.atomicFile.cleanOrphans
|
|
370
|
+
*
|
|
371
|
+
* Synchronous atomic write — same temp + fsync + rename + dirfsync
|
|
372
|
+
* sequence as the async `write`, but without the retry loop (which
|
|
373
|
+
* requires awaits). Use from sync-only code paths: process exit
|
|
374
|
+
* handlers, module-load-time bootstraps, signal handlers. For
|
|
375
|
+
* everything else, prefer the async form. Either the rename
|
|
376
|
+
* completes (new contents fully visible) or the tmp file is removed —
|
|
377
|
+
* no half-written file ever appears at `filepath`.
|
|
378
|
+
*
|
|
379
|
+
* @opts
|
|
380
|
+
* fileMode: 0o600, // mode applied to the temp file (and thus the renamed final)
|
|
381
|
+
* computeHash: false, // when true, return SHA3-512 of the written bytes
|
|
382
|
+
*
|
|
383
|
+
* @example
|
|
384
|
+
* var result = b.atomicFile.writeSync(
|
|
385
|
+
* "/var/lib/blamejs/state.bin",
|
|
386
|
+
* Buffer.from("payload"),
|
|
387
|
+
* { fileMode: 0o600, computeHash: true }
|
|
388
|
+
* );
|
|
389
|
+
* // → { bytesWritten: 7, hash: "<sha3-512 hex>" }
|
|
390
|
+
*/
|
|
391
|
+
function writeSync(filepath, data, opts) {
|
|
392
|
+
opts = Object.assign({}, DEFAULTS, opts || {});
|
|
393
|
+
var buf = safeBuffer.toBuffer(data, {
|
|
394
|
+
errorClass: AtomicFileError,
|
|
395
|
+
typeCode: "atomic-file/invalid-data",
|
|
396
|
+
typeMessage: "data must be Buffer, Uint8Array, or string",
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
var dir = nodePath.dirname(filepath);
|
|
400
|
+
if (!nodeFs.existsSync(dir)) nodeFs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
401
|
+
|
|
402
|
+
var tmpPath = filepath + ".tmp-" + generateToken(C.BYTES.bytes(8));
|
|
403
|
+
var renamed = false;
|
|
404
|
+
try {
|
|
405
|
+
var fd = nodeFs.openSync(tmpPath, "w", opts.fileMode);
|
|
406
|
+
try {
|
|
407
|
+
var pos = 0;
|
|
408
|
+
while (pos < buf.length) {
|
|
409
|
+
pos += nodeFs.writeSync(fd, buf, pos, buf.length - pos, null);
|
|
410
|
+
}
|
|
411
|
+
_fsync(fd);
|
|
412
|
+
} finally {
|
|
413
|
+
try { nodeFs.closeSync(fd); } catch (_e) { /* already closed? */ }
|
|
414
|
+
}
|
|
415
|
+
nodeFs.renameSync(tmpPath, filepath);
|
|
416
|
+
renamed = true;
|
|
417
|
+
_fsyncDir(dir);
|
|
418
|
+
} finally {
|
|
419
|
+
if (!renamed) {
|
|
420
|
+
// Either the write or the rename failed — remove the tmp so the next
|
|
421
|
+
// boot doesn't see a leaked partial file.
|
|
422
|
+
try { nodeFs.unlinkSync(tmpPath); } catch (_e) { /* may not exist */ }
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
return {
|
|
427
|
+
bytesWritten: buf.length,
|
|
428
|
+
hash: opts.computeHash ? sha3Hash(buf) : null,
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* @primitive b.atomicFile.cleanOrphans
|
|
434
|
+
* @signature b.atomicFile.cleanOrphans(filepath, opts)
|
|
435
|
+
* @since 0.7.0
|
|
436
|
+
* @status stable
|
|
437
|
+
* @related b.atomicFile.write, b.atomicFile.writeSync
|
|
438
|
+
*
|
|
439
|
+
* Sweep orphan temp files left behind by a previously-crashed
|
|
440
|
+
* process. Atomic writes use random temp names (`<filepath>.tmp-<token>`),
|
|
441
|
+
* so a crashed run leaves a file with a name the next boot can't
|
|
442
|
+
* predict — only glob-by-prefix and prune by age. Operators should
|
|
443
|
+
* call this at boot for every "important" filepath (vault.key.sealed,
|
|
444
|
+
* audit-sign.key.sealed, db.enc, ...) BEFORE the first atomic write
|
|
445
|
+
* to that path. Returns the number of orphans removed.
|
|
446
|
+
*
|
|
447
|
+
* @opts
|
|
448
|
+
* olderThanMs: 300000, // only prune temp files older than this many ms (default 5 minutes)
|
|
449
|
+
*
|
|
450
|
+
* @example
|
|
451
|
+
* var removed = b.atomicFile.cleanOrphans(
|
|
452
|
+
* "/var/lib/blamejs/vault.key.sealed",
|
|
453
|
+
* { olderThanMs: 300000 }
|
|
454
|
+
* );
|
|
455
|
+
* // → 0 (no orphans found, or the count of files unlinked)
|
|
456
|
+
*/
|
|
457
|
+
function cleanOrphans(filepath, opts) {
|
|
458
|
+
opts = opts || {};
|
|
459
|
+
var olderThanMs = opts.olderThanMs != null ? opts.olderThanMs : C.TIME.minutes(5);
|
|
460
|
+
var dir = nodePath.dirname(filepath);
|
|
461
|
+
var basename = nodePath.basename(filepath);
|
|
462
|
+
var prefix = basename + ".tmp-";
|
|
463
|
+
var nowMs = Date.now();
|
|
464
|
+
var removed = 0;
|
|
465
|
+
var entries = listDir(dir, {
|
|
466
|
+
filter: function (name) { return name.startsWith(prefix); },
|
|
467
|
+
includeStat: true,
|
|
468
|
+
});
|
|
469
|
+
for (var i = 0; i < entries.length; i++) {
|
|
470
|
+
var entry = entries[i];
|
|
471
|
+
try {
|
|
472
|
+
if (nowMs - entry.mtimeMs >= olderThanMs) {
|
|
473
|
+
nodeFs.unlinkSync(entry.fullPath);
|
|
474
|
+
removed += 1;
|
|
475
|
+
}
|
|
476
|
+
} catch (_e) { /* concurrent cleanup or permission — best effort */ }
|
|
477
|
+
}
|
|
478
|
+
return removed;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* @primitive b.atomicFile.write
|
|
483
|
+
* @signature b.atomicFile.write(filepath, data, opts)
|
|
484
|
+
* @since 0.7.0
|
|
485
|
+
* @status stable
|
|
486
|
+
* @related b.atomicFile.writeSync, b.atomicFile.read, b.atomicFile.lock
|
|
487
|
+
*
|
|
488
|
+
* Crash-safe write-replace. Writes `data` to a sibling temp file,
|
|
489
|
+
* fsyncs the fd, atomically renames over `filepath`, then fsyncs the
|
|
490
|
+
* parent directory. On any failure path the temp is unlinked, so the
|
|
491
|
+
* destination is never seen as half-written. Transient FS errors
|
|
492
|
+
* (EBUSY / EAGAIN / ENFILE / EMFILE / EPERM) retry with exponential
|
|
493
|
+
* backoff. Returns `{ bytesWritten, hash }` where `hash` is null
|
|
494
|
+
* unless `computeHash: true`.
|
|
495
|
+
*
|
|
496
|
+
* @opts
|
|
497
|
+
* fileMode: 0o600, // mode applied to the renamed file
|
|
498
|
+
* computeHash: false, // SHA3-512 the written bytes; included in result
|
|
499
|
+
* retryAttempts: 5, // attempts before giving up on transient FS errors
|
|
500
|
+
* retryBaseMs: 50, // base backoff
|
|
501
|
+
* retryMaxMs: 2000, // backoff ceiling
|
|
502
|
+
* signal: AbortSignal | undefined, // abort the retry loop early
|
|
503
|
+
*
|
|
504
|
+
* @example
|
|
505
|
+
* async function persist() {
|
|
506
|
+
* var result = await b.atomicFile.write(
|
|
507
|
+
* "/var/lib/blamejs/state.bin",
|
|
508
|
+
* Buffer.from("payload"),
|
|
509
|
+
* { fileMode: 0o600, computeHash: true }
|
|
510
|
+
* );
|
|
511
|
+
* return result; // → { bytesWritten: 7, hash: "<sha3-512 hex>" }
|
|
512
|
+
* }
|
|
513
|
+
*/
|
|
514
|
+
async function write(filepath, data, opts) {
|
|
515
|
+
opts = Object.assign({}, DEFAULTS, opts || {});
|
|
516
|
+
var buf = safeBuffer.toBuffer(data, {
|
|
517
|
+
errorClass: AtomicFileError,
|
|
518
|
+
typeCode: "atomic-file/invalid-data",
|
|
519
|
+
typeMessage: "data must be Buffer, Uint8Array, or string",
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
return await _withRetry(function () {
|
|
523
|
+
return new Promise(function (resolve, reject) {
|
|
524
|
+
var dir = nodePath.dirname(filepath);
|
|
525
|
+
if (!nodeFs.existsSync(dir)) nodeFs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
526
|
+
var tmpPath = filepath + ".tmp-" + generateToken(C.BYTES.bytes(8));
|
|
527
|
+
var renamed = false;
|
|
528
|
+
try {
|
|
529
|
+
var fd = nodeFs.openSync(tmpPath, "w", opts.fileMode);
|
|
530
|
+
try {
|
|
531
|
+
var pos = 0;
|
|
532
|
+
while (pos < buf.length) {
|
|
533
|
+
pos += nodeFs.writeSync(fd, buf, pos, buf.length - pos, null);
|
|
534
|
+
}
|
|
535
|
+
_fsync(fd);
|
|
536
|
+
} finally {
|
|
537
|
+
try { nodeFs.closeSync(fd); } catch (_e) { /* already closed? */ }
|
|
538
|
+
}
|
|
539
|
+
// Atomic rename — POSIX rename is atomic on the same FS; on Windows,
|
|
540
|
+
// nodeFs.renameSync uses MoveFileEx with REPLACE_EXISTING.
|
|
541
|
+
nodeFs.renameSync(tmpPath, filepath);
|
|
542
|
+
renamed = true;
|
|
543
|
+
_fsyncDir(dir);
|
|
544
|
+
var hash = opts.computeHash ? sha3Hash(buf) : null;
|
|
545
|
+
resolve({ bytesWritten: buf.length, hash: hash });
|
|
546
|
+
} catch (e) {
|
|
547
|
+
reject(e);
|
|
548
|
+
} finally {
|
|
549
|
+
if (!renamed) {
|
|
550
|
+
try { nodeFs.unlinkSync(tmpPath); } catch (_e) { /* may not exist */ }
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
});
|
|
554
|
+
}, opts);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/**
|
|
558
|
+
* @primitive b.atomicFile.read
|
|
559
|
+
* @signature b.atomicFile.read(filepath, opts)
|
|
560
|
+
* @since 0.7.0
|
|
561
|
+
* @status stable
|
|
562
|
+
* @related b.atomicFile.readSync, b.atomicFile.write
|
|
563
|
+
*
|
|
564
|
+
* Read a file with size cap and optional integrity verification.
|
|
565
|
+
* `maxBytes` defaults to 64 MiB; values larger than the file's stat
|
|
566
|
+
* size throw `atomic-file/too-large` BEFORE the read happens (no
|
|
567
|
+
* memory-blow up on hostile inputs). When `expectedHash` is provided,
|
|
568
|
+
* the SHA3-512 of the bytes is compared and a mismatch throws
|
|
569
|
+
* `atomic-file/integrity`. Pass `encoding` to receive a decoded
|
|
570
|
+
* string instead of a Buffer. Retries on transient FS errors.
|
|
571
|
+
*
|
|
572
|
+
* @opts
|
|
573
|
+
* maxBytes: 67108864, // ceiling on file size; reject anything larger
|
|
574
|
+
* encoding: undefined, // when set (e.g. "utf8"), return a decoded string
|
|
575
|
+
* expectedHash: undefined, // SHA3-512 hex; when set, integrity-check the bytes
|
|
576
|
+
* retryAttempts: 5, // transient-error retry count
|
|
577
|
+
* retryBaseMs: 50,
|
|
578
|
+
* retryMaxMs: 2000,
|
|
579
|
+
* signal: AbortSignal | undefined,
|
|
580
|
+
*
|
|
581
|
+
* @example
|
|
582
|
+
* async function load() {
|
|
583
|
+
* var buf = await b.atomicFile.read(
|
|
584
|
+
* "/var/lib/blamejs/state.bin",
|
|
585
|
+
* { maxBytes: 1048576 }
|
|
586
|
+
* );
|
|
587
|
+
* return buf; // → <Buffer ...> (≤ 1 MiB)
|
|
588
|
+
* }
|
|
589
|
+
*
|
|
590
|
+
* // Integrity-checked read — pass the digest computed at write time:
|
|
591
|
+
* async function loadVerified(digestHex) {
|
|
592
|
+
* return await b.atomicFile.read(
|
|
593
|
+
* "/var/lib/blamejs/state.bin",
|
|
594
|
+
* { expectedHash: digestHex, encoding: "utf8" }
|
|
595
|
+
* );
|
|
596
|
+
* }
|
|
597
|
+
*/
|
|
598
|
+
async function read(filepath, opts) {
|
|
599
|
+
opts = Object.assign({}, DEFAULTS, opts || {});
|
|
600
|
+
return await _withRetry(function () {
|
|
601
|
+
return new Promise(function (resolve, reject) {
|
|
602
|
+
try { resolve(_readSyncCore(filepath, opts)); }
|
|
603
|
+
catch (e) { reject(e); }
|
|
604
|
+
});
|
|
605
|
+
}, opts);
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
/**
|
|
609
|
+
* @primitive b.atomicFile.readSync
|
|
610
|
+
* @signature b.atomicFile.readSync(filepath, opts)
|
|
611
|
+
* @since 0.7.0
|
|
612
|
+
* @status stable
|
|
613
|
+
* @related b.atomicFile.read, b.atomicFile.writeSync
|
|
614
|
+
*
|
|
615
|
+
* Synchronous variant for callers in module-init / boot paths that
|
|
616
|
+
* can't await — vault unsealing, audit-sign init, DB rollback check.
|
|
617
|
+
* Same semantics as the async `read`: size cap via `maxBytes`,
|
|
618
|
+
* optional `expectedHash` integrity check, ENOENT translated to an
|
|
619
|
+
* AtomicFileError with `code === "ENOENT"`. No retry loop — sync
|
|
620
|
+
* paths can't usefully back off.
|
|
621
|
+
*
|
|
622
|
+
* @opts
|
|
623
|
+
* maxBytes: 67108864,
|
|
624
|
+
* encoding: undefined,
|
|
625
|
+
* expectedHash: undefined,
|
|
626
|
+
*
|
|
627
|
+
* @example
|
|
628
|
+
* var buf = b.atomicFile.readSync(
|
|
629
|
+
* "/var/lib/blamejs/vault.key.sealed",
|
|
630
|
+
* { maxBytes: 65536 }
|
|
631
|
+
* );
|
|
632
|
+
* // → <Buffer ...> (≤ 64 KiB)
|
|
633
|
+
*/
|
|
634
|
+
function readSync(filepath, opts) {
|
|
635
|
+
opts = Object.assign({}, DEFAULTS, opts || {});
|
|
636
|
+
return _readSyncCore(filepath, opts);
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
// maxBytes via shared lib/numeric-bounds — Infinity / NaN bypass the
|
|
640
|
+
// stat.size cap (any-comparison-with-Infinity-or-NaN is false).
|
|
641
|
+
function _validateMaxBytes(maxBytes) {
|
|
642
|
+
if (!numericBounds.isPositiveFiniteInt(maxBytes)) {
|
|
643
|
+
throw new AtomicFileError(
|
|
644
|
+
"atomicFile.read: maxBytes must be a positive finite integer; got " +
|
|
645
|
+
numericBounds.shape(maxBytes),
|
|
646
|
+
"atomic-file/bad-opt");
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
function _readSyncCore(filepath, opts) {
|
|
651
|
+
_validateMaxBytes(opts.maxBytes);
|
|
652
|
+
// CodeQL js/file-system-race defense — TOCTOU-safe-read scaffold.
|
|
653
|
+
// Open the fd first, then fstat the same fd (so size + content
|
|
654
|
+
// measurement bind to the inode the fd holds open). An attacker
|
|
655
|
+
// can't swap the file between size-check and read because the fd
|
|
656
|
+
// is anchored to the original inode. ENOENT surfaces from open()
|
|
657
|
+
// rather than the previous existsSync() pre-check.
|
|
658
|
+
var fd;
|
|
659
|
+
try {
|
|
660
|
+
fd = nodeFs.openSync(filepath, "r");
|
|
661
|
+
} catch (openErr) {
|
|
662
|
+
if (openErr && openErr.code === "ENOENT") {
|
|
663
|
+
var e = new AtomicFileError("file not found: " + filepath, "atomic-file/not-found");
|
|
664
|
+
e.code = "ENOENT";
|
|
665
|
+
throw e;
|
|
666
|
+
}
|
|
667
|
+
throw openErr;
|
|
668
|
+
}
|
|
669
|
+
var buf;
|
|
670
|
+
try {
|
|
671
|
+
var fstat = nodeFs.fstatSync(fd);
|
|
672
|
+
if (fstat.size > opts.maxBytes) {
|
|
673
|
+
throw new AtomicFileError(
|
|
674
|
+
"file size " + fstat.size + " > maxBytes " + opts.maxBytes,
|
|
675
|
+
"atomic-file/too-large"
|
|
676
|
+
);
|
|
677
|
+
}
|
|
678
|
+
buf = Buffer.alloc(fstat.size);
|
|
679
|
+
var read = 0;
|
|
680
|
+
while (read < fstat.size) {
|
|
681
|
+
var n = nodeFs.readSync(fd, buf, read, fstat.size - read, null);
|
|
682
|
+
if (n === 0) break;
|
|
683
|
+
read += n;
|
|
684
|
+
}
|
|
685
|
+
if (read !== fstat.size) {
|
|
686
|
+
throw new AtomicFileError(
|
|
687
|
+
"short read: " + read + " of " + fstat.size + " bytes",
|
|
688
|
+
"atomic-file/short-read"
|
|
689
|
+
);
|
|
690
|
+
}
|
|
691
|
+
} finally {
|
|
692
|
+
try { nodeFs.closeSync(fd); } catch (_c) { /* close best-effort */ }
|
|
693
|
+
}
|
|
694
|
+
if (opts.expectedHash) {
|
|
695
|
+
var actual = sha3Hash(buf);
|
|
696
|
+
if (actual !== opts.expectedHash) {
|
|
697
|
+
throw new AtomicFileError(
|
|
698
|
+
"integrity check failed: expected " + opts.expectedHash + " got " + actual,
|
|
699
|
+
"atomic-file/integrity"
|
|
700
|
+
);
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
return opts.encoding ? buf.toString(opts.encoding) : buf;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
/**
|
|
707
|
+
* @primitive b.atomicFile.writeJson
|
|
708
|
+
* @signature b.atomicFile.writeJson(filepath, value, opts)
|
|
709
|
+
* @since 0.7.0
|
|
710
|
+
* @status stable
|
|
711
|
+
* @related b.atomicFile.readJson, b.atomicFile.write
|
|
712
|
+
*
|
|
713
|
+
* Atomic JSON write. Serializes via `b.safeJson` (RFC 8785 canonical
|
|
714
|
+
* form when `canonical: true`, otherwise standard stringify with
|
|
715
|
+
* configurable indent) and routes through `b.atomicFile.write` for
|
|
716
|
+
* the same crash-safe semantics. Returns the same shape as `write`.
|
|
717
|
+
*
|
|
718
|
+
* @opts
|
|
719
|
+
* canonical: false, // when true, emit RFC 8785 JCS canonical bytes (suitable for signing)
|
|
720
|
+
* indent: 0, // pretty-print indent for the non-canonical path
|
|
721
|
+
* fileMode: 0o600,
|
|
722
|
+
* computeHash: false,
|
|
723
|
+
* retryAttempts: 5,
|
|
724
|
+
* retryBaseMs: 50,
|
|
725
|
+
* retryMaxMs: 2000,
|
|
726
|
+
*
|
|
727
|
+
* @example
|
|
728
|
+
* async function persist() {
|
|
729
|
+
* var result = await b.atomicFile.writeJson(
|
|
730
|
+
* "/var/lib/blamejs/manifest.json",
|
|
731
|
+
* { schema: 1, items: [] },
|
|
732
|
+
* { canonical: true, computeHash: true }
|
|
733
|
+
* );
|
|
734
|
+
* return result; // → { bytesWritten: 24, hash: "<sha3-512 hex>" }
|
|
735
|
+
* }
|
|
736
|
+
*/
|
|
737
|
+
async function writeJson(filepath, value, opts) {
|
|
738
|
+
opts = opts || {};
|
|
739
|
+
var serialized = opts.canonical
|
|
740
|
+
? safeJson.canonical(value)
|
|
741
|
+
: safeJson.stringify(value, { indent: opts.indent || 0 });
|
|
742
|
+
return await write(filepath, serialized, opts);
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
/**
|
|
746
|
+
* @primitive b.atomicFile.readJson
|
|
747
|
+
* @signature b.atomicFile.readJson(filepath, opts)
|
|
748
|
+
* @since 0.7.0
|
|
749
|
+
* @status stable
|
|
750
|
+
* @related b.atomicFile.writeJson, b.atomicFile.read
|
|
751
|
+
*
|
|
752
|
+
* Atomic JSON read. Routes through `b.atomicFile.read` (size cap +
|
|
753
|
+
* optional integrity hash) then parses via `b.safeJson.parse`, which
|
|
754
|
+
* applies the framework's prototype-pollution / __proto__-key
|
|
755
|
+
* defenses. Throws `atomic-file/too-large`, `atomic-file/integrity`,
|
|
756
|
+
* or a JSON parse error from safeJson — never returns a partial
|
|
757
|
+
* object.
|
|
758
|
+
*
|
|
759
|
+
* @opts
|
|
760
|
+
* maxBytes: 67108864,
|
|
761
|
+
* expectedHash: undefined,
|
|
762
|
+
*
|
|
763
|
+
* @example
|
|
764
|
+
* async function load() {
|
|
765
|
+
* var doc = await b.atomicFile.readJson(
|
|
766
|
+
* "/var/lib/blamejs/manifest.json",
|
|
767
|
+
* { maxBytes: 1048576 }
|
|
768
|
+
* );
|
|
769
|
+
* return doc; // → { schema: 1, items: [] }
|
|
770
|
+
* }
|
|
771
|
+
*/
|
|
772
|
+
async function readJson(filepath, opts) {
|
|
773
|
+
opts = opts || {};
|
|
774
|
+
var buf = await read(filepath, opts);
|
|
775
|
+
var input = Buffer.isBuffer(buf) ? buf : Buffer.from(buf, "utf8");
|
|
776
|
+
return safeJson.parse(input, opts);
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
/**
|
|
780
|
+
* @primitive b.atomicFile.copy
|
|
781
|
+
* @signature b.atomicFile.copy(src, dst, opts)
|
|
782
|
+
* @since 0.7.0
|
|
783
|
+
* @status stable
|
|
784
|
+
* @related b.atomicFile.copyDirRecursive, b.atomicFile.write
|
|
785
|
+
*
|
|
786
|
+
* Atomic file copy. Reads the source via `b.atomicFile.read` (so
|
|
787
|
+
* `maxBytes` and retry semantics apply), then writes the bytes
|
|
788
|
+
* through `b.atomicFile.write` (temp + fsync + rename). When
|
|
789
|
+
* `expectedHash` is set, the digest is checked against the WRITTEN
|
|
790
|
+
* bytes at `dst` — the source is not gated on it. Returns
|
|
791
|
+
* `{ bytesWritten, hash }`.
|
|
792
|
+
*
|
|
793
|
+
* @opts
|
|
794
|
+
* maxBytes: 67108864,
|
|
795
|
+
* fileMode: 0o600,
|
|
796
|
+
* computeHash: false,
|
|
797
|
+
* expectedHash: undefined,
|
|
798
|
+
* retryAttempts: 5,
|
|
799
|
+
*
|
|
800
|
+
* @example
|
|
801
|
+
* async function snapshot() {
|
|
802
|
+
* var result = await b.atomicFile.copy(
|
|
803
|
+
* "/var/lib/blamejs/state.bin",
|
|
804
|
+
* "/var/lib/blamejs/state.bin.bak",
|
|
805
|
+
* { computeHash: true }
|
|
806
|
+
* );
|
|
807
|
+
* return result; // → { bytesWritten: 4096, hash: "<sha3-512 hex>" }
|
|
808
|
+
* }
|
|
809
|
+
*/
|
|
810
|
+
async function copy(src, dst, opts) {
|
|
811
|
+
opts = Object.assign({}, DEFAULTS, opts || {});
|
|
812
|
+
var srcOpts = Object.assign({}, opts);
|
|
813
|
+
delete srcOpts.expectedHash; // hash check applies to dst, not src
|
|
814
|
+
var buf = await read(src, srcOpts);
|
|
815
|
+
if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf, "utf8");
|
|
816
|
+
return await write(dst, buf, opts);
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
/**
|
|
820
|
+
* @primitive b.atomicFile.exists
|
|
821
|
+
* @signature b.atomicFile.exists(filepath)
|
|
822
|
+
* @since 0.7.0
|
|
823
|
+
* @status stable
|
|
824
|
+
* @related b.atomicFile.read, b.atomicFile.readSync
|
|
825
|
+
*
|
|
826
|
+
* Synchronous existence check. Thin wrapper over `fs.existsSync` that
|
|
827
|
+
* normalises the answer for callers that already require this module
|
|
828
|
+
* — saves an additional `require("fs")` in modules that otherwise
|
|
829
|
+
* only need atomicFile.
|
|
830
|
+
*
|
|
831
|
+
* @example
|
|
832
|
+
* if (b.atomicFile.exists("/var/lib/blamejs/state.bin")) {
|
|
833
|
+
* // → safe to read
|
|
834
|
+
* }
|
|
835
|
+
*/
|
|
836
|
+
function exists(filepath) {
|
|
837
|
+
return nodeFs.existsSync(filepath);
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
/**
|
|
841
|
+
* @primitive b.atomicFile.lock
|
|
842
|
+
* @signature b.atomicFile.lock(filepath, fn, opts)
|
|
843
|
+
* @since 0.7.0
|
|
844
|
+
* @status stable
|
|
845
|
+
* @related b.atomicFile.write, b.atomicFile.read
|
|
846
|
+
*
|
|
847
|
+
* Cross-process file mutex around a read-modify-write sequence.
|
|
848
|
+
* Acquires `<filepath>.lock` via `O_CREAT | O_EXCL` (the POSIX atomic
|
|
849
|
+
* "create-or-fail" primitive — Node's "wx" flag), writes
|
|
850
|
+
* `{ pid, acquiredAt }` into the lock for diagnostics, runs `fn()`,
|
|
851
|
+
* then unlinks the lock in a `finally` so a thrown handler still
|
|
852
|
+
* releases. Stale-lock detection: lock files older than 5 minutes
|
|
853
|
+
* are assumed crashed-holder and reclaimed. Returns whatever `fn`
|
|
854
|
+
* returns (or rejects with whatever it throws). Throws
|
|
855
|
+
* `atomic-file/lock-timeout` if the lock can't be acquired before
|
|
856
|
+
* `lockTimeoutMs`.
|
|
857
|
+
*
|
|
858
|
+
* @opts
|
|
859
|
+
* lockTimeoutMs: 30000, // total time to wait before timing out
|
|
860
|
+
* lockPollMs: 50, // sleep between lock acquisition attempts
|
|
861
|
+
* fileMode: 0o600, // mode applied to the lock file
|
|
862
|
+
* signal: AbortSignal | undefined, // abort the wait early
|
|
863
|
+
*
|
|
864
|
+
* @example
|
|
865
|
+
* async function bumpCounter() {
|
|
866
|
+
* return await b.atomicFile.lock(
|
|
867
|
+
* "/var/lib/blamejs/counter.txt",
|
|
868
|
+
* async function () {
|
|
869
|
+
* var buf = await b.atomicFile.read("/var/lib/blamejs/counter.txt", { encoding: "utf8" });
|
|
870
|
+
* var next = (parseInt(buf, 10) || 0) + 1;
|
|
871
|
+
* await b.atomicFile.write("/var/lib/blamejs/counter.txt", String(next));
|
|
872
|
+
* return next;
|
|
873
|
+
* },
|
|
874
|
+
* { lockTimeoutMs: 5000 }
|
|
875
|
+
* );
|
|
876
|
+
* }
|
|
877
|
+
*/
|
|
878
|
+
async function lock(filepath, fn, opts) {
|
|
879
|
+
opts = Object.assign({}, DEFAULTS, opts || {});
|
|
880
|
+
var lockPath = filepath + ".lock";
|
|
881
|
+
var deadline = Date.now() + opts.lockTimeoutMs;
|
|
882
|
+
var fd = null;
|
|
883
|
+
|
|
884
|
+
while (Date.now() < deadline) {
|
|
885
|
+
try {
|
|
886
|
+
// O_CREAT | O_EXCL — fails if file exists
|
|
887
|
+
fd = nodeFs.openSync(lockPath, "wx", opts.fileMode);
|
|
888
|
+
break;
|
|
889
|
+
} catch (e) {
|
|
890
|
+
if (e.code !== "EEXIST") throw e;
|
|
891
|
+
// Stale lock detection: if the .lock file is older than 5 minutes,
|
|
892
|
+
// assume the holding process crashed and remove it.
|
|
893
|
+
try {
|
|
894
|
+
var stat = nodeFs.statSync(lockPath);
|
|
895
|
+
if (Date.now() - stat.mtimeMs > C.TIME.minutes(5)) {
|
|
896
|
+
try { nodeFs.unlinkSync(lockPath); }
|
|
897
|
+
catch (uerr) { log.debug("stale-lock unlink failed", { path: lockPath, error: uerr.message }); }
|
|
898
|
+
continue;
|
|
899
|
+
}
|
|
900
|
+
} catch (_e) { /* stat raced with another process — keep waiting */ }
|
|
901
|
+
await safeAsync.sleep(opts.lockPollMs, { signal: opts.signal });
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
if (fd === null) {
|
|
905
|
+
throw new AtomicFileError(
|
|
906
|
+
"lock timeout after " + opts.lockTimeoutMs + "ms on " + filepath,
|
|
907
|
+
"atomic-file/lock-timeout"
|
|
908
|
+
);
|
|
909
|
+
}
|
|
910
|
+
try {
|
|
911
|
+
nodeFs.writeSync(fd, Buffer.from(JSON.stringify({
|
|
912
|
+
pid: process.pid,
|
|
913
|
+
acquiredAt: Date.now(),
|
|
914
|
+
}), "utf8"));
|
|
915
|
+
_fsync(fd);
|
|
916
|
+
} catch (_e) { /* lock content best-effort */ }
|
|
917
|
+
|
|
918
|
+
try {
|
|
919
|
+
return await fn();
|
|
920
|
+
} finally {
|
|
921
|
+
try { nodeFs.closeSync(fd); }
|
|
922
|
+
catch (cerr) { log.debug("lock fd close failed", { error: cerr.message }); }
|
|
923
|
+
try { nodeFs.unlinkSync(lockPath); }
|
|
924
|
+
catch (uerr) { log.debug("lock release unlink failed", { path: lockPath, error: uerr.message }); }
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
/**
|
|
929
|
+
* @primitive b.atomicFile.listDir
|
|
930
|
+
* @signature b.atomicFile.listDir(dir, opts)
|
|
931
|
+
* @since 0.7.0
|
|
932
|
+
* @status stable
|
|
933
|
+
* @related b.atomicFile.cleanOrphans, b.atomicFile.copyDirRecursive
|
|
934
|
+
*
|
|
935
|
+
* Single-directory listing with optional stat enrichment, name-only
|
|
936
|
+
* filter, and missing-dir tolerance. Returns an array of
|
|
937
|
+
* `{ name, fullPath }` objects (plus `mtimeMs`, `sizeBytes`,
|
|
938
|
+
* `isDirectory`, `isFile` when `includeStat: true`). Entries that
|
|
939
|
+
* vanish between readdir and stat — concurrent cleanup by another
|
|
940
|
+
* process — are silently dropped. For recursive walks, callers
|
|
941
|
+
* compose per subdirectory so per-iteration limits, filters, and
|
|
942
|
+
* stop conditions stay explicit.
|
|
943
|
+
*
|
|
944
|
+
* @opts
|
|
945
|
+
* filter: function (name) { return true; }, // name-only predicate; falsey skips entry
|
|
946
|
+
* includeStat: false, // when true, statSync each entry; one extra syscall per entry
|
|
947
|
+
* missingOk: true, // when true (default), ENOENT returns []; when false, ENOENT throws
|
|
948
|
+
*
|
|
949
|
+
* @example
|
|
950
|
+
* var entries = b.atomicFile.listDir(
|
|
951
|
+
* "/var/lib/blamejs/audit",
|
|
952
|
+
* {
|
|
953
|
+
* filter: function (n) { return n.endsWith(".log"); },
|
|
954
|
+
* includeStat: true,
|
|
955
|
+
* }
|
|
956
|
+
* );
|
|
957
|
+
* // → [{ name: "audit-1.log", fullPath: "/var/lib/blamejs/audit/audit-1.log",
|
|
958
|
+
* // mtimeMs: 1700000000000, sizeBytes: 2048, isDirectory: false, isFile: true }, ...]
|
|
959
|
+
*/
|
|
960
|
+
function listDir(dir, opts) {
|
|
961
|
+
opts = opts || {};
|
|
962
|
+
var missingOk = opts.missingOk !== false;
|
|
963
|
+
var includeStat = opts.includeStat === true;
|
|
964
|
+
var filter = typeof opts.filter === "function" ? opts.filter : null;
|
|
965
|
+
|
|
966
|
+
var entries;
|
|
967
|
+
try {
|
|
968
|
+
entries = nodeFs.readdirSync(dir);
|
|
969
|
+
} catch (e) {
|
|
970
|
+
if (missingOk && e.code === "ENOENT") return [];
|
|
971
|
+
throw new AtomicFileError(
|
|
972
|
+
"failed to list directory " + dir + ": " + e.message,
|
|
973
|
+
"atomic-file/list-failed"
|
|
974
|
+
);
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
var out = [];
|
|
978
|
+
for (var i = 0; i < entries.length; i++) {
|
|
979
|
+
var name = entries[i];
|
|
980
|
+
if (filter && !filter(name)) continue;
|
|
981
|
+
var fullPath = nodePath.join(dir, name);
|
|
982
|
+
var entry = { name: name, fullPath: fullPath };
|
|
983
|
+
if (includeStat) {
|
|
984
|
+
try {
|
|
985
|
+
var stat = nodeFs.statSync(fullPath);
|
|
986
|
+
entry.mtimeMs = stat.mtimeMs;
|
|
987
|
+
entry.sizeBytes = stat.size;
|
|
988
|
+
entry.isDirectory = stat.isDirectory();
|
|
989
|
+
entry.isFile = stat.isFile();
|
|
990
|
+
} catch (_e) {
|
|
991
|
+
// Entry vanished between readdir and stat — concurrent cleanup
|
|
992
|
+
// by another process. Skip silently; caller asked for stat
|
|
993
|
+
// info that no longer exists.
|
|
994
|
+
continue;
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
out.push(entry);
|
|
998
|
+
}
|
|
999
|
+
return out;
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
module.exports = {
|
|
1003
|
+
write: write,
|
|
1004
|
+
writeSync: writeSync,
|
|
1005
|
+
read: read,
|
|
1006
|
+
readSync: readSync,
|
|
1007
|
+
writeJson: writeJson,
|
|
1008
|
+
readJson: readJson,
|
|
1009
|
+
copy: copy,
|
|
1010
|
+
exists: exists,
|
|
1011
|
+
lock: lock,
|
|
1012
|
+
listDir: listDir,
|
|
1013
|
+
cleanOrphans: cleanOrphans,
|
|
1014
|
+
// Filesystem hygiene helpers (lifted from inline duplicates across lib/)
|
|
1015
|
+
fsync: fsync,
|
|
1016
|
+
fsyncDir: fsyncDir,
|
|
1017
|
+
ensureDir: ensureDir,
|
|
1018
|
+
copyDirRecursive: copyDirRecursive,
|
|
1019
|
+
pathTimestamp: pathTimestamp,
|
|
1020
|
+
conflictPath: conflictPath,
|
|
1021
|
+
AtomicFileError: AtomicFileError,
|
|
1022
|
+
DEFAULTS: DEFAULTS,
|
|
1023
|
+
};
|