@blamejs/blamejs-shop 0.5.12 → 0.5.13
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 +2 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/vendor/MANIFEST.json +632 -416
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
- package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
- package/lib/vendor/blamejs/.gitignore +2 -0
- package/lib/vendor/blamejs/CHANGELOG.md +122 -0
- package/lib/vendor/blamejs/NOTICE +26 -1
- package/lib/vendor/blamejs/SECURITY.md +1 -1
- package/lib/vendor/blamejs/api-snapshot.json +207 -5
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
- package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
- package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
- package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
- package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
- package/lib/vendor/blamejs/index.js +6 -0
- package/lib/vendor/blamejs/lib/a2a.js +4 -4
- package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
- package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
- package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
- package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
- package/lib/vendor/blamejs/lib/archive-read.js +8 -0
- package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
- package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
- package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
- package/lib/vendor/blamejs/lib/audit.js +71 -8
- package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
- package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
- package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
- package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
- package/lib/vendor/blamejs/lib/backup/index.js +16 -5
- package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
- package/lib/vendor/blamejs/lib/base32.js +21 -0
- package/lib/vendor/blamejs/lib/break-glass.js +19 -10
- package/lib/vendor/blamejs/lib/bundler.js +5 -1
- package/lib/vendor/blamejs/lib/cache-status.js +3 -7
- package/lib/vendor/blamejs/lib/calendar.js +21 -1
- package/lib/vendor/blamejs/lib/cbor.js +12 -1
- package/lib/vendor/blamejs/lib/cert.js +29 -11
- package/lib/vendor/blamejs/lib/cli.js +94 -24
- package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
- package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
- package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
- package/lib/vendor/blamejs/lib/content-digest.js +2 -1
- package/lib/vendor/blamejs/lib/cookies.js +13 -3
- package/lib/vendor/blamejs/lib/cose.js +31 -16
- package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
- package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
- package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
- package/lib/vendor/blamejs/lib/crypto.js +314 -19
- package/lib/vendor/blamejs/lib/csp.js +11 -3
- package/lib/vendor/blamejs/lib/daemon.js +270 -24
- package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
- package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
- package/lib/vendor/blamejs/lib/db-query.js +34 -7
- package/lib/vendor/blamejs/lib/db.js +18 -6
- package/lib/vendor/blamejs/lib/dbsc.js +17 -0
- package/lib/vendor/blamejs/lib/dev.js +21 -2
- package/lib/vendor/blamejs/lib/dsr.js +157 -102
- package/lib/vendor/blamejs/lib/external-db.js +41 -2
- package/lib/vendor/blamejs/lib/file-upload.js +25 -7
- package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
- package/lib/vendor/blamejs/lib/forms.js +113 -27
- package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
- package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
- package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
- package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
- package/lib/vendor/blamejs/lib/guard-html.js +26 -53
- package/lib/vendor/blamejs/lib/guard-image.js +24 -5
- package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
- package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
- package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
- package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
- package/lib/vendor/blamejs/lib/guard-time.js +1 -1
- package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
- package/lib/vendor/blamejs/lib/html-balance.js +3 -3
- package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
- package/lib/vendor/blamejs/lib/http-client.js +39 -7
- package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
- package/lib/vendor/blamejs/lib/i18n.js +35 -21
- package/lib/vendor/blamejs/lib/incident-report.js +8 -1
- package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
- package/lib/vendor/blamejs/lib/json-path.js +23 -1
- package/lib/vendor/blamejs/lib/jwk.js +20 -3
- package/lib/vendor/blamejs/lib/link-header.js +2 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream.js +8 -3
- package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
- package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
- package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
- package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
- package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
- package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
- package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
- package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
- package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
- package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
- package/lib/vendor/blamejs/lib/mail.js +15 -5
- package/lib/vendor/blamejs/lib/metrics.js +268 -63
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
- package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
- package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
- package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
- package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
- package/lib/vendor/blamejs/lib/network-dns.js +21 -2
- package/lib/vendor/blamejs/lib/network-tls.js +69 -7
- package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
- package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
- package/lib/vendor/blamejs/lib/outbox.js +1 -1
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
- package/lib/vendor/blamejs/lib/permissions.js +6 -3
- package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
- package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
- package/lib/vendor/blamejs/lib/pubsub.js +20 -9
- package/lib/vendor/blamejs/lib/queue-local.js +8 -1
- package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
- package/lib/vendor/blamejs/lib/redact.js +54 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
- package/lib/vendor/blamejs/lib/restore.js +19 -0
- package/lib/vendor/blamejs/lib/retention.js +12 -4
- package/lib/vendor/blamejs/lib/router.js +60 -6
- package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
- package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
- package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
- package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
- package/lib/vendor/blamejs/lib/safe-object.js +80 -0
- package/lib/vendor/blamejs/lib/safe-path.js +52 -4
- package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
- package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
- package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
- package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
- package/lib/vendor/blamejs/lib/scheduler.js +8 -1
- package/lib/vendor/blamejs/lib/security-assert.js +6 -6
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
- package/lib/vendor/blamejs/lib/self-update.js +517 -87
- package/lib/vendor/blamejs/lib/server-timing.js +2 -4
- package/lib/vendor/blamejs/lib/session.js +34 -12
- package/lib/vendor/blamejs/lib/sql.js +15 -1
- package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
- package/lib/vendor/blamejs/lib/static.js +55 -13
- package/lib/vendor/blamejs/lib/storage.js +8 -2
- package/lib/vendor/blamejs/lib/subject.js +6 -1
- package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
- package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
- package/lib/vendor/blamejs/lib/tsa.js +34 -13
- package/lib/vendor/blamejs/lib/uri-template.js +8 -1
- package/lib/vendor/blamejs/lib/vault/index.js +13 -0
- package/lib/vendor/blamejs/lib/vc.js +44 -5
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
- package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
- package/lib/vendor/blamejs/lib/watcher.js +89 -17
- package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
- package/lib/vendor/blamejs/lib/webhook.js +12 -2
- package/lib/vendor/blamejs/lib/ws-client.js +32 -1
- package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
- package/lib/vendor/blamejs/package-lock.json +2 -2
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
- package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
- package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
- package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
- package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
- package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
- package/lib/vendor/blamejs/socket.yml +94 -0
- package/lib/vendor/blamejs/test/00-primitives.js +605 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
- package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
- package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
- package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
- package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
- package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
- package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
- 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 +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
- package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
- package/lib/vendor/blamejs/test/smoke.js +2 -0
- package/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
- package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
- package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
- package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
- package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
- package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
|
@@ -1,592 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
// Copyright (c) blamejs contributors
|
|
3
|
-
"use strict";
|
|
4
|
-
/**
|
|
5
|
-
* b.router — coverage for the registration, dispatch, introspection, and
|
|
6
|
-
* static-file surfaces not exercised by the focused router test files
|
|
7
|
-
* (router-use-path-scope / router-cross-origin-redirect / router-body-
|
|
8
|
-
* validation / router-tls0rtt).
|
|
9
|
-
*
|
|
10
|
-
* Drives the public API only — b.router.create(...), the route-registration
|
|
11
|
-
* verbs, r.handle(req, res) with in-memory request/response fakes, and a
|
|
12
|
-
* real in-process listen(0) server for the response-helper wiring
|
|
13
|
-
* (res.json / res.status / res.redirect / errorHandler / 0-RTT gate) that
|
|
14
|
-
* is only attached inside listen(). No external network / DB backend.
|
|
15
|
-
*
|
|
16
|
-
* Validates:
|
|
17
|
-
* - compilePattern registration-time refusals (empty / non-string /
|
|
18
|
-
* over-length pattern, empty parameter name)
|
|
19
|
-
* - _registerRoute CVE-2026-4923 asterisk-flood refusal
|
|
20
|
-
* - route-spec validation (unknown key, non-schema body/query/params/
|
|
21
|
-
* response, malformed tags)
|
|
22
|
-
* - dispatch: method-mismatch → 404, default vs custom notFound, param
|
|
23
|
-
* capture + req.routePattern, trailing-slash no-match, multi-handler
|
|
24
|
-
* fall-through, middleware next() semantics, req.query population,
|
|
25
|
-
* the HashDoS query-key cap
|
|
26
|
-
* - schema validator query/params paths + response-validation throw mode
|
|
27
|
-
* - inspectRoutes / openapi / getReservedSlugs introspection
|
|
28
|
-
* - ws() registration validation + activeWebSockets / closeWebSockets
|
|
29
|
-
* - serveStatic next() bypass branches + a real served file
|
|
30
|
-
* - listen() response helpers end-to-end on a live localhost server
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
var http = require("node:http");
|
|
34
|
-
var fs = require("node:fs");
|
|
35
|
-
var os = require("node:os");
|
|
36
|
-
var nodePath = require("node:path");
|
|
37
|
-
|
|
38
|
-
var helpers = require("../helpers");
|
|
39
|
-
var b = helpers.b;
|
|
40
|
-
var check = helpers.check;
|
|
41
|
-
var s = b.safeSchema;
|
|
42
|
-
|
|
43
|
-
function _req(method, url, headers) {
|
|
44
|
-
return { method: method, url: url, headers: Object.assign({ host: "localhost" }, headers || {}) };
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function _res() {
|
|
48
|
-
var res = {
|
|
49
|
-
statusCode: 0,
|
|
50
|
-
headersSent: false,
|
|
51
|
-
writableEnded: false,
|
|
52
|
-
_body: "",
|
|
53
|
-
_headers: null,
|
|
54
|
-
writeHead: function (status, headers) {
|
|
55
|
-
res.statusCode = status;
|
|
56
|
-
res._headers = headers || {};
|
|
57
|
-
res.headersSent = true;
|
|
58
|
-
},
|
|
59
|
-
end: function (chunk) {
|
|
60
|
-
if (chunk !== undefined) res._body += chunk;
|
|
61
|
-
res.writableEnded = true;
|
|
62
|
-
},
|
|
63
|
-
};
|
|
64
|
-
return res;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function _throwMsg(fn) {
|
|
68
|
-
try { fn(); return null; }
|
|
69
|
-
catch (e) { return (e && e.message) || "threw"; }
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// ---- compilePattern registration-time refusals ----
|
|
73
|
-
|
|
74
|
-
function testPatternValidation() {
|
|
75
|
-
check("get('') refuses empty pattern",
|
|
76
|
-
/non-empty string/.test(_throwMsg(function () { b.router.create().get("", function () {}); })));
|
|
77
|
-
check("get(123) refuses non-string pattern",
|
|
78
|
-
/non-empty string/.test(_throwMsg(function () { b.router.create().get(123, function () {}); })));
|
|
79
|
-
var long = "/" + "a".repeat(1030);
|
|
80
|
-
check("get(<1031-char pattern>) refuses over-length pattern",
|
|
81
|
-
/exceeds 1024 chars/.test(_throwMsg(function () { b.router.create().get(long, function () {}); })));
|
|
82
|
-
check("get('/users/:') refuses empty parameter name",
|
|
83
|
-
/empty parameter name/.test(_throwMsg(function () { b.router.create().get("/users/:", function () {}); })));
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function testAsteriskFloodRefused() {
|
|
87
|
-
check("get('/a/****/b') refused (CVE-2026-4923, 4 asterisks)",
|
|
88
|
-
/CVE-2026-4923/.test(_throwMsg(function () { b.router.create().get("/a/****/b", function () {}); })));
|
|
89
|
-
check("get('/a/***/b') allowed (3 asterisks under the cap)",
|
|
90
|
-
_throwMsg(function () { b.router.create().get("/a/***/b", function () {}); }) === null);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function testRouteSpecValidation() {
|
|
94
|
-
check("spec with unknown key refused",
|
|
95
|
-
/unknown spec key 'bogus'/.test(_throwMsg(function () {
|
|
96
|
-
b.router.create().get("/x", { bogus: 1 }, function () {});
|
|
97
|
-
})));
|
|
98
|
-
check("spec.body not a schema refused",
|
|
99
|
-
/spec\.body must be a b\.safeSchema/.test(_throwMsg(function () {
|
|
100
|
-
b.router.create().get("/x", { body: {} }, function () {});
|
|
101
|
-
})));
|
|
102
|
-
check("spec.query not a schema refused",
|
|
103
|
-
/spec\.query must be a b\.safeSchema/.test(_throwMsg(function () {
|
|
104
|
-
b.router.create().get("/x", { query: { safeParse: 1 } }, function () {});
|
|
105
|
-
})));
|
|
106
|
-
check("spec.response not a schema refused",
|
|
107
|
-
/spec\.response must be a b\.safeSchema/.test(_throwMsg(function () {
|
|
108
|
-
b.router.create().get("/x", { response: 5 }, function () {});
|
|
109
|
-
})));
|
|
110
|
-
check("spec.tags not an array refused",
|
|
111
|
-
/spec\.tags must be an array of strings/.test(_throwMsg(function () {
|
|
112
|
-
b.router.create().get("/x", { tags: "nope" }, function () {});
|
|
113
|
-
})));
|
|
114
|
-
check("spec.tags with non-string entries refused",
|
|
115
|
-
/spec\.tags must be an array of strings/.test(_throwMsg(function () {
|
|
116
|
-
b.router.create().get("/x", { tags: [1, 2] }, function () {});
|
|
117
|
-
})));
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// ---- dispatch ----
|
|
121
|
-
|
|
122
|
-
async function testMethodMismatchFallsToNotFound() {
|
|
123
|
-
var r = b.router.create();
|
|
124
|
-
var ran = false;
|
|
125
|
-
r.get("/x", function (req, res) { ran = true; res.writeHead(200); res.end("get"); });
|
|
126
|
-
var res = _res();
|
|
127
|
-
await r.handle(_req("POST", "/x"), res);
|
|
128
|
-
check("POST to a GET-only path → 404 (method not matched, no 405)",
|
|
129
|
-
res.statusCode === 404 && ran === false);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
async function testDefaultNotFoundBody() {
|
|
133
|
-
var r = b.router.create();
|
|
134
|
-
var res = _res();
|
|
135
|
-
await r.handle(_req("GET", "/nope"), res);
|
|
136
|
-
check("default notFound → 404 with the framework HTML body",
|
|
137
|
-
res.statusCode === 404 && res._body === "<h1>404 Not Found</h1>");
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
async function testCustomNotFound() {
|
|
141
|
-
var r = b.router.create();
|
|
142
|
-
var sawReq = false;
|
|
143
|
-
r.onNotFound(function (req, res) { sawReq = !!req; res.writeHead(404); res.end("custom-nf"); });
|
|
144
|
-
var res = _res();
|
|
145
|
-
await r.handle(_req("GET", "/nope"), res);
|
|
146
|
-
check("onNotFound handler runs on no-match",
|
|
147
|
-
res.statusCode === 404 && res._body === "custom-nf" && sawReq === true);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
async function testParamCaptureAndRoutePattern() {
|
|
151
|
-
var r = b.router.create();
|
|
152
|
-
var seen = null, pattern = null;
|
|
153
|
-
r.get("/users/:id/posts/:pid", function (req, res) {
|
|
154
|
-
seen = req.params; pattern = req.routePattern;
|
|
155
|
-
res.writeHead(200); res.end("ok");
|
|
156
|
-
});
|
|
157
|
-
var res = _res();
|
|
158
|
-
await r.handle(_req("GET", "/users/42/posts/99"), res);
|
|
159
|
-
check("named params captured onto req.params",
|
|
160
|
-
seen && seen.id === "42" && seen.pid === "99");
|
|
161
|
-
check("req.routePattern exposes the route template (not the concrete URL)",
|
|
162
|
-
pattern === "/users/:id/posts/:pid");
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
async function testTrailingSlashParamNoMatch() {
|
|
166
|
-
var r = b.router.create();
|
|
167
|
-
var ran = false;
|
|
168
|
-
r.get("/users/:id", function (req, res) { ran = true; res.writeHead(200); res.end("u"); });
|
|
169
|
-
var res = _res();
|
|
170
|
-
await r.handle(_req("GET", "/users/"), res);
|
|
171
|
-
check("'/users/' does NOT match '/users/:id' (empty param segment) → 404",
|
|
172
|
-
res.statusCode === 404 && ran === false);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
async function testMultiHandlerFallThrough() {
|
|
176
|
-
var r = b.router.create();
|
|
177
|
-
var order = [];
|
|
178
|
-
r.get("/m",
|
|
179
|
-
function (req, res) { order.push("h1"); },
|
|
180
|
-
function (req, res) { order.push("h2"); res.writeHead(200); res.end("done"); });
|
|
181
|
-
var res = _res();
|
|
182
|
-
await r.handle(_req("GET", "/m"), res);
|
|
183
|
-
check("two terminal handlers on one route both run in order",
|
|
184
|
-
order.join(",") === "h1,h2" && res.statusCode === 200);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
async function testInRouteMiddlewareNextSemantics() {
|
|
188
|
-
var r = b.router.create();
|
|
189
|
-
var terminalRan = false;
|
|
190
|
-
r.get("/g",
|
|
191
|
-
function gate(req, res, next) { /* no next() — refuse */ res.writeHead(403); res.end("deny"); },
|
|
192
|
-
function terminal(req, res) { terminalRan = true; res.writeHead(200); res.end("ok"); });
|
|
193
|
-
var res = _res();
|
|
194
|
-
await r.handle(_req("GET", "/g"), res);
|
|
195
|
-
check("in-route middleware that omits next() halts the chain",
|
|
196
|
-
res.statusCode === 403 && terminalRan === false);
|
|
197
|
-
|
|
198
|
-
var r2 = b.router.create();
|
|
199
|
-
var order = [];
|
|
200
|
-
r2.get("/g2",
|
|
201
|
-
function gate(req, res, next) { order.push("gate"); next(); },
|
|
202
|
-
function terminal(req, res) { order.push("terminal"); res.writeHead(200); res.end("ok"); });
|
|
203
|
-
var res2 = _res();
|
|
204
|
-
await r2.handle(_req("GET", "/g2"), res2);
|
|
205
|
-
check("in-route middleware that calls next() proceeds to the terminal handler",
|
|
206
|
-
order.join(",") === "gate,terminal" && res2.statusCode === 200);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
async function testGlobalMwEndsResponseWithNextStopsDispatch() {
|
|
210
|
-
var r = b.router.create();
|
|
211
|
-
var routeRan = false;
|
|
212
|
-
r.use(function (req, res, next) { res.writeHead(200); res.end("mw"); next(); });
|
|
213
|
-
r.get("/f", function (req, res) { routeRan = true; res.writeHead(200); res.end("route"); });
|
|
214
|
-
var res = _res();
|
|
215
|
-
await r.handle(_req("GET", "/f"), res);
|
|
216
|
-
check("a global middleware that ends the response short-circuits dispatch even if it calls next()",
|
|
217
|
-
routeRan === false && res._body === "mw");
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
async function testQueryPopulated() {
|
|
221
|
-
var r = b.router.create();
|
|
222
|
-
var seen = null;
|
|
223
|
-
r.get("/search", function (req, res) { seen = req.query; res.writeHead(200); res.end("ok"); });
|
|
224
|
-
var res = _res();
|
|
225
|
-
await r.handle(_req("GET", "/search?q=hello&limit=5"), res);
|
|
226
|
-
check("req.query is populated from the URL search string",
|
|
227
|
-
seen && seen.q === "hello" && seen.limit === "5");
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
async function testQueryKeyCap() {
|
|
231
|
-
var r = b.router.create();
|
|
232
|
-
var ran = false;
|
|
233
|
-
r.get("/q", function (req, res) { ran = true; res.writeHead(200); res.end("ok"); });
|
|
234
|
-
var parts = [];
|
|
235
|
-
for (var i = 0; i < 1001; i++) parts.push("k" + i + "=v");
|
|
236
|
-
var res = _res();
|
|
237
|
-
await r.handle(_req("GET", "/q?" + parts.join("&")), res);
|
|
238
|
-
check("HashDoS query-key cap: 1001 distinct keys → 400 before dispatch",
|
|
239
|
-
res.statusCode === 400 && ran === false && /too many query keys/.test(res._body));
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// ---- schema + response validators ----
|
|
243
|
-
|
|
244
|
-
async function testQuerySchemaValidation() {
|
|
245
|
-
var r = b.router.create();
|
|
246
|
-
var handlerRan = false;
|
|
247
|
-
r.get("/search", { query: s.object({ q: s.string() }) }, function (req, res) {
|
|
248
|
-
handlerRan = true; res.writeHead(200); res.end("ok");
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
var ok = _res();
|
|
252
|
-
await r.handle(_req("GET", "/search?q=abc"), ok);
|
|
253
|
-
check("valid query → 200", ok.statusCode === 200 && handlerRan === true);
|
|
254
|
-
|
|
255
|
-
var bad = _res();
|
|
256
|
-
handlerRan = false;
|
|
257
|
-
await r.handle(_req("GET", "/search"), bad); // q omitted
|
|
258
|
-
check("missing required query field → 400 with where:query",
|
|
259
|
-
bad.statusCode === 400 && /"where":"query"/.test(bad._body) && handlerRan === false);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
async function testParamsSchemaValidation() {
|
|
263
|
-
var r = b.router.create();
|
|
264
|
-
var seen = null;
|
|
265
|
-
r.get("/n/:count", { params: s.object({ count: s.string() }) }, function (req, res) {
|
|
266
|
-
seen = req.params; res.writeHead(200); res.end("ok");
|
|
267
|
-
});
|
|
268
|
-
var res = _res();
|
|
269
|
-
await r.handle(_req("GET", "/n/7"), res);
|
|
270
|
-
check("params schema runs and the handler sees the parsed params",
|
|
271
|
-
res.statusCode === 200 && seen && seen.count === "7");
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
async function testResponseValidatorThrowMode() {
|
|
275
|
-
var r = b.router.create();
|
|
276
|
-
r.get("/rv", { response: s.object({ ok: s.boolean() }), validateResponse: "throw" },
|
|
277
|
-
function (req, res) { res.json({ ok: "not-a-boolean" }); });
|
|
278
|
-
var res = _res();
|
|
279
|
-
res.json = function (v) { res.writeHead(200); res.end(JSON.stringify(v)); };
|
|
280
|
-
var threw = null;
|
|
281
|
-
try { await r.handle(_req("GET", "/rv"), res); } catch (e) { threw = e; }
|
|
282
|
-
check("response-validation throw mode surfaces a drift error out of res.json",
|
|
283
|
-
threw && /response-validation failed/.test(threw.message));
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// ---- introspection ----
|
|
287
|
-
|
|
288
|
-
function testInspectRoutes() {
|
|
289
|
-
var r = b.router.create();
|
|
290
|
-
r.get("/u/:id", { description: "desc", tags: ["t"], summary: "sum" }, function () {});
|
|
291
|
-
r.post("/plain", function () {});
|
|
292
|
-
var rows = r.inspectRoutes();
|
|
293
|
-
check("inspectRoutes returns one row per registered route", rows.length === 2);
|
|
294
|
-
var specRow = rows[0];
|
|
295
|
-
check("inspectRoutes surfaces method + pattern + description",
|
|
296
|
-
specRow.method === "GET" && specRow.pattern === "/u/:id" && specRow.description === "desc");
|
|
297
|
-
check("inspectRoutes surfaces the spec tags + summary",
|
|
298
|
-
specRow.spec && specRow.spec.tags.join(",") === "t" && specRow.spec.summary === "sum");
|
|
299
|
-
check("inspectRoutes reports a plain route's spec as null",
|
|
300
|
-
rows[1].spec === null && rows[1].method === "POST");
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
function testOpenapi() {
|
|
304
|
-
var r = b.router.create();
|
|
305
|
-
r.get("/users/:id", {
|
|
306
|
-
summary: "Get user", tags: ["users"], description: "d",
|
|
307
|
-
queryJsonSchema: { properties: { q: { type: "string" } }, required: ["q"] },
|
|
308
|
-
responseJsonSchema: { type: "object" },
|
|
309
|
-
}, function () {});
|
|
310
|
-
r.post("/users/:id", { bodyJsonSchema: { type: "object" } }, function () {});
|
|
311
|
-
r.get("/safe", { body: s.object({ a: s.string() }) }, function () {});
|
|
312
|
-
r.put("/plain", function () {});
|
|
313
|
-
|
|
314
|
-
var docDefault = b.router.create().openapi();
|
|
315
|
-
check("openapi() defaults info to the framework placeholder",
|
|
316
|
-
docDefault.openapi === "3.0.3" &&
|
|
317
|
-
docDefault.info.title === "blamejs app" && docDefault.info.version === "0.0.0");
|
|
318
|
-
|
|
319
|
-
var doc = r.openapi({ info: { title: "T", version: "1.0" } });
|
|
320
|
-
check("openapi() passes custom info through", doc.info.title === "T" && doc.info.version === "1.0");
|
|
321
|
-
check("openapi() converts ':id' path params to '{id}' and merges methods on one path",
|
|
322
|
-
doc.paths["/users/{id}"] &&
|
|
323
|
-
!!doc.paths["/users/{id}"].get && !!doc.paths["/users/{id}"].post);
|
|
324
|
-
|
|
325
|
-
var getOp = doc.paths["/users/{id}"].get;
|
|
326
|
-
var pathParam = getOp.parameters.filter(function (p) { return p.in === "path"; })[0];
|
|
327
|
-
var queryParam = getOp.parameters.filter(function (p) { return p.in === "query"; })[0];
|
|
328
|
-
check("openapi() emits a required path parameter",
|
|
329
|
-
pathParam && pathParam.name === "id" && pathParam.required === true);
|
|
330
|
-
check("openapi() emits the query parameter from queryJsonSchema (required)",
|
|
331
|
-
queryParam && queryParam.name === "q" && queryParam.required === true);
|
|
332
|
-
check("openapi() emits responses from responseJsonSchema",
|
|
333
|
-
getOp.responses && getOp.responses["200"]);
|
|
334
|
-
check("openapi() emits requestBody from bodyJsonSchema",
|
|
335
|
-
doc.paths["/users/{id}"].post.requestBody &&
|
|
336
|
-
doc.paths["/users/{id}"].post.requestBody.required === true);
|
|
337
|
-
check("openapi() annotates a safeSchema-only body with x-blamejs-body-validation",
|
|
338
|
-
doc.paths["/safe"].get["x-blamejs-body-validation"] === "safe-schema (json schema not provided)");
|
|
339
|
-
check("openapi() summarizes a spec-less route from method + pattern",
|
|
340
|
-
doc.paths["/plain"].put.summary === "PUT /plain");
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
function testReservedSlugs() {
|
|
344
|
-
var r = b.router.create();
|
|
345
|
-
r.get("/admin/panel", function () {});
|
|
346
|
-
r.get("/api", function () {});
|
|
347
|
-
r.get("/API/v2", function () {}); // dedupes case-insensitively with /api
|
|
348
|
-
r.get("/:id", function () {}); // param-first: not a reserved slug
|
|
349
|
-
r.get("/", function () {}); // root: no slug
|
|
350
|
-
var slugs = r.getReservedSlugs();
|
|
351
|
-
check("getReservedSlugs collects first literal segments, lowercased + deduped",
|
|
352
|
-
slugs.has("admin") && slugs.has("api") && slugs.size === 2);
|
|
353
|
-
check("getReservedSlugs excludes parameter-first and root patterns",
|
|
354
|
-
!slugs.has(":id") && !slugs.has(""));
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
// ---- ws() registration + lifecycle ----
|
|
358
|
-
|
|
359
|
-
function testWsValidation() {
|
|
360
|
-
check("ws('') refuses empty path",
|
|
361
|
-
/path must be a non-empty string/.test(_throwMsg(function () { b.router.create().ws("", function () {}); })));
|
|
362
|
-
check("ws(path, non-fn) refuses non-function handler",
|
|
363
|
-
/handler must be a function/.test(_throwMsg(function () { b.router.create().ws("/ws", "x"); })));
|
|
364
|
-
check("ws(path, fn, {transport:'h3'}) refuses unknown transport",
|
|
365
|
-
/transport must be/.test(_throwMsg(function () { b.router.create().ws("/ws", function () {}, { transport: "h3" }); })));
|
|
366
|
-
check("ws(path, fn, {origins:'*'}) registers without throwing",
|
|
367
|
-
_throwMsg(function () { b.router.create().ws("/ws", function () {}, { origins: "*" }); }) === null);
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
async function testWebSocketLifecycleCounters() {
|
|
371
|
-
var r = b.router.create();
|
|
372
|
-
check("activeWebSockets() is 0 on a fresh router", r.activeWebSockets() === 0);
|
|
373
|
-
var closed = await r.closeWebSockets();
|
|
374
|
-
check("closeWebSockets() with no open connections resolves to 0", closed === 0);
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
// ---- serveStatic ----
|
|
378
|
-
|
|
379
|
-
async function _runStaticMw(mw, req) {
|
|
380
|
-
var res = _res();
|
|
381
|
-
var nexted = false;
|
|
382
|
-
mw(req, res, function () { nexted = true; });
|
|
383
|
-
// Settle when the middleware finishes — it either called next() (sync or
|
|
384
|
-
// async) or wrote a response. A pass-through that does neither settles as
|
|
385
|
-
// not-nexted once the poll window elapses (waitUntil throws on timeout).
|
|
386
|
-
try {
|
|
387
|
-
await helpers.waitUntil(function () {
|
|
388
|
-
return nexted || res.headersSent || res.writableEnded;
|
|
389
|
-
}, { timeoutMs: 2000, label: "router static mw: next() or response written" });
|
|
390
|
-
} catch (_e) { /* mw neither nexted nor responded — settle as-is */ }
|
|
391
|
-
return { nexted: nexted, res: res };
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
async function testServeStaticBypassBranches() {
|
|
395
|
-
var mw = b.router.serveStatic(os.tmpdir());
|
|
396
|
-
var nonGet = await _runStaticMw(mw, { method: "POST", url: "/x", pathname: "/x", headers: {} });
|
|
397
|
-
check("serveStatic passes non-GET requests through (next)", nonGet.nexted === true);
|
|
398
|
-
|
|
399
|
-
var nul = await _runStaticMw(mw, { method: "GET", url: "/x", pathname: "/xy", headers: {} });
|
|
400
|
-
check("serveStatic passes NUL-byte pathnames through (next)", nul.nexted === true);
|
|
401
|
-
|
|
402
|
-
var traversal = await _runStaticMw(mw, { method: "GET", url: "/x", pathname: "/../../etc/passwd", headers: {} });
|
|
403
|
-
check("serveStatic passes a '..' escape outside root through (next)", traversal.nexted === true);
|
|
404
|
-
|
|
405
|
-
var missing = await _runStaticMw(mw, {
|
|
406
|
-
method: "GET", url: "/x", pathname: "/no-such-file-" + Date.now() + ".html", headers: {},
|
|
407
|
-
});
|
|
408
|
-
check("serveStatic passes a missing file through (next)", missing.nexted === true);
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
async function testServeStaticServesFile() {
|
|
412
|
-
var dir = fs.mkdtempSync(nodePath.join(os.tmpdir(), "router-cov-"));
|
|
413
|
-
try {
|
|
414
|
-
fs.writeFileSync(nodePath.join(dir, "hello.html"), "<b>hi</b>");
|
|
415
|
-
fs.writeFileSync(nodePath.join(dir, "blob.xyz"), "rawbytes");
|
|
416
|
-
|
|
417
|
-
var r = b.router.create();
|
|
418
|
-
r.use(b.router.serveStatic(dir));
|
|
419
|
-
var server = r.listen(0);
|
|
420
|
-
await _listening(server);
|
|
421
|
-
var port = server.address().port;
|
|
422
|
-
try {
|
|
423
|
-
var html = await _get(port, "/hello.html");
|
|
424
|
-
check("serveStatic serves a known file with mapped MIME + 1h cache",
|
|
425
|
-
html.status === 200 && html.body === "<b>hi</b>" &&
|
|
426
|
-
html.headers["content-type"] === "text/html" &&
|
|
427
|
-
html.headers["cache-control"] === "public, max-age=3600");
|
|
428
|
-
|
|
429
|
-
var versioned = await _get(port, "/hello.html?v=abc");
|
|
430
|
-
check("serveStatic marks ?v=-versioned URLs immutable for a year",
|
|
431
|
-
versioned.headers["cache-control"] === "public, max-age=31536000, immutable");
|
|
432
|
-
|
|
433
|
-
var blob = await _get(port, "/blob.xyz");
|
|
434
|
-
check("serveStatic falls back to application/octet-stream for unknown extensions",
|
|
435
|
-
blob.status === 200 && blob.headers["content-type"] === "application/octet-stream");
|
|
436
|
-
|
|
437
|
-
var post = await _get(port, "/hello.html", {}, "POST");
|
|
438
|
-
check("serveStatic + no POST route → 404 (non-GET bypass reaches the notFound)",
|
|
439
|
-
post.status === 404);
|
|
440
|
-
|
|
441
|
-
var missing = await _get(port, "/absent.html");
|
|
442
|
-
check("serveStatic + missing file → 404 (bypass reaches the notFound)",
|
|
443
|
-
missing.status === 404);
|
|
444
|
-
} finally {
|
|
445
|
-
await _close(server);
|
|
446
|
-
}
|
|
447
|
-
} finally {
|
|
448
|
-
try { fs.rmSync(dir, { recursive: true, force: true }); } catch (_e) { /* best-effort */ }
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
// ---- live listen() response-helper wiring ----
|
|
453
|
-
|
|
454
|
-
function _listening(server) {
|
|
455
|
-
return new Promise(function (resolve) {
|
|
456
|
-
if (server.listening) { resolve(); return; }
|
|
457
|
-
server.once("listening", resolve);
|
|
458
|
-
});
|
|
459
|
-
}
|
|
460
|
-
function _close(server) { return new Promise(function (resolve) { server.close(resolve); }); }
|
|
461
|
-
function _get(port, path, headers, method) {
|
|
462
|
-
return new Promise(function (resolve, reject) {
|
|
463
|
-
var req = http.request({ host: "127.0.0.1", port: port, path: path, method: method || "GET", headers: headers || {} },
|
|
464
|
-
function (r) {
|
|
465
|
-
var body = "";
|
|
466
|
-
r.on("data", function (c) { body += c; });
|
|
467
|
-
r.on("end", function () { resolve({ status: r.statusCode, headers: r.headers, body: body }); });
|
|
468
|
-
});
|
|
469
|
-
req.on("error", reject);
|
|
470
|
-
req.end();
|
|
471
|
-
});
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
async function testListenResponseHelpers() {
|
|
475
|
-
var r = b.router.create({ allowedRedirectOrigins: ["https://idp.example.com"] });
|
|
476
|
-
r.get("/json", function (req, res) { res.json({ hello: "world" }); });
|
|
477
|
-
r.get("/created", function (req, res) { res.status(201).json({ id: 1 }); });
|
|
478
|
-
r.get("/same", function (req, res) { res.redirect("/dashboard"); });
|
|
479
|
-
r.get("/xo", function (req, res) { res.redirect("https://idp.example.com/authorize?x=1"); });
|
|
480
|
-
r.get("/xo-bad", function (req, res) { try { res.redirect("https://evil.example.com/x"); } catch (e) { res.writeHead(400); res.end("refused:" + e.code); } });
|
|
481
|
-
r.get("/crlf", function (req, res) { try { res.redirect("/a\nEvil:1"); } catch (e) { res.writeHead(400); res.end("refused:" + e.code); } });
|
|
482
|
-
r.get("/boom", function (req, res) { throw new Error("kaboom"); });
|
|
483
|
-
r.onError(function (err, req, res) { res.writeHead(500, { "Content-Type": "text/plain" }); res.end("custom-500:" + err.message); });
|
|
484
|
-
|
|
485
|
-
var server = r.listen(0);
|
|
486
|
-
await _listening(server);
|
|
487
|
-
var port = server.address().port;
|
|
488
|
-
try {
|
|
489
|
-
var j = await _get(port, "/json");
|
|
490
|
-
check("res.json ships 200 + application/json + serialized body",
|
|
491
|
-
j.status === 200 && /application\/json/.test(j.headers["content-type"]) &&
|
|
492
|
-
j.body === '{"hello":"world"}');
|
|
493
|
-
|
|
494
|
-
var created = await _get(port, "/created");
|
|
495
|
-
check("res.status(201).json chains the status through", created.status === 201);
|
|
496
|
-
|
|
497
|
-
var same = await _get(port, "/same");
|
|
498
|
-
check("res.redirect same-origin path → 302 Location", same.status === 302 && same.headers.location === "/dashboard");
|
|
499
|
-
|
|
500
|
-
var xo = await _get(port, "/xo");
|
|
501
|
-
check("res.redirect to an allowlisted cross-origin → 302 Location",
|
|
502
|
-
xo.status === 302 && xo.headers.location === "https://idp.example.com/authorize?x=1");
|
|
503
|
-
|
|
504
|
-
var xoBad = await _get(port, "/xo-bad");
|
|
505
|
-
check("res.redirect to an off-allowlist origin throws RouterError (handler-observable)",
|
|
506
|
-
xoBad.status === 400 && xoBad.body === "refused:router/redirect-cross-origin-refused");
|
|
507
|
-
|
|
508
|
-
var crlf = await _get(port, "/crlf");
|
|
509
|
-
check("res.redirect refuses a LF in the target (header-injection guard)",
|
|
510
|
-
crlf.status === 400 && crlf.body === "refused:router/redirect-target-has-control-chars");
|
|
511
|
-
|
|
512
|
-
var boom = await _get(port, "/boom");
|
|
513
|
-
check("a throwing handler routes through onError to a custom 500",
|
|
514
|
-
boom.status === 500 && boom.body === "custom-500:kaboom");
|
|
515
|
-
|
|
516
|
-
var nf = await _get(port, "/missing");
|
|
517
|
-
check("unmatched path on the live server → 404", nf.status === 404);
|
|
518
|
-
} finally {
|
|
519
|
-
await _close(server);
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
async function testListenDefault500NoErrorHandler() {
|
|
524
|
-
var r = b.router.create();
|
|
525
|
-
r.get("/boom", function () { throw new Error("nope"); });
|
|
526
|
-
var server = r.listen(0);
|
|
527
|
-
await _listening(server);
|
|
528
|
-
var port = server.address().port;
|
|
529
|
-
try {
|
|
530
|
-
var boom = await _get(port, "/boom");
|
|
531
|
-
check("a throwing handler with no onError → default 500 Internal Server Error",
|
|
532
|
-
boom.status === 500 && /Internal Server Error/.test(boom.body));
|
|
533
|
-
} finally {
|
|
534
|
-
await _close(server);
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
async function testListenEarlyDataGate() {
|
|
539
|
-
var r = b.router.create({ tls0Rtt: "refuse" });
|
|
540
|
-
r.get("/e", function (req, res) { res.json({ ok: 1 }); });
|
|
541
|
-
var server = r.listen(0);
|
|
542
|
-
await _listening(server);
|
|
543
|
-
var port = server.address().port;
|
|
544
|
-
try {
|
|
545
|
-
var early = await _get(port, "/e", { "early-data": "1" });
|
|
546
|
-
check("refuse posture: an Early-Data:1 request is gated with 425 at listen()",
|
|
547
|
-
early.status === 425 && early.body === "early-data-refused");
|
|
548
|
-
var normal = await _get(port, "/e");
|
|
549
|
-
check("refuse posture: a normal (non-early-data) request proceeds",
|
|
550
|
-
normal.status === 200);
|
|
551
|
-
} finally {
|
|
552
|
-
await _close(server);
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
async function run() {
|
|
557
|
-
testPatternValidation();
|
|
558
|
-
testAsteriskFloodRefused();
|
|
559
|
-
testRouteSpecValidation();
|
|
560
|
-
await testMethodMismatchFallsToNotFound();
|
|
561
|
-
await testDefaultNotFoundBody();
|
|
562
|
-
await testCustomNotFound();
|
|
563
|
-
await testParamCaptureAndRoutePattern();
|
|
564
|
-
await testTrailingSlashParamNoMatch();
|
|
565
|
-
await testMultiHandlerFallThrough();
|
|
566
|
-
await testInRouteMiddlewareNextSemantics();
|
|
567
|
-
await testGlobalMwEndsResponseWithNextStopsDispatch();
|
|
568
|
-
await testQueryPopulated();
|
|
569
|
-
await testQueryKeyCap();
|
|
570
|
-
await testQuerySchemaValidation();
|
|
571
|
-
await testParamsSchemaValidation();
|
|
572
|
-
await testResponseValidatorThrowMode();
|
|
573
|
-
testInspectRoutes();
|
|
574
|
-
testOpenapi();
|
|
575
|
-
testReservedSlugs();
|
|
576
|
-
testWsValidation();
|
|
577
|
-
await testWebSocketLifecycleCounters();
|
|
578
|
-
await testServeStaticBypassBranches();
|
|
579
|
-
await testServeStaticServesFile();
|
|
580
|
-
await testListenResponseHelpers();
|
|
581
|
-
await testListenDefault500NoErrorHandler();
|
|
582
|
-
await testListenEarlyDataGate();
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
module.exports = { run: run };
|
|
586
|
-
|
|
587
|
-
if (require.main === module) {
|
|
588
|
-
run().then(
|
|
589
|
-
function () { console.log("OK router-coverage — " + helpers.getChecks() + " checks"); process.exit(0); },
|
|
590
|
-
function (e) { console.error("FAIL:", (e && e.stack) || e); process.exit(1); }
|
|
591
|
-
);
|
|
592
|
-
}
|