@blamejs/blamejs-shop 0.5.11 → 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 +4 -0
- package/SECURITY.md +6 -1
- package/lib/admin.js +56 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/operator-sessions.js +68 -5
- 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
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* b.safeSchema.SafeSchemaError + b.safeSchema.undefined_ — the schema
|
|
6
|
+
* error class and the undefined-only leaf schema.
|
|
7
|
+
*
|
|
8
|
+
* SafeSchemaError is thrown by every construction-time misuse (bad
|
|
9
|
+
* union, poisoned shape key) AND by schema.parse() on validation
|
|
10
|
+
* failure, carrying the full per-field .issues array so one 400 can
|
|
11
|
+
* report every failing field. It is marked alwaysPermanent so a
|
|
12
|
+
* validation failure never round-trips through retry / transient-error
|
|
13
|
+
* logic. undefined_() is the leaf schema that accepts only `undefined`
|
|
14
|
+
* (implicitly optional) and rejects everything else with an issue code
|
|
15
|
+
* of "type".
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
var helpers = require("../helpers");
|
|
19
|
+
var b = helpers.b;
|
|
20
|
+
var check = helpers.check;
|
|
21
|
+
|
|
22
|
+
function run() {
|
|
23
|
+
var s = b.safeSchema;
|
|
24
|
+
|
|
25
|
+
// ---- SafeSchemaError: thrown by parse() on validation failure ----
|
|
26
|
+
var threw = false;
|
|
27
|
+
var caught = null;
|
|
28
|
+
try { s.string().min(3).parse("ab"); }
|
|
29
|
+
catch (e) { threw = true; caught = e; }
|
|
30
|
+
check("b.safeSchema.SafeSchemaError: parse() of an invalid value throws", threw);
|
|
31
|
+
check("SafeSchemaError: instanceof the exported class",
|
|
32
|
+
caught instanceof b.safeSchema.SafeSchemaError);
|
|
33
|
+
check("SafeSchemaError: name is SafeSchemaError", caught && caught.name === "SafeSchemaError");
|
|
34
|
+
check("SafeSchemaError: carries an .issues array", Array.isArray(caught.issues));
|
|
35
|
+
check("SafeSchemaError: issue[0] has the { path, code, message } shape",
|
|
36
|
+
caught.issues.length === 1 &&
|
|
37
|
+
Array.isArray(caught.issues[0].path) &&
|
|
38
|
+
typeof caught.issues[0].code === "string" &&
|
|
39
|
+
typeof caught.issues[0].message === "string");
|
|
40
|
+
check("SafeSchemaError: issue code reflects the failed check (string/too-short)",
|
|
41
|
+
caught.issues[0].code === "string/too-short");
|
|
42
|
+
|
|
43
|
+
// alwaysPermanent — a validation failure must never be retried as if
|
|
44
|
+
// it were a transient fault. defineClass({ alwaysPermanent: true })
|
|
45
|
+
// stamps `.permanent = true` on every instance.
|
|
46
|
+
check("SafeSchemaError: marked permanent so it never round-trips retry",
|
|
47
|
+
caught.permanent === true);
|
|
48
|
+
|
|
49
|
+
// The advertised aggregation guarantee: one throw surfaces EVERY
|
|
50
|
+
// failing field so HTTP middleware can answer with a single 400.
|
|
51
|
+
var multiThrew = null;
|
|
52
|
+
try { s.object({ a: s.string().min(3), b: s.number() }).parse({ a: "x", b: "nope" }); }
|
|
53
|
+
catch (e) { multiThrew = e; }
|
|
54
|
+
check("SafeSchemaError: aggregates all failing fields into one .issues array",
|
|
55
|
+
multiThrew instanceof b.safeSchema.SafeSchemaError && multiThrew.issues.length === 2);
|
|
56
|
+
check("SafeSchemaError: each aggregated issue carries its field path",
|
|
57
|
+
multiThrew.issues[0].path[0] === "a" && multiThrew.issues[1].path[0] === "b");
|
|
58
|
+
|
|
59
|
+
// ---- SafeSchemaError: also thrown on construction-time misuse ----
|
|
60
|
+
var badUnion = null;
|
|
61
|
+
try { s.union([]); }
|
|
62
|
+
catch (e) { badUnion = e; }
|
|
63
|
+
check("SafeSchemaError: construction-time misuse (empty union) throws it",
|
|
64
|
+
badUnion instanceof b.safeSchema.SafeSchemaError && badUnion.code === "safe-schema/bad-union");
|
|
65
|
+
|
|
66
|
+
// A prototype-pollution shape key is rejected at construction, not at
|
|
67
|
+
// parse, so an operator schema can never define one.
|
|
68
|
+
var poisoned = null;
|
|
69
|
+
try { s.object({ "constructor": s.string() }); }
|
|
70
|
+
catch (e) { poisoned = e; }
|
|
71
|
+
check("SafeSchemaError: a poisoned shape key ('constructor') is refused at construction",
|
|
72
|
+
poisoned instanceof b.safeSchema.SafeSchemaError && poisoned.code === "safe-schema/poisoned-shape-key");
|
|
73
|
+
|
|
74
|
+
// ---- undefined_(): accepts only undefined; implicitly optional ----
|
|
75
|
+
check("b.safeSchema.undefined_: parse(undefined) returns undefined",
|
|
76
|
+
b.safeSchema.undefined_().parse(undefined) === undefined);
|
|
77
|
+
|
|
78
|
+
var nullThrew = null;
|
|
79
|
+
try { s.undefined_().parse(null); }
|
|
80
|
+
catch (e) { nullThrew = e; }
|
|
81
|
+
check("undefined_: parse(null) throws SafeSchemaError with a type issue",
|
|
82
|
+
nullThrew instanceof b.safeSchema.SafeSchemaError && nullThrew.issues[0].code === "type");
|
|
83
|
+
|
|
84
|
+
var valThrew = null;
|
|
85
|
+
try { s.undefined_().parse(0); }
|
|
86
|
+
catch (e) { valThrew = e; }
|
|
87
|
+
check("undefined_: parse(0) rejects a defined value with a type issue",
|
|
88
|
+
valThrew instanceof b.safeSchema.SafeSchemaError && valThrew.issues[0].code === "type");
|
|
89
|
+
|
|
90
|
+
// safeParse mirrors parse without throwing — the non-throwing consumer
|
|
91
|
+
// path an operator uses to fold errors into a response body.
|
|
92
|
+
check("undefined_: safeParse(undefined) is ok:true",
|
|
93
|
+
s.undefined_().safeParse(undefined).ok === true);
|
|
94
|
+
var spBad = s.undefined_().safeParse(1);
|
|
95
|
+
check("undefined_: safeParse(1) is ok:false with the type error code",
|
|
96
|
+
spBad.ok === false && spBad.errors[0].code === "type");
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
module.exports = { run: run };
|
|
100
|
+
|
|
101
|
+
if (require.main === module) {
|
|
102
|
+
try { run(); console.log("OK — " + helpers.getChecks() + " checks passed"); }
|
|
103
|
+
catch (e) { console.error("FAIL:", e.stack || e); process.exit(1); }
|
|
104
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* b.safeSql identifier-shape primitives — the default identifier regex, the
|
|
6
|
+
* length ceiling, and the typed error class, each proven through the real
|
|
7
|
+
* validateIdentifier consumer path rather than by existence checks.
|
|
8
|
+
*
|
|
9
|
+
* DEFAULT_IDENTIFIER_RE is shown to be the shape validateIdentifier applies by
|
|
10
|
+
* default (an identifier the regex rejects throws sql/bad-shape; the same
|
|
11
|
+
* identifier passes once a wider opts.pattern is supplied). MAX_IDENTIFIER_LENGTH
|
|
12
|
+
* is shown to be the length boundary (one char past it throws sql/too-long;
|
|
13
|
+
* exactly at it passes). SafeSqlError is shown to be the class every throw
|
|
14
|
+
* carries, with its stable .code and default code.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
var { check, b } = require("../helpers");
|
|
18
|
+
|
|
19
|
+
function _code(fn) {
|
|
20
|
+
try { fn(); return "OK"; }
|
|
21
|
+
catch (e) { return e && e.code; }
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// ---- DEFAULT_IDENTIFIER_RE ----
|
|
25
|
+
|
|
26
|
+
function testDefaultIdentifierRe() {
|
|
27
|
+
check("b.safeSql.DEFAULT_IDENTIFIER_RE is the advertised ASCII identifier shape",
|
|
28
|
+
String(b.safeSql.DEFAULT_IDENTIFIER_RE) === "/^[A-Za-z_][A-Za-z0-9_]*$/");
|
|
29
|
+
|
|
30
|
+
// Advertised @example values: a plain snake_case name matches, a
|
|
31
|
+
// digit-leading name does not.
|
|
32
|
+
check("DEFAULT_IDENTIFIER_RE matches a plain identifier",
|
|
33
|
+
b.safeSql.DEFAULT_IDENTIFIER_RE.test("audit_log") === true);
|
|
34
|
+
check("DEFAULT_IDENTIFIER_RE rejects a digit-leading identifier",
|
|
35
|
+
b.safeSql.DEFAULT_IDENTIFIER_RE.test("1starts_with_digit") === false);
|
|
36
|
+
|
|
37
|
+
// validateIdentifier applies DEFAULT_IDENTIFIER_RE by default: a name the
|
|
38
|
+
// regex rejects throws sql/bad-shape...
|
|
39
|
+
check("validateIdentifier accepts a name matching DEFAULT_IDENTIFIER_RE",
|
|
40
|
+
b.safeSql.validateIdentifier("audit_log") === "audit_log");
|
|
41
|
+
check("validateIdentifier refuses a name failing DEFAULT_IDENTIFIER_RE",
|
|
42
|
+
_code(function () { b.safeSql.validateIdentifier("col-1"); }) === "sql/bad-shape");
|
|
43
|
+
|
|
44
|
+
// ...and the same name passes once a wider opts.pattern overrides the
|
|
45
|
+
// default shape — proving the default really was DEFAULT_IDENTIFIER_RE.
|
|
46
|
+
check("a wider opts.pattern accepts the name the default shape refused",
|
|
47
|
+
b.safeSql.validateIdentifier("col-1", {
|
|
48
|
+
pattern: /^[A-Za-z][A-Za-z0-9_-]*$/,
|
|
49
|
+
}) === "col-1");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ---- MAX_IDENTIFIER_LENGTH ----
|
|
53
|
+
|
|
54
|
+
function testMaxIdentifierLength() {
|
|
55
|
+
check("b.safeSql.MAX_IDENTIFIER_LENGTH is the advertised 63 (Postgres NAMEDATALEN)",
|
|
56
|
+
b.safeSql.MAX_IDENTIFIER_LENGTH === 63);
|
|
57
|
+
|
|
58
|
+
// One char past the ceiling refuses with sql/too-long; exactly at the
|
|
59
|
+
// ceiling is accepted. Sizing off the constant makes a drift break the test.
|
|
60
|
+
var tooLong = "a".repeat(b.safeSql.MAX_IDENTIFIER_LENGTH + 1);
|
|
61
|
+
check("validateIdentifier refuses a name longer than MAX_IDENTIFIER_LENGTH",
|
|
62
|
+
_code(function () { b.safeSql.validateIdentifier(tooLong); }) === "sql/too-long");
|
|
63
|
+
|
|
64
|
+
var atMax = "a".repeat(b.safeSql.MAX_IDENTIFIER_LENGTH);
|
|
65
|
+
check("validateIdentifier accepts a name exactly at MAX_IDENTIFIER_LENGTH",
|
|
66
|
+
b.safeSql.validateIdentifier(atMax) === atMax);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ---- SafeSqlError ----
|
|
70
|
+
|
|
71
|
+
function testSafeSqlError() {
|
|
72
|
+
// Every validateIdentifier rejection carries the class with a stable .code.
|
|
73
|
+
var thrown = null;
|
|
74
|
+
try { b.safeSql.validateIdentifier("drop"); }
|
|
75
|
+
catch (e) { thrown = e; }
|
|
76
|
+
check("validateIdentifier throws a b.safeSql.SafeSqlError",
|
|
77
|
+
thrown instanceof b.safeSql.SafeSqlError);
|
|
78
|
+
check("SafeSqlError extends Error", thrown instanceof Error);
|
|
79
|
+
check("SafeSqlError carries the .isSafeSqlError brand", thrown.isSafeSqlError === true);
|
|
80
|
+
check("reserved-word rejection carries code sql/reserved-word",
|
|
81
|
+
thrown.code === "sql/reserved-word");
|
|
82
|
+
|
|
83
|
+
// Distinct rejection reasons carry distinct documented codes on the SAME
|
|
84
|
+
// class — the code is the security signal HTTP middleware branches on.
|
|
85
|
+
check("bad-shape rejection is a SafeSqlError with code sql/bad-shape",
|
|
86
|
+
_code(function () { b.safeSql.validateIdentifier("a;b"); }) === "sql/bad-shape");
|
|
87
|
+
check("non-string input is a SafeSqlError with code sql/bad-type",
|
|
88
|
+
_code(function () { b.safeSql.validateIdentifier(42); }) === "sql/bad-type");
|
|
89
|
+
|
|
90
|
+
// The constructor's documented default code when none is supplied.
|
|
91
|
+
var bare = new b.safeSql.SafeSqlError("boom");
|
|
92
|
+
check("SafeSqlError defaults .code to sql/invalid", bare.code === "sql/invalid");
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ---- normalizeForScan ----
|
|
96
|
+
|
|
97
|
+
function testNormalizeForScan() {
|
|
98
|
+
// A quoted table/identifier abutting a keyword with NO whitespace gets a
|
|
99
|
+
// separating space so a whitespace-anchored tokenizer sees the boundary
|
|
100
|
+
// (the residency write-gate evasion this primitive was extracted to close).
|
|
101
|
+
check("normalizeForScan inserts a space where a quoted token abuts a word",
|
|
102
|
+
b.safeSql.normalizeForScan('INSERT INTO"t"(a) VALUES(?)') === 'INSERT INTO "t"(a) VALUES(?)');
|
|
103
|
+
|
|
104
|
+
// A slash-star block comment wedged between two keywords collapses to a
|
|
105
|
+
// single space so the token boundary survives.
|
|
106
|
+
var blockComment = "UPDATE" + "/*x*/" + "t SET a = ?";
|
|
107
|
+
check("normalizeForScan collapses an internal block comment to a space",
|
|
108
|
+
b.safeSql.normalizeForScan(blockComment) === "UPDATE t SET a = ?");
|
|
109
|
+
|
|
110
|
+
// A line comment collapses to a single space.
|
|
111
|
+
check("normalizeForScan collapses a line comment to a space",
|
|
112
|
+
b.safeSql.normalizeForScan("SELECT 1-- note") === "SELECT 1 ");
|
|
113
|
+
|
|
114
|
+
// Quote-aware: a comment marker INSIDE a string literal is copied verbatim,
|
|
115
|
+
// never treated as a comment (doubled-quote escape respected).
|
|
116
|
+
var litWithMarker = "SELECT '-- not a comment' AS x";
|
|
117
|
+
check("normalizeForScan leaves a comment marker inside a string literal intact",
|
|
118
|
+
b.safeSql.normalizeForScan(litWithMarker) === litWithMarker);
|
|
119
|
+
|
|
120
|
+
// Already-whitespace-delimited SQL is returned unchanged (no spurious spaces).
|
|
121
|
+
var clean = 'INSERT INTO "t" (a) VALUES (?)';
|
|
122
|
+
check("normalizeForScan is a no-op on already-normalized SQL",
|
|
123
|
+
b.safeSql.normalizeForScan(clean) === clean);
|
|
124
|
+
|
|
125
|
+
// A backtick-quoted (MySQL) identifier abutting a word is also separated.
|
|
126
|
+
check("normalizeForScan separates a backtick-quoted identifier abutting a word",
|
|
127
|
+
b.safeSql.normalizeForScan("UPDATE`t` SET a = ?") === "UPDATE `t` SET a = ?");
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async function run() {
|
|
131
|
+
testDefaultIdentifierRe();
|
|
132
|
+
testMaxIdentifierLength();
|
|
133
|
+
testSafeSqlError();
|
|
134
|
+
testNormalizeForScan();
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
module.exports = { run: run };
|
|
138
|
+
|
|
139
|
+
if (require.main === module) {
|
|
140
|
+
run().then(function () { console.log("OK"); })
|
|
141
|
+
.catch(function (e) { console.error(e.stack || e); process.exit(1); });
|
|
142
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* b.safeUrl protocol-allowlist presets — the three frozen scheme arrays a
|
|
6
|
+
* caller passes as opts.allowedProtocols, proven through the real parse gate
|
|
7
|
+
* rather than by shape checks alone.
|
|
8
|
+
*
|
|
9
|
+
* Each preset is asserted for its advertised contents AND its gating behavior:
|
|
10
|
+
* a URL whose scheme is IN the preset parses and returns the matching
|
|
11
|
+
* protocol; a URL whose scheme is OUT of it refuses with
|
|
12
|
+
* safe-url/protocol-disallowed. ALLOW_WS_TLS is the headline case — it permits
|
|
13
|
+
* wss: and refuses cleartext ws:. The presets are also confirmed frozen, as the
|
|
14
|
+
* docs promise (a shared allowlist must not be mutable by one caller).
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
var { check, b } = require("../helpers");
|
|
18
|
+
|
|
19
|
+
function _code(fn) {
|
|
20
|
+
try { fn(); return "OK"; }
|
|
21
|
+
catch (e) { return e && e.code; }
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// ---- ALLOW_WS_TLS (["wss:"]) ----
|
|
25
|
+
|
|
26
|
+
function testAllowWsTls() {
|
|
27
|
+
check("b.safeUrl.ALLOW_WS_TLS is the advertised secure-WS allowlist",
|
|
28
|
+
b.safeUrl.ALLOW_WS_TLS.join(",") === "wss:");
|
|
29
|
+
check("ALLOW_WS_TLS is frozen (a shared preset must be immutable)",
|
|
30
|
+
Object.isFrozen(b.safeUrl.ALLOW_WS_TLS));
|
|
31
|
+
|
|
32
|
+
// Permits wss:, refuses cleartext ws: — the secure-WebSocket default.
|
|
33
|
+
check("parse with ALLOW_WS_TLS accepts a wss: URL",
|
|
34
|
+
b.safeUrl.parse("wss://example.com/stream", {
|
|
35
|
+
allowedProtocols: b.safeUrl.ALLOW_WS_TLS,
|
|
36
|
+
}).protocol === "wss:");
|
|
37
|
+
check("parse with ALLOW_WS_TLS refuses a cleartext ws: URL",
|
|
38
|
+
_code(function () {
|
|
39
|
+
b.safeUrl.parse("ws://example.com/stream", {
|
|
40
|
+
allowedProtocols: b.safeUrl.ALLOW_WS_TLS,
|
|
41
|
+
});
|
|
42
|
+
}) === "safe-url/protocol-disallowed");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ---- ALLOW_WS_ALL (["ws:", "wss:"]) ----
|
|
46
|
+
|
|
47
|
+
function testAllowWsAll() {
|
|
48
|
+
check("b.safeUrl.ALLOW_WS_ALL is the advertised ws+wss allowlist",
|
|
49
|
+
b.safeUrl.ALLOW_WS_ALL.join(",") === "ws:,wss:");
|
|
50
|
+
check("ALLOW_WS_ALL is frozen", Object.isFrozen(b.safeUrl.ALLOW_WS_ALL));
|
|
51
|
+
|
|
52
|
+
// Opt-in cleartext WebSocket: both ws: and wss: parse.
|
|
53
|
+
check("parse with ALLOW_WS_ALL accepts a cleartext ws: URL",
|
|
54
|
+
b.safeUrl.parse("ws://127.0.0.1:9000/stream", {
|
|
55
|
+
allowedProtocols: b.safeUrl.ALLOW_WS_ALL,
|
|
56
|
+
}).protocol === "ws:");
|
|
57
|
+
check("parse with ALLOW_WS_ALL accepts a wss: URL",
|
|
58
|
+
b.safeUrl.parse("wss://example.com/stream", {
|
|
59
|
+
allowedProtocols: b.safeUrl.ALLOW_WS_ALL,
|
|
60
|
+
}).protocol === "wss:");
|
|
61
|
+
// But it is a WebSocket allowlist — an https: URL is a category error here.
|
|
62
|
+
check("parse with ALLOW_WS_ALL refuses a non-WebSocket https: URL",
|
|
63
|
+
_code(function () {
|
|
64
|
+
b.safeUrl.parse("https://example.com/", {
|
|
65
|
+
allowedProtocols: b.safeUrl.ALLOW_WS_ALL,
|
|
66
|
+
});
|
|
67
|
+
}) === "safe-url/protocol-disallowed");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// ---- ALLOW_ANY (["http:", "https:", "ws:", "wss:"]) ----
|
|
71
|
+
|
|
72
|
+
function testAllowAny() {
|
|
73
|
+
check("b.safeUrl.ALLOW_ANY is every framework-supported scheme",
|
|
74
|
+
b.safeUrl.ALLOW_ANY.join(",") === "http:,https:,ws:,wss:");
|
|
75
|
+
check("b.safeUrl.ALLOW_ANY has the advertised length of 4",
|
|
76
|
+
b.safeUrl.ALLOW_ANY.length === 4);
|
|
77
|
+
check("ALLOW_ANY is frozen", Object.isFrozen(b.safeUrl.ALLOW_ANY));
|
|
78
|
+
|
|
79
|
+
// Every supported scheme parses under ALLOW_ANY and returns its protocol.
|
|
80
|
+
var supported = [
|
|
81
|
+
{ url: "http://example.com/", protocol: "http:" },
|
|
82
|
+
{ url: "https://example.com/", protocol: "https:" },
|
|
83
|
+
{ url: "ws://example.com/", protocol: "ws:" },
|
|
84
|
+
{ url: "wss://example.com/", protocol: "wss:" },
|
|
85
|
+
];
|
|
86
|
+
for (var i = 0; i < supported.length; i += 1) {
|
|
87
|
+
check("parse with ALLOW_ANY accepts " + supported[i].protocol,
|
|
88
|
+
b.safeUrl.parse(supported[i].url, {
|
|
89
|
+
allowedProtocols: b.safeUrl.ALLOW_ANY,
|
|
90
|
+
}).protocol === supported[i].protocol);
|
|
91
|
+
}
|
|
92
|
+
// A scheme outside the framework-supported set still refuses.
|
|
93
|
+
check("parse with ALLOW_ANY refuses an unsupported ftp: scheme",
|
|
94
|
+
_code(function () {
|
|
95
|
+
b.safeUrl.parse("ftp://example.com/file", {
|
|
96
|
+
allowedProtocols: b.safeUrl.ALLOW_ANY,
|
|
97
|
+
});
|
|
98
|
+
}) === "safe-url/protocol-disallowed");
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async function run() {
|
|
102
|
+
testAllowWsTls();
|
|
103
|
+
testAllowWsAll();
|
|
104
|
+
testAllowAny();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
module.exports = { run: run };
|
|
108
|
+
|
|
109
|
+
if (require.main === module) {
|
|
110
|
+
run().then(function () { console.log("OK"); })
|
|
111
|
+
.catch(function (e) { console.error(e.stack || e); process.exit(1); });
|
|
112
|
+
}
|
|
@@ -203,6 +203,31 @@ function testRefusesBadProfile() {
|
|
|
203
203
|
"safe-vcard/bad-opt");
|
|
204
204
|
}
|
|
205
205
|
|
|
206
|
+
function testProtoKeyProfileRejected() {
|
|
207
|
+
// A prototype-member name as the profile must be refused, not resolved to an
|
|
208
|
+
// inherited member ("constructor" -> Object.prototype.constructor,
|
|
209
|
+
// "__proto__" -> Object.prototype). The own-property guard in _resolveCaps
|
|
210
|
+
// rejects it; a bare `if (!PROFILES[name])` truthiness check would pass the
|
|
211
|
+
// inherited member as a known profile and run under it (fail-open).
|
|
212
|
+
expectRefused("refuses prototype-key profile 'constructor'",
|
|
213
|
+
function () { safeVcard.parse(_card(""), { profile: "constructor" }); },
|
|
214
|
+
"safe-vcard/bad-opt");
|
|
215
|
+
expectRefused("refuses prototype-key profile '__proto__'",
|
|
216
|
+
function () { safeVcard.parse(_card(""), { profile: "__proto__" }); },
|
|
217
|
+
"safe-vcard/bad-opt");
|
|
218
|
+
// A prototype-member name as the compliancePosture must not resolve to an
|
|
219
|
+
// inherited member either — the own-property guard skips the unknown posture
|
|
220
|
+
// and falls back to the strict profile, parsing cleanly.
|
|
221
|
+
var postureThrew = null, ast = null;
|
|
222
|
+
try { ast = safeVcard.parse(_card(""), { compliancePosture: "toString" }); }
|
|
223
|
+
catch (e) { postureThrew = e; }
|
|
224
|
+
check("prototype-key posture falls back to strict (no fail-open)",
|
|
225
|
+
postureThrew === null && !!(ast && ast.vcards));
|
|
226
|
+
// A valid profile still parses.
|
|
227
|
+
var ok = safeVcard.parse(_card(""), { profile: "balanced" });
|
|
228
|
+
check("valid profile 'balanced' still parses", !!ok.vcards);
|
|
229
|
+
}
|
|
230
|
+
|
|
206
231
|
function testRefusesOversizeCards() {
|
|
207
232
|
// strict caps at 16 cards.
|
|
208
233
|
var body = "";
|
|
@@ -247,6 +272,7 @@ async function run() {
|
|
|
247
272
|
testRefusesNestedBegin();
|
|
248
273
|
testRefusesBadInput();
|
|
249
274
|
testRefusesBadProfile();
|
|
275
|
+
testProtoKeyProfileRejected();
|
|
250
276
|
testRefusesOversizeCards();
|
|
251
277
|
testExtraPropertiesAllowlist();
|
|
252
278
|
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* scheduler.nextBaselineFire — earliest UTC ms strictly after `after`
|
|
6
|
+
* whose wall-clock in a timezone matches an HH:MM baseline.
|
|
7
|
+
*
|
|
8
|
+
* Pure function: known-answer vectors (UTC + a non-UTC zone + local
|
|
9
|
+
* clock), the strictly-after / next-day rollover semantics, and the
|
|
10
|
+
* malformed-input throws.
|
|
11
|
+
*
|
|
12
|
+
* Run standalone: `node test/layer-0-primitives/scheduler.test.js`
|
|
13
|
+
* Or via smoke: `node test/smoke.js`
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
var helpers = require("../helpers");
|
|
17
|
+
var b = helpers.b;
|
|
18
|
+
var check = helpers.check;
|
|
19
|
+
|
|
20
|
+
function _iso(ms) { return new Date(ms).toISOString(); }
|
|
21
|
+
|
|
22
|
+
function testNextBaselineFireKnownAnswerUtc() {
|
|
23
|
+
var when = b.scheduler.nextBaselineFire("02:30", "UTC", new Date("2026-05-09T01:00:00Z"));
|
|
24
|
+
check("nextBaselineFire UTC known-answer",
|
|
25
|
+
_iso(when) === "2026-05-09T02:30:00.000Z");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function testNextBaselineFireStrictlyAfter() {
|
|
29
|
+
// `after` sitting exactly on the target minute must roll to the NEXT day.
|
|
30
|
+
var when = b.scheduler.nextBaselineFire("02:30", "UTC", new Date("2026-05-09T02:30:00.000Z"));
|
|
31
|
+
check("nextBaselineFire is strictly-after (rolls a day when at target)",
|
|
32
|
+
_iso(when) === "2026-05-10T02:30:00.000Z");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function testNextBaselineFireRollsWhenPast() {
|
|
36
|
+
var when = b.scheduler.nextBaselineFire("02:30", "UTC", new Date("2026-05-09T05:00:00Z"));
|
|
37
|
+
check("nextBaselineFire rolls to next day when time already passed today",
|
|
38
|
+
_iso(when) === "2026-05-10T02:30:00.000Z");
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function testNextBaselineFireNonUtcZone() {
|
|
42
|
+
// America/New_York on 2026-05-09 is EDT (UTC-4): 02:30 local = 06:30 UTC.
|
|
43
|
+
var when = b.scheduler.nextBaselineFire("02:30", "America/New_York", new Date("2026-05-09T00:00:00Z"));
|
|
44
|
+
check("nextBaselineFire honors a non-UTC timeZone",
|
|
45
|
+
_iso(when) === "2026-05-09T06:30:00.000Z");
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function testNextBaselineFireLocalClock() {
|
|
49
|
+
// null timeZone follows the server's local clock — assert the local
|
|
50
|
+
// wall-clock of the result matches the requested HH:MM (TZ-independent).
|
|
51
|
+
var after = new Date("2026-05-09T00:00:00Z");
|
|
52
|
+
var when = b.scheduler.nextBaselineFire("13:45", null, after);
|
|
53
|
+
var d = new Date(when);
|
|
54
|
+
check("nextBaselineFire local-clock matches requested HH:MM",
|
|
55
|
+
d.getHours() === 13 && d.getMinutes() === 45);
|
|
56
|
+
check("nextBaselineFire local-clock result is strictly after `after`",
|
|
57
|
+
when > after.getTime());
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function testNextBaselineFireRejectsBadInput() {
|
|
61
|
+
var t1 = null;
|
|
62
|
+
try { b.scheduler.nextBaselineFire("2:3", "UTC", new Date()); } catch (e) { t1 = e; }
|
|
63
|
+
check("nextBaselineFire rejects malformed HH:MM",
|
|
64
|
+
t1 && t1.code === "scheduler/invalid-baseline");
|
|
65
|
+
var t2 = null;
|
|
66
|
+
try { b.scheduler.nextBaselineFire("25:00", "UTC", new Date()); } catch (e) { t2 = e; }
|
|
67
|
+
check("nextBaselineFire rejects out-of-range hour",
|
|
68
|
+
t2 && t2.code === "scheduler/invalid-baseline");
|
|
69
|
+
var t3 = null;
|
|
70
|
+
try { b.scheduler.nextBaselineFire("12:60", "UTC", new Date()); } catch (e) { t3 = e; }
|
|
71
|
+
check("nextBaselineFire rejects out-of-range minute",
|
|
72
|
+
t3 && t3.code === "scheduler/invalid-baseline");
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function _sortedSet(s) { return Array.from(s).sort(function (a, b) { return a - b; }); }
|
|
76
|
+
function _eq(a, b) { return JSON.stringify(a) === JSON.stringify(b); }
|
|
77
|
+
|
|
78
|
+
// A bare number followed by a step (`N/step`) is the Vixie-cron / crontab.guru
|
|
79
|
+
// shorthand for `N-max/step` — it fires at N and every `step` thereafter up to
|
|
80
|
+
// the field maximum, NOT just at the single value N. `5/15` in the minute
|
|
81
|
+
// field is 5,20,35,50 (the same way `*/15` is 0,15,30,45); before the fix it
|
|
82
|
+
// silently collapsed to {5}, so a task the operator meant to run every 15
|
|
83
|
+
// minutes ran once an hour. That silent under-firing is exactly the class the
|
|
84
|
+
// framework already rejects for over-range steps (v0.6.65).
|
|
85
|
+
function testCronBareNumberStep() {
|
|
86
|
+
var m = b.scheduler.parseCron("5/15 * * * *");
|
|
87
|
+
check("cron 5/15 minute expands to 5,20,35,50 (N/step == N-max/step)",
|
|
88
|
+
_eq(_sortedSet(m.minute), [5, 20, 35, 50]));
|
|
89
|
+
|
|
90
|
+
var m2 = b.scheduler.parseCron("10/20 * * * *");
|
|
91
|
+
check("cron 10/20 minute expands to 10,30,50",
|
|
92
|
+
_eq(_sortedSet(m2.minute), [10, 30, 50]));
|
|
93
|
+
|
|
94
|
+
// `0/15` must be identical to `*/15` — both start at 0 and step by 15.
|
|
95
|
+
var m3 = b.scheduler.parseCron("0/15 * * * *");
|
|
96
|
+
check("cron 0/15 minute equals */15 (0,15,30,45)",
|
|
97
|
+
_eq(_sortedSet(m3.minute), [0, 15, 30, 45]));
|
|
98
|
+
|
|
99
|
+
var h = b.scheduler.parseCron("* 1/6 * * *");
|
|
100
|
+
check("cron 1/6 hour expands to 1,7,13,19",
|
|
101
|
+
_eq(_sortedSet(h.hour), [1, 7, 13, 19]));
|
|
102
|
+
|
|
103
|
+
// dom starts at 1: `2/10` day-of-month = 2,12,22 (max 31).
|
|
104
|
+
var d = b.scheduler.parseCron("0 0 2/10 * *");
|
|
105
|
+
check("cron 2/10 dom expands to 2,12,22",
|
|
106
|
+
_eq(_sortedSet(d.dom), [2, 12, 22]));
|
|
107
|
+
|
|
108
|
+
// Regressions: forms that must be UNCHANGED by the fix.
|
|
109
|
+
var star = b.scheduler.parseCron("*/15 * * * *");
|
|
110
|
+
check("cron */15 unchanged (0,15,30,45)",
|
|
111
|
+
_eq(_sortedSet(star.minute), [0, 15, 30, 45]));
|
|
112
|
+
var bare = b.scheduler.parseCron("5 * * * *");
|
|
113
|
+
check("cron bare 5 (no step) is the single value {5}",
|
|
114
|
+
_eq(_sortedSet(bare.minute), [5]));
|
|
115
|
+
var list = b.scheduler.parseCron("0,30 * * * *");
|
|
116
|
+
check("cron list 0,30 unchanged",
|
|
117
|
+
_eq(_sortedSet(list.minute), [0, 30]));
|
|
118
|
+
var range = b.scheduler.parseCron("10-20/5 * * * *");
|
|
119
|
+
check("cron explicit range 10-20/5 unchanged (10,15,20)",
|
|
120
|
+
_eq(_sortedSet(range.minute), [10, 15, 20]));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// nextCronFire must actually fire at every step position of an `N/step`
|
|
124
|
+
// schedule — the real consumer path a queue cron-repeat / scheduler task
|
|
125
|
+
// drives. `5/15` fires at :05, :20, :35, :50, then :05 the next hour.
|
|
126
|
+
function testCronBareNumberStepNextFire() {
|
|
127
|
+
var cron = b.scheduler.parseCron("5/15 * * * *");
|
|
128
|
+
var t = new Date("2026-05-09T00:00:00Z");
|
|
129
|
+
var fires = [];
|
|
130
|
+
for (var i = 0; i < 5; i++) {
|
|
131
|
+
var next = b.scheduler.nextCronFire(cron, t, "UTC");
|
|
132
|
+
fires.push(new Date(next).toISOString().slice(11, 16));
|
|
133
|
+
t = new Date(next);
|
|
134
|
+
}
|
|
135
|
+
check("nextCronFire 5/15 fires at every 15-min step, not once an hour",
|
|
136
|
+
_eq(fires, ["00:05", "00:20", "00:35", "00:50", "01:05"]));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async function run() {
|
|
140
|
+
testNextBaselineFireKnownAnswerUtc();
|
|
141
|
+
testNextBaselineFireStrictlyAfter();
|
|
142
|
+
testNextBaselineFireRollsWhenPast();
|
|
143
|
+
testNextBaselineFireNonUtcZone();
|
|
144
|
+
testNextBaselineFireLocalClock();
|
|
145
|
+
testNextBaselineFireRejectsBadInput();
|
|
146
|
+
testCronBareNumberStep();
|
|
147
|
+
testCronBareNumberStepNextFire();
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
module.exports = { run: run };
|
|
151
|
+
|
|
152
|
+
if (require.main === module) {
|
|
153
|
+
run().then(
|
|
154
|
+
function () { console.log("[scheduler] OK — " + helpers.getChecks() + " checks passed"); },
|
|
155
|
+
function (e) { console.error("FAIL:", e); process.exit(1); }
|
|
156
|
+
);
|
|
157
|
+
}
|