@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
|
@@ -308,6 +308,556 @@ async function run() {
|
|
|
308
308
|
} finally {
|
|
309
309
|
try { fs.rmSync(autoDir, { recursive: true, force: true }); } catch (_e) {}
|
|
310
310
|
}
|
|
311
|
+
|
|
312
|
+
// ---- config-time validation: remaining bad-shape opts ----
|
|
313
|
+
// These surface at create() synchronously — no fs.watch priming needed.
|
|
314
|
+
|
|
315
|
+
// root points at a plain file, not a directory → root-not-dir.
|
|
316
|
+
var fileRootDir = fs.mkdtempSync(path.join(os.tmpdir(), "watcher-filroot-"));
|
|
317
|
+
try {
|
|
318
|
+
var fileRoot = path.join(fileRootDir, "iam-a-file.txt");
|
|
319
|
+
fs.writeFileSync(fileRoot, "not a dir");
|
|
320
|
+
var threwFR = null;
|
|
321
|
+
try { b.watcher.create({ root: fileRoot }); } catch (e) { threwFR = e; }
|
|
322
|
+
check("watcher.create: root that is a file throws root-not-dir",
|
|
323
|
+
threwFR && threwFR.code === "watcher/root-not-dir");
|
|
324
|
+
} finally {
|
|
325
|
+
try { fs.rmSync(fileRootDir, { recursive: true, force: true }); } catch (_e) {}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// pollMaxFiles must be a positive finite integer.
|
|
329
|
+
var threwPMF = null;
|
|
330
|
+
try { b.watcher.create({ root: os.tmpdir(), pollMaxFiles: 0 }); } catch (e) { threwPMF = e; }
|
|
331
|
+
check("watcher.create: pollMaxFiles < 1 throws bad-poll-max-files",
|
|
332
|
+
threwPMF && threwPMF.code === "watcher/bad-poll-max-files");
|
|
333
|
+
|
|
334
|
+
threwPMF = null;
|
|
335
|
+
try { b.watcher.create({ root: os.tmpdir(), pollMaxFiles: "lots" }); } catch (e) { threwPMF = e; }
|
|
336
|
+
check("watcher.create: non-number pollMaxFiles throws bad-poll-max-files",
|
|
337
|
+
threwPMF && threwPMF.code === "watcher/bad-poll-max-files");
|
|
338
|
+
|
|
339
|
+
// maxPending must be a positive finite number.
|
|
340
|
+
var threwMP = null;
|
|
341
|
+
try { b.watcher.create({ root: os.tmpdir(), maxPending: 0 }); } catch (e) { threwMP = e; }
|
|
342
|
+
check("watcher.create: maxPending < 1 throws bad-max-pending",
|
|
343
|
+
threwMP && threwMP.code === "watcher/bad-max-pending");
|
|
344
|
+
|
|
345
|
+
threwMP = null;
|
|
346
|
+
try { b.watcher.create({ root: os.tmpdir(), maxPending: Infinity }); } catch (e) { threwMP = e; }
|
|
347
|
+
check("watcher.create: non-finite maxPending throws bad-max-pending",
|
|
348
|
+
threwMP && threwMP.code === "watcher/bad-max-pending");
|
|
349
|
+
|
|
350
|
+
// onDelete + onError are validated the same way as onChange.
|
|
351
|
+
var threwHook = null;
|
|
352
|
+
try { b.watcher.create({ root: os.tmpdir(), onDelete: 42 }); } catch (e) { threwHook = e; }
|
|
353
|
+
check("watcher.create: non-function onDelete throws bad-hook",
|
|
354
|
+
threwHook && threwHook.code === "watcher/bad-hook");
|
|
355
|
+
|
|
356
|
+
threwHook = null;
|
|
357
|
+
try { b.watcher.create({ root: os.tmpdir(), onError: {} }); } catch (e) { threwHook = e; }
|
|
358
|
+
check("watcher.create: non-function onError throws bad-hook",
|
|
359
|
+
threwHook && threwHook.code === "watcher/bad-hook");
|
|
360
|
+
|
|
361
|
+
// ---- ignore-pattern parse-time guards ----
|
|
362
|
+
|
|
363
|
+
// A `*` glob whose literal pieces contain a path separator is refused
|
|
364
|
+
// (path separators only legal in the trailing dir/** prefix form).
|
|
365
|
+
var threwSep = null;
|
|
366
|
+
try { b.watcher.create({ root: os.tmpdir(), ignore: ["foo*/bar"] }); } catch (e) { threwSep = e; }
|
|
367
|
+
check("watcher.create: glob with mid-pattern path separator throws bad-ignore",
|
|
368
|
+
threwSep && threwSep.code === "watcher/bad-ignore");
|
|
369
|
+
|
|
370
|
+
// Pattern length cap.
|
|
371
|
+
var threwLen = null;
|
|
372
|
+
var longPat = new Array(300).join("a") + "*";
|
|
373
|
+
try { b.watcher.create({ root: os.tmpdir(), ignore: [longPat] }); } catch (e) { threwLen = e; }
|
|
374
|
+
check("watcher.create: over-long ignore pattern throws bad-ignore",
|
|
375
|
+
threwLen && threwLen.code === "watcher/bad-ignore");
|
|
376
|
+
|
|
377
|
+
// Wildcard-count cap (17 stars > MAX_IGNORE_STAR_COUNT of 16).
|
|
378
|
+
var threwStar = null;
|
|
379
|
+
try { b.watcher.create({ root: os.tmpdir(), ignore: [new Array(18).join("*") + "x"] }); }
|
|
380
|
+
catch (e) { threwStar = e; }
|
|
381
|
+
check("watcher.create: too-many-wildcard ignore pattern throws bad-ignore",
|
|
382
|
+
threwStar && threwStar.code === "watcher/bad-ignore");
|
|
383
|
+
|
|
384
|
+
// Non-string ignore entry (a number in the array) → bad-ignore.
|
|
385
|
+
var threwEntry = null;
|
|
386
|
+
try { b.watcher.create({ root: os.tmpdir(), ignore: [123] }); } catch (e) { threwEntry = e; }
|
|
387
|
+
check("watcher.create: non-string ignore entry throws bad-ignore",
|
|
388
|
+
threwEntry && threwEntry.code === "watcher/bad-ignore");
|
|
389
|
+
|
|
390
|
+
// ---- ignore-pattern matching across all three shapes (poll-driven,
|
|
391
|
+
// fully deterministic via _flushForTest — no fs.watch priming race) ----
|
|
392
|
+
var globDir = fs.mkdtempSync(path.join(os.tmpdir(), "watcher-glob-"));
|
|
393
|
+
try {
|
|
394
|
+
var globHits = [];
|
|
395
|
+
var gw = b.watcher.create({
|
|
396
|
+
root: globDir,
|
|
397
|
+
mode: "poll",
|
|
398
|
+
pollIntervalMs: 1000,
|
|
399
|
+
debounceMs: 5,
|
|
400
|
+
// basename glob (suffix), prefix glob, multi-star glob, exact match.
|
|
401
|
+
ignore: ["*.tmp", "cache-*", "a*b*c.dat", "exact-ignore.txt"],
|
|
402
|
+
onChange: function (e) { globHits.push(e.relativePath); },
|
|
403
|
+
audit: false,
|
|
404
|
+
});
|
|
405
|
+
fs.writeFileSync(path.join(globDir, "keep.txt"), "x"); // not ignored → fires
|
|
406
|
+
fs.writeFileSync(path.join(globDir, "scratch.tmp"), "x"); // *.tmp
|
|
407
|
+
fs.writeFileSync(path.join(globDir, "cache-abc"), "x"); // cache-*
|
|
408
|
+
fs.writeFileSync(path.join(globDir, "aXXbYYc.dat"), "x"); // a*b*c.dat
|
|
409
|
+
fs.writeFileSync(path.join(globDir, "exact-ignore.txt"), "x"); // exact
|
|
410
|
+
fs.writeFileSync(path.join(globDir, "notcache.txt"), "x"); // NOT cache-* → fires
|
|
411
|
+
await helpers.waitUntil(function () {
|
|
412
|
+
gw._flushForTest();
|
|
413
|
+
return globHits.indexOf("keep.txt") !== -1;
|
|
414
|
+
}, { label: "watcher glob: keep.txt onChange" });
|
|
415
|
+
|
|
416
|
+
check("watcher ignore: non-matching file fires onChange",
|
|
417
|
+
globHits.indexOf("keep.txt") !== -1 && globHits.indexOf("notcache.txt") !== -1);
|
|
418
|
+
check("watcher ignore: *.tmp suffix glob suppresses",
|
|
419
|
+
globHits.indexOf("scratch.tmp") === -1);
|
|
420
|
+
check("watcher ignore: cache-* prefix glob suppresses",
|
|
421
|
+
globHits.indexOf("cache-abc") === -1);
|
|
422
|
+
check("watcher ignore: a*b*c.dat multi-star glob suppresses",
|
|
423
|
+
globHits.indexOf("aXXbYYc.dat") === -1);
|
|
424
|
+
check("watcher ignore: exact-match ignore suppresses (poll)",
|
|
425
|
+
globHits.indexOf("exact-ignore.txt") === -1);
|
|
426
|
+
gw.stop();
|
|
427
|
+
} finally {
|
|
428
|
+
try { fs.rmSync(globDir, { recursive: true, force: true }); } catch (_e) {}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// ---- poll: pre-existing files establish the baseline silently ----
|
|
432
|
+
// Files present at create() must NOT fire onChange on the first tick
|
|
433
|
+
// (matches fs.watch semantics — you observe changes after start).
|
|
434
|
+
var baseDir = fs.mkdtempSync(path.join(os.tmpdir(), "watcher-base-"));
|
|
435
|
+
try {
|
|
436
|
+
fs.writeFileSync(path.join(baseDir, "pre-existing.txt"), "old");
|
|
437
|
+
var baseHits = [];
|
|
438
|
+
var bw = b.watcher.create({
|
|
439
|
+
root: baseDir,
|
|
440
|
+
mode: "poll",
|
|
441
|
+
pollIntervalMs: 1000,
|
|
442
|
+
debounceMs: 5,
|
|
443
|
+
onChange: function (e) { baseHits.push(e.relativePath); },
|
|
444
|
+
audit: false,
|
|
445
|
+
});
|
|
446
|
+
// One tick over an unchanged tree — no events for the baseline file.
|
|
447
|
+
bw._flushForTest();
|
|
448
|
+
check("watcher poll: pre-existing file does not fire on first tick",
|
|
449
|
+
baseHits.indexOf("pre-existing.txt") === -1);
|
|
450
|
+
|
|
451
|
+
// A brand-new file after start DOES fire.
|
|
452
|
+
fs.writeFileSync(path.join(baseDir, "fresh.txt"), "new");
|
|
453
|
+
await helpers.waitUntil(function () {
|
|
454
|
+
bw._flushForTest();
|
|
455
|
+
return baseHits.indexOf("fresh.txt") !== -1;
|
|
456
|
+
}, { label: "watcher poll: fresh.txt after baseline" });
|
|
457
|
+
check("watcher poll: post-start create fires onChange", baseHits.indexOf("fresh.txt") !== -1);
|
|
458
|
+
bw.stop();
|
|
459
|
+
} finally {
|
|
460
|
+
try { fs.rmSync(baseDir, { recursive: true, force: true }); } catch (_e) {}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// ---- poll: directory create emits type="dir"; nested delete + dir
|
|
464
|
+
// delete both surface via the snapshot diff ----
|
|
465
|
+
var dirDir = fs.mkdtempSync(path.join(os.tmpdir(), "watcher-dir-"));
|
|
466
|
+
try {
|
|
467
|
+
var dirChanges = [];
|
|
468
|
+
var dirDeletes = [];
|
|
469
|
+
var dw = b.watcher.create({
|
|
470
|
+
root: dirDir,
|
|
471
|
+
mode: "poll",
|
|
472
|
+
pollIntervalMs: 1000,
|
|
473
|
+
debounceMs: 5,
|
|
474
|
+
onChange: function (e) { dirChanges.push(e); },
|
|
475
|
+
onDelete: function (e) { dirDeletes.push(e.relativePath); },
|
|
476
|
+
audit: false,
|
|
477
|
+
});
|
|
478
|
+
fs.mkdirSync(path.join(dirDir, "created-dir"));
|
|
479
|
+
fs.writeFileSync(path.join(dirDir, "created-dir", "child.txt"), "x");
|
|
480
|
+
await helpers.waitUntil(function () {
|
|
481
|
+
dw._flushForTest();
|
|
482
|
+
return dirChanges.some(function (e) { return e.relativePath === "created-dir" && e.type === "dir"; });
|
|
483
|
+
}, { label: "watcher poll: created-dir onChange(type=dir)" });
|
|
484
|
+
check("watcher poll: directory create fires onChange type='dir'",
|
|
485
|
+
dirChanges.some(function (e) { return e.relativePath === "created-dir" && e.type === "dir"; }));
|
|
486
|
+
check("watcher poll: nested child create fires onChange type='file'",
|
|
487
|
+
dirChanges.some(function (e) { return e.relativePath === "created-dir/child.txt" && e.type === "file"; }));
|
|
488
|
+
|
|
489
|
+
// Remove the whole directory subtree → onDelete for both entries.
|
|
490
|
+
fs.rmSync(path.join(dirDir, "created-dir"), { recursive: true, force: true });
|
|
491
|
+
await helpers.waitUntil(function () {
|
|
492
|
+
dw._flushForTest();
|
|
493
|
+
return dirDeletes.indexOf("created-dir") !== -1;
|
|
494
|
+
}, { label: "watcher poll: created-dir onDelete" });
|
|
495
|
+
check("watcher poll: directory delete fires onDelete", dirDeletes.indexOf("created-dir") !== -1);
|
|
496
|
+
check("watcher poll: nested child delete fires onDelete",
|
|
497
|
+
dirDeletes.indexOf("created-dir/child.txt") !== -1);
|
|
498
|
+
dw.stop();
|
|
499
|
+
} finally {
|
|
500
|
+
try { fs.rmSync(dirDir, { recursive: true, force: true }); } catch (_e) {}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// ---- poll: symlink entries are skipped in the tree walk (never
|
|
504
|
+
// follow an attacker-controlled link out of root). POSIX only ----
|
|
505
|
+
if (process.platform !== "win32") {
|
|
506
|
+
var symDir = fs.mkdtempSync(path.join(os.tmpdir(), "watcher-sym-"));
|
|
507
|
+
try {
|
|
508
|
+
var symHits = [];
|
|
509
|
+
var symW = b.watcher.create({
|
|
510
|
+
root: symDir,
|
|
511
|
+
mode: "poll",
|
|
512
|
+
pollIntervalMs: 1000,
|
|
513
|
+
debounceMs: 5,
|
|
514
|
+
onChange: function (e) { symHits.push(e.relativePath); },
|
|
515
|
+
audit: false,
|
|
516
|
+
});
|
|
517
|
+
var symlinkMade = false;
|
|
518
|
+
try {
|
|
519
|
+
fs.symlinkSync(os.tmpdir(), path.join(symDir, "link-out"));
|
|
520
|
+
symlinkMade = true;
|
|
521
|
+
} catch (_e) { /* some sandboxes refuse symlink even on POSIX */ }
|
|
522
|
+
// Also drop a real file so we have a positive control that the
|
|
523
|
+
// tick ran and delivered SOMETHING.
|
|
524
|
+
fs.writeFileSync(path.join(symDir, "real.txt"), "x");
|
|
525
|
+
await helpers.waitUntil(function () {
|
|
526
|
+
symW._flushForTest();
|
|
527
|
+
return symHits.indexOf("real.txt") !== -1;
|
|
528
|
+
}, { label: "watcher poll: real.txt control" });
|
|
529
|
+
if (symlinkMade) {
|
|
530
|
+
check("watcher poll: symlink entry skipped in walk",
|
|
531
|
+
symHits.indexOf("link-out") === -1);
|
|
532
|
+
} else {
|
|
533
|
+
check("watcher poll: symlink entry skipped (skipped — symlink unavailable)", true);
|
|
534
|
+
}
|
|
535
|
+
symW.stop();
|
|
536
|
+
} finally {
|
|
537
|
+
try { fs.rmSync(symDir, { recursive: true, force: true }); } catch (_e) {}
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// ---- maxPending overflow: too many distinct pending paths trips the
|
|
542
|
+
// safety net → onError(watcher/overflow) + self-stop, dropping further
|
|
543
|
+
// events. Deterministic via the synchronous poll tick ----
|
|
544
|
+
var ovDir = fs.mkdtempSync(path.join(os.tmpdir(), "watcher-ov-"));
|
|
545
|
+
try {
|
|
546
|
+
var ovErrs = [];
|
|
547
|
+
var ovHits = [];
|
|
548
|
+
var ow = b.watcher.create({
|
|
549
|
+
root: ovDir,
|
|
550
|
+
mode: "poll",
|
|
551
|
+
pollIntervalMs: 1000,
|
|
552
|
+
debounceMs: 5,
|
|
553
|
+
maxPending: 2,
|
|
554
|
+
onChange: function (e) { ovHits.push(e.relativePath); },
|
|
555
|
+
onError: function (e) { ovErrs.push(e); },
|
|
556
|
+
audit: false,
|
|
557
|
+
});
|
|
558
|
+
// Create more distinct new files than maxPending in a single tick.
|
|
559
|
+
for (var oi = 0; oi < 5; oi += 1) {
|
|
560
|
+
fs.writeFileSync(path.join(ovDir, "ov-" + oi + ".txt"), "x");
|
|
561
|
+
}
|
|
562
|
+
ow._flushForTest(); // one synchronous tick enqueues → overflow
|
|
563
|
+
check("watcher: maxPending overflow surfaces onError(watcher/overflow)",
|
|
564
|
+
ovErrs.some(function (e) { return e && e.code === "watcher/overflow"; }));
|
|
565
|
+
|
|
566
|
+
// Post-overflow the watcher self-stopped; a later change is dropped.
|
|
567
|
+
ovHits.length = 0;
|
|
568
|
+
fs.writeFileSync(path.join(ovDir, "after-stop.txt"), "x");
|
|
569
|
+
ow._flushForTest();
|
|
570
|
+
check("watcher: overflow self-stops — later events dropped",
|
|
571
|
+
ovHits.indexOf("after-stop.txt") === -1);
|
|
572
|
+
ow.stop(); // idempotent after self-stop
|
|
573
|
+
} finally {
|
|
574
|
+
try { fs.rmSync(ovDir, { recursive: true, force: true }); } catch (_e) {}
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
// ---- poll: running-tick pollMaxFiles overflow routes through onError
|
|
578
|
+
// (distinct from the create()-time initial-walk overflow tested above,
|
|
579
|
+
// which throws watcher/start-failed) ----
|
|
580
|
+
var tickCapDir = fs.mkdtempSync(path.join(os.tmpdir(), "watcher-tickcap-"));
|
|
581
|
+
try {
|
|
582
|
+
var tickErrs = [];
|
|
583
|
+
var tw = b.watcher.create({
|
|
584
|
+
root: tickCapDir, // starts empty → initial walk under cap
|
|
585
|
+
mode: "poll",
|
|
586
|
+
pollIntervalMs: 1000,
|
|
587
|
+
pollMaxFiles: 1,
|
|
588
|
+
onChange: function () {},
|
|
589
|
+
onError: function (e) { tickErrs.push(e); },
|
|
590
|
+
audit: false,
|
|
591
|
+
});
|
|
592
|
+
// Now blow past the cap so the NEXT tick's walk throws.
|
|
593
|
+
fs.writeFileSync(path.join(tickCapDir, "t1.txt"), "x");
|
|
594
|
+
fs.writeFileSync(path.join(tickCapDir, "t2.txt"), "x");
|
|
595
|
+
tw._flushForTest();
|
|
596
|
+
check("watcher poll: running-tick pollMaxFiles overflow surfaces onError(poll-overflow)",
|
|
597
|
+
tickErrs.some(function (e) { return e && e.code === "watcher/poll-overflow"; }));
|
|
598
|
+
tw.stop();
|
|
599
|
+
} finally {
|
|
600
|
+
try { fs.rmSync(tickCapDir, { recursive: true, force: true }); } catch (_e) {}
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
// ---- operator hooks that throw must not crash dispatch ----
|
|
604
|
+
var throwDir = fs.mkdtempSync(path.join(os.tmpdir(), "watcher-throw-"));
|
|
605
|
+
try {
|
|
606
|
+
var afterChange = [];
|
|
607
|
+
var thw = b.watcher.create({
|
|
608
|
+
root: throwDir,
|
|
609
|
+
mode: "poll",
|
|
610
|
+
pollIntervalMs: 1000,
|
|
611
|
+
debounceMs: 5,
|
|
612
|
+
onChange: function (e) {
|
|
613
|
+
afterChange.push(e.relativePath);
|
|
614
|
+
throw new Error("operator onChange blew up");
|
|
615
|
+
},
|
|
616
|
+
onDelete: function () { throw new Error("operator onDelete blew up"); },
|
|
617
|
+
audit: false,
|
|
618
|
+
});
|
|
619
|
+
fs.writeFileSync(path.join(throwDir, "boom.txt"), "x");
|
|
620
|
+
await helpers.waitUntil(function () {
|
|
621
|
+
thw._flushForTest();
|
|
622
|
+
return afterChange.indexOf("boom.txt") !== -1;
|
|
623
|
+
}, { label: "watcher: throwing onChange still dispatched" });
|
|
624
|
+
check("watcher: throwing onChange hook does not crash dispatch",
|
|
625
|
+
afterChange.indexOf("boom.txt") !== -1);
|
|
626
|
+
|
|
627
|
+
// A second, distinct change still dispatches (proves dispatch loop
|
|
628
|
+
// survived the earlier throw).
|
|
629
|
+
fs.writeFileSync(path.join(throwDir, "boom2.txt"), "x");
|
|
630
|
+
await helpers.waitUntil(function () {
|
|
631
|
+
thw._flushForTest();
|
|
632
|
+
return afterChange.indexOf("boom2.txt") !== -1;
|
|
633
|
+
}, { label: "watcher: dispatch survives prior hook throw" });
|
|
634
|
+
check("watcher: dispatch continues after a hook throw",
|
|
635
|
+
afterChange.indexOf("boom2.txt") !== -1);
|
|
636
|
+
|
|
637
|
+
// Deleting the file drives the throwing onDelete — must not crash.
|
|
638
|
+
fs.unlinkSync(path.join(throwDir, "boom.txt"));
|
|
639
|
+
var delThrewCrash = false;
|
|
640
|
+
try {
|
|
641
|
+
await helpers.waitUntil(function () {
|
|
642
|
+
thw._flushForTest();
|
|
643
|
+
// We can't observe onDelete's arg (it throws), but reaching here
|
|
644
|
+
// without an unhandled exception is the assertion.
|
|
645
|
+
return true;
|
|
646
|
+
}, { label: "watcher: throwing onDelete tolerated", timeoutMs: 1000 });
|
|
647
|
+
} catch (_e) { delThrewCrash = true; }
|
|
648
|
+
check("watcher: throwing onDelete hook does not crash dispatch", !delThrewCrash);
|
|
649
|
+
thw.stop();
|
|
650
|
+
} finally {
|
|
651
|
+
try { fs.rmSync(throwDir, { recursive: true, force: true }); } catch (_e) {}
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
// ---- onError hook that itself throws must not crash the watcher ----
|
|
655
|
+
// Drive the overflow path with an onError that throws; _safeError wraps
|
|
656
|
+
// the operator callback in try/catch so the throw is swallowed.
|
|
657
|
+
var errThrowDir = fs.mkdtempSync(path.join(os.tmpdir(), "watcher-errthrow-"));
|
|
658
|
+
try {
|
|
659
|
+
var reachedAfter = false;
|
|
660
|
+
var ew = b.watcher.create({
|
|
661
|
+
root: errThrowDir,
|
|
662
|
+
mode: "poll",
|
|
663
|
+
pollIntervalMs: 1000,
|
|
664
|
+
debounceMs: 5,
|
|
665
|
+
maxPending: 1,
|
|
666
|
+
onChange: function () {},
|
|
667
|
+
onError: function () { throw new Error("operator onError blew up"); },
|
|
668
|
+
audit: false,
|
|
669
|
+
});
|
|
670
|
+
fs.writeFileSync(path.join(errThrowDir, "e1.txt"), "x");
|
|
671
|
+
fs.writeFileSync(path.join(errThrowDir, "e2.txt"), "x");
|
|
672
|
+
fs.writeFileSync(path.join(errThrowDir, "e3.txt"), "x");
|
|
673
|
+
ew._flushForTest(); // overflow → _safeError → onError throws → swallowed
|
|
674
|
+
reachedAfter = true;
|
|
675
|
+
check("watcher: throwing onError hook does not crash the watcher", reachedAfter);
|
|
676
|
+
ew.stop();
|
|
677
|
+
} finally {
|
|
678
|
+
try { fs.rmSync(errThrowDir, { recursive: true, force: true }); } catch (_e) {}
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
// ---- debounce: one observed change produces exactly one dispatch, and
|
|
682
|
+
// a same-tick modification (size/mtime delta) re-fires on the next tick ----
|
|
683
|
+
var coalDir = fs.mkdtempSync(path.join(os.tmpdir(), "watcher-coal-"));
|
|
684
|
+
try {
|
|
685
|
+
var coalCount = 0;
|
|
686
|
+
var cw = b.watcher.create({
|
|
687
|
+
root: coalDir,
|
|
688
|
+
mode: "poll",
|
|
689
|
+
pollIntervalMs: 1000,
|
|
690
|
+
debounceMs: 5,
|
|
691
|
+
onChange: function (e) { if (e.relativePath === "c.txt") coalCount += 1; },
|
|
692
|
+
audit: false,
|
|
693
|
+
});
|
|
694
|
+
cw._flushForTest(); // baseline (empty tree)
|
|
695
|
+
coalCount = 0;
|
|
696
|
+
|
|
697
|
+
fs.writeFileSync(path.join(coalDir, "c.txt"), "one");
|
|
698
|
+
await helpers.waitUntil(function () {
|
|
699
|
+
cw._flushForTest();
|
|
700
|
+
return coalCount >= 1;
|
|
701
|
+
}, { label: "watcher debounce: c.txt first dispatch" });
|
|
702
|
+
check("watcher: a single observed change dispatches exactly one onChange",
|
|
703
|
+
coalCount === 1);
|
|
704
|
+
|
|
705
|
+
// No further change → no further dispatch across extra ticks (the
|
|
706
|
+
// snapshot diff is empty, so nothing re-enqueues).
|
|
707
|
+
cw._flushForTest();
|
|
708
|
+
cw._flushForTest();
|
|
709
|
+
check("watcher: an unchanged tree re-tick fires no onChange", coalCount === 1);
|
|
710
|
+
|
|
711
|
+
// A real modification (content grows → size + mtime differ) re-fires.
|
|
712
|
+
fs.writeFileSync(path.join(coalDir, "c.txt"), "one-two-three");
|
|
713
|
+
await helpers.waitUntil(function () {
|
|
714
|
+
cw._flushForTest();
|
|
715
|
+
return coalCount >= 2;
|
|
716
|
+
}, { label: "watcher debounce: c.txt modify re-dispatch" });
|
|
717
|
+
check("watcher: a subsequent modification re-fires onChange", coalCount === 2);
|
|
718
|
+
cw.stop();
|
|
719
|
+
} finally {
|
|
720
|
+
try { fs.rmSync(coalDir, { recursive: true, force: true }); } catch (_e) {}
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
// ---- #505: ignore-pattern caps are exported so a consumer pre-filtering
|
|
724
|
+
// operator patterns aligns with what create() enforces, instead of pinning
|
|
725
|
+
// hand-copied mirror constants that silently drift on an upstream refresh ----
|
|
726
|
+
check("watcher: MAX_IGNORE_PATTERN_LEN exported and matches the enforced cap",
|
|
727
|
+
typeof b.watcher.MAX_IGNORE_PATTERN_LEN === "number" &&
|
|
728
|
+
b.watcher.MAX_IGNORE_PATTERN_LEN === 256);
|
|
729
|
+
check("watcher: MAX_IGNORE_STAR_COUNT exported and matches the enforced cap",
|
|
730
|
+
typeof b.watcher.MAX_IGNORE_STAR_COUNT === "number" &&
|
|
731
|
+
b.watcher.MAX_IGNORE_STAR_COUNT === 16);
|
|
732
|
+
// The exported caps must actually gate create() (a pattern one under the cap
|
|
733
|
+
// is accepted; one over is refused) so a pre-filter that trusts them agrees.
|
|
734
|
+
var underCap = new Array(b.watcher.MAX_IGNORE_PATTERN_LEN).join("a") + "*"; // len = cap
|
|
735
|
+
var overCap = new Array(b.watcher.MAX_IGNORE_PATTERN_LEN + 2).join("a") + "*";
|
|
736
|
+
var threwUnder = null, threwOver = null;
|
|
737
|
+
try { var uw = b.watcher.create({ root: os.tmpdir(), ignore: [underCap], onChange: function () {} }); uw.stop(); }
|
|
738
|
+
catch (e) { threwUnder = e; }
|
|
739
|
+
try { b.watcher.create({ root: os.tmpdir(), ignore: [overCap], onChange: function () {} }); }
|
|
740
|
+
catch (e) { threwOver = e; }
|
|
741
|
+
check("watcher: pattern at the exported length cap is accepted",
|
|
742
|
+
threwUnder === null);
|
|
743
|
+
check("watcher: pattern over the exported length cap is refused",
|
|
744
|
+
threwOver && threwOver.code === "watcher/bad-ignore");
|
|
745
|
+
|
|
746
|
+
// ---- #508: ignoreCaseFold folds the walk-prune identically to a
|
|
747
|
+
// case-insensitive consumer's own filter, so an on-disk 'Node_Modules' is
|
|
748
|
+
// pruned by a 'node_modules/**' ignore (else the walk stats the whole
|
|
749
|
+
// subtree toward pollMaxFiles and can overflow into the degraded state) ----
|
|
750
|
+
var cfDir = fs.mkdtempSync(path.join(os.tmpdir(), "watcher-casefold-"));
|
|
751
|
+
try {
|
|
752
|
+
var cfHits = [];
|
|
753
|
+
var cfW = b.watcher.create({
|
|
754
|
+
root: cfDir,
|
|
755
|
+
mode: "poll",
|
|
756
|
+
pollIntervalMs: 1000,
|
|
757
|
+
debounceMs: 5,
|
|
758
|
+
ignore: ["node_modules/**", "*.log", "exact-ignore.txt"],
|
|
759
|
+
ignoreCaseFold: true,
|
|
760
|
+
onChange: function (e) { cfHits.push(e.relativePath); },
|
|
761
|
+
audit: false,
|
|
762
|
+
});
|
|
763
|
+
fs.mkdirSync(path.join(cfDir, "Node_Modules"));
|
|
764
|
+
fs.writeFileSync(path.join(cfDir, "Node_Modules", "pkg.js"), "x"); // prefix ignore, case-folded
|
|
765
|
+
fs.writeFileSync(path.join(cfDir, "App.LOG"), "x"); // glob ignore, case-folded
|
|
766
|
+
fs.writeFileSync(path.join(cfDir, "Exact-Ignore.TXT"), "x"); // exact ignore, case-folded
|
|
767
|
+
fs.writeFileSync(path.join(cfDir, "keep.txt"), "x"); // NOT ignored → fires (control)
|
|
768
|
+
await helpers.waitUntil(function () {
|
|
769
|
+
cfW._flushForTest();
|
|
770
|
+
return cfHits.indexOf("keep.txt") !== -1;
|
|
771
|
+
}, { label: "watcher casefold: keep.txt control" });
|
|
772
|
+
check("watcher ignoreCaseFold: case-different dir pruned by prefix ignore",
|
|
773
|
+
cfHits.indexOf("Node_Modules/pkg.js") === -1);
|
|
774
|
+
check("watcher ignoreCaseFold: case-different basename pruned by glob ignore",
|
|
775
|
+
cfHits.indexOf("App.LOG") === -1);
|
|
776
|
+
check("watcher ignoreCaseFold: case-different name pruned by exact ignore",
|
|
777
|
+
cfHits.indexOf("Exact-Ignore.TXT") === -1);
|
|
778
|
+
cfW.stop();
|
|
779
|
+
} finally {
|
|
780
|
+
try { fs.rmSync(cfDir, { recursive: true, force: true }); } catch (_e) {}
|
|
781
|
+
}
|
|
782
|
+
// ...and case-fold is opt-in: without it, a case-different name is NOT pruned
|
|
783
|
+
// (default stays case-sensitive so existing consumers are unaffected).
|
|
784
|
+
var csDir = fs.mkdtempSync(path.join(os.tmpdir(), "watcher-casesens-"));
|
|
785
|
+
try {
|
|
786
|
+
var csHits = [];
|
|
787
|
+
var csW = b.watcher.create({
|
|
788
|
+
root: csDir, mode: "poll", pollIntervalMs: 1000, debounceMs: 5,
|
|
789
|
+
ignore: ["node_modules/**"],
|
|
790
|
+
onChange: function (e) { csHits.push(e.relativePath); }, audit: false,
|
|
791
|
+
});
|
|
792
|
+
fs.mkdirSync(path.join(csDir, "Node_Modules"));
|
|
793
|
+
fs.writeFileSync(path.join(csDir, "Node_Modules", "pkg.js"), "x");
|
|
794
|
+
await helpers.waitUntil(function () {
|
|
795
|
+
csW._flushForTest();
|
|
796
|
+
return csHits.indexOf("Node_Modules/pkg.js") !== -1;
|
|
797
|
+
}, { label: "watcher case-sensitive default: Node_Modules NOT pruned" });
|
|
798
|
+
check("watcher: default (no ignoreCaseFold) stays case-sensitive",
|
|
799
|
+
csHits.indexOf("Node_Modules/pkg.js") !== -1);
|
|
800
|
+
csW.stop();
|
|
801
|
+
} finally {
|
|
802
|
+
try { fs.rmSync(csDir, { recursive: true, force: true }); } catch (_e) {}
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
// ---- #506: a lost ROOT (unmounted volume / deleted root) surfaces a
|
|
806
|
+
// DISTINCT root-lost signal, not an empty snapshot that diffs as a delete of
|
|
807
|
+
// every tracked entry (a mass-delete a consumer can't distinguish from a real
|
|
808
|
+
// rm -rf) ----
|
|
809
|
+
var rlDir = fs.mkdtempSync(path.join(os.tmpdir(), "watcher-rootlost-"));
|
|
810
|
+
var rlDeletes = [];
|
|
811
|
+
var rlErrs = [];
|
|
812
|
+
var rlW = b.watcher.create({
|
|
813
|
+
root: rlDir,
|
|
814
|
+
mode: "poll",
|
|
815
|
+
pollIntervalMs: 1000,
|
|
816
|
+
debounceMs: 5,
|
|
817
|
+
onChange: function () {},
|
|
818
|
+
onDelete: function (e) { rlDeletes.push(e.relativePath); },
|
|
819
|
+
onError: function (e) { rlErrs.push(e); },
|
|
820
|
+
audit: false,
|
|
821
|
+
});
|
|
822
|
+
fs.writeFileSync(path.join(rlDir, "one.txt"), "x");
|
|
823
|
+
fs.writeFileSync(path.join(rlDir, "two.txt"), "x");
|
|
824
|
+
rlW._flushForTest(); // baseline snapshot: one.txt, two.txt
|
|
825
|
+
rlDeletes.length = 0;
|
|
826
|
+
// Remove the ROOT out from under the watcher (models an unmounted volume).
|
|
827
|
+
fs.rmSync(rlDir, { recursive: true, force: true });
|
|
828
|
+
rlW._flushForTest(); // tick over an unreadable root
|
|
829
|
+
check("watcher: a lost root surfaces watcher/root-lost via onError",
|
|
830
|
+
rlErrs.some(function (e) { return e && e.code === "watcher/root-lost"; }));
|
|
831
|
+
check("watcher: a lost root does NOT mass-delete every tracked entry",
|
|
832
|
+
rlDeletes.indexOf("one.txt") === -1 && rlDeletes.indexOf("two.txt") === -1);
|
|
833
|
+
rlW.stop();
|
|
834
|
+
|
|
835
|
+
// ---- #507: a dead native FSWatcher handle (EPERM after the watched root is
|
|
836
|
+
// deleted/recreated on Windows) is classified FATAL, so a wrapper can tell
|
|
837
|
+
// change detection has permanently stopped rather than treating it as a
|
|
838
|
+
// transient blip ----
|
|
839
|
+
var hdDir = fs.mkdtempSync(path.join(os.tmpdir(), "watcher-handledead-"));
|
|
840
|
+
try {
|
|
841
|
+
var hdErrs = [];
|
|
842
|
+
var hdW = b.watcher.create({
|
|
843
|
+
root: hdDir,
|
|
844
|
+
mode: "fs",
|
|
845
|
+
onChange: function () {},
|
|
846
|
+
onError: function (e) { hdErrs.push(e); },
|
|
847
|
+
audit: false,
|
|
848
|
+
});
|
|
849
|
+
// Drive the native-backend error path via the test seam (the real trigger —
|
|
850
|
+
// the OS killing the handle — isn't deterministically reproducible).
|
|
851
|
+
var eperm = new Error("EPERM: operation not permitted, watch"); eperm.code = "EPERM";
|
|
852
|
+
hdW._simulateBackendErrorForTest(eperm);
|
|
853
|
+
check("watcher: a handle-dead backend error is classified fatal for consumers",
|
|
854
|
+
hdErrs.some(function (e) { return e && e.fatal === true && e.code === "watcher/handle-dead"; }));
|
|
855
|
+
check("watcher: the classified handle-dead error carries the underlying cause",
|
|
856
|
+
hdErrs.some(function (e) { return e && e.cause && e.cause.code === "EPERM"; }));
|
|
857
|
+
hdW.stop();
|
|
858
|
+
} finally {
|
|
859
|
+
try { fs.rmSync(hdDir, { recursive: true, force: true }); } catch (_e) {}
|
|
860
|
+
}
|
|
311
861
|
}
|
|
312
862
|
|
|
313
863
|
module.exports = { run: run };
|