@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
|
@@ -119,6 +119,14 @@ function testPublicSurface() {
|
|
|
119
119
|
check("b.codepointClass.decodeNumericEntities",
|
|
120
120
|
b.codepointClass.decodeNumericEntities("javascript:") === "javascript:" &&
|
|
121
121
|
b.codepointClass.decodeNumericEntities("javascript:") === "javascript:");
|
|
122
|
+
check("b.codepointClass.decodeMarkupEntities",
|
|
123
|
+
b.codepointClass.decodeMarkupEntities("expression(") === "expression(" &&
|
|
124
|
+
b.codepointClass.decodeMarkupEntities("behavior:url(") === "behavior:url(" &&
|
|
125
|
+
b.codepointClass.decodeMarkupEntities("a	b").charCodeAt(1) === 0x09);
|
|
126
|
+
check("b.codepointClass.stripUrlSchemeWhitespace",
|
|
127
|
+
b.codepointClass.stripUrlSchemeWhitespace(" javascript:x") === "javascript:x" &&
|
|
128
|
+
b.codepointClass.stripUrlSchemeWhitespace(
|
|
129
|
+
"java" + b.codepointClass.fromCp(0x09) + "script:") === "javascript:");
|
|
122
130
|
// The remaining catalog constants the issue lists are reachable.
|
|
123
131
|
check("b.codepointClass.BOM_CHAR",
|
|
124
132
|
typeof b.codepointClass.BOM_CHAR === "string" && b.codepointClass.BOM_CHAR.charCodeAt(0) === 0xFEFF);
|
|
@@ -54,6 +54,28 @@ function run() {
|
|
|
54
54
|
});
|
|
55
55
|
check("prohibited.classify: social-scoring caught", hits1.indexOf("social-scoring") !== -1);
|
|
56
56
|
|
|
57
|
+
// Art. 5(1)(c) of the ADOPTED Regulation (EU) 2024/1689 prohibits social
|
|
58
|
+
// scoring by ANY actor. The "by public authorities or on their behalf"
|
|
59
|
+
// limitation present in the 2021 Commission proposal was removed from the
|
|
60
|
+
// final text; the catalog's own description already reflects that (it does
|
|
61
|
+
// not mention public authorities). A private-company social-scoring system
|
|
62
|
+
// must therefore classify as prohibited, not fall through to minimal-risk.
|
|
63
|
+
var hitsPriv = aiAct.prohibited.classify({
|
|
64
|
+
purpose: "social-scoring", deployerType: "private-company",
|
|
65
|
+
});
|
|
66
|
+
check("prohibited.classify: private-actor social-scoring caught",
|
|
67
|
+
hitsPriv.indexOf("social-scoring") !== -1);
|
|
68
|
+
var hitsNoDeployer = aiAct.prohibited.classify({ purpose: "social-scoring" });
|
|
69
|
+
check("prohibited.classify: social-scoring caught without deployerType",
|
|
70
|
+
hitsNoDeployer.indexOf("social-scoring") !== -1);
|
|
71
|
+
var assessPrivSocial = aiAct.classify({
|
|
72
|
+
purpose: "social-scoring", deployerType: "private-company",
|
|
73
|
+
});
|
|
74
|
+
check("classify: private-actor social-scoring → prohibited",
|
|
75
|
+
assessPrivSocial.tier === "prohibited");
|
|
76
|
+
check("classify: private-actor social-scoring cites Art. 5",
|
|
77
|
+
assessPrivSocial.legalReference[0] && assessPrivSocial.legalReference[0].indexOf("Art. 5") !== -1);
|
|
78
|
+
|
|
57
79
|
var hits2 = aiAct.prohibited.classify({
|
|
58
80
|
builds: "facial-recognition-db", scrapesUntargeted: true,
|
|
59
81
|
});
|
|
@@ -182,6 +204,25 @@ function run() {
|
|
|
182
204
|
check("transparency.htmlBanner: HTML element", html.indexOf('<div ') === 0);
|
|
183
205
|
check("transparency.htmlBanner: data attr", html.indexOf('data-blamejs-aiAct="Art. 50(2)"') !== -1);
|
|
184
206
|
|
|
207
|
+
// htmlBanner serializes the operator-supplied `lang` into a double-quoted
|
|
208
|
+
// HTML attribute. lang is free-form (a request locale / Accept-Language /
|
|
209
|
+
// query param in a server-rendered banner), so a value carrying a double
|
|
210
|
+
// quote must be entity-escaped or it breaks out of the attribute and injects
|
|
211
|
+
// active content (reflected XSS). Only the element TEXT was escaped before;
|
|
212
|
+
// the attribute values were concatenated raw.
|
|
213
|
+
var xssLang = t.htmlBanner({ kind: "ai-interaction", lang: '"><script>alert(1)</script><x y="' });
|
|
214
|
+
check("transparency.htmlBanner: lang cannot break out of attribute",
|
|
215
|
+
xssLang.indexOf("<script>alert(1)</script>") === -1);
|
|
216
|
+
check("transparency.htmlBanner: lang quote is entity-escaped",
|
|
217
|
+
xssLang.indexOf(""") !== -1);
|
|
218
|
+
var xssHandler = t.htmlBanner({ kind: "ai-interaction", lang: 'en" onmouseover=alert(document.cookie) x="' });
|
|
219
|
+
// The handler substring survives as inert text INSIDE the quoted value; the
|
|
220
|
+
// invariant is that no RAW quote precedes it (which would close the attribute
|
|
221
|
+
// and make onmouseover a real event handler).
|
|
222
|
+
check("transparency.htmlBanner: lang cannot inject an event handler",
|
|
223
|
+
xssHandler.indexOf('"en" onmouseover') === -1 &&
|
|
224
|
+
xssHandler.indexOf('en" onmouseover') !== -1);
|
|
225
|
+
|
|
185
226
|
var w = t.watermark({ mediaKind: "image", modelId: "myco/img-gen-3", modelVersion: "v3.1" });
|
|
186
227
|
check("transparency.watermark: manifest", w.aiActArticle === "Art. 50(2)");
|
|
187
228
|
check("transparency.watermark: modelId", w.modelId === "myco/img-gen-3");
|
|
@@ -193,6 +234,24 @@ function run() {
|
|
|
193
234
|
var jl = t.jsonLdDisclosure({ mediaKind: "audio", modelId: "myco/voice-gen-2" });
|
|
194
235
|
check("transparency.jsonLdDisclosure: tag", jl.indexOf('<script type="application/ld+json"') === 0);
|
|
195
236
|
|
|
237
|
+
// jsonLdDisclosure embeds the operator-supplied watermark manifest via
|
|
238
|
+
// JSON.stringify inside a <script> element. Raw JSON.stringify does not
|
|
239
|
+
// escape "</script>" (or "<"), so a model id / deployer name carrying that
|
|
240
|
+
// sequence terminates the script block early and injects active markup. The
|
|
241
|
+
// HTML parser ends a <script> at the first "</script>" regardless of the
|
|
242
|
+
// type="application/ld+json" attribute, so the injected element executes.
|
|
243
|
+
var jlXss = t.jsonLdDisclosure({
|
|
244
|
+
mediaKind: "image",
|
|
245
|
+
modelId: "x</script><script>alert(document.domain)</script>",
|
|
246
|
+
});
|
|
247
|
+
check("transparency.jsonLdDisclosure: cannot break out of <script>",
|
|
248
|
+
jlXss.indexOf("</script><script>alert(document.domain)</script>") === -1);
|
|
249
|
+
check("transparency.jsonLdDisclosure: '<' is unicode-escaped in the payload",
|
|
250
|
+
jlXss.indexOf("\\u003c/script\\u003e") !== -1);
|
|
251
|
+
// Exactly one real closing </script> tag (the element terminator) survives.
|
|
252
|
+
check("transparency.jsonLdDisclosure: single real closing tag",
|
|
253
|
+
jlXss.split("</script>").length === 2);
|
|
254
|
+
|
|
196
255
|
var meta = t.metaTags({ kind: "deep-fake", policyUri: "https://example.com/ai-policy" });
|
|
197
256
|
check("transparency.metaTags: notice", meta.indexOf('<meta name="ai-act-notice"') !== -1);
|
|
198
257
|
check("transparency.metaTags: article", meta.indexOf('<meta name="ai-act-article"') !== -1);
|
|
@@ -776,6 +835,141 @@ function run() {
|
|
|
776
835
|
});
|
|
777
836
|
}, /copVersion/);
|
|
778
837
|
|
|
838
|
+
// ---- full-dotted-path drive: FRIA (Art. 27), GPAI training-data
|
|
839
|
+
// summary (Art. 53(1)(d)), COP adherence form + signed-declaration
|
|
840
|
+
// verify. Each primitive is exercised through the real
|
|
841
|
+
// b.compliance.aiAct.* consumer path with a valid input plus a
|
|
842
|
+
// missing-required-field typed refusal. ----
|
|
843
|
+
|
|
844
|
+
// b.compliance.aiAct.fundamentalRightsImpactAssessment — Art. 27 FRIA
|
|
845
|
+
var friaDoc = b.compliance.aiAct.fundamentalRightsImpactAssessment({
|
|
846
|
+
systemId: "credit-scoring-v3",
|
|
847
|
+
systemDescription: { purpose: "loan approval / creditworthiness" },
|
|
848
|
+
deploymentContext: { purpose: "loan approval", sector: "financial",
|
|
849
|
+
geography: "EU", scale: "1M decisions/year" },
|
|
850
|
+
affectedPersons: { categories: ["EU consumers"], estimatedCount: 1000000 },
|
|
851
|
+
risksToFundamentalRights: ["discriminatory denial", "right to explanation"],
|
|
852
|
+
mitigations: ["bias audit every 6 months", "human review threshold"],
|
|
853
|
+
humanOversight: { roles: ["credit officer"], escalationPath: "ombudsman" },
|
|
854
|
+
reviewCadence: "semi-annual",
|
|
855
|
+
});
|
|
856
|
+
check("fria: Article 27 document", friaDoc.article.indexOf("Article 27") !== -1);
|
|
857
|
+
check("fria: systemId echoed", friaDoc.systemId === "credit-scoring-v3");
|
|
858
|
+
check("fria: risks carried through", friaDoc.risks.length === 2);
|
|
859
|
+
check("fria: mitigations carried through", friaDoc.mitigations.length === 2);
|
|
860
|
+
check("fria: humanOversight carried through", friaDoc.humanOversight.escalationPath === "ombudsman");
|
|
861
|
+
check("fria: reviewCadence honored", friaDoc.reviewCadence === "semi-annual");
|
|
862
|
+
check("fria: classification derived from systemDescription",
|
|
863
|
+
friaDoc.classification !== null && typeof friaDoc.classification.tier === "string");
|
|
864
|
+
check("fria: operator-must-notify status", friaDoc.notificationStatus === "operator-must-notify");
|
|
865
|
+
|
|
866
|
+
// Defaults when optional context + systemDescription are omitted
|
|
867
|
+
var friaMin = b.compliance.aiAct.fundamentalRightsImpactAssessment({ systemId: "s1" });
|
|
868
|
+
check("fria: classification null without systemDescription", friaMin.classification === null);
|
|
869
|
+
check("fria: reviewCadence defaults to annual", friaMin.reviewCadence === "annual");
|
|
870
|
+
|
|
871
|
+
rejects("fria: missing systemId refused",
|
|
872
|
+
function () { b.compliance.aiAct.fundamentalRightsImpactAssessment({}); },
|
|
873
|
+
/systemId must be a non-empty string/);
|
|
874
|
+
rejects("fria: missing opts refused",
|
|
875
|
+
function () { b.compliance.aiAct.fundamentalRightsImpactAssessment(); },
|
|
876
|
+
/opts must be an object/);
|
|
877
|
+
check("fria: missing opts is a typed ComplianceError with descriptive message",
|
|
878
|
+
(function () {
|
|
879
|
+
try { b.compliance.aiAct.fundamentalRightsImpactAssessment({}); return false; }
|
|
880
|
+
catch (e) { return e.name === "ComplianceError" && e.code === "compliance-ai-act/no-system-id" &&
|
|
881
|
+
/systemId must be a non-empty string/.test(e.message); }
|
|
882
|
+
})());
|
|
883
|
+
|
|
884
|
+
// b.compliance.aiAct.gpai.trainingDataSummary — Art. 53(1)(d) template
|
|
885
|
+
var tds = b.compliance.aiAct.gpai.trainingDataSummary({
|
|
886
|
+
modelId: "acme-llm-7b",
|
|
887
|
+
modelVersion: "1.0",
|
|
888
|
+
provider: { name: "Acme AI", address: "1 St", contact: "ai@acme.example" },
|
|
889
|
+
dataCategories: ["web-crawl", "books", "code"],
|
|
890
|
+
modalities: ["text"],
|
|
891
|
+
sources: [
|
|
892
|
+
{ identifier: "CommonCrawl-2024", type: "web-crawl", licenseStatus: "permitted" },
|
|
893
|
+
],
|
|
894
|
+
biasMitigation: { methodsApplied: ["demographic-balance"], auditCadence: "quarterly" },
|
|
895
|
+
});
|
|
896
|
+
check("trainingDataSummary: Article 53(1)(d)", tds.article.indexOf("Article 53(1)(d)") !== -1);
|
|
897
|
+
check("trainingDataSummary: AI Office template", tds.template.indexOf("AI Office") !== -1);
|
|
898
|
+
check("trainingDataSummary: modelId echoed", tds.modelId === "acme-llm-7b");
|
|
899
|
+
check("trainingDataSummary: modalities carried", tds.modalities.length === 1 && tds.modalities[0] === "text");
|
|
900
|
+
check("trainingDataSummary: source normalized", tds.sources[0].identifier === "CommonCrawl-2024");
|
|
901
|
+
check("trainingDataSummary: source defaults applied", tds.sources[0].url === null && tds.sources[0].size === null);
|
|
902
|
+
check("trainingDataSummary: licenseStatus preserved", tds.sources[0].licenseStatus === "permitted");
|
|
903
|
+
check("trainingDataSummary: copyrightStatus defaulted", tds.copyrightStatus.respectsRightReservations === null);
|
|
904
|
+
check("trainingDataSummary: well-known publish note", tds.note.indexOf("well-known") !== -1);
|
|
905
|
+
|
|
906
|
+
rejects("trainingDataSummary: missing modelId refused",
|
|
907
|
+
function () { b.compliance.aiAct.gpai.trainingDataSummary({ modelVersion: "1.0" }); },
|
|
908
|
+
/modelId must be a non-empty string/);
|
|
909
|
+
rejects("trainingDataSummary: missing opts refused",
|
|
910
|
+
function () { b.compliance.aiAct.gpai.trainingDataSummary(); },
|
|
911
|
+
/opts must be an object/);
|
|
912
|
+
check("trainingDataSummary: missing modelId is a typed ComplianceError with descriptive message",
|
|
913
|
+
(function () {
|
|
914
|
+
try { b.compliance.aiAct.gpai.trainingDataSummary({ modelVersion: "1.0" }); return false; }
|
|
915
|
+
catch (e) { return e.name === "ComplianceError" && e.code === "compliance-ai-act/no-model-id" &&
|
|
916
|
+
/modelId must be a non-empty string/.test(e.message); }
|
|
917
|
+
})());
|
|
918
|
+
|
|
919
|
+
// b.compliance.aiAct.gpai.adherenceForm — derived Art. 53 obligation set
|
|
920
|
+
var dotEvidence = b.crypto.sha3Hash("annex-xi-technical-documentation-v1");
|
|
921
|
+
var dotForm = b.compliance.aiAct.gpai.adherenceForm({
|
|
922
|
+
modelId: "dotted-llm", modelVersion: "2.0",
|
|
923
|
+
commitments: [{ article: "Art. 53(1)(a)", statement: "Annex XI docs maintained", evidenceHash: dotEvidence }],
|
|
924
|
+
});
|
|
925
|
+
check("adherenceForm: derives 4 Art. 53 obligations", dotForm.commitments.length === 4);
|
|
926
|
+
check("adherenceForm: not systemic by default", dotForm.isSystemicRisk === false);
|
|
927
|
+
check("adherenceForm: articles Art. 53 only", dotForm.articles.length === 1 && dotForm.articles[0] === "Art. 53");
|
|
928
|
+
check("adherenceForm: bound commitment evidenced", dotForm.commitments[0].evidenced === true);
|
|
929
|
+
check("adherenceForm: unsupplied obligation surfaced", dotForm.commitments[1].evidenced === false);
|
|
930
|
+
|
|
931
|
+
rejects("adherenceForm: missing modelVersion refused",
|
|
932
|
+
function () {
|
|
933
|
+
b.compliance.aiAct.gpai.adherenceForm({
|
|
934
|
+
modelId: "m",
|
|
935
|
+
commitments: [{ article: "Art. 53(1)(a)", statement: "x", evidenceHash: dotEvidence }],
|
|
936
|
+
});
|
|
937
|
+
}, /modelVersion/);
|
|
938
|
+
rejects("adherenceForm: missing opts refused",
|
|
939
|
+
function () { b.compliance.aiAct.gpai.adherenceForm(); },
|
|
940
|
+
/must be an object|opts/);
|
|
941
|
+
|
|
942
|
+
// b.compliance.aiAct.gpai.verifyAdherence — signed round-trip verdict.
|
|
943
|
+
// The verify contract RETURNS a verdict { valid, adherence, reason } and
|
|
944
|
+
// never throws, so its "refusals" are verdicts, not exceptions.
|
|
945
|
+
var dotPair = b.crypto.generateSigningKeyPair("ml-dsa-87");
|
|
946
|
+
var dotArticles = ["Art. 53(1)(a)", "Art. 53(1)(b)", "Art. 53(1)(c)", "Art. 53(1)(d)"];
|
|
947
|
+
var dotCommitments = dotArticles.map(function (a) {
|
|
948
|
+
return { article: a, statement: "evidence for " + a, evidenceHash: dotEvidence };
|
|
949
|
+
});
|
|
950
|
+
var dotEnv = b.compliance.aiAct.gpai.declareAdherence({
|
|
951
|
+
modelId: "dotted-llm", modelVersion: "2.0",
|
|
952
|
+
commitments: dotCommitments,
|
|
953
|
+
privateKeyPem: dotPair.privateKey,
|
|
954
|
+
});
|
|
955
|
+
var dotVerdict = b.compliance.aiAct.gpai.verifyAdherence(dotEnv, dotPair.publicKey);
|
|
956
|
+
check("verifyAdherence: valid round-trip", dotVerdict.valid === true);
|
|
957
|
+
check("verifyAdherence: reason null on success", dotVerdict.reason === null);
|
|
958
|
+
check("verifyAdherence: surfaces adherence form", dotVerdict.adherence.modelId === "dotted-llm");
|
|
959
|
+
|
|
960
|
+
// Missing required public key → typed verdict refusal (never throws)
|
|
961
|
+
var dotNoKeyVerdict = b.compliance.aiAct.gpai.verifyAdherence(dotEnv);
|
|
962
|
+
check("verifyAdherence: missing public key → verdict refusal",
|
|
963
|
+
dotNoKeyVerdict.valid === false && dotNoKeyVerdict.reason === "public-key-required" &&
|
|
964
|
+
dotNoKeyVerdict.adherence === null);
|
|
965
|
+
|
|
966
|
+
// Wrong signing key → signature-invalid verdict
|
|
967
|
+
var dotOtherPair = b.crypto.generateSigningKeyPair("ml-dsa-87");
|
|
968
|
+
var dotBadVerdict = b.compliance.aiAct.gpai.verifyAdherence(dotEnv, dotOtherPair.publicKey);
|
|
969
|
+
check("verifyAdherence: wrong key → signature-invalid verdict",
|
|
970
|
+
dotBadVerdict.valid === false && dotBadVerdict.reason === "signature-invalid" &&
|
|
971
|
+
dotBadVerdict.adherence === null);
|
|
972
|
+
|
|
779
973
|
console.log("OK — compliance-ai-act tests");
|
|
780
974
|
}
|
|
781
975
|
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* Regression: compliance lifecycle catalogs indexed by an operator-supplied
|
|
6
|
+
* string must resolve only OWN keys. A regime / posture whose value collides
|
|
7
|
+
* with an Object.prototype member ("valueOf", "toString", "constructor",
|
|
8
|
+
* "hasOwnProperty", ...) previously resolved to the inherited function
|
|
9
|
+
* instead of falling back / throwing:
|
|
10
|
+
*
|
|
11
|
+
* - b.incident.report.open({ regime: "valueOf" }) picked up
|
|
12
|
+
* Object.prototype.valueOf as the deadline table -> every dueBy became
|
|
13
|
+
* NaN -> a filing 100 days past the real 30-day final wall was recorded
|
|
14
|
+
* late: false and status().late.final stayed 0 (a missed regulatory
|
|
15
|
+
* deadline reported as met).
|
|
16
|
+
* - b.retention.complianceFloor("valueOf", ttl) returned a function
|
|
17
|
+
* instead of throwing retention/unknown-posture (the config-time typo
|
|
18
|
+
* guard silently failed open for these ~7 values).
|
|
19
|
+
*/
|
|
20
|
+
var helpers = require("../helpers");
|
|
21
|
+
var b = helpers.b;
|
|
22
|
+
var check = helpers.check;
|
|
23
|
+
|
|
24
|
+
var PROTO_KEYS = ["valueOf", "toString", "constructor", "hasOwnProperty",
|
|
25
|
+
"isPrototypeOf", "propertyIsEnumerable", "toLocaleString"];
|
|
26
|
+
|
|
27
|
+
async function run() {
|
|
28
|
+
var HOUR = b.constants.TIME.hours(1);
|
|
29
|
+
var H24 = b.constants.TIME.hours(24);
|
|
30
|
+
var H72 = b.constants.TIME.hours(72);
|
|
31
|
+
var D30 = b.constants.TIME.days(30);
|
|
32
|
+
|
|
33
|
+
// ---- incident.report: proto-key regime must fall back to DEFAULT_DEADLINES ----
|
|
34
|
+
for (var i = 0; i < PROTO_KEYS.length; i++) {
|
|
35
|
+
var regime = PROTO_KEYS[i];
|
|
36
|
+
var ir = b.incident.report.create({ audit: false });
|
|
37
|
+
var rec = await ir.open({ regime: regime, detectedAt: 0 });
|
|
38
|
+
check("incident regime '" + regime + "' initial is finite wall not NaN",
|
|
39
|
+
rec.dueBy.initial === H24);
|
|
40
|
+
check("incident regime '" + regime + "' intermediate is finite wall not NaN",
|
|
41
|
+
rec.dueBy.intermediate === H72);
|
|
42
|
+
check("incident regime '" + regime + "' final is finite wall not NaN",
|
|
43
|
+
rec.dueBy.final === D30);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// A genuinely-late FINAL filing under a proto-key regime is flagged late.
|
|
47
|
+
var lateIr = b.incident.report.create({
|
|
48
|
+
audit: false,
|
|
49
|
+
now: function () { return b.constants.TIME.days(100); }, // 100d >> 30d final wall
|
|
50
|
+
});
|
|
51
|
+
var lateRec = await lateIr.open({ regime: "valueOf", detectedAt: 0 });
|
|
52
|
+
var filed = await lateIr.recordFinal(lateRec.id, { note: "100d late" });
|
|
53
|
+
check("incident: 100-days-late final is late:true (not reported as met)",
|
|
54
|
+
filed.stages.final.late === true);
|
|
55
|
+
check("incident: late final lateBy is the real overrun",
|
|
56
|
+
filed.stages.final.lateBy === b.constants.TIME.days(100) - D30);
|
|
57
|
+
check("incident: status counts the late final",
|
|
58
|
+
lateIr.status().late.final === 1);
|
|
59
|
+
|
|
60
|
+
// Control: a benign unknown regime still falls back (fallback contract intact).
|
|
61
|
+
var ctlIr = b.incident.report.create({ audit: false });
|
|
62
|
+
var ctlRec = await ctlIr.open({ regime: "ccpa-not-a-known-regime", detectedAt: 0 });
|
|
63
|
+
check("incident: benign unknown regime falls back to 30d final",
|
|
64
|
+
ctlRec.dueBy.final === D30);
|
|
65
|
+
|
|
66
|
+
// Regression: real regimes keep their statutory walls (DORA 4h initial).
|
|
67
|
+
var doraIr = b.incident.report.create({ audit: false });
|
|
68
|
+
var doraRec = await doraIr.open({ regime: "dora", detectedAt: 0 });
|
|
69
|
+
check("incident: dora regime keeps 4h initial wall",
|
|
70
|
+
doraRec.dueBy.initial === 4 * HOUR);
|
|
71
|
+
|
|
72
|
+
// ---- retention.complianceFloor: proto-key posture must throw, not return a fn ----
|
|
73
|
+
for (var j = 0; j < PROTO_KEYS.length; j++) {
|
|
74
|
+
var posture = PROTO_KEYS[j];
|
|
75
|
+
var threw = false;
|
|
76
|
+
var ret;
|
|
77
|
+
try { ret = b.retention.complianceFloor(posture, 1000); }
|
|
78
|
+
catch (e) { threw = e && e.code === "retention/unknown-posture"; }
|
|
79
|
+
check("retention.complianceFloor('" + posture + "') throws unknown-posture (not a function)",
|
|
80
|
+
threw === true && ret === undefined);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Control + regression: real posture returns its floor; a plain typo throws.
|
|
84
|
+
check("retention.complianceFloor('hipaa') returns 6-year floor",
|
|
85
|
+
b.retention.complianceFloor("hipaa") === b.constants.TIME.days(365 * 6));
|
|
86
|
+
var typoThrew = false;
|
|
87
|
+
try { b.retention.complianceFloor("hipaa-typo", 1000); }
|
|
88
|
+
catch (e2) { typoThrew = e2 && e2.code === "retention/unknown-posture"; }
|
|
89
|
+
check("retention.complianceFloor plain typo still throws", typoThrew === true);
|
|
90
|
+
|
|
91
|
+
// applyPosture with a proto-key posture must not inherit a function floor.
|
|
92
|
+
var ap = b.retention.applyPosture("valueOf");
|
|
93
|
+
check("retention.applyPosture('valueOf') floorMs is null (no inherited fn)",
|
|
94
|
+
ap !== null ? ap.floorMs === null : true);
|
|
95
|
+
b.retention.applyPosture(""); // reset active posture
|
|
96
|
+
|
|
97
|
+
console.log("OK — compliance lifecycle proto-key tests");
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
module.exports = { run: run };
|
|
101
|
+
if (require.main === module) {
|
|
102
|
+
run().then(function () { process.exit(0); })
|
|
103
|
+
.catch(function (e) { console.error(e); process.exit(1); });
|
|
104
|
+
}
|
|
@@ -681,6 +681,249 @@ function testFetcherValidation() {
|
|
|
681
681
|
check("fetcher.create: missing fetch throws", threwBadFetch);
|
|
682
682
|
}
|
|
683
683
|
|
|
684
|
+
// ---- Error/edge coverage ----
|
|
685
|
+
|
|
686
|
+
function _threwCode(fn, code) {
|
|
687
|
+
try { fn(); return false; }
|
|
688
|
+
catch (e) { return e && e.code === code; }
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
// parseOfacCsvRow — exercise the missing-field alternates (Program /
|
|
692
|
+
// Country / Publish_Date absent → defaults) and the Remarks-present
|
|
693
|
+
// consequent, plus every SDN_Type → canonical mapping.
|
|
694
|
+
function testParseOfacCsvRowEdge() {
|
|
695
|
+
// Minimal row: no Program/Country/Publish_Date/Remarks, no SDN_Type
|
|
696
|
+
var min = sanctions.parseOfacCsvRow({ ent_num: 5, SDN_Name: "MIN GUY" });
|
|
697
|
+
check("parseOfacCsvRow min: no Program → []",
|
|
698
|
+
Array.isArray(min.programs) && min.programs.length === 0);
|
|
699
|
+
check("parseOfacCsvRow min: no Country → null", min.country === null);
|
|
700
|
+
check("parseOfacCsvRow min: no Publish_Date → null", min.listedAt === null);
|
|
701
|
+
check("parseOfacCsvRow min: absent SDN_Type → default entity",
|
|
702
|
+
min.type === "entity");
|
|
703
|
+
check("parseOfacCsvRow min: no Remarks → null", min.remarks === null);
|
|
704
|
+
|
|
705
|
+
// Remarks present → the String(row.Remarks) consequent
|
|
706
|
+
var rem = sanctions.parseOfacCsvRow({
|
|
707
|
+
ent_num: 6, SDN_Name: "REM GUY", SDN_Type: "entity", Remarks: "watchlist note",
|
|
708
|
+
});
|
|
709
|
+
check("parseOfacCsvRow: Remarks preserved", rem.remarks === "watchlist note");
|
|
710
|
+
check("parseOfacCsvRow: SDN_Type entity", rem.type === "entity");
|
|
711
|
+
|
|
712
|
+
// Vessel / aircraft / unknown SDN_Type mappings
|
|
713
|
+
check("parseOfacCsvRow: SDN_Type vessel",
|
|
714
|
+
sanctions.parseOfacCsvRow({ ent_num: 7, SDN_Name: "BOAT", SDN_Type: "vessel" }).type === "vessel");
|
|
715
|
+
check("parseOfacCsvRow: SDN_Type aircraft",
|
|
716
|
+
sanctions.parseOfacCsvRow({ ent_num: 8, SDN_Name: "PLANE", SDN_Type: "aircraft" }).type === "aircraft");
|
|
717
|
+
check("parseOfacCsvRow: unknown SDN_Type → entity default",
|
|
718
|
+
sanctions.parseOfacCsvRow({ ent_num: 9, SDN_Name: "X", SDN_Type: "warlord" }).type === "entity");
|
|
719
|
+
|
|
720
|
+
// Non-object + name-without-ent_num guards
|
|
721
|
+
check("parseOfacCsvRow: non-object returns null",
|
|
722
|
+
sanctions.parseOfacCsvRow("not-an-object") === null);
|
|
723
|
+
check("parseOfacCsvRow: name without ent_num returns null",
|
|
724
|
+
sanctions.parseOfacCsvRow({ SDN_Name: "NoNum" }) === null);
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
// parseOfacAliasRow — the alt-names shim had zero tests.
|
|
728
|
+
function testParseOfacAliasRow() {
|
|
729
|
+
check("parseOfacAliasRow: null returns null",
|
|
730
|
+
sanctions.parseOfacAliasRow(null) === null);
|
|
731
|
+
check("parseOfacAliasRow: non-object returns null",
|
|
732
|
+
sanctions.parseOfacAliasRow("nope") === null);
|
|
733
|
+
check("parseOfacAliasRow: missing ent_num returns null",
|
|
734
|
+
sanctions.parseOfacAliasRow({ alt_name: "AKA" }) === null);
|
|
735
|
+
check("parseOfacAliasRow: missing alt_name returns null",
|
|
736
|
+
sanctions.parseOfacAliasRow({ ent_num: 5 }) === null);
|
|
737
|
+
|
|
738
|
+
var full = sanctions.parseOfacAliasRow({
|
|
739
|
+
ent_num: 5, alt_type: "fka", alt_name: " JOHNNY SMITH ", alt_remarks: "former",
|
|
740
|
+
});
|
|
741
|
+
check("parseOfacAliasRow: entId formed", full.entId === "OFAC-5");
|
|
742
|
+
check("parseOfacAliasRow: altType preserved", full.altType === "fka");
|
|
743
|
+
check("parseOfacAliasRow: altName trimmed", full.altName === "JOHNNY SMITH");
|
|
744
|
+
check("parseOfacAliasRow: remarks preserved", full.remarks === "former");
|
|
745
|
+
|
|
746
|
+
// Defaults: no alt_type → "aka"; no alt_remarks → null
|
|
747
|
+
var defd = sanctions.parseOfacAliasRow({ ent_num: 6, alt_name: "J SMITH" });
|
|
748
|
+
check("parseOfacAliasRow: default altType aka", defd.altType === "aka");
|
|
749
|
+
check("parseOfacAliasRow: default remarks null", defd.remarks === null);
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
function testMergeAliasesEdge() {
|
|
753
|
+
check("mergeAliases: non-array entries → []",
|
|
754
|
+
(function () {
|
|
755
|
+
var r = sanctions.mergeAliases("nope", []);
|
|
756
|
+
return Array.isArray(r) && r.length === 0;
|
|
757
|
+
})());
|
|
758
|
+
check("mergeAliases: non-array aliasRows → entries unchanged",
|
|
759
|
+
(function () {
|
|
760
|
+
var entries = [{ id: "A", aliases: [] }];
|
|
761
|
+
var r = sanctions.mergeAliases(entries, "nope");
|
|
762
|
+
return r === entries && r.length === 1;
|
|
763
|
+
})());
|
|
764
|
+
// Alias pointing at an unknown entId is a no-op (never crashes,
|
|
765
|
+
// never mis-attributes to a different entry)
|
|
766
|
+
check("mergeAliases: unknown entId is a no-op",
|
|
767
|
+
(function () {
|
|
768
|
+
var entries = [{ id: "A", aliases: [] }];
|
|
769
|
+
sanctions.mergeAliases(entries, [{ entId: "ZZZ", altName: "GHOST" }]);
|
|
770
|
+
return entries[0].aliases.length === 0;
|
|
771
|
+
})());
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
// parseEuCslEntry — uppercase field variants, single-object nameAlias,
|
|
775
|
+
// empty-name fallbacks, and every subjectType mapping.
|
|
776
|
+
function testParseEuCslEntryEdge() {
|
|
777
|
+
check("parseEuCslEntry: null returns null", sanctions.parseEuCslEntry(null) === null);
|
|
778
|
+
check("parseEuCslEntry: non-object returns null", sanctions.parseEuCslEntry("x") === null);
|
|
779
|
+
|
|
780
|
+
// Uppercase variants (NAMEALIAS / LOGICALID / SUBJECTTYPE / WHOLENAME),
|
|
781
|
+
// no regulation/country/designationDate → default alternates
|
|
782
|
+
var up = sanctions.parseEuCslEntry({
|
|
783
|
+
NAMEALIAS: [{ WHOLENAME: "UPPER BANK" }, { WHOLENAME: "UPPER ALIAS" }],
|
|
784
|
+
LOGICALID: 42,
|
|
785
|
+
SUBJECTTYPE: "person",
|
|
786
|
+
});
|
|
787
|
+
check("parseEuCslEntry upper: id via LOGICALID", up.id === "EU-CSL-42");
|
|
788
|
+
check("parseEuCslEntry upper: primary via WHOLENAME", up.primaryName === "UPPER BANK");
|
|
789
|
+
check("parseEuCslEntry upper: alias via WHOLENAME",
|
|
790
|
+
up.aliases.length === 1 && up.aliases[0] === "UPPER ALIAS");
|
|
791
|
+
check("parseEuCslEntry upper: SUBJECTTYPE person → individual", up.type === "individual");
|
|
792
|
+
check("parseEuCslEntry upper: no regulation → []", up.programs.length === 0);
|
|
793
|
+
check("parseEuCslEntry upper: no country → null", up.country === null);
|
|
794
|
+
check("parseEuCslEntry upper: no designationDate → null", up.listedAt === null);
|
|
795
|
+
|
|
796
|
+
// No nameAlias at all → null (empty name-list guard)
|
|
797
|
+
check("parseEuCslEntry: no names → null",
|
|
798
|
+
sanctions.parseEuCslEntry({ logicalId: 7 }) === null);
|
|
799
|
+
|
|
800
|
+
// Single (non-array) nameAlias object → wrapped; no id fields → "EU-CSL-"
|
|
801
|
+
var solo = sanctions.parseEuCslEntry({ nameAlias: { wholeName: "Solo Vessel" }, subjectType: "vessel" });
|
|
802
|
+
check("parseEuCslEntry solo: non-array nameAlias wrapped", solo.primaryName === "Solo Vessel");
|
|
803
|
+
check("parseEuCslEntry solo: no id fields → EU-CSL-", solo.id === "EU-CSL-");
|
|
804
|
+
check("parseEuCslEntry solo: subjectType vessel", solo.type === "vessel");
|
|
805
|
+
|
|
806
|
+
// Empty name objects → "" fallbacks; absent subjectType → default entity
|
|
807
|
+
var empties = sanctions.parseEuCslEntry({ nameAlias: [{}, {}], logicalId: 9 });
|
|
808
|
+
check("parseEuCslEntry empties: primary → ''", empties.primaryName === "");
|
|
809
|
+
check("parseEuCslEntry empties: blank aliases filtered out", empties.aliases.length === 0);
|
|
810
|
+
check("parseEuCslEntry empties: absent subjectType → entity default", empties.type === "entity");
|
|
811
|
+
|
|
812
|
+
// subjectType aircraft mapping
|
|
813
|
+
check("parseEuCslEntry: subjectType aircraft",
|
|
814
|
+
sanctions.parseEuCslEntry({ nameAlias: [{ wholeName: "Y" }], subjectType: "aircraft" }).type === "aircraft");
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
// parseUn1267Entry — lowercase/FIRST_NAME name fallbacks, empty-name
|
|
818
|
+
// null, ALIASES array branch, DATAID/empty id fallbacks, Entity type,
|
|
819
|
+
// missing LISTED_ON.
|
|
820
|
+
function testParseUn1267EntryEdge() {
|
|
821
|
+
check("parseUn1267Entry: null returns null", sanctions.parseUn1267Entry(null) === null);
|
|
822
|
+
check("parseUn1267Entry: non-object returns null", sanctions.parseUn1267Entry("x") === null);
|
|
823
|
+
|
|
824
|
+
var lower = sanctions.parseUn1267Entry({ name: "lower guy", REFERENCE_NUMBER: "R1" });
|
|
825
|
+
check("parseUn1267Entry: lowercase name fallback", lower.primaryName === "lower guy");
|
|
826
|
+
|
|
827
|
+
var first = sanctions.parseUn1267Entry({ FIRST_NAME: "First Only", REFERENCE_NUMBER: "R2" });
|
|
828
|
+
check("parseUn1267Entry: FIRST_NAME fallback", first.primaryName === "First Only");
|
|
829
|
+
|
|
830
|
+
check("parseUn1267Entry: no name fields → null",
|
|
831
|
+
sanctions.parseUn1267Entry({ REFERENCE_NUMBER: "R3" }) === null);
|
|
832
|
+
|
|
833
|
+
var arr = sanctions.parseUn1267Entry({ NAME: "Guy", ALIASES: ["A1", "A2"], REFERENCE_NUMBER: "R4" });
|
|
834
|
+
check("parseUn1267Entry: ALIASES array branch", arr.aliases.length === 2 && arr.aliases[0] === "A1");
|
|
835
|
+
|
|
836
|
+
var byData = sanctions.parseUn1267Entry({ NAME: "Guy2", DATAID: "D9" });
|
|
837
|
+
check("parseUn1267Entry: id via DATAID", byData.id === "UN-1267-D9");
|
|
838
|
+
check("parseUn1267Entry: no LISTED_ON → null", byData.listedAt === null);
|
|
839
|
+
|
|
840
|
+
var noId = sanctions.parseUn1267Entry({ NAME: "Guy3" });
|
|
841
|
+
check("parseUn1267Entry: no id fields → UN-1267-", noId.id === "UN-1267-");
|
|
842
|
+
|
|
843
|
+
var ent = sanctions.parseUn1267Entry({ NAME: "Some Corp", NAME_TYPE: "Entity", REFERENCE_NUMBER: "R5" });
|
|
844
|
+
check("parseUn1267Entry: NAME_TYPE Entity → entity", ent.type === "entity");
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
// _normalizeEntry — driven through create(): empty primaryName, non-array
|
|
848
|
+
// aliases/programs, falsy type, dateOfBirth as array vs scalar string.
|
|
849
|
+
function testNormalizeEntryEdge() {
|
|
850
|
+
var screener = sanctions.create({
|
|
851
|
+
entries: [
|
|
852
|
+
{ id: "NORM-1", primaryName: "", aliases: "notarray", type: "", programs: "notarray", dateOfBirth: ["1990-01-01"] },
|
|
853
|
+
{ id: "NORM-2", primaryName: "SOMEONE", dateOfBirth: "1985-07-04" },
|
|
854
|
+
],
|
|
855
|
+
algorithm: "custom",
|
|
856
|
+
});
|
|
857
|
+
var n1 = screener.entryById("NORM-1");
|
|
858
|
+
check("normalizeEntry: empty primaryName preserved", n1.primaryName === "");
|
|
859
|
+
check("normalizeEntry: non-array aliases → []",
|
|
860
|
+
Array.isArray(n1.aliases) && n1.aliases.length === 0);
|
|
861
|
+
check("normalizeEntry: falsy type → entity default", n1.type === "entity");
|
|
862
|
+
check("normalizeEntry: non-array programs → []",
|
|
863
|
+
Array.isArray(n1.programs) && n1.programs.length === 0);
|
|
864
|
+
check("normalizeEntry: array dateOfBirth sliced",
|
|
865
|
+
Array.isArray(n1.dateOfBirth) && n1.dateOfBirth.length === 1 && n1.dateOfBirth[0] === "1990-01-01");
|
|
866
|
+
var n2 = screener.entryById("NORM-2");
|
|
867
|
+
check("normalizeEntry: scalar dateOfBirth wrapped in array",
|
|
868
|
+
Array.isArray(n2.dateOfBirth) && n2.dateOfBirth.length === 1 && n2.dateOfBirth[0] === "1985-07-04");
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
function testCreateDefaultAlgorithm() {
|
|
872
|
+
var screener = sanctions.create({ entries: [] });
|
|
873
|
+
check("create: omitted algorithm defaults to custom", screener.algorithm === "custom");
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
function testCreateFuzzyNonObject() {
|
|
877
|
+
check("create: fuzzy as array throws bad-fuzzy",
|
|
878
|
+
_threwCode(function () { sanctions.create({ entries: [], fuzzy: [] }); }, "sanctions/bad-fuzzy"));
|
|
879
|
+
check("create: fuzzy as string throws bad-fuzzy",
|
|
880
|
+
_threwCode(function () { sanctions.create({ entries: [], fuzzy: "nope" }); }, "sanctions/bad-fuzzy"));
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
function testCreateFuzzyDisabled() {
|
|
884
|
+
var screener = sanctions.create({
|
|
885
|
+
entries: _sampleEntries(),
|
|
886
|
+
algorithm: "ofac-sdn",
|
|
887
|
+
fuzzy: { enabled: false, strategy: "jaro-winkler" },
|
|
888
|
+
});
|
|
889
|
+
check("create fuzzy-disabled: reported strategy is exact", screener.strategy === "exact");
|
|
890
|
+
|
|
891
|
+
var exact = screener.screen({ name: "JOHN ALEXANDER SMITH" });
|
|
892
|
+
check("screen fuzzy-disabled: exact name still matches", exact.match === true);
|
|
893
|
+
check("screen fuzzy-disabled: result strategy is exact", exact.strategy === "exact");
|
|
894
|
+
|
|
895
|
+
// With fuzzy off, a typo must NOT match (exact-only comparison)
|
|
896
|
+
var typo = screener.screen({ name: "John Aleksander Smyth" });
|
|
897
|
+
check("screen fuzzy-disabled: typo does not match", typo.match === false);
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
function testScreenNonObjectInput() {
|
|
901
|
+
var screener = sanctions.create({ entries: _sampleEntries(), algorithm: "ofac-sdn" });
|
|
902
|
+
check("screen: null input throws bad-input",
|
|
903
|
+
_threwCode(function () { screener.screen(null); }, "sanctions/bad-input"));
|
|
904
|
+
check("screen: string input throws bad-input",
|
|
905
|
+
_threwCode(function () { screener.screen("John Smith"); }, "sanctions/bad-input"));
|
|
906
|
+
check("screen: number input throws bad-input",
|
|
907
|
+
_threwCode(function () { screener.screen(42); }, "sanctions/bad-input"));
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
function testScreenFuzzyReasonBand() {
|
|
911
|
+
// A transliteration variant scoring inside [threshold, 0.92) exercises
|
|
912
|
+
// the "fuzzy" reason band (below the substring/token and near-exact bands).
|
|
913
|
+
var screener = sanctions.create({
|
|
914
|
+
entries: [
|
|
915
|
+
{ id: "FZ-1", primaryName: "MOHAMMED", aliases: [], type: "individual", programs: ["SDGT"], country: null, listedAt: null },
|
|
916
|
+
],
|
|
917
|
+
algorithm: "ofac-sdn",
|
|
918
|
+
fuzzy: { strategy: "jaro-winkler", threshold: 0.80 },
|
|
919
|
+
});
|
|
920
|
+
var r = screener.screen({ name: "MUHAMMAD" });
|
|
921
|
+
check("screen fuzzy-band: transliteration matches", r.match === true);
|
|
922
|
+
check("screen fuzzy-band: score in [0.80, 0.92)",
|
|
923
|
+
r.hits[0].score >= 0.80 && r.hits[0].score < 0.92);
|
|
924
|
+
check("screen fuzzy-band: reason is 'fuzzy'", r.hits[0].reason === "fuzzy");
|
|
925
|
+
}
|
|
926
|
+
|
|
684
927
|
// ---- Run all ----
|
|
685
928
|
|
|
686
929
|
function _syncTests() {
|
|
@@ -701,9 +944,20 @@ function _syncTests() {
|
|
|
701
944
|
testCreateValidation();
|
|
702
945
|
testScreenInputValidation();
|
|
703
946
|
testParseOfacCsvRow();
|
|
947
|
+
testParseOfacCsvRowEdge();
|
|
948
|
+
testParseOfacAliasRow();
|
|
704
949
|
testMergeAliases();
|
|
950
|
+
testMergeAliasesEdge();
|
|
705
951
|
testParseEuCslEntry();
|
|
952
|
+
testParseEuCslEntryEdge();
|
|
706
953
|
testParseUn1267Entry();
|
|
954
|
+
testParseUn1267EntryEdge();
|
|
955
|
+
testNormalizeEntryEdge();
|
|
956
|
+
testCreateDefaultAlgorithm();
|
|
957
|
+
testCreateFuzzyNonObject();
|
|
958
|
+
testCreateFuzzyDisabled();
|
|
959
|
+
testScreenNonObjectInput();
|
|
960
|
+
testScreenFuzzyReasonBand();
|
|
707
961
|
testEntryById();
|
|
708
962
|
testScreenBulk();
|
|
709
963
|
testScreenBulkValidation();
|