@blamejs/blamejs-shop 0.5.12 → 0.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/vendor/MANIFEST.json +632 -416
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
- package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
- package/lib/vendor/blamejs/.gitignore +2 -0
- package/lib/vendor/blamejs/CHANGELOG.md +122 -0
- package/lib/vendor/blamejs/NOTICE +26 -1
- package/lib/vendor/blamejs/SECURITY.md +1 -1
- package/lib/vendor/blamejs/api-snapshot.json +207 -5
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
- package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
- package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
- package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
- package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
- package/lib/vendor/blamejs/index.js +6 -0
- package/lib/vendor/blamejs/lib/a2a.js +4 -4
- package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
- package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
- package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
- package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
- package/lib/vendor/blamejs/lib/archive-read.js +8 -0
- package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
- package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
- package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
- package/lib/vendor/blamejs/lib/audit.js +71 -8
- package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
- package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
- package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
- package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
- package/lib/vendor/blamejs/lib/backup/index.js +16 -5
- package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
- package/lib/vendor/blamejs/lib/base32.js +21 -0
- package/lib/vendor/blamejs/lib/break-glass.js +19 -10
- package/lib/vendor/blamejs/lib/bundler.js +5 -1
- package/lib/vendor/blamejs/lib/cache-status.js +3 -7
- package/lib/vendor/blamejs/lib/calendar.js +21 -1
- package/lib/vendor/blamejs/lib/cbor.js +12 -1
- package/lib/vendor/blamejs/lib/cert.js +29 -11
- package/lib/vendor/blamejs/lib/cli.js +94 -24
- package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
- package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
- package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
- package/lib/vendor/blamejs/lib/content-digest.js +2 -1
- package/lib/vendor/blamejs/lib/cookies.js +13 -3
- package/lib/vendor/blamejs/lib/cose.js +31 -16
- package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
- package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
- package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
- package/lib/vendor/blamejs/lib/crypto.js +314 -19
- package/lib/vendor/blamejs/lib/csp.js +11 -3
- package/lib/vendor/blamejs/lib/daemon.js +270 -24
- package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
- package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
- package/lib/vendor/blamejs/lib/db-query.js +34 -7
- package/lib/vendor/blamejs/lib/db.js +18 -6
- package/lib/vendor/blamejs/lib/dbsc.js +17 -0
- package/lib/vendor/blamejs/lib/dev.js +21 -2
- package/lib/vendor/blamejs/lib/dsr.js +157 -102
- package/lib/vendor/blamejs/lib/external-db.js +41 -2
- package/lib/vendor/blamejs/lib/file-upload.js +25 -7
- package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
- package/lib/vendor/blamejs/lib/forms.js +113 -27
- package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
- package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
- package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
- package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
- package/lib/vendor/blamejs/lib/guard-html.js +26 -53
- package/lib/vendor/blamejs/lib/guard-image.js +24 -5
- package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
- package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
- package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
- package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
- package/lib/vendor/blamejs/lib/guard-time.js +1 -1
- package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
- package/lib/vendor/blamejs/lib/html-balance.js +3 -3
- package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
- package/lib/vendor/blamejs/lib/http-client.js +39 -7
- package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
- package/lib/vendor/blamejs/lib/i18n.js +35 -21
- package/lib/vendor/blamejs/lib/incident-report.js +8 -1
- package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
- package/lib/vendor/blamejs/lib/json-path.js +23 -1
- package/lib/vendor/blamejs/lib/jwk.js +20 -3
- package/lib/vendor/blamejs/lib/link-header.js +2 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream.js +8 -3
- package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
- package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
- package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
- package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
- package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
- package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
- package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
- package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
- package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
- package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
- package/lib/vendor/blamejs/lib/mail.js +15 -5
- package/lib/vendor/blamejs/lib/metrics.js +268 -63
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
- package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
- package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
- package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
- package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
- package/lib/vendor/blamejs/lib/network-dns.js +21 -2
- package/lib/vendor/blamejs/lib/network-tls.js +69 -7
- package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
- package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
- package/lib/vendor/blamejs/lib/outbox.js +1 -1
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
- package/lib/vendor/blamejs/lib/permissions.js +6 -3
- package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
- package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
- package/lib/vendor/blamejs/lib/pubsub.js +20 -9
- package/lib/vendor/blamejs/lib/queue-local.js +8 -1
- package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
- package/lib/vendor/blamejs/lib/redact.js +54 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
- package/lib/vendor/blamejs/lib/restore.js +19 -0
- package/lib/vendor/blamejs/lib/retention.js +12 -4
- package/lib/vendor/blamejs/lib/router.js +60 -6
- package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
- package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
- package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
- package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
- package/lib/vendor/blamejs/lib/safe-object.js +80 -0
- package/lib/vendor/blamejs/lib/safe-path.js +52 -4
- package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
- package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
- package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
- package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
- package/lib/vendor/blamejs/lib/scheduler.js +8 -1
- package/lib/vendor/blamejs/lib/security-assert.js +6 -6
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
- package/lib/vendor/blamejs/lib/self-update.js +517 -87
- package/lib/vendor/blamejs/lib/server-timing.js +2 -4
- package/lib/vendor/blamejs/lib/session.js +34 -12
- package/lib/vendor/blamejs/lib/sql.js +15 -1
- package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
- package/lib/vendor/blamejs/lib/static.js +55 -13
- package/lib/vendor/blamejs/lib/storage.js +8 -2
- package/lib/vendor/blamejs/lib/subject.js +6 -1
- package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
- package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
- package/lib/vendor/blamejs/lib/tsa.js +34 -13
- package/lib/vendor/blamejs/lib/uri-template.js +8 -1
- package/lib/vendor/blamejs/lib/vault/index.js +13 -0
- package/lib/vendor/blamejs/lib/vc.js +44 -5
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
- package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
- package/lib/vendor/blamejs/lib/watcher.js +89 -17
- package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
- package/lib/vendor/blamejs/lib/webhook.js +12 -2
- package/lib/vendor/blamejs/lib/ws-client.js +32 -1
- package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
- package/lib/vendor/blamejs/package-lock.json +2 -2
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
- package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
- package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
- package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
- package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
- package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
- package/lib/vendor/blamejs/socket.yml +94 -0
- package/lib/vendor/blamejs/test/00-primitives.js +605 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
- package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
- package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
- package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
- package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
- package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
- package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
- package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
- package/lib/vendor/blamejs/test/smoke.js +2 -0
- package/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
- package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
- package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
- package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
- package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
- package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
|
@@ -179,6 +179,54 @@ async function run() {
|
|
|
179
179
|
rejectsS("delim same as quote", function () { b.csv.stringify([{ a: 1 }], { delimiter: "\"" }); }, /csv\/bad-delimiter/);
|
|
180
180
|
rejectsS("bad eol", function () { b.csv.stringify([{ a: 1 }], { eol: "X" }); }, /csv\/bad-opt/);
|
|
181
181
|
check("stringify: empty array → empty string", b.csv.stringify([]) === "");
|
|
182
|
+
|
|
183
|
+
// ---- DEFAULTS_PARSE — documented values + parse honors them ----
|
|
184
|
+
var dp = b.csv.DEFAULTS_PARSE;
|
|
185
|
+
check("DEFAULTS_PARSE.maxBytes is 16 MiB", dp.maxBytes === 16777216);
|
|
186
|
+
check("DEFAULTS_PARSE.maxRows is 1,000,000", dp.maxRows === 1000000);
|
|
187
|
+
check("DEFAULTS_PARSE.maxFieldBytes is 1 MiB", dp.maxFieldBytes === 1048576);
|
|
188
|
+
check("DEFAULTS_PARSE.delimiter is comma", dp.delimiter === ",");
|
|
189
|
+
check("DEFAULTS_PARSE.quote is double-quote", dp.quote === "\"");
|
|
190
|
+
check("DEFAULTS_PARSE.header defaults true", dp.header === true);
|
|
191
|
+
check("DEFAULTS_PARSE.trim defaults false", dp.trim === false);
|
|
192
|
+
check("DEFAULTS_PARSE.onBadRow defaults throw", dp.onBadRow === "throw");
|
|
193
|
+
|
|
194
|
+
// parse honors header:true by default → returns objects keyed by header.
|
|
195
|
+
var dpRows = b.csv.parse("k,v\nx,1");
|
|
196
|
+
check("DEFAULTS_PARSE: default header→objects", !Array.isArray(dpRows[0]) && dpRows[0].k === "x");
|
|
197
|
+
// parse honors the default comma delimiter (a tab is data, not a split).
|
|
198
|
+
var dpTab = b.csv.parse("a\tb\nc\td");
|
|
199
|
+
check("DEFAULTS_PARSE: default delimiter is comma", dpTab[0]["a\tb"] === "c\td");
|
|
200
|
+
// parse enforces DEFAULTS_PARSE.maxBytes: input at the exact cap parses;
|
|
201
|
+
// one byte over is refused with csv/too-large. maxFieldBytes stays well
|
|
202
|
+
// above the tiny fixture so only the byte cap under test can fire.
|
|
203
|
+
var underCap = "h\n" + "a".repeat(dp.maxBytes - 2); // exactly maxBytes
|
|
204
|
+
check("DEFAULTS_PARSE: input at maxBytes parses",
|
|
205
|
+
b.csv.parse(underCap, { maxFieldBytes: dp.maxBytes }).length === 1);
|
|
206
|
+
var overThrew = null;
|
|
207
|
+
try { b.csv.parse(underCap + "a"); } catch (e) { overThrew = e; }
|
|
208
|
+
check("DEFAULTS_PARSE: input over maxBytes refused",
|
|
209
|
+
!!overThrew && /csv\/too-large/.test(overThrew.code || ""));
|
|
210
|
+
|
|
211
|
+
// ---- DEFAULTS_STRINGIFY — documented values + stringify honors them ----
|
|
212
|
+
var ds = b.csv.DEFAULTS_STRINGIFY;
|
|
213
|
+
check("DEFAULTS_STRINGIFY.header defaults true", ds.header === true);
|
|
214
|
+
check("DEFAULTS_STRINGIFY.delimiter is comma", ds.delimiter === ",");
|
|
215
|
+
check("DEFAULTS_STRINGIFY.eol is CRLF", ds.eol === "\r\n");
|
|
216
|
+
check("DEFAULTS_STRINGIFY.quote is double-quote",ds.quote === "\"");
|
|
217
|
+
check("DEFAULTS_STRINGIFY.alwaysQuote false", ds.alwaysQuote === false);
|
|
218
|
+
check("DEFAULTS_STRINGIFY.columns defaults null",ds.columns === null);
|
|
219
|
+
|
|
220
|
+
// stringify honors DEFAULTS_STRINGIFY.eol (CRLF) + header:true + no-quote.
|
|
221
|
+
var dsOut = b.csv.stringify([{ a: "1", bee: "2" }]);
|
|
222
|
+
var dsLines = dsOut.split(b.csv.DEFAULTS_STRINGIFY.eol);
|
|
223
|
+
check("DEFAULTS_STRINGIFY: default eol splits into header+row",
|
|
224
|
+
dsLines.length === 2 && dsLines[0] === "a,bee" && dsLines[1] === "1,2");
|
|
225
|
+
check("DEFAULTS_STRINGIFY: default eol is literally CRLF",
|
|
226
|
+
dsOut.indexOf("\r\n") !== -1);
|
|
227
|
+
// alwaysQuote:false default → a plain cell is emitted bare.
|
|
228
|
+
check("DEFAULTS_STRINGIFY: default alwaysQuote false leaves plain cell unquoted",
|
|
229
|
+
b.csv.stringify([{ a: "plain" }]).indexOf("\"") === -1);
|
|
182
230
|
}
|
|
183
231
|
|
|
184
232
|
module.exports = { run: run };
|
|
@@ -191,19 +191,477 @@ async function testDaemonStaleCleanupOnStartReap() {
|
|
|
191
191
|
}
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
+
function testDaemonStartRejectsMalformedOptTypes() {
|
|
195
|
+
var threw = null;
|
|
196
|
+
try { b.daemon.start({ pidFile: "/tmp/x.pid", logFile: 123 }); } catch (e) { threw = e; }
|
|
197
|
+
check("start(): non-string logFile -> daemon/bad-log-file",
|
|
198
|
+
threw && /daemon\/bad-log-file/.test(threw.code || ""));
|
|
199
|
+
|
|
200
|
+
threw = null;
|
|
201
|
+
try { b.daemon.start({ pidFile: "/tmp/x.pid", command: 123 }); } catch (e) { threw = e; }
|
|
202
|
+
check("start(): non-string command -> daemon/bad-command",
|
|
203
|
+
threw && /daemon\/bad-command/.test(threw.code || ""));
|
|
204
|
+
|
|
205
|
+
threw = null;
|
|
206
|
+
try { b.daemon.start({ pidFile: "/tmp/x.pid", command: "/bin/true", args: "not-an-array" }); }
|
|
207
|
+
catch (e) { threw = e; }
|
|
208
|
+
check("start(): non-array args -> daemon/bad-args",
|
|
209
|
+
threw && /daemon\/bad-args/.test(threw.code || ""));
|
|
210
|
+
|
|
211
|
+
threw = null;
|
|
212
|
+
try { b.daemon.start({ pidFile: "/tmp/x.pid", signals: "SIGTERM" }); } catch (e) { threw = e; }
|
|
213
|
+
check("start(): non-array signals -> daemon/bad-signals",
|
|
214
|
+
threw && /daemon\/bad-signals/.test(threw.code || ""));
|
|
215
|
+
|
|
216
|
+
threw = null;
|
|
217
|
+
try { b.daemon.start({ pidFile: "/tmp/x.pid", signals: ["SIGTERM", ""] }); } catch (e) { threw = e; }
|
|
218
|
+
check("start(): empty-string signal element -> daemon/bad-signals",
|
|
219
|
+
threw && /daemon\/bad-signals/.test(threw.code || ""));
|
|
220
|
+
|
|
221
|
+
threw = null;
|
|
222
|
+
try { b.daemon.start({ pidFile: "/tmp/x.pid", bogusOpt: true }); } catch (e) { threw = e; }
|
|
223
|
+
check("start(): unknown opt refused by exhaustive shape",
|
|
224
|
+
threw && /daemon\/bad-opts/.test(threw.code || ""));
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// The documented `cwd` opt (foreground-agnostic; forwarded to the detached
|
|
228
|
+
// child's spawn) must be accepted and threaded through to processSpawn. It
|
|
229
|
+
// was rejected by the exhaustive opts shape (undeclared field) despite being
|
|
230
|
+
// advertised in @opts — a passing operator call threw daemon/bad-opts.
|
|
231
|
+
async function testDaemonStartForwardsCwdToDetachedChild() {
|
|
232
|
+
var pidFile = _tmpFile("cwd.pid");
|
|
233
|
+
var chosenCwd = _tmpBase;
|
|
234
|
+
var origSpawn = processSpawn.spawn;
|
|
235
|
+
var captured = null;
|
|
236
|
+
processSpawn.spawn = function (cmd, args, opts) {
|
|
237
|
+
captured = { cmd: cmd, args: args, opts: opts };
|
|
238
|
+
return { pid: 515151, unref: function () {}, on: function () {} };
|
|
239
|
+
};
|
|
240
|
+
try {
|
|
241
|
+
var r = b.daemon.start({
|
|
242
|
+
pidFile: pidFile,
|
|
243
|
+
command: process.execPath,
|
|
244
|
+
args: ["-e", "process.exit(0)"],
|
|
245
|
+
cwd: chosenCwd,
|
|
246
|
+
});
|
|
247
|
+
check("cwd: documented opt accepted (no daemon/bad-opts)", r.pid === 515151);
|
|
248
|
+
check("cwd: forwarded to processSpawn opts.cwd", captured && captured.opts.cwd === chosenCwd);
|
|
249
|
+
} finally {
|
|
250
|
+
processSpawn.spawn = origSpawn;
|
|
251
|
+
try { fs.unlinkSync(pidFile); } catch (_e) { /* best-effort */ }
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
async function testDaemonStopRejectsMalformedNumericOpts() {
|
|
256
|
+
async function expect(opts, codeRe, label) {
|
|
257
|
+
var threw = null;
|
|
258
|
+
try { await b.daemon.stop(opts); } catch (e) { threw = e; }
|
|
259
|
+
check(label, threw && codeRe.test(threw.code || ""));
|
|
260
|
+
}
|
|
261
|
+
await expect({ pidFile: "/tmp/x.pid", signal: 123 }, /daemon\/bad-signal/,
|
|
262
|
+
"stop(): non-string signal -> daemon/bad-signal");
|
|
263
|
+
await expect({ pidFile: "/tmp/x.pid", timeoutMs: -1 }, /daemon\/bad-timeout/,
|
|
264
|
+
"stop(): negative timeoutMs -> daemon/bad-timeout");
|
|
265
|
+
await expect({ pidFile: "/tmp/x.pid", timeoutMs: 0 }, /daemon\/bad-timeout/,
|
|
266
|
+
"stop(): zero timeoutMs -> daemon/bad-timeout");
|
|
267
|
+
await expect({ pidFile: "/tmp/x.pid", timeoutMs: 1.5 }, /daemon\/bad-timeout/,
|
|
268
|
+
"stop(): non-integer timeoutMs -> daemon/bad-timeout");
|
|
269
|
+
await expect({ pidFile: "/tmp/x.pid", timeoutMs: Infinity }, /daemon\/bad-timeout/,
|
|
270
|
+
"stop(): Infinity timeoutMs -> daemon/bad-timeout");
|
|
271
|
+
await expect({ pidFile: "/tmp/x.pid", pollMs: -5 }, /daemon\/bad-poll/,
|
|
272
|
+
"stop(): negative pollMs -> daemon/bad-poll");
|
|
273
|
+
await expect({ pidFile: "/tmp/x.pid", pollMs: NaN }, /daemon\/bad-poll/,
|
|
274
|
+
"stop(): NaN pollMs -> daemon/bad-poll");
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// stop() drives process.kill through three failure/edge branches that can't
|
|
278
|
+
// be reached with a real long-lived child inside smoke. We stub the global
|
|
279
|
+
// kill seam (restored in finally) to steer each branch deterministically.
|
|
280
|
+
// These edge branches are the POSIX signal path: on Windows process.kill maps
|
|
281
|
+
// any real signal to TerminateProcess, so stop() drives the cooperative
|
|
282
|
+
// stop-request sentinel instead (SIGTERM→ESRCH→SIGKILL has no analogue there).
|
|
283
|
+
// The Windows cooperative + terminate branches are covered by
|
|
284
|
+
// testDaemonStopWin32CooperativeStop.
|
|
285
|
+
async function testDaemonStopKillRaceAndEscalation() {
|
|
286
|
+
if (process.platform === "win32") {
|
|
287
|
+
check("kill-race edge branches are POSIX-only (win32 uses cooperative stop)", true);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
var origKill = process.kill;
|
|
291
|
+
|
|
292
|
+
// (1) Target dies between pidfile read and the first signal (ESRCH on the
|
|
293
|
+
// real kill) -> reported stopped=true with the original signal, pidfile
|
|
294
|
+
// cleaned, no escalation.
|
|
295
|
+
var pidFile = _tmpFile("race.pid");
|
|
296
|
+
fs.writeFileSync(pidFile, "4242\n");
|
|
297
|
+
process.kill = function (pid, sig) {
|
|
298
|
+
if (sig === 0) return true; // liveness probe: alive
|
|
299
|
+
var err = new Error("no such process"); err.code = "ESRCH"; throw err;
|
|
300
|
+
};
|
|
301
|
+
try {
|
|
302
|
+
var r1 = await b.daemon.stop({ pidFile: pidFile, signal: "SIGTERM" });
|
|
303
|
+
check("stop(): ESRCH between read+kill -> stopped=true", r1.stopped === true);
|
|
304
|
+
check("stop(): ESRCH race keeps original signal", r1.signal === "SIGTERM");
|
|
305
|
+
check("stop(): ESRCH race did not escalate", r1.escalated === undefined);
|
|
306
|
+
check("stop(): ESRCH race cleaned pidfile", !fs.existsSync(pidFile));
|
|
307
|
+
} finally { process.kill = origKill; }
|
|
308
|
+
|
|
309
|
+
// (2) kill() fails with a non-ESRCH error (e.g. EINVAL bad signal name) ->
|
|
310
|
+
// surfaced as a typed daemon/kill-failed, never an uncaught throw.
|
|
311
|
+
var pidFile2 = _tmpFile("killfail.pid");
|
|
312
|
+
fs.writeFileSync(pidFile2, "4243\n");
|
|
313
|
+
process.kill = function (pid, sig) {
|
|
314
|
+
if (sig === 0) return true;
|
|
315
|
+
var err = new Error("invalid signal"); err.code = "EINVAL"; throw err;
|
|
316
|
+
};
|
|
317
|
+
var threw = null;
|
|
318
|
+
try { await b.daemon.stop({ pidFile: pidFile2, signal: "SIGTERM" }); }
|
|
319
|
+
catch (e) { threw = e; }
|
|
320
|
+
finally { process.kill = origKill; }
|
|
321
|
+
check("stop(): non-ESRCH kill error -> daemon/kill-failed",
|
|
322
|
+
threw && /daemon\/kill-failed/.test(threw.code || ""));
|
|
323
|
+
try { fs.unlinkSync(pidFile2); } catch (_e) { /* best-effort */ }
|
|
324
|
+
|
|
325
|
+
// (3) Target ignores SIGTERM past timeoutMs -> escalate to SIGKILL. The stub
|
|
326
|
+
// reports the pid alive until SIGKILL lands, then dead.
|
|
327
|
+
var pidFile3 = _tmpFile("escalate.pid");
|
|
328
|
+
fs.writeFileSync(pidFile3, "4244\n");
|
|
329
|
+
var killed = false;
|
|
330
|
+
process.kill = function (pid, sig) {
|
|
331
|
+
if (sig === 0) {
|
|
332
|
+
if (killed) { var e = new Error("gone"); e.code = "ESRCH"; throw e; }
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
if (sig === "SIGKILL") { killed = true; return true; }
|
|
336
|
+
return true; // SIGTERM: swallowed, process keeps running
|
|
337
|
+
};
|
|
338
|
+
try {
|
|
339
|
+
var r3 = await b.daemon.stop({ pidFile: pidFile3, signal: "SIGTERM", timeoutMs: 20, pollMs: 5 });
|
|
340
|
+
check("stop(): unresponsive child escalates -> escalated=true", r3.escalated === true);
|
|
341
|
+
check("stop(): escalation reports signal=SIGKILL", r3.signal === "SIGKILL");
|
|
342
|
+
check("stop(): escalation cleaned pidfile", !fs.existsSync(pidFile3));
|
|
343
|
+
} finally {
|
|
344
|
+
process.kill = origKill;
|
|
345
|
+
try { fs.unlinkSync(pidFile3); } catch (_e) { /* best-effort */ }
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// Foreground start with a logFile opens an O_NOFOLLOW append fd (mode 0600)
|
|
350
|
+
// and redirects the current process's stdout/stderr to it. Verify the
|
|
351
|
+
// redirect actually routes writes into the log — restoring the real writers
|
|
352
|
+
// before any assertion so the harness output is never swallowed.
|
|
353
|
+
async function testDaemonForegroundLogRedirect() {
|
|
354
|
+
var pidFile = _tmpFile("fg-log.pid");
|
|
355
|
+
var logFile = _tmpFile("fg-log.log");
|
|
356
|
+
var origOut = process.stdout.write;
|
|
357
|
+
var origErr = process.stderr.write;
|
|
358
|
+
var r = null;
|
|
359
|
+
try {
|
|
360
|
+
r = b.daemon.start({ pidFile: pidFile, logFile: logFile, signals: ["SIGUSR2"] });
|
|
361
|
+
process.stdout.write("daemon-redirect-probe-out\n");
|
|
362
|
+
process.stderr.write("daemon-redirect-probe-err\n");
|
|
363
|
+
} finally {
|
|
364
|
+
process.stdout.write = origOut;
|
|
365
|
+
process.stderr.write = origErr;
|
|
366
|
+
}
|
|
367
|
+
try {
|
|
368
|
+
check("fg+log: mode=foreground", r && r.mode === "foreground");
|
|
369
|
+
check("fg+log: logFile created", fs.existsSync(logFile));
|
|
370
|
+
var mode = fs.statSync(logFile).mode & 0o777;
|
|
371
|
+
// Windows fs collapses POSIX perm bits; only assert the strict mode on POSIX.
|
|
372
|
+
if (process.platform !== "win32") {
|
|
373
|
+
check("fg+log: logFile mode is 0600", mode === 0o600);
|
|
374
|
+
}
|
|
375
|
+
var content = fs.readFileSync(logFile, "utf8");
|
|
376
|
+
check("fg+log: stdout redirected into logFile",
|
|
377
|
+
content.indexOf("daemon-redirect-probe-out") !== -1);
|
|
378
|
+
check("fg+log: stderr redirected into logFile",
|
|
379
|
+
content.indexOf("daemon-redirect-probe-err") !== -1);
|
|
380
|
+
} finally {
|
|
381
|
+
if (r) { await r.orchestrator.shutdown(); r.orchestrator._resetForTest(); }
|
|
382
|
+
b.daemon._resetForTest();
|
|
383
|
+
try { fs.unlinkSync(pidFile); } catch (_e) { /* best-effort */ }
|
|
384
|
+
try { fs.unlinkSync(logFile); } catch (_e) { /* best-effort */ }
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// Foreground start where the logFile cannot be opened (a path component is a
|
|
389
|
+
// regular file, so ensureDir/open throws) must release the just-acquired
|
|
390
|
+
// pidLock and surface daemon/log-open-failed — not leak the lock.
|
|
391
|
+
async function testDaemonForegroundLogOpenFailedReleasesLock() {
|
|
392
|
+
var pidFile = _tmpFile("fg-openfail.pid");
|
|
393
|
+
var blocker = _tmpFile("blocker-file");
|
|
394
|
+
fs.writeFileSync(blocker, "x"); // a file, not a directory
|
|
395
|
+
var logFile = path.join(blocker, "cannot", "here.log");
|
|
396
|
+
var threw = null;
|
|
397
|
+
try {
|
|
398
|
+
b.daemon.start({ pidFile: pidFile, logFile: logFile, signals: ["SIGUSR2"] });
|
|
399
|
+
} catch (e) { threw = e; }
|
|
400
|
+
check("fg+log-open-fail: surfaced as daemon/log-open-failed",
|
|
401
|
+
threw && /daemon\/log-open-failed/.test(threw.code || ""));
|
|
402
|
+
check("fg+log-open-fail: pidLock released (pidFile gone)", !fs.existsSync(pidFile));
|
|
403
|
+
// Lock is free again: a second start on the same pidFile must succeed.
|
|
404
|
+
var r2 = null;
|
|
405
|
+
try {
|
|
406
|
+
r2 = b.daemon.start({ pidFile: pidFile, signals: ["SIGUSR2"] });
|
|
407
|
+
check("fg+log-open-fail: pidFile reusable after failure", r2.mode === "foreground");
|
|
408
|
+
} finally {
|
|
409
|
+
if (r2) { await r2.orchestrator.shutdown(); r2.orchestrator._resetForTest(); }
|
|
410
|
+
b.daemon._resetForTest();
|
|
411
|
+
try { fs.unlinkSync(pidFile); } catch (_e) { /* best-effort */ }
|
|
412
|
+
try { fs.unlinkSync(blocker); } catch (_e) { /* best-effort */ }
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// #498 — daemon.status(): a READ-ONLY PID-liveness probe. Unlike stop() it
|
|
417
|
+
// never unlinks the pidfile (a status check must not mutate the daemon's
|
|
418
|
+
// lifecycle state), returns { running, pid, reason? }, and refuses hostile
|
|
419
|
+
// pidfiles (symlink / oversized) as not-running rather than throwing.
|
|
420
|
+
async function testDaemonStatusReadOnlyProbe() {
|
|
421
|
+
check("status: b.daemon.status is a function", typeof b.daemon.status === "function");
|
|
422
|
+
if (typeof b.daemon.status !== "function") return; // remaining asserts need the export
|
|
423
|
+
|
|
424
|
+
// Missing pidfile -> not running, no pid.
|
|
425
|
+
var missing = _tmpFile("status-missing.pid");
|
|
426
|
+
var s1 = b.daemon.status({ pidFile: missing });
|
|
427
|
+
check("status: missing -> running=false", s1.running === false);
|
|
428
|
+
check("status: missing -> pid=null", s1.pid === null);
|
|
429
|
+
check("status: missing -> reason=no-pidfile", s1.reason === "no-pidfile");
|
|
430
|
+
|
|
431
|
+
// Live (our own PID, guaranteed alive) -> running with our pid.
|
|
432
|
+
var livePid = _tmpFile("status-live.pid");
|
|
433
|
+
fs.writeFileSync(livePid, String(process.pid) + "\n");
|
|
434
|
+
var s2 = b.daemon.status({ pidFile: livePid });
|
|
435
|
+
check("status: live -> running=true", s2.running === true);
|
|
436
|
+
check("status: live -> pid = our pid", s2.pid === process.pid);
|
|
437
|
+
check("status: live pidfile NOT unlinked (read-only)", fs.existsSync(livePid));
|
|
438
|
+
try { fs.unlinkSync(livePid); } catch (_e) { /* best-effort */ }
|
|
439
|
+
|
|
440
|
+
// Stale (dead PID) -> not running, reason=stale, AND pidfile left in place.
|
|
441
|
+
var stalePid = _tmpFile("status-stale.pid");
|
|
442
|
+
fs.writeFileSync(stalePid, "999999\n");
|
|
443
|
+
var s3 = b.daemon.status({ pidFile: stalePid });
|
|
444
|
+
check("status: stale -> running=false", s3.running === false);
|
|
445
|
+
check("status: stale -> pid=999999", s3.pid === 999999);
|
|
446
|
+
check("status: stale -> reason=stale", s3.reason === "stale");
|
|
447
|
+
check("status: stale pidfile NOT unlinked (read-only)", fs.existsSync(stalePid));
|
|
448
|
+
try { fs.unlinkSync(stalePid); } catch (_e) { /* best-effort */ }
|
|
449
|
+
|
|
450
|
+
// Oversized pidfile (> 1 KiB cap) -> refused as not-running, never throws.
|
|
451
|
+
var oversized = _tmpFile("status-oversized.pid");
|
|
452
|
+
fs.writeFileSync(oversized, "1".repeat(2048));
|
|
453
|
+
var s4 = null, s4Threw = null;
|
|
454
|
+
try { s4 = b.daemon.status({ pidFile: oversized }); } catch (e) { s4Threw = e; }
|
|
455
|
+
check("status: oversized pidfile does not throw", s4Threw === null);
|
|
456
|
+
check("status: oversized pidfile -> running=false", s4 && s4.running === false);
|
|
457
|
+
try { fs.unlinkSync(oversized); } catch (_e) { /* best-effort */ }
|
|
458
|
+
|
|
459
|
+
// Symlink pidfile -> refused (O_NOFOLLOW) as not-running, never throws.
|
|
460
|
+
// Windows may lack symlink-create privilege; skip the case if so.
|
|
461
|
+
var symTarget = _tmpFile("status-symtarget.pid");
|
|
462
|
+
fs.writeFileSync(symTarget, String(process.pid) + "\n");
|
|
463
|
+
var symLink = _tmpFile("status-symlink.pid");
|
|
464
|
+
var symMade = false;
|
|
465
|
+
try { fs.symlinkSync(symTarget, symLink); symMade = true; } catch (_e) { /* no symlink priv */ }
|
|
466
|
+
if (symMade) {
|
|
467
|
+
var s5 = null, s5Threw = null;
|
|
468
|
+
try { s5 = b.daemon.status({ pidFile: symLink }); } catch (e) { s5Threw = e; }
|
|
469
|
+
check("status: symlink pidfile does not throw", s5Threw === null);
|
|
470
|
+
check("status: symlink pidfile -> running=false (refused)", s5 && s5.running === false);
|
|
471
|
+
try { fs.unlinkSync(symLink); } catch (_e) { /* best-effort */ }
|
|
472
|
+
} else {
|
|
473
|
+
check("status: symlink case skipped (no symlink privilege)", true);
|
|
474
|
+
}
|
|
475
|
+
try { fs.unlinkSync(symTarget); } catch (_e) { /* best-effort */ }
|
|
476
|
+
|
|
477
|
+
// Bad opts -> config-time throw (same code the start/stop validators use).
|
|
478
|
+
var badThrew = null;
|
|
479
|
+
try { b.daemon.status({}); } catch (e) { badThrew = e; }
|
|
480
|
+
check("status: bad opts -> daemon/bad-pid-file",
|
|
481
|
+
badThrew && /daemon\/bad-pid-file/.test(badThrew.code || ""));
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// #499 — a detached spawn that fails ASYNC leaves child.pid === undefined; the
|
|
485
|
+
// try/catch only wraps the SYNCHRONOUS spawn call, so the old path wrote
|
|
486
|
+
// "undefined\n" to the pidfile and reported success unconditionally. start()
|
|
487
|
+
// must validate child.pid BEFORE any pidfile write and throw daemon/spawn-failed.
|
|
488
|
+
async function testDaemonStartDetachedSpawnFailureUndefinedPid() {
|
|
489
|
+
var pidFile = _tmpFile("spawnfail.pid");
|
|
490
|
+
var origSpawn = processSpawn.spawn;
|
|
491
|
+
processSpawn.spawn = function () {
|
|
492
|
+
// Model an async spawn failure: the OS never launched the exec, so the
|
|
493
|
+
// returned child object carries no pid (the real failure arrives later
|
|
494
|
+
// via a 'error' event).
|
|
495
|
+
return { pid: undefined, unref: function () {}, on: function () {} };
|
|
496
|
+
};
|
|
497
|
+
var threw = null;
|
|
498
|
+
try {
|
|
499
|
+
b.daemon.start({ pidFile: pidFile, command: "/nonexistent/cmd", args: [] });
|
|
500
|
+
} catch (e) { threw = e; }
|
|
501
|
+
finally { processSpawn.spawn = origSpawn; }
|
|
502
|
+
check("spawn-fail: undefined child.pid -> daemon/spawn-failed",
|
|
503
|
+
threw && /daemon\/spawn-failed/.test(threw.code || ""));
|
|
504
|
+
check("spawn-fail: pidfile NOT written with 'undefined'",
|
|
505
|
+
!fs.existsSync(pidFile) ||
|
|
506
|
+
String(fs.readFileSync(pidFile, "utf8")).trim() !== "undefined");
|
|
507
|
+
try { fs.unlinkSync(pidFile); } catch (_e) { /* best-effort */ }
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// #499 — a valid detached spawn must subscribe a one-shot child 'error' handler
|
|
511
|
+
// so an async launch failure after a valid initial pid still reaps the pidfile
|
|
512
|
+
// + audits, instead of leaving a stale sidecar for a child that never ran.
|
|
513
|
+
async function testDaemonStartDetachedSubscribesErrorHandler() {
|
|
514
|
+
var pidFile = _tmpFile("spawn-errsub.pid");
|
|
515
|
+
var origSpawn = processSpawn.spawn;
|
|
516
|
+
var subscribed = Object.create(null);
|
|
517
|
+
processSpawn.spawn = function () {
|
|
518
|
+
return {
|
|
519
|
+
pid: 434343,
|
|
520
|
+
unref: function () {},
|
|
521
|
+
on: function (event) { subscribed[event] = true; },
|
|
522
|
+
};
|
|
523
|
+
};
|
|
524
|
+
try {
|
|
525
|
+
var r = b.daemon.start({ pidFile: pidFile, command: process.execPath, args: ["-e", "0"] });
|
|
526
|
+
check("spawn-errsub: detached start succeeded with valid pid", r.pid === 434343);
|
|
527
|
+
check("spawn-errsub: start subscribed a child 'error' handler", subscribed.error === true);
|
|
528
|
+
} finally {
|
|
529
|
+
processSpawn.spawn = origSpawn;
|
|
530
|
+
try { fs.unlinkSync(pidFile); } catch (_e) { /* best-effort */ }
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// #500 — on win32 process.kill(pid, "SIGTERM") maps to TerminateProcess (a hard
|
|
535
|
+
// kill), so the graceful appShutdown orchestration is unreachable via signals.
|
|
536
|
+
// stop() must instead write a cooperative <pidFile>.stop sentinel, poll for the
|
|
537
|
+
// daemon to exit, and escalate to TerminateProcess ONLY on timeout — reporting
|
|
538
|
+
// a `mechanism` that distinguishes the cooperative exit from the forced one.
|
|
539
|
+
async function testDaemonStopWin32CooperativeStop() {
|
|
540
|
+
if (process.platform !== "win32") {
|
|
541
|
+
check("cooperative-stop test skipped on non-win32 (POSIX uses signals)", true);
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
var origKill = process.kill;
|
|
545
|
+
|
|
546
|
+
// (A) Cooperative: the daemon exits once it observes the stop-request file.
|
|
547
|
+
var pidFile = _tmpFile("coop.pid");
|
|
548
|
+
var sentinel = pidFile + ".stop";
|
|
549
|
+
fs.writeFileSync(pidFile, "5252\n");
|
|
550
|
+
var terminatedA = false;
|
|
551
|
+
process.kill = function (pid, sig) {
|
|
552
|
+
if (sig === 0) {
|
|
553
|
+
// Liveness probe: model a cooperative daemon that exits the moment it
|
|
554
|
+
// sees the sentinel stop() writes.
|
|
555
|
+
if (fs.existsSync(sentinel)) { var e = new Error("gone"); e.code = "ESRCH"; throw e; }
|
|
556
|
+
return true;
|
|
557
|
+
}
|
|
558
|
+
terminatedA = true; // any real signal on win32 = TerminateProcess
|
|
559
|
+
return true;
|
|
560
|
+
};
|
|
561
|
+
try {
|
|
562
|
+
var rA = await b.daemon.stop({ pidFile: pidFile, timeoutMs: 2000, pollMs: 5 });
|
|
563
|
+
check("win32 stop: cooperative graceful exit -> stopped=true", rA.stopped === true);
|
|
564
|
+
check("win32 stop: mechanism=cooperative", rA.mechanism === "cooperative");
|
|
565
|
+
check("win32 stop: no hard TerminateProcess on graceful exit", terminatedA === false);
|
|
566
|
+
check("win32 stop: cooperative did not escalate", rA.escalated === undefined);
|
|
567
|
+
check("win32 stop: sentinel cleaned up", !fs.existsSync(sentinel));
|
|
568
|
+
check("win32 stop: pidfile cleaned up", !fs.existsSync(pidFile));
|
|
569
|
+
} finally {
|
|
570
|
+
process.kill = origKill;
|
|
571
|
+
try { fs.unlinkSync(pidFile); } catch (_e) { /* best-effort */ }
|
|
572
|
+
try { fs.unlinkSync(sentinel); } catch (_e) { /* best-effort */ }
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
// (B) Forced: the daemon ignores the sentinel past the timeout -> escalate to
|
|
576
|
+
// TerminateProcess, reported as mechanism=terminate + escalated=true.
|
|
577
|
+
var pidFile2 = _tmpFile("coop-forced.pid");
|
|
578
|
+
var sentinel2 = pidFile2 + ".stop";
|
|
579
|
+
fs.writeFileSync(pidFile2, "5253\n");
|
|
580
|
+
var terminatedB = false;
|
|
581
|
+
process.kill = function (pid, sig) {
|
|
582
|
+
if (sig === 0) {
|
|
583
|
+
if (terminatedB) { var e = new Error("gone"); e.code = "ESRCH"; throw e; }
|
|
584
|
+
return true; // stays alive despite the sentinel
|
|
585
|
+
}
|
|
586
|
+
terminatedB = true; // TerminateProcess escalation
|
|
587
|
+
return true;
|
|
588
|
+
};
|
|
589
|
+
try {
|
|
590
|
+
var rB = await b.daemon.stop({ pidFile: pidFile2, timeoutMs: 30, pollMs: 5 });
|
|
591
|
+
check("win32 stop: unresponsive daemon escalates -> escalated=true", rB.escalated === true);
|
|
592
|
+
check("win32 stop: mechanism=terminate on escalation", rB.mechanism === "terminate");
|
|
593
|
+
check("win32 stop: TerminateProcess invoked on timeout", terminatedB === true);
|
|
594
|
+
check("win32 stop: forced path cleaned pidfile", !fs.existsSync(pidFile2));
|
|
595
|
+
check("win32 stop: forced path cleaned sentinel", !fs.existsSync(sentinel2));
|
|
596
|
+
} finally {
|
|
597
|
+
process.kill = origKill;
|
|
598
|
+
try { fs.unlinkSync(pidFile2); } catch (_e) { /* best-effort */ }
|
|
599
|
+
try { fs.unlinkSync(sentinel2); } catch (_e) { /* best-effort */ }
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
// #500 — the other half of the cooperative channel: a foreground start() on
|
|
604
|
+
// win32 must install a watcher on the sibling <pidFile>.stop sentinel so a
|
|
605
|
+
// stop() from another process routes into the SAME appShutdown orchestrator the
|
|
606
|
+
// POSIX signal path uses.
|
|
607
|
+
async function testDaemonStartWin32CooperativeStopWatcher() {
|
|
608
|
+
if (process.platform !== "win32") {
|
|
609
|
+
check("cooperative stop-watcher test skipped on non-win32", true);
|
|
610
|
+
return;
|
|
611
|
+
}
|
|
612
|
+
var pidFile = _tmpFile("coop-fg.pid");
|
|
613
|
+
var sentinel = pidFile + ".stop";
|
|
614
|
+
var r = b.daemon.start({ pidFile: pidFile, signals: ["SIGUSR2"] });
|
|
615
|
+
try {
|
|
616
|
+
check("coop-watcher: foreground start returned", r && r.mode === "foreground");
|
|
617
|
+
// Model daemon.stop()'s cooperative request by writing the sentinel.
|
|
618
|
+
fs.writeFileSync(sentinel, String(process.pid) + "\n");
|
|
619
|
+
await helpers.waitUntil(function () { return r.orchestrator.draining() === true; },
|
|
620
|
+
{ timeoutMs: 5000, label: "coop-watcher: sentinel triggers orchestrator shutdown" });
|
|
621
|
+
check("coop-watcher: sentinel routed into graceful shutdown",
|
|
622
|
+
r.orchestrator.draining() === true);
|
|
623
|
+
} finally {
|
|
624
|
+
try { await r.orchestrator.shutdown(); } catch (_e) { /* best-effort */ }
|
|
625
|
+
r.orchestrator._resetForTest();
|
|
626
|
+
b.daemon._resetForTest();
|
|
627
|
+
try { fs.unlinkSync(pidFile); } catch (_e) { /* best-effort */ }
|
|
628
|
+
try { fs.unlinkSync(sentinel); } catch (_e) { /* best-effort */ }
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
|
|
194
632
|
async function run() {
|
|
195
633
|
testDaemonSurface();
|
|
196
634
|
testDaemonStartRejectsBadOpts();
|
|
635
|
+
testDaemonStartRejectsMalformedOptTypes();
|
|
636
|
+
await testDaemonStartForwardsCwdToDetachedChild();
|
|
197
637
|
await testDaemonStopRejectsBadOpts();
|
|
638
|
+
await testDaemonStopRejectsMalformedNumericOpts();
|
|
198
639
|
await testDaemonStopOnMissingPidfile();
|
|
199
640
|
await testDaemonStopReapsStalePid();
|
|
641
|
+
await testDaemonStopKillRaceAndEscalation();
|
|
200
642
|
await testDaemonStartDetachedSpawn();
|
|
201
643
|
await testDaemonStartRejectsLivePidfile();
|
|
202
644
|
await testDaemonStartForegroundAcquiresLock();
|
|
645
|
+
await testDaemonForegroundLogRedirect();
|
|
646
|
+
await testDaemonForegroundLogOpenFailedReleasesLock();
|
|
203
647
|
await testDaemonStaleCleanupOnStartReap();
|
|
648
|
+
await testDaemonStatusReadOnlyProbe();
|
|
649
|
+
await testDaemonStartDetachedSpawnFailureUndefinedPid();
|
|
650
|
+
await testDaemonStartDetachedSubscribesErrorHandler();
|
|
651
|
+
await testDaemonStopWin32CooperativeStop();
|
|
652
|
+
await testDaemonStartWin32CooperativeStopWatcher();
|
|
204
653
|
}
|
|
205
654
|
|
|
206
|
-
module.exports = {
|
|
655
|
+
module.exports = {
|
|
656
|
+
run: run,
|
|
657
|
+
_tests: {
|
|
658
|
+
testDaemonStatusReadOnlyProbe: testDaemonStatusReadOnlyProbe,
|
|
659
|
+
testDaemonStartDetachedSpawnFailureUndefinedPid: testDaemonStartDetachedSpawnFailureUndefinedPid,
|
|
660
|
+
testDaemonStartDetachedSubscribesErrorHandler: testDaemonStartDetachedSubscribesErrorHandler,
|
|
661
|
+
testDaemonStopWin32CooperativeStop: testDaemonStopWin32CooperativeStop,
|
|
662
|
+
testDaemonStartWin32CooperativeStopWatcher: testDaemonStartWin32CooperativeStopWatcher,
|
|
663
|
+
},
|
|
664
|
+
};
|
|
207
665
|
|
|
208
666
|
if (require.main === module) {
|
|
209
667
|
run().then(
|
|
@@ -63,6 +63,25 @@ async function run() {
|
|
|
63
63
|
try { b.darkPatterns.assertParity(s, { kind: "cancel", resourceId: "different" }); }
|
|
64
64
|
catch (e) { threw = e; }
|
|
65
65
|
check("assertParity refuses resource mismatch", threw && threw.code === "dark-patterns/resource-mismatch");
|
|
66
|
+
|
|
67
|
+
// Prototype-member name as posture must be refused, not resolved to an
|
|
68
|
+
// inherited member. Drive with VALID, resourceId-matched flows (s and c both
|
|
69
|
+
// carry "plan-1") so the posture own-property guard is the assertion point —
|
|
70
|
+
// not an earlier shape or resource-mismatch check. A bare `POSTURES[name]`
|
|
71
|
+
// truthiness guard would let "constructor" / "__proto__" / "toString" resolve
|
|
72
|
+
// to an inherited member and run the parity check under it (fail-open).
|
|
73
|
+
["constructor", "__proto__", "toString"].forEach(function (protoKey) {
|
|
74
|
+
var pkThrew = null;
|
|
75
|
+
try { b.darkPatterns.assertParity(s, c, { posture: protoKey }); }
|
|
76
|
+
catch (e) { pkThrew = e; }
|
|
77
|
+
check("assertParity refuses prototype-key posture '" + protoKey + "'",
|
|
78
|
+
pkThrew && pkThrew.code === "dark-patterns/bad-posture");
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// A valid posture still produces a verdict.
|
|
82
|
+
var okVerdict = b.darkPatterns.assertParity(s, c, { posture: "ftc-2024" });
|
|
83
|
+
check("assertParity valid posture produces verdict",
|
|
84
|
+
okVerdict && typeof okVerdict.ok === "boolean");
|
|
66
85
|
}
|
|
67
86
|
|
|
68
87
|
module.exports = { run: run };
|