@blamejs/blamejs-shop 0.5.12 → 0.5.14
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/lib/asset-manifest.json +1 -1
- package/lib/sales-tax-filings.js +143 -0
- 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
|
@@ -5,9 +5,15 @@
|
|
|
5
5
|
* b.ddlChangeControl — formal DDL approval / change-control workflow.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
8
|
+
var fs = require("fs");
|
|
9
|
+
var os = require("os");
|
|
10
|
+
var path = require("path");
|
|
11
|
+
|
|
12
|
+
var helpers = require("../helpers");
|
|
13
|
+
var b = helpers.b;
|
|
14
|
+
var check = helpers.check;
|
|
15
|
+
var setupTestDb = helpers.setupTestDb;
|
|
16
|
+
var teardownTestDb = helpers.teardownTestDb;
|
|
11
17
|
|
|
12
18
|
function _fakeAudit() {
|
|
13
19
|
var emitted = [];
|
|
@@ -17,11 +23,18 @@ function _fakeAudit() {
|
|
|
17
23
|
};
|
|
18
24
|
}
|
|
19
25
|
|
|
26
|
+
function _tmp() { return fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-ddlcc-")); }
|
|
27
|
+
|
|
20
28
|
function testSurface() {
|
|
21
29
|
check("ddlChangeControl.create is a function",
|
|
22
30
|
typeof b.ddlChangeControl.create === "function");
|
|
23
31
|
check("STATES.PROPOSED", b.ddlChangeControl.STATES.PROPOSED === "proposed");
|
|
24
32
|
check("STATES.APPROVED", b.ddlChangeControl.STATES.APPROVED === "approved");
|
|
33
|
+
check("STATES.APPLIED", b.ddlChangeControl.STATES.APPLIED === "applied");
|
|
34
|
+
check("STATES.REJECTED", b.ddlChangeControl.STATES.REJECTED === "rejected");
|
|
35
|
+
check("STATES.FAILED", b.ddlChangeControl.STATES.FAILED === "failed");
|
|
36
|
+
check("POSTURES_REQUIRING_CHANGE_CONTROL lists sox-404",
|
|
37
|
+
b.ddlChangeControl.POSTURES_REQUIRING_CHANGE_CONTROL.indexOf("sox-404") !== -1);
|
|
25
38
|
check("frameworkError.DdlChangeControlError exposed",
|
|
26
39
|
typeof b.frameworkError.DdlChangeControlError === "function");
|
|
27
40
|
check("ddlChangeControl.DdlChangeControlError is fn",
|
|
@@ -167,6 +180,438 @@ async function testSqlTamperRefused() {
|
|
|
167
180
|
threw && /sql-tampered/.test(threw.code || ""));
|
|
168
181
|
}
|
|
169
182
|
|
|
183
|
+
// ---- error / adversarial / default branches added for coverage ----
|
|
184
|
+
|
|
185
|
+
function _codeOf(fn) {
|
|
186
|
+
var threw = null;
|
|
187
|
+
try { fn(); } catch (e) { threw = e; }
|
|
188
|
+
return threw ? (threw.code || "") : null;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async function _asyncCode(fn) {
|
|
192
|
+
var threw = null;
|
|
193
|
+
try { await fn(); } catch (e) { threw = e; }
|
|
194
|
+
return threw ? (threw.code || "") : null;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function testCreateOptionValidation() {
|
|
198
|
+
// approvers must be a positive integer.
|
|
199
|
+
check("approvers=0 rejected", /bad-approvers/.test(_codeOf(function () {
|
|
200
|
+
b.ddlChangeControl.create({ audit: _fakeAudit(), approvers: 0 });
|
|
201
|
+
})));
|
|
202
|
+
check("approvers=NaN rejected", /bad-approvers/.test(_codeOf(function () {
|
|
203
|
+
b.ddlChangeControl.create({ audit: _fakeAudit(), approvers: NaN });
|
|
204
|
+
})));
|
|
205
|
+
check("approvers non-number rejected", /bad-approvers/.test(_codeOf(function () {
|
|
206
|
+
b.ddlChangeControl.create({ audit: _fakeAudit(), approvers: "two" });
|
|
207
|
+
})));
|
|
208
|
+
// approvers floored to an integer.
|
|
209
|
+
var ddlFloor = b.ddlChangeControl.create({ audit: _fakeAudit(), approvers: 3.9 });
|
|
210
|
+
check("fractional approvers floored", ddlFloor.approvers === 3);
|
|
211
|
+
|
|
212
|
+
// SOX / PCI posture forces approvers >= 2.
|
|
213
|
+
check("pci-dss + approvers=1 rejected", /insufficient-approvers/.test(_codeOf(function () {
|
|
214
|
+
b.ddlChangeControl.create({ audit: _fakeAudit(), approvers: 1, posture: "pci-dss" });
|
|
215
|
+
})));
|
|
216
|
+
check("sox + approvers=1 rejected", /insufficient-approvers/.test(_codeOf(function () {
|
|
217
|
+
b.ddlChangeControl.create({ audit: _fakeAudit(), approvers: 1, posture: "sox" });
|
|
218
|
+
})));
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function testWindowSpecGrammarErrors() {
|
|
222
|
+
function bad(spec) {
|
|
223
|
+
return _codeOf(function () {
|
|
224
|
+
b.ddlChangeControl.create({ audit: _fakeAudit(), approvers: 1, windowSpec: spec });
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
// Non-string but truthy value reaches the parser.
|
|
228
|
+
check("numeric windowSpec rejected", /bad-window/.test(bad(42)));
|
|
229
|
+
// Wrong field count (missing UTC token).
|
|
230
|
+
check("two-token windowSpec rejected", /bad-window/.test(bad("Mon 09:00-17:00")));
|
|
231
|
+
// Malformed day-range.
|
|
232
|
+
check("A-B-C day range rejected", /bad-window/.test(bad("Mon-Tue-Wed 09:00-17:00 UTC")));
|
|
233
|
+
check("unknown day in range rejected", /bad-window/.test(bad("Xxx-Fri 09:00-17:00 UTC")));
|
|
234
|
+
// Malformed single day.
|
|
235
|
+
check("unknown single day rejected", /bad-window/.test(bad("Xyz 09:00-17:00 UTC")));
|
|
236
|
+
// Hour-range shape errors.
|
|
237
|
+
check("hour-range missing dash rejected", /bad-window/.test(bad("Wed 09:00 UTC")));
|
|
238
|
+
check("non-two-digit hour rejected", /bad-window/.test(bad("Wed 9:00-17:00 UTC")));
|
|
239
|
+
check("hour out of range rejected", /bad-window/.test(bad("Wed 25:00-26:00 UTC")));
|
|
240
|
+
check("start >= end rejected", /bad-window/.test(bad("Wed 17:00-09:00 UTC")));
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function testWindowSpecReverseAndSingleDay() {
|
|
244
|
+
// Reverse day-range wraps across the week (Fri..Sat..Sun..Mon).
|
|
245
|
+
var ddlRev = b.ddlChangeControl.create({
|
|
246
|
+
audit: _fakeAudit(), approvers: 1, windowSpec: "Fri-Mon 09:00-17:00 UTC",
|
|
247
|
+
});
|
|
248
|
+
check("reverse day-range parses", ddlRev.windowSpec === "Fri-Mon 09:00-17:00 UTC");
|
|
249
|
+
// Comma list mixing a single day and a forward range.
|
|
250
|
+
var ddlMix = b.ddlChangeControl.create({
|
|
251
|
+
audit: _fakeAudit(), approvers: 1, windowSpec: "Wed,Fri-Sat 10:00-12:00 UTC",
|
|
252
|
+
});
|
|
253
|
+
check("single-day + range comma list parses",
|
|
254
|
+
ddlMix.windowSpec === "Wed,Fri-Sat 10:00-12:00 UTC");
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
async function testProposeValidation() {
|
|
258
|
+
var ddl = b.ddlChangeControl.create({ audit: _fakeAudit(), approvers: 1 });
|
|
259
|
+
check("empty sql rejected", /bad-sql/.test(await _asyncCode(function () {
|
|
260
|
+
return ddl.propose("", { proposer: "alice" });
|
|
261
|
+
})));
|
|
262
|
+
check("non-string sql rejected", /bad-sql/.test(await _asyncCode(function () {
|
|
263
|
+
return ddl.propose(123, { proposer: "alice" });
|
|
264
|
+
})));
|
|
265
|
+
check("missing proposer rejected", /missing-proposer/.test(await _asyncCode(function () {
|
|
266
|
+
return ddl.propose("ALTER TABLE x ADD y TEXT", {});
|
|
267
|
+
})));
|
|
268
|
+
check("empty proposer rejected", /missing-proposer/.test(await _asyncCode(function () {
|
|
269
|
+
return ddl.propose("ALTER TABLE x ADD y TEXT", { proposer: "" });
|
|
270
|
+
})));
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
async function testApproveValidation() {
|
|
274
|
+
var ddl = b.ddlChangeControl.create({ audit: _fakeAudit(), approvers: 2 });
|
|
275
|
+
var prop = await ddl.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
276
|
+
|
|
277
|
+
check("approve empty changeId rejected", /bad-id/.test(await _asyncCode(function () {
|
|
278
|
+
return ddl.approve("", "bob");
|
|
279
|
+
})));
|
|
280
|
+
check("approve empty approver rejected", /missing-approver/.test(await _asyncCode(function () {
|
|
281
|
+
return ddl.approve(prop.changeId, "");
|
|
282
|
+
})));
|
|
283
|
+
check("approve unknown change rejected", /unknown-change/.test(await _asyncCode(function () {
|
|
284
|
+
return ddl.approve("does-not-exist", "bob");
|
|
285
|
+
})));
|
|
286
|
+
|
|
287
|
+
// already-rejected branch.
|
|
288
|
+
var rejd = b.ddlChangeControl.create({ audit: _fakeAudit(), approvers: 2 });
|
|
289
|
+
var pr = await rejd.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
290
|
+
await rejd.reject(pr.changeId, "reviewer", "no");
|
|
291
|
+
check("approve of rejected change refused", /already-rejected/.test(await _asyncCode(function () {
|
|
292
|
+
return rejd.approve(pr.changeId, "bob");
|
|
293
|
+
})));
|
|
294
|
+
|
|
295
|
+
// already-applied branch (approvers:1 so one approval + apply completes).
|
|
296
|
+
var app = b.ddlChangeControl.create({ audit: _fakeAudit(), approvers: 1 });
|
|
297
|
+
var pa = await app.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
298
|
+
await app.approve(pa.changeId, "bob");
|
|
299
|
+
await app.applyApproved(pa.changeId, async function () { return { ok: true }; });
|
|
300
|
+
check("approve of applied change refused", /already-applied/.test(await _asyncCode(function () {
|
|
301
|
+
return app.approve(pa.changeId, "carol");
|
|
302
|
+
})));
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
async function testRejectValidation() {
|
|
306
|
+
var ddl = b.ddlChangeControl.create({ audit: _fakeAudit(), approvers: 1 });
|
|
307
|
+
var prop = await ddl.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
308
|
+
|
|
309
|
+
check("reject empty changeId rejected", /bad-id/.test(await _asyncCode(function () {
|
|
310
|
+
return ddl.reject("", "reviewer", "reason");
|
|
311
|
+
})));
|
|
312
|
+
check("reject empty reviewer rejected", /missing-reviewer/.test(await _asyncCode(function () {
|
|
313
|
+
return ddl.reject(prop.changeId, "", "reason");
|
|
314
|
+
})));
|
|
315
|
+
check("reject unknown change rejected", /unknown-change/.test(await _asyncCode(function () {
|
|
316
|
+
return ddl.reject("nope", "reviewer", "reason");
|
|
317
|
+
})));
|
|
318
|
+
|
|
319
|
+
// reject after apply -> already-applied.
|
|
320
|
+
await ddl.approve(prop.changeId, "bob");
|
|
321
|
+
await ddl.applyApproved(prop.changeId, async function () { return { ok: true }; });
|
|
322
|
+
check("reject of applied change refused", /already-applied/.test(await _asyncCode(function () {
|
|
323
|
+
return ddl.reject(prop.changeId, "reviewer", "too late");
|
|
324
|
+
})));
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
async function testApplyApprovedValidation() {
|
|
328
|
+
var ddl = b.ddlChangeControl.create({ audit: _fakeAudit(), approvers: 1 });
|
|
329
|
+
var prop = await ddl.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
330
|
+
|
|
331
|
+
check("non-function runner rejected", /bad-runner/.test(await _asyncCode(function () {
|
|
332
|
+
return ddl.applyApproved(prop.changeId, "not-a-function");
|
|
333
|
+
})));
|
|
334
|
+
check("apply unknown change rejected", /unknown-change/.test(await _asyncCode(function () {
|
|
335
|
+
return ddl.applyApproved("nope", async function () { return null; });
|
|
336
|
+
})));
|
|
337
|
+
|
|
338
|
+
// already-applied branch on applyApproved itself.
|
|
339
|
+
await ddl.approve(prop.changeId, "bob");
|
|
340
|
+
await ddl.applyApproved(prop.changeId, async function () { return { ok: true }; });
|
|
341
|
+
check("re-apply refused", /already-applied/.test(await _asyncCode(function () {
|
|
342
|
+
return ddl.applyApproved(prop.changeId, async function () { return null; });
|
|
343
|
+
})));
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
async function testWindowEnforcementAtApply() {
|
|
347
|
+
// 2026-07-08 is a Wednesday (UTC); 2026-07-12 is a Sunday (UTC).
|
|
348
|
+
var WED_NOON = Date.UTC(2026, 6, 8, 12, 0, 0);
|
|
349
|
+
var WED_2000 = Date.UTC(2026, 6, 8, 20, 0, 0);
|
|
350
|
+
var SUN_NOON = Date.UTC(2026, 6, 12, 12, 0, 0);
|
|
351
|
+
|
|
352
|
+
// In-window apply succeeds.
|
|
353
|
+
var okAudit = _fakeAudit();
|
|
354
|
+
var ddlOk = b.ddlChangeControl.create({
|
|
355
|
+
audit: okAudit, approvers: 1,
|
|
356
|
+
windowSpec: "Mon-Fri 09:00-17:00 UTC",
|
|
357
|
+
now: function () { return WED_NOON; },
|
|
358
|
+
});
|
|
359
|
+
var pOk = await ddlOk.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
360
|
+
await ddlOk.approve(pOk.changeId, "bob");
|
|
361
|
+
var ran = false;
|
|
362
|
+
await ddlOk.applyApproved(pOk.changeId, async function () { ran = true; return { ok: true }; });
|
|
363
|
+
check("in-window apply runs", ran === true);
|
|
364
|
+
|
|
365
|
+
// Day matches but the hour is outside the window -> refused.
|
|
366
|
+
var hourAudit = _fakeAudit();
|
|
367
|
+
var ddlHour = b.ddlChangeControl.create({
|
|
368
|
+
audit: hourAudit, approvers: 1,
|
|
369
|
+
windowSpec: "Mon-Fri 09:00-17:00 UTC",
|
|
370
|
+
now: function () { return WED_2000; },
|
|
371
|
+
});
|
|
372
|
+
var pHour = await ddlHour.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
373
|
+
await ddlHour.approve(pHour.changeId, "bob");
|
|
374
|
+
check("out-of-hours apply refused", /window-closed/.test(await _asyncCode(function () {
|
|
375
|
+
return ddlHour.applyApproved(pHour.changeId, async function () { return null; });
|
|
376
|
+
})));
|
|
377
|
+
check("window-closed refusal audited",
|
|
378
|
+
hourAudit._emitted.some(function (e) {
|
|
379
|
+
return e.action === "ddl.change.apply_refused" &&
|
|
380
|
+
e.metadata && e.metadata.reason === "window-closed";
|
|
381
|
+
}));
|
|
382
|
+
|
|
383
|
+
// Day itself is outside the allowed set -> refused.
|
|
384
|
+
var dayAudit = _fakeAudit();
|
|
385
|
+
var ddlDay = b.ddlChangeControl.create({
|
|
386
|
+
audit: dayAudit, approvers: 1,
|
|
387
|
+
windowSpec: "Mon-Fri 09:00-17:00 UTC",
|
|
388
|
+
now: function () { return SUN_NOON; },
|
|
389
|
+
});
|
|
390
|
+
var pDay = await ddlDay.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
391
|
+
await ddlDay.approve(pDay.changeId, "bob");
|
|
392
|
+
check("out-of-day apply refused", /window-closed/.test(await _asyncCode(function () {
|
|
393
|
+
return ddlDay.applyApproved(pDay.changeId, async function () { return null; });
|
|
394
|
+
})));
|
|
395
|
+
|
|
396
|
+
// An "always" window never gates apply, whatever the clock reads.
|
|
397
|
+
var ddlAlways = b.ddlChangeControl.create({
|
|
398
|
+
audit: _fakeAudit(), approvers: 1, windowSpec: "always",
|
|
399
|
+
now: function () { return SUN_NOON; },
|
|
400
|
+
});
|
|
401
|
+
var pAlways = await ddlAlways.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
402
|
+
await ddlAlways.approve(pAlways.changeId, "bob");
|
|
403
|
+
var ranAlways = false;
|
|
404
|
+
await ddlAlways.applyApproved(pAlways.changeId, async function () {
|
|
405
|
+
ranAlways = true; return { ok: true };
|
|
406
|
+
});
|
|
407
|
+
check("always window applies regardless of day/hour", ranAlways === true);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
async function testRunnerFailurePath() {
|
|
411
|
+
var fakeAudit = _fakeAudit();
|
|
412
|
+
var ddl = b.ddlChangeControl.create({ audit: fakeAudit, approvers: 1 });
|
|
413
|
+
var prop = await ddl.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
414
|
+
await ddl.approve(prop.changeId, "bob");
|
|
415
|
+
|
|
416
|
+
var threw = null;
|
|
417
|
+
try {
|
|
418
|
+
await ddl.applyApproved(prop.changeId, async function () {
|
|
419
|
+
throw new Error("runner boom");
|
|
420
|
+
});
|
|
421
|
+
} catch (e) { threw = e; }
|
|
422
|
+
check("runner error propagates", threw && /runner boom/.test(threw.message || ""));
|
|
423
|
+
|
|
424
|
+
var state = ddl.get(prop.changeId);
|
|
425
|
+
check("failed runner sets state=failed",
|
|
426
|
+
state && state.state === b.ddlChangeControl.STATES.FAILED);
|
|
427
|
+
check("failed runner records applyError",
|
|
428
|
+
state && /runner boom/.test(state.applyError || ""));
|
|
429
|
+
check("failure emits ddl.change.applied outcome=failure",
|
|
430
|
+
fakeAudit._emitted.some(function (e) {
|
|
431
|
+
return e.action === "ddl.change.applied" && e.outcome === "failure";
|
|
432
|
+
}));
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
async function testListAndGet() {
|
|
436
|
+
var ddl = b.ddlChangeControl.create({ audit: _fakeAudit(), approvers: 2 });
|
|
437
|
+
var p1 = await ddl.propose("ALTER TABLE a ADD c1 TEXT", { proposer: "alice" });
|
|
438
|
+
await ddl.approve(p1.changeId, "bob");
|
|
439
|
+
var p2 = await ddl.propose("ALTER TABLE a ADD c2 TEXT", { proposer: "carol" });
|
|
440
|
+
|
|
441
|
+
var listed = ddl.list();
|
|
442
|
+
check("list returns both changes", listed.length === 2);
|
|
443
|
+
var entry = listed.find(function (c) { return c.changeId === p1.changeId; });
|
|
444
|
+
check("list entry carries proposer + approvals",
|
|
445
|
+
entry && entry.proposer === "alice" && entry.approvals.length === 1 &&
|
|
446
|
+
entry.approvals[0].approver === "bob");
|
|
447
|
+
check("list entry omits raw sql",
|
|
448
|
+
entry && !Object.prototype.hasOwnProperty.call(entry, "sql"));
|
|
449
|
+
|
|
450
|
+
var got = ddl.get(p2.changeId);
|
|
451
|
+
check("get returns a deep snapshot with sql",
|
|
452
|
+
got && got.sql === "ALTER TABLE a ADD c2 TEXT" && got.state === "proposed");
|
|
453
|
+
// Mutating the snapshot must not affect stored state.
|
|
454
|
+
got.sql = "MUTATED";
|
|
455
|
+
check("get returns an isolated clone",
|
|
456
|
+
ddl.get(p2.changeId).sql === "ALTER TABLE a ADD c2 TEXT");
|
|
457
|
+
check("get of unknown change returns null", ddl.get("no-such-id") === null);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
async function testSelfApprovalOptAndPostureOverride() {
|
|
461
|
+
// selfApproval:true lets the proposer approve their own change (no posture).
|
|
462
|
+
var ddlSelf = b.ddlChangeControl.create({
|
|
463
|
+
audit: _fakeAudit(), approvers: 1, selfApproval: true,
|
|
464
|
+
});
|
|
465
|
+
var ps = await ddlSelf.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
466
|
+
var rv = await ddlSelf.approve(ps.changeId, "alice");
|
|
467
|
+
check("selfApproval:true permits proposer approval", rv.thresholdMet === true);
|
|
468
|
+
|
|
469
|
+
// posture forces selfApproval false even when explicitly requested.
|
|
470
|
+
var ddlForced = b.ddlChangeControl.create({
|
|
471
|
+
audit: _fakeAudit(), approvers: 2, posture: "sox", selfApproval: true,
|
|
472
|
+
});
|
|
473
|
+
var pf = await ddlForced.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
474
|
+
check("posture overrides selfApproval:true",
|
|
475
|
+
/self-approval-denied/.test(await _asyncCode(function () {
|
|
476
|
+
return ddlForced.approve(pf.changeId, "alice");
|
|
477
|
+
})));
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
async function testSignedPayloads() {
|
|
481
|
+
// signWith returning a Buffer -> base64-encoded signatures stored.
|
|
482
|
+
var bufDdl = b.ddlChangeControl.create({
|
|
483
|
+
audit: _fakeAudit(), approvers: 1,
|
|
484
|
+
signWith: function (bytes) {
|
|
485
|
+
check("signWith receives a Buffer", Buffer.isBuffer(bytes));
|
|
486
|
+
return Buffer.from("buf-signature");
|
|
487
|
+
},
|
|
488
|
+
});
|
|
489
|
+
var pb = await bufDdl.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
490
|
+
var snapB = bufDdl.get(pb.changeId);
|
|
491
|
+
check("buffer proposal signature stored base64",
|
|
492
|
+
snapB && snapB.proposalSignature === Buffer.from("buf-signature").toString("base64"));
|
|
493
|
+
await bufDdl.approve(pb.changeId, "bob");
|
|
494
|
+
var snapB2 = bufDdl.get(pb.changeId);
|
|
495
|
+
check("buffer approval signature stored base64",
|
|
496
|
+
snapB2 && snapB2.approvals[0].signature ===
|
|
497
|
+
Buffer.from("buf-signature").toString("base64"));
|
|
498
|
+
|
|
499
|
+
// signWith returning a string -> coerced via String().
|
|
500
|
+
var strDdl = b.ddlChangeControl.create({
|
|
501
|
+
audit: _fakeAudit(), approvers: 1,
|
|
502
|
+
signWith: function () { return "str-signature"; },
|
|
503
|
+
});
|
|
504
|
+
var psn = await strDdl.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
505
|
+
await strDdl.approve(psn.changeId, "bob");
|
|
506
|
+
var snapS = strDdl.get(psn.changeId);
|
|
507
|
+
check("string proposal signature stored verbatim",
|
|
508
|
+
snapS && snapS.proposalSignature === "str-signature");
|
|
509
|
+
check("string approval signature stored verbatim",
|
|
510
|
+
snapS && snapS.approvals[0].signature === "str-signature");
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
async function testAuditOptionalAndEdgeDefaults() {
|
|
514
|
+
// create() with no opts at all -> full defaults (approvers 2, no posture).
|
|
515
|
+
var defaults = b.ddlChangeControl.create();
|
|
516
|
+
check("create() with no opts defaults approvers=2", defaults.approvers === 2);
|
|
517
|
+
check("create() with no opts has null posture", defaults.posture === null);
|
|
518
|
+
|
|
519
|
+
// No audit configured — the whole lifecycle runs with _emit short-circuited.
|
|
520
|
+
var noAudit = b.ddlChangeControl.create({ approvers: 1 });
|
|
521
|
+
var pna = await noAudit.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
522
|
+
await noAudit.approve(pna.changeId, "bob");
|
|
523
|
+
var outNa = await noAudit.applyApproved(pna.changeId, async function () { return { ok: true }; });
|
|
524
|
+
check("lifecycle works with no audit sink", outNa.result.ok === true);
|
|
525
|
+
|
|
526
|
+
// Audit whose safeEmit throws — emissions are best-effort and swallowed.
|
|
527
|
+
var throwingAudit = { safeEmit: function () { throw new Error("audit down"); } };
|
|
528
|
+
var badAuditDdl = b.ddlChangeControl.create({ audit: throwingAudit, approvers: 1 });
|
|
529
|
+
var pta = await badAuditDdl.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
530
|
+
check("throwing audit does not break propose", typeof pta.changeId === "string");
|
|
531
|
+
|
|
532
|
+
// propose called with no options object at all -> defaults, then proposer check.
|
|
533
|
+
var defOpts = b.ddlChangeControl.create({ approvers: 1 });
|
|
534
|
+
check("propose without options rejects on missing proposer",
|
|
535
|
+
/missing-proposer/.test(await _asyncCode(function () {
|
|
536
|
+
return defOpts.propose("ALTER TABLE x ADD y TEXT");
|
|
537
|
+
})));
|
|
538
|
+
|
|
539
|
+
// Self-approval denied with NO posture -> error text falls back to "default".
|
|
540
|
+
var noPosture = b.ddlChangeControl.create({ approvers: 1 });
|
|
541
|
+
var pnp = await noPosture.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
542
|
+
var selfErr = null;
|
|
543
|
+
try { await noPosture.approve(pnp.changeId, "alice"); } catch (e) { selfErr = e; }
|
|
544
|
+
check("self-approval denied without posture", selfErr &&
|
|
545
|
+
/self-approval-denied/.test(selfErr.code || ""));
|
|
546
|
+
check("self-approval message names default posture",
|
|
547
|
+
selfErr && /'default'/.test(selfErr.message || ""));
|
|
548
|
+
|
|
549
|
+
// reject with no reason -> stored rejection.reason is null.
|
|
550
|
+
var rej = b.ddlChangeControl.create({ approvers: 1 });
|
|
551
|
+
var prj = await rej.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
552
|
+
await rej.reject(prj.changeId, "reviewer");
|
|
553
|
+
var rjSnap = rej.get(prj.changeId);
|
|
554
|
+
check("reject without reason sets state=rejected",
|
|
555
|
+
rjSnap && rjSnap.state === b.ddlChangeControl.STATES.REJECTED);
|
|
556
|
+
check("reject without reason stores null reason",
|
|
557
|
+
rjSnap && rjSnap.rejection && rjSnap.rejection.reason === null);
|
|
558
|
+
|
|
559
|
+
// Runner throwing a non-Error value -> applyError coerced via String().
|
|
560
|
+
var strFail = b.ddlChangeControl.create({ approvers: 1 });
|
|
561
|
+
var psf = await strFail.propose("ALTER TABLE x ADD y TEXT", { proposer: "alice" });
|
|
562
|
+
await strFail.approve(psf.changeId, "bob");
|
|
563
|
+
var nonErr = null;
|
|
564
|
+
try {
|
|
565
|
+
await strFail.applyApproved(psf.changeId, async function () {
|
|
566
|
+
throw "plain-string-failure"; // eslint-disable-line no-throw-literal
|
|
567
|
+
});
|
|
568
|
+
} catch (e) { nonErr = e; }
|
|
569
|
+
check("non-Error runner throw propagates", nonErr === "plain-string-failure");
|
|
570
|
+
var sfSnap = strFail.get(psf.changeId);
|
|
571
|
+
check("non-Error failure coerced into applyError",
|
|
572
|
+
sfSnap && sfSnap.applyError === "plain-string-failure" &&
|
|
573
|
+
sfSnap.state === b.ddlChangeControl.STATES.FAILED);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
async function testRealDdlApplyAndRefusalOnLiveDb() {
|
|
577
|
+
var tmpDir = _tmp();
|
|
578
|
+
await setupTestDb(tmpDir);
|
|
579
|
+
try {
|
|
580
|
+
var ddl = b.ddlChangeControl.create({ audit: _fakeAudit(), approvers: 2 });
|
|
581
|
+
var sql = "CREATE TABLE ddl_scratch (id INTEGER PRIMARY KEY, note TEXT)";
|
|
582
|
+
var prop = await ddl.propose(sql, {
|
|
583
|
+
proposer: "alice", reason: "scratch table", ticket: "OPS-1",
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
function tableExists() {
|
|
587
|
+
var row = b.db.prepare(
|
|
588
|
+
"SELECT name FROM sqlite_master WHERE type='table' AND name='ddl_scratch'"
|
|
589
|
+
).get();
|
|
590
|
+
return !!row;
|
|
591
|
+
}
|
|
592
|
+
var runner = async function (ddlSql) { b.db.runSql(ddlSql); return { created: true }; };
|
|
593
|
+
|
|
594
|
+
// Unapproved change is refused and the live schema is untouched.
|
|
595
|
+
var refused = null;
|
|
596
|
+
try { await ddl.applyApproved(prop.changeId, runner); } catch (e) { refused = e; }
|
|
597
|
+
check("live: unapproved apply refused",
|
|
598
|
+
refused && /insufficient-approvals/.test(refused.code || ""));
|
|
599
|
+
check("live: schema not mutated by refused change", tableExists() === false);
|
|
600
|
+
|
|
601
|
+
// Two independent approvers clear the threshold, then the runner applies it.
|
|
602
|
+
await ddl.approve(prop.changeId, "bob");
|
|
603
|
+
await ddl.approve(prop.changeId, "carol");
|
|
604
|
+
var out = await ddl.applyApproved(prop.changeId, runner);
|
|
605
|
+
check("live: approved apply returns runner result",
|
|
606
|
+
out.result && out.result.created === true);
|
|
607
|
+
check("live: schema mutated after approved apply", tableExists() === true);
|
|
608
|
+
check("live: change recorded as applied",
|
|
609
|
+
ddl.get(prop.changeId).state === b.ddlChangeControl.STATES.APPLIED);
|
|
610
|
+
} finally {
|
|
611
|
+
await teardownTestDb(tmpDir);
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
|
|
170
615
|
async function run() {
|
|
171
616
|
testSurface();
|
|
172
617
|
await testProposeApproveApply();
|
|
@@ -176,6 +621,20 @@ async function run() {
|
|
|
176
621
|
await testRejectThenApply();
|
|
177
622
|
testWindowSpecParsing();
|
|
178
623
|
await testSqlTamperRefused();
|
|
624
|
+
testCreateOptionValidation();
|
|
625
|
+
testWindowSpecGrammarErrors();
|
|
626
|
+
testWindowSpecReverseAndSingleDay();
|
|
627
|
+
await testProposeValidation();
|
|
628
|
+
await testApproveValidation();
|
|
629
|
+
await testRejectValidation();
|
|
630
|
+
await testApplyApprovedValidation();
|
|
631
|
+
await testWindowEnforcementAtApply();
|
|
632
|
+
await testRunnerFailurePath();
|
|
633
|
+
await testListAndGet();
|
|
634
|
+
await testSelfApprovalOptAndPostureOverride();
|
|
635
|
+
await testSignedPayloads();
|
|
636
|
+
await testAuditOptionalAndEdgeDefaults();
|
|
637
|
+
await testRealDdlApplyAndRefusalOnLiveDb();
|
|
179
638
|
}
|
|
180
639
|
|
|
181
640
|
module.exports = { run: run };
|