@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.
Files changed (521) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/lib/asset-manifest.json +1 -1
  3. package/lib/vendor/MANIFEST.json +632 -416
  4. package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
  5. package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
  6. package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
  7. package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
  8. package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
  9. package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
  10. package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
  11. package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
  12. package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
  13. package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
  14. package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
  15. package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
  16. package/lib/vendor/blamejs/.gitignore +2 -0
  17. package/lib/vendor/blamejs/CHANGELOG.md +122 -0
  18. package/lib/vendor/blamejs/NOTICE +26 -1
  19. package/lib/vendor/blamejs/SECURITY.md +1 -1
  20. package/lib/vendor/blamejs/api-snapshot.json +207 -5
  21. package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
  22. package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
  23. package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
  24. package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
  25. package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
  26. package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
  27. package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
  28. package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
  29. package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
  30. package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
  31. package/lib/vendor/blamejs/index.js +6 -0
  32. package/lib/vendor/blamejs/lib/a2a.js +4 -4
  33. package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
  34. package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
  35. package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
  36. package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
  37. package/lib/vendor/blamejs/lib/archive-read.js +8 -0
  38. package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
  39. package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
  40. package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
  41. package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
  42. package/lib/vendor/blamejs/lib/audit.js +71 -8
  43. package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
  44. package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
  45. package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
  46. package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
  47. package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
  48. package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
  49. package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
  50. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
  51. package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
  52. package/lib/vendor/blamejs/lib/backup/index.js +16 -5
  53. package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
  54. package/lib/vendor/blamejs/lib/base32.js +21 -0
  55. package/lib/vendor/blamejs/lib/break-glass.js +19 -10
  56. package/lib/vendor/blamejs/lib/bundler.js +5 -1
  57. package/lib/vendor/blamejs/lib/cache-status.js +3 -7
  58. package/lib/vendor/blamejs/lib/calendar.js +21 -1
  59. package/lib/vendor/blamejs/lib/cbor.js +12 -1
  60. package/lib/vendor/blamejs/lib/cert.js +29 -11
  61. package/lib/vendor/blamejs/lib/cli.js +94 -24
  62. package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
  63. package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
  64. package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
  65. package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
  66. package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
  67. package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
  68. package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
  69. package/lib/vendor/blamejs/lib/content-digest.js +2 -1
  70. package/lib/vendor/blamejs/lib/cookies.js +13 -3
  71. package/lib/vendor/blamejs/lib/cose.js +31 -16
  72. package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
  73. package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
  74. package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
  75. package/lib/vendor/blamejs/lib/crypto.js +314 -19
  76. package/lib/vendor/blamejs/lib/csp.js +11 -3
  77. package/lib/vendor/blamejs/lib/daemon.js +270 -24
  78. package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
  79. package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
  80. package/lib/vendor/blamejs/lib/db-query.js +34 -7
  81. package/lib/vendor/blamejs/lib/db.js +18 -6
  82. package/lib/vendor/blamejs/lib/dbsc.js +17 -0
  83. package/lib/vendor/blamejs/lib/dev.js +21 -2
  84. package/lib/vendor/blamejs/lib/dsr.js +157 -102
  85. package/lib/vendor/blamejs/lib/external-db.js +41 -2
  86. package/lib/vendor/blamejs/lib/file-upload.js +25 -7
  87. package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
  88. package/lib/vendor/blamejs/lib/forms.js +113 -27
  89. package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
  90. package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
  91. package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
  92. package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
  93. package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
  94. package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
  95. package/lib/vendor/blamejs/lib/guard-html.js +26 -53
  96. package/lib/vendor/blamejs/lib/guard-image.js +24 -5
  97. package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
  98. package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
  99. package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
  100. package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
  101. package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
  102. package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
  103. package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
  104. package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
  105. package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
  106. package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
  107. package/lib/vendor/blamejs/lib/guard-time.js +1 -1
  108. package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
  109. package/lib/vendor/blamejs/lib/html-balance.js +3 -3
  110. package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
  111. package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
  112. package/lib/vendor/blamejs/lib/http-client.js +39 -7
  113. package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
  114. package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
  115. package/lib/vendor/blamejs/lib/i18n.js +35 -21
  116. package/lib/vendor/blamejs/lib/incident-report.js +8 -1
  117. package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
  118. package/lib/vendor/blamejs/lib/json-path.js +23 -1
  119. package/lib/vendor/blamejs/lib/jwk.js +20 -3
  120. package/lib/vendor/blamejs/lib/link-header.js +2 -1
  121. package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
  122. package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
  123. package/lib/vendor/blamejs/lib/log-stream.js +8 -3
  124. package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
  125. package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
  126. package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
  127. package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
  128. package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
  129. package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
  130. package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
  131. package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
  132. package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
  133. package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
  134. package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
  135. package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
  136. package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
  137. package/lib/vendor/blamejs/lib/mail.js +15 -5
  138. package/lib/vendor/blamejs/lib/metrics.js +268 -63
  139. package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
  140. package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
  141. package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
  142. package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
  143. package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
  144. package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
  145. package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
  146. package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
  147. package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
  148. package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
  149. package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
  150. package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
  151. package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
  152. package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
  153. package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
  154. package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
  155. package/lib/vendor/blamejs/lib/network-dns.js +21 -2
  156. package/lib/vendor/blamejs/lib/network-tls.js +69 -7
  157. package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
  158. package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
  159. package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
  160. package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
  161. package/lib/vendor/blamejs/lib/outbox.js +1 -1
  162. package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
  163. package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
  164. package/lib/vendor/blamejs/lib/permissions.js +6 -3
  165. package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
  166. package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
  167. package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
  168. package/lib/vendor/blamejs/lib/pubsub.js +20 -9
  169. package/lib/vendor/blamejs/lib/queue-local.js +8 -1
  170. package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
  171. package/lib/vendor/blamejs/lib/redact.js +54 -0
  172. package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
  173. package/lib/vendor/blamejs/lib/restore.js +19 -0
  174. package/lib/vendor/blamejs/lib/retention.js +12 -4
  175. package/lib/vendor/blamejs/lib/router.js +60 -6
  176. package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
  177. package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
  178. package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
  179. package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
  180. package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
  181. package/lib/vendor/blamejs/lib/safe-object.js +80 -0
  182. package/lib/vendor/blamejs/lib/safe-path.js +52 -4
  183. package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
  184. package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
  185. package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
  186. package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
  187. package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
  188. package/lib/vendor/blamejs/lib/scheduler.js +8 -1
  189. package/lib/vendor/blamejs/lib/security-assert.js +6 -6
  190. package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
  191. package/lib/vendor/blamejs/lib/self-update.js +517 -87
  192. package/lib/vendor/blamejs/lib/server-timing.js +2 -4
  193. package/lib/vendor/blamejs/lib/session.js +34 -12
  194. package/lib/vendor/blamejs/lib/sql.js +15 -1
  195. package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
  196. package/lib/vendor/blamejs/lib/static.js +55 -13
  197. package/lib/vendor/blamejs/lib/storage.js +8 -2
  198. package/lib/vendor/blamejs/lib/subject.js +6 -1
  199. package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
  200. package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
  201. package/lib/vendor/blamejs/lib/tsa.js +34 -13
  202. package/lib/vendor/blamejs/lib/uri-template.js +8 -1
  203. package/lib/vendor/blamejs/lib/vault/index.js +13 -0
  204. package/lib/vendor/blamejs/lib/vc.js +44 -5
  205. package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
  206. package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
  207. package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
  208. package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
  209. package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
  210. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
  211. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
  212. package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
  213. package/lib/vendor/blamejs/lib/watcher.js +89 -17
  214. package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
  215. package/lib/vendor/blamejs/lib/webhook.js +12 -2
  216. package/lib/vendor/blamejs/lib/ws-client.js +32 -1
  217. package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
  218. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
  219. package/lib/vendor/blamejs/package-lock.json +2 -2
  220. package/lib/vendor/blamejs/package.json +1 -1
  221. package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
  222. package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
  223. package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
  224. package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
  225. package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
  226. package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
  227. package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
  228. package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
  229. package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
  230. package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
  231. package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
  232. package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
  233. package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
  234. package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
  235. package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
  236. package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
  237. package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
  238. package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
  239. package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
  240. package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
  241. package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
  242. package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
  243. package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
  244. package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
  245. package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
  246. package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
  247. package/lib/vendor/blamejs/socket.yml +94 -0
  248. package/lib/vendor/blamejs/test/00-primitives.js +605 -0
  249. package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
  250. package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
  251. package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
  252. package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
  253. package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
  254. package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
  255. package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
  256. package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
  257. package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
  258. package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
  259. package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
  260. package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
  261. package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
  262. package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
  263. package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
  264. package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
  265. package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
  266. package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
  267. package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
  268. package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
  269. package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
  270. package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
  271. package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
  272. package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
  273. package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
  274. package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
  275. package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
  276. package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
  277. package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
  278. package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
  279. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
  280. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
  281. package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
  282. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
  283. package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
  284. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
  285. package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
  286. package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
  287. package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
  288. package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
  289. package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
  290. package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
  291. package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
  292. package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
  293. package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
  294. package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
  295. package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
  296. package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
  297. package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
  298. package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
  299. package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
  300. package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
  301. package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
  302. package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
  303. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
  304. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
  305. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
  306. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
  307. package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
  308. package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
  309. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
  310. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
  311. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
  312. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
  313. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
  314. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
  315. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
  316. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
  317. package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
  318. package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
  319. package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
  320. package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
  321. package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
  322. package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
  323. package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
  324. package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
  325. package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
  326. package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
  327. package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
  328. package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
  329. package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
  330. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
  331. package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
  332. package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
  333. package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
  334. package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
  335. package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
  336. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
  337. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
  338. package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
  339. package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
  340. package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
  341. package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
  342. package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
  343. package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
  344. package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
  345. package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
  346. package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
  347. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
  348. package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
  349. package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
  350. package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
  351. package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
  352. package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
  353. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
  354. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
  355. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
  356. package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
  357. package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
  358. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
  359. package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
  360. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
  361. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
  362. package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
  363. package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
  364. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
  365. package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
  366. package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
  367. package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
  368. package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
  369. package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
  370. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
  371. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
  372. package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
  373. package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
  374. package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
  375. package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
  376. package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
  377. package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
  378. package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
  379. package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
  380. package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
  381. package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
  382. package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
  383. package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
  384. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
  385. package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
  386. package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
  387. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
  388. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
  389. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
  390. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
  391. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
  392. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
  393. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
  394. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
  395. package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
  396. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
  397. package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
  398. package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
  399. package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
  400. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
  401. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
  402. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
  403. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
  404. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
  405. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
  406. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
  407. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
  408. package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
  409. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
  410. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
  411. package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
  412. package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
  413. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
  414. package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
  415. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
  416. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
  417. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
  418. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
  419. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
  420. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
  421. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
  422. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
  423. package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
  424. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
  425. package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
  426. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
  427. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
  428. package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
  429. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
  430. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
  431. package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
  432. package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
  433. package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
  434. package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
  435. package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
  436. package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
  437. package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
  438. package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
  439. package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
  440. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
  441. package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
  442. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
  443. package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
  444. package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
  445. package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
  446. package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
  447. package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
  448. package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
  449. package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
  450. package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
  451. package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
  452. package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
  453. package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
  454. package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
  455. package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
  456. package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
  457. package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
  458. package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
  459. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
  460. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
  461. package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
  462. package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
  463. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
  464. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
  465. package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
  466. package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
  467. package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
  468. package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
  469. package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
  470. package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
  471. package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
  472. package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
  473. package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
  474. package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
  475. package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
  476. package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
  477. package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
  478. package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
  479. package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
  480. package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
  481. package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
  482. package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
  483. package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
  484. package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
  485. package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
  486. package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
  487. package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
  488. package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
  489. package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
  490. package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
  491. package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
  492. package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
  493. package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
  494. package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
  495. package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
  496. package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
  497. package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
  498. package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
  499. package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
  500. package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
  501. package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
  502. package/lib/vendor/blamejs/test/smoke.js +2 -0
  503. package/package.json +1 -1
  504. package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
  505. package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
  506. package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
  507. package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
  508. package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
  509. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
  510. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
  511. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
  512. package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
  513. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
  514. package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
  515. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
  516. package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
  517. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
  518. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
  519. package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
  520. package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
  521. package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
@@ -178,8 +178,11 @@ var INPUT_TYPES = {
178
178
  };
179
179
 
180
180
  function _renderInput(field) {
181
+ // A field with no explicit type defaults to a text input — mirror the
182
+ // `|| "text"` dispatch in _renderField so the emitted type attribute
183
+ // agrees with the widget actually rendered (never a bare type="").
181
184
  var attrs = [
182
- 'type="' + escapeAttribute(field.type) + '"',
185
+ 'type="' + escapeAttribute(field.type || "text") + '"',
183
186
  'name="' + escapeAttribute(field.name) + '"',
184
187
  ];
185
188
  if (field.value !== undefined && field.value !== null) {
@@ -358,7 +361,14 @@ function _coerce(field, raw) {
358
361
  // (false), not "not provided." Coerce to false BEFORE the generic
359
362
  // undefined-passthrough below.
360
363
  if (field.type === "checkbox") {
361
- if (raw === undefined || raw === null || raw === "" || raw === "false" || raw === "0") return false;
364
+ // A urlencoded checkbox submits its VALUE string only when checked, so
365
+ // any present string — including a custom value of "false" / "0" / "" —
366
+ // means checked: presence, not the string content, is the checked
367
+ // signal. Unchecked is the field's ABSENCE (undefined / null) or, for a
368
+ // typed (JSON) body, an explicit boolean false / numeric 0. This keeps a
369
+ // required checkbox satisfiable whatever value it is rendered with, while
370
+ // a JSON false / 0 still reads as unchecked.
371
+ if (raw === undefined || raw === null || raw === false || raw === 0) return false;
362
372
  return true;
363
373
  }
364
374
  if (raw === undefined) return undefined;
@@ -381,6 +391,74 @@ function _isEmpty(v) {
381
391
  return v === undefined || v === null || v === "";
382
392
  }
383
393
 
394
+ // A field's numeric bound (min / max / minlength / maxlength) must resolve
395
+ // to a finite number. A non-finite bound (a non-numeric string, NaN,
396
+ // Infinity) would make its comparison a silent no-op — NaN comparisons are
397
+ // always false — turning a documented constraint into nothing. That is an
398
+ // operator config error, so throw at the entry point (mirrors the
399
+ // pre-compiled-RegExp requirement for `pattern`) rather than shipping a
400
+ // form whose bound is quietly unenforced.
401
+ // A clean numeric literal: an optional sign, an integer/decimal mantissa,
402
+ // and an optional exponent. Linear (no nested quantifier over overlapping
403
+ // classes), so it is a framework-internal constant with no ReDoS surface.
404
+ var NUMERIC_LITERAL_RE = /^[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?$/;
405
+ // Any real numeric bound is short — Number.MAX_VALUE stringifies to ~23
406
+ // chars — so cap the length before the regex test; a longer "number" string
407
+ // is malformed, and running a regex over an unbounded operator string is a
408
+ // DoS shape regardless of the pattern's own linearity.
409
+ var MAX_NUMERIC_BOUND_CHARS = 40;
410
+
411
+ function _numericBound(f, key) {
412
+ var v = f[key];
413
+ // Accept ONLY a genuine finite number or a string that is a clean numeric
414
+ // literal. A bare Number() coerces null / "" / whitespace / false / [] to a
415
+ // finite 0 (and true to 1), which would let a malformed bound — e.g.
416
+ // min: null, which the renderer emits as min="" (no constraint) — silently
417
+ // validate as 0 on the backend and diverge from the browser. Those are
418
+ // rejected here, not coerced.
419
+ var n = NaN;
420
+ if (typeof v === "number") n = v;
421
+ else if (typeof v === "string" && v.length <= MAX_NUMERIC_BOUND_CHARS && NUMERIC_LITERAL_RE.test(v)) n = Number(v);
422
+ if (!Number.isFinite(n)) {
423
+ throw new Error("forms.validate: field '" + f.name + "'." + key +
424
+ " must be a finite number; got " +
425
+ (typeof v === "string" ? JSON.stringify(v) : typeof v) +
426
+ ". Fix the form spec.");
427
+ }
428
+ return n;
429
+ }
430
+
431
+ // Validate a field's SPEC — the operator-supplied shape, independent of any
432
+ // submitted value. A numeric bound (min / max / minlength / maxlength) must
433
+ // be finite, and a `pattern` must be a pre-compiled, ReDoS-safe RegExp
434
+ // (compiling operator source on the request path would be an engine ReDoS
435
+ // surface). A malformed spec is an operator config error surfaced
436
+ // deterministically at the entry point — never conditionally on whether a
437
+ // given request happens to carry a value that reaches the bound, which would
438
+ // turn a config bug into an input-dependent runtime failure.
439
+ function _assertFieldSpec(f) {
440
+ if (!f.name || f.type === "submit") return;
441
+ // min / max are compared numerically only for number / range controls;
442
+ // date / time / datetime-local / month / week controls carry ISO-string
443
+ // bounds (e.g. min: "2026-01-01") that validate() never compares
444
+ // numerically, so those are not numeric bounds and must not be rejected.
445
+ if (f.type === "number" || f.type === "range") {
446
+ if (f.min !== undefined) _numericBound(f, "min");
447
+ if (f.max !== undefined) _numericBound(f, "max");
448
+ }
449
+ // minlength / maxlength are always character counts, whatever the control.
450
+ if (f.minlength !== undefined) _numericBound(f, "minlength");
451
+ if (f.maxlength !== undefined) _numericBound(f, "maxlength");
452
+ if (f.pattern) {
453
+ if (!(f.pattern instanceof RegExp)) {
454
+ throw new Error("forms.validate: field '" + f.name +
455
+ "'.pattern must be a pre-compiled RegExp; got " +
456
+ (typeof f.pattern) + ". Wrap the source string with `RegExp` at config time.");
457
+ }
458
+ guardRegex.assertSafe(f.pattern, "forms: field[" + f.name + "].pattern");
459
+ }
460
+ }
461
+
384
462
  /**
385
463
  * @primitive b.forms.validate
386
464
  * @signature b.forms.validate(spec, body)
@@ -390,8 +468,9 @@ function _isEmpty(v) {
390
468
  *
391
469
  * Walks the same spec the renderer accepts and validates a submitted
392
470
  * body. Per field: required-field check, type coercion (string /
393
- * number / boolean / email / url), `minLength` / `maxLength` bounds,
394
- * regex `pattern`, `enum` membership. Returns
471
+ * number / boolean / email / url), `minlength` / `maxlength` bounds,
472
+ * numeric `min` / `max` bounds, regex `pattern`, `enum` membership.
473
+ * Returns
395
474
  * `{ valid: boolean, errors: { field: msg, ... }, values: { ... } }`.
396
475
  * The `values` object holds coerced values keyed by field name —
397
476
  * route handlers consume `result.values` directly without re-parsing.
@@ -400,7 +479,7 @@ function _isEmpty(v) {
400
479
  * var result = b.forms.validate(
401
480
  * { fields: [
402
481
  * { type: "email", name: "email", required: true },
403
- * { type: "number", name: "age", minLength: 1 },
482
+ * { type: "number", name: "age", min: 1 },
404
483
  * ] },
405
484
  * { email: "ada@example.com", age: "37" }
406
485
  * );
@@ -410,6 +489,12 @@ function validate(spec, body) {
410
489
  if (!spec || !Array.isArray(spec.fields)) {
411
490
  throw new Error("forms.validate: spec.fields must be an array");
412
491
  }
492
+ // Validate every field's spec up front — a malformed bound or pattern is
493
+ // rejected on the first call, deterministically, regardless of the body
494
+ // (never only when a request happens to carry a value that reaches it).
495
+ for (var s = 0; s < spec.fields.length; s++) {
496
+ _assertFieldSpec(spec.fields[s]);
497
+ }
413
498
  body = body || {};
414
499
  var errors = {};
415
500
  var values = {};
@@ -423,7 +508,21 @@ function validate(spec, body) {
423
508
  var coerced = _coerce(f, raw);
424
509
  values[f.name] = coerced;
425
510
 
426
- if (f.required && _isEmpty(coerced) && coerced !== false) {
511
+ // Checkbox: the only constraint is `required`, which HTML defines as
512
+ // "must be checked" — and the renderer emits that attribute, so the
513
+ // server enforces the same (backend validates what the frontend
514
+ // displays). An unchecked required box (coerced === false) is an error,
515
+ // never a silent pass. No length / pattern / enum checks apply.
516
+ if (f.type === "checkbox") {
517
+ if (f.required && coerced !== true) {
518
+ errors[f.name] = f.errorMessages && f.errorMessages.required
519
+ ? f.errorMessages.required
520
+ : (f.label || f.name) + " is required";
521
+ }
522
+ continue;
523
+ }
524
+
525
+ if (f.required && _isEmpty(coerced)) {
427
526
  errors[f.name] = f.errorMessages && f.errorMessages.required
428
527
  ? f.errorMessages.required
429
528
  : (f.label || f.name) + " is required";
@@ -486,27 +585,14 @@ function validate(spec, body) {
486
585
  errors[f.name] = (f.label || f.name) + " must be at most " + f.maxlength + " characters";
487
586
  continue;
488
587
  }
489
- if (f.pattern) {
490
- // Pattern accepts a pre-compiled RegExp only taking a string
491
- // and compiling it here would be a ReDoS surface against the
492
- // form-render engine. Operators construct the RegExp at config
493
- // time so the framework never compiles operator-supplied source
494
- // on the request path.
495
- if (!(f.pattern instanceof RegExp)) {
496
- throw new Error("forms.validate: field '" + f.name +
497
- "'.pattern must be a pre-compiled RegExp; got " +
498
- (typeof f.pattern) + ". Wrap the source string with `RegExp` at config time.");
499
- }
500
- // Screen the operator-supplied pattern for catastrophic-backtracking
501
- // (ReDoS) shapes before the test, so a pathological regex can't be
502
- // run against the submitted value.
503
- guardRegex.assertSafe(f.pattern, "forms: field[" + f.name + "].pattern");
504
- if (!f.pattern.test(coerced)) {
505
- errors[f.name] = f.errorMessages && f.errorMessages.pattern
506
- ? f.errorMessages.pattern
507
- : (f.label || f.name) + " has an invalid format";
508
- continue;
509
- }
588
+ // `pattern` was proven a pre-compiled, ReDoS-safe RegExp by the
589
+ // up-front spec pass, so only the match against the submitted value
590
+ // remains on the request path.
591
+ if (f.pattern && !f.pattern.test(coerced)) {
592
+ errors[f.name] = f.errorMessages && f.errorMessages.pattern
593
+ ? f.errorMessages.pattern
594
+ : (f.label || f.name) + " has an invalid format";
595
+ continue;
510
596
  }
511
597
  }
512
598
  if ((f.type === "select" || f.type === "radio") && Array.isArray(f.options)) {
@@ -1190,12 +1190,20 @@ function makeProfileResolver(cfg) {
1190
1190
  var label = _guardLabelFromError(ErrorClass);
1191
1191
  return function resolveProfile(opts) {
1192
1192
  opts = opts || {};
1193
- if (opts.posture && postures && postures[opts.posture]) {
1193
+ // Own-property lookups only: opts.posture / opts.profile are attacker/
1194
+ // operator input, so a bare bracket read would let a prototype key
1195
+ // ("constructor" / "__proto__" / "toString") resolve to an inherited
1196
+ // truthy member — the posture read would return it as the profile name,
1197
+ // and `!profiles[p]` would treat it as a known profile and skip the
1198
+ // bad-profile refusal, running the gate under a bogus profile (fail-open).
1199
+ if (opts.posture && postures &&
1200
+ Object.prototype.hasOwnProperty.call(postures, opts.posture) &&
1201
+ postures[opts.posture]) {
1194
1202
  var pn = postures[opts.posture];
1195
1203
  return byObject ? profiles[pn] : pn;
1196
1204
  }
1197
1205
  var p = opts.profile || dft;
1198
- if (!profiles[p]) {
1206
+ if (!Object.prototype.hasOwnProperty.call(profiles, p)) {
1199
1207
  throw ErrorClass.factory(codePrefix + "/bad-profile",
1200
1208
  label + ": unknown profile '" + p + "' (use " +
1201
1209
  Object.keys(profiles).join(" / ") + ")");
@@ -2313,11 +2321,11 @@ function _resetForTest() {
2313
2321
  * `makeProfileBuilder` and never call `buildProfile` directly.
2314
2322
  *
2315
2323
  * @opts
2316
- * baseProfile: string, // start from this profile name
2317
- * extends: string[], // additional bases (later-wins)
2318
- * overrides: object, // inline merge after extends
2319
- * removes: object, // drop array entries or keys
2320
- * resolveProfile: function, // (name) → profile|null (required)
2324
+ * baseProfile: string, // start from this profile name
2325
+ * extends: string|string[], // additional base(s) (later-wins)
2326
+ * overrides: object, // inline merge after extends
2327
+ * removes: object, // drop array entries or keys
2328
+ * resolveProfile: function, // (name) → profile|null (required)
2321
2329
  *
2322
2330
  * @example
2323
2331
  * var PROFILES = {
@@ -2363,9 +2371,14 @@ function buildProfile(opts) {
2363
2371
  return merged;
2364
2372
  }
2365
2373
  var base = opts.baseProfile ? _walk(opts.baseProfile) : {};
2366
- if (Array.isArray(opts.extends)) {
2367
- for (var i = 0; i < opts.extends.length; i++) {
2368
- base = _mergeProfile(base, _walk(opts.extends[i]));
2374
+ // @opts documents `extends: string|string[]`; normalize a bare string
2375
+ // to a one-element list so the single-base form composes instead of
2376
+ // being silently dropped (the ABI-template @example every guard shares
2377
+ // is `buildProfile({ extends: "strict" })`).
2378
+ var extendsList = typeof opts.extends === "string" ? [opts.extends] : opts.extends;
2379
+ if (Array.isArray(extendsList)) {
2380
+ for (var i = 0; i < extendsList.length; i++) {
2381
+ base = _mergeProfile(base, _walk(extendsList[i]));
2369
2382
  }
2370
2383
  }
2371
2384
  if (opts.overrides) base = _mergeProfile(base, opts.overrides);
@@ -129,7 +129,14 @@ function create(opts) {
129
129
  registeredAt: existing.registeredAt,
130
130
  lastUpdatedAt: now(),
131
131
  });
132
- if (patch.legalBasis && !Object.prototype.hasOwnProperty.call(VALID_LEGAL_BASES, merged.legalBasis)) {
132
+ // Validate whenever the patch TOUCHES legalBasis keyed on own-property
133
+ // presence, not truthiness. A falsy-but-invalid value ("" / 0 / false /
134
+ // undefined) is still an invalid legal basis and must be rejected with the
135
+ // same rigor register() applies; a `patch.legalBasis &&` guard would skip
136
+ // the enum check for those values and silently corrupt a required
137
+ // Article 30 field.
138
+ if (Object.prototype.hasOwnProperty.call(patch, "legalBasis") &&
139
+ !Object.prototype.hasOwnProperty.call(VALID_LEGAL_BASES, merged.legalBasis)) {
133
140
  throw new GdprRopaError("gdpr-ropa/bad-legal-basis",
134
141
  "gdpr.ropa.update: legalBasis must be one of " + Object.keys(VALID_LEGAL_BASES).join(", "));
135
142
  }
@@ -102,7 +102,7 @@ function _checkName(name, profile) {
102
102
  throw new GuardAgentRegistryError("agent-registry/name-too-long",
103
103
  "guardAgentRegistry.validate: name exceeds maxNameBytes=" + profile.maxNameBytes);
104
104
  }
105
- if (RESERVED_EXACT[name]) {
105
+ if (Object.prototype.hasOwnProperty.call(RESERVED_EXACT, name)) {
106
106
  throw new GuardAgentRegistryError("agent-registry/reserved-name",
107
107
  "guardAgentRegistry.validate: name '" + name + "' is framework-reserved");
108
108
  }
@@ -781,10 +781,10 @@ function gate(opts) {
781
781
  * `GuardArchiveError("archive.bad-profile")` on unknown name.
782
782
  *
783
783
  * @opts
784
- * profile: "strict"|"balanced"|"permissive",
784
+ * extends: "strict"|"balanced"|"permissive", // base profile name(s)
785
785
  *
786
786
  * @example
787
- * var resolved = b.guardArchive.buildProfile({ profile: "strict" });
787
+ * var resolved = b.guardArchive.buildProfile({ extends: "strict" });
788
788
  * resolved.maxEntries; // → 100
789
789
  * resolved.symlinkPolicy; // → "reject"
790
790
  * resolved.maxCompressionRatio; // → 100
@@ -182,6 +182,11 @@ function _parseIpv6(s) {
182
182
  if (left === null || right === null) return null;
183
183
  var pad = IPV6_GROUPS - left.length - right.length;
184
184
  if (pad < 0) return null;
185
+ // RFC 4291 §2.2 — "::" must compress at least one all-zero group. Eight
186
+ // explicit groups adjacent to a "::" (pad === 0) compress nothing and are
187
+ // malformed IPv6 text (net.isIP rejects them), so reject rather than accept
188
+ // a non-canonical spelling into CIDR matching.
189
+ if (pad === 0) return null;
185
190
  var zeros = [];
186
191
  for (var z = 0; z < pad; z += 1) zeros.push("0000"); // IPv6 zero group
187
192
  groups = left.concat(zeros).concat(right);
@@ -232,13 +237,34 @@ function _ipv4InReservedRange(octets, prefix) {
232
237
  return hits;
233
238
  }
234
239
 
240
+ // Bit-accurate prefix match over two hex strings. Reserved-range membership
241
+ // is a relation on the first `prefixBits` bits, NOT on a whole number of hex
242
+ // nibbles: ULA fc00::/7 (7 bits) and link-local fe80::/10 (10 bits) end
243
+ // mid-nibble, so a hex-string startsWith on the reserved nibbles silently
244
+ // misses every address whose trailing (masked-off) bits differ — e.g. fd00::
245
+ // (the assigned half of fc00::/7) and fe90::/fea0::/feb0:: (all inside
246
+ // fe80::/10). Compare the whole nibbles, then the top `prefixBits % 4` bits of
247
+ // the boundary nibble under a mask — the same bit-prefix relation the IPv4
248
+ // side gets from `(addr & mask) === net` and ssrf-guard gets from its byte-
249
+ // level `_ipv6PrefixMatch`.
250
+ function _ipv6HexPrefixMatch(hex, reservedHex, prefixBits) {
251
+ var fullNibbles = Math.floor(prefixBits / 4); // whole hex chars fully inside the prefix
252
+ if (hex.slice(0, fullNibbles) !== reservedHex.slice(0, fullNibbles)) return false;
253
+ var remBits = prefixBits - fullNibbles * 4; // 0-3 bits in the boundary nibble
254
+ if (remBits === 0) return true;
255
+ var mask = (0xF << (4 - remBits)) & 0xF; // high `remBits` bits of the nibble
256
+ var aNib = parseInt(hex.charAt(fullNibbles), 16); // base-16 radix
257
+ var rNib = parseInt(reservedHex.charAt(fullNibbles), 16); // base-16 radix
258
+ return (aNib & mask) === (rNib & mask);
259
+ }
260
+
235
261
  function _ipv6InReservedRange(groups, prefix) {
236
262
  var hex = groups.join("");
237
263
  var hits = [];
238
264
  for (var i = 0; i < IPV6_RESERVED.length; i += 1) {
239
265
  var r = IPV6_RESERVED[i];
240
266
  if (prefix < r.prefix) continue;
241
- if (hex.startsWith(r.hexPrefix)) hits.push(r.label);
267
+ if (_ipv6HexPrefixMatch(hex, r.hexPrefix, r.prefix)) hits.push(r.label);
242
268
  }
243
269
  return hits;
244
270
  }
@@ -165,7 +165,8 @@ function _measureQueryShape(query) {
165
165
  var depth = 0;
166
166
  var inString = false;
167
167
  var inComment = false;
168
- var aliasCounts = [0]; // per-depth alias counter
168
+ var escapeNext = false; // inside a string, the previous char was an unescaped backslash
169
+ var aliasStack = [0]; // per-selection-set alias counter (top of stack = current set)
169
170
  for (var i = 0; i < query.length; i += 1) {
170
171
  var c = query.charAt(i);
171
172
  if (inComment) {
@@ -173,7 +174,18 @@ function _measureQueryShape(query) {
173
174
  continue;
174
175
  }
175
176
  if (inString) {
176
- if (c === '"' && query.charAt(i - 1) !== "\\") inString = false;
177
+ // Escaped-quote handling must track the backslash RUN, not just the
178
+ // single preceding char. `"\\"` is a complete string (its backslash is
179
+ // itself escaped), so a naive `charAt(i - 1) !== "\\"` test reads the
180
+ // closing quote as escaped, leaves the walker stuck in-string, and
181
+ // blinds it to every following brace / colon — silently under-counting
182
+ // depth and alias breadth so a depth-bomb or alias-bomb rides through as
183
+ // shape-clean (a fail-open DoS-measurement bypass on valid GraphQL).
184
+ // Toggle on each backslash: a closing quote ends the string only after
185
+ // an EVEN run (escapeNext false).
186
+ if (escapeNext) { escapeNext = false; continue; }
187
+ if (c === "\\") { escapeNext = true; continue; }
188
+ if (c === '"') inString = false;
177
189
  continue;
178
190
  }
179
191
  if (c === '"') { inString = true; continue; }
@@ -181,28 +193,35 @@ function _measureQueryShape(query) {
181
193
  if (c === "{") {
182
194
  depth += 1;
183
195
  if (depth > maxDepth) maxDepth = depth;
184
- aliasCounts.push(0);
196
+ aliasStack.push(0);
185
197
  } else if (c === "}") {
186
198
  // Capture the current selection-set's alias count before popping
187
199
  // — otherwise we lose the per-block max when the block closes.
188
- var current = aliasCounts[aliasCounts.length - 1] || 0;
200
+ var current = aliasStack[aliasStack.length - 1] || 0;
189
201
  if (current > maxAliases) maxAliases = current;
190
202
  depth -= 1;
191
- aliasCounts.pop();
203
+ // Never pop the base counter: an unbalanced leading `}` would otherwise
204
+ // desync the stack from `depth`, and a subsequent `depth`-indexed
205
+ // increment lands on an absent slot (`undefined + 1 === NaN`), poisoning
206
+ // every later comparison so an alias-bomb reads as clean.
207
+ if (aliasStack.length > 1) aliasStack.pop();
192
208
  if (depth < 0) depth = 0;
193
209
  } else if (c === ":") {
194
- // Alias indicator — `alias: field`. Increment the current depth's
195
- // counter when the char before `:` looks like an identifier.
210
+ // Alias / argument indicator — `alias: field` / `field(arg: value)`.
211
+ // Increment the CURRENT selection-set's counter (top of stack) when the
212
+ // char before `:` looks like an identifier. Using the stack top rather
213
+ // than a `depth` index keeps counting correct even when a malformed
214
+ // brace run has decoupled `depth` from the stack length.
196
215
  var prev = i > 0 ? query.charAt(i - 1) : "";
197
- if (/[A-Za-z0-9_]/.test(prev) && depth > 0) {
198
- aliasCounts[depth] += 1;
216
+ if (/[A-Za-z0-9_]/.test(prev) && aliasStack.length > 1) {
217
+ aliasStack[aliasStack.length - 1] += 1;
199
218
  }
200
219
  }
201
220
  }
202
221
  // Final sweep covers any unclosed selection-sets (operator-supplied
203
222
  // syntactically-invalid queries).
204
- for (var ai = 0; ai < aliasCounts.length; ai += 1) {
205
- if (aliasCounts[ai] > maxAliases) maxAliases = aliasCounts[ai];
223
+ for (var ai = 0; ai < aliasStack.length; ai += 1) {
224
+ if (aliasStack[ai] > maxAliases) maxAliases = aliasStack[ai];
206
225
  }
207
226
  return { maxDepth: maxDepth, maxAliases: maxAliases };
208
227
  }
@@ -110,11 +110,6 @@ void observability;
110
110
 
111
111
  var _err = GuardHtmlError.factory;
112
112
 
113
- // ---- Codepoint catalog (shared via lib/codepoint-class) ----
114
-
115
- var C0_CTRL_RE_G = codepointClass.C0_CTRL_RE_G;
116
- var ZW_RE_G = codepointClass.ZW_RE_G;
117
-
118
113
  // ---- Tag denylists / allowlists ----
119
114
 
120
115
  // Always-dangerous tags. Active scripts, plugin embeds, form elements,
@@ -362,54 +357,21 @@ function escapeAttr(value) {
362
357
  .replace(/=/g, "&#61;");
363
358
  }
364
359
 
365
- // HTML5 named entities that decode to ASCII codepoints focused on
366
- // the entries browsers honor inside URL contexts (whitespace, control
367
- // chars, scheme-significant punctuation). The full WHATWG named-
368
- // character-reference table is ~2,231 entries; this is the
369
- // security-load-bearing subset documented in scheme-bypass writeups
370
- // (CVE-2026-30838 class). High-codepoint named entities (e.g. mathematical
371
- // symbols) don't affect URL scheme parsing, so they're omitted.
372
- var NAMED_ENTITY_ASCII = {
373
- // Whitespace + control chars browsers strip inside URL schemes
374
- Tab: "\t", NewLine: "\n",
375
- // Scheme-significant punctuation
376
- colon: ":", semi: ";", period: ".", sol: "/", bsol: "\\",
377
- num: "#", excl: "!", quest: "?", lpar: "(", rpar: ")",
378
- lsqb: "[", rsqb: "]", lcub: "{", rcub: "}",
379
- // Quotes / brackets
380
- quot: "\"", apos: "'", lt: "<", gt: ">",
381
- // Misc ASCII
382
- amp: "&", commat: "@", dollar: "$", percnt: "%",
383
- ast: "*", plus: "+", lowbar: "_", hyphen: "-",
384
- // Whitespace markers (codepoints in the ASCII / Latin-1 range that
385
- // browsers treat as URL-strippable)
386
- nbsp: " ",
387
- };
388
-
389
- // _normalizeUrl — peel off entity-encoded leading whitespace and
390
- // HTML/URL-encoded scheme prefix tricks, then return the lowercased
391
- // scheme. Returns "" if no scheme.
360
+ // The named-entity ASCII table + entity decoder now live in codepoint-class
361
+ // (NAMED_ENTITY_ASCII / decodeMarkupEntities), shared with guard-svg /
362
+ // guard-markdown so all three decode the SAME browser-honored set and cannot
363
+ // drift on which encoding a scheme / CSS-token danger check must fold away.
364
+ // _extractScheme decode entity-hidden scheme-prefix tricks, fold away the
365
+ // whitespace the WHATWG URL parser would (tab/lf/cr anywhere + a leading/
366
+ // trailing C0-control-or-space run none of which the C0/zero-width strip
367
+ // covers: tab/lf/cr are excluded from C0_CTRL_RANGES and space is not a
368
+ // control), then return the lowercased scheme ("" if none). The shared
369
+ // codepoint-class primitive keeps guard-html / guard-svg from drifting on which
370
+ // whitespace to strip, so neither `java<TAB>script:` nor `&#32;javascript:` can
371
+ // read as scheme-less.
392
372
  function _extractScheme(rawUrl) {
393
- var s = String(rawUrl || "").trim();
394
- // Decode HTML numeric entities (hex &#x..; and decimal &#..;, semicolon
395
- // OPTIONAL) just enough to expose hidden schemes like &#x6A;avascript: or
396
- // the browser-decoded no-semicolon form &#106avascript:. Shared decoder so
397
- // guard-html / guard-svg / guard-markdown can't drift (see codepoint-class).
398
- s = codepointClass.decodeNumericEntities(s);
399
- // Decode HTML5 named entities that browsers honor inside URL
400
- // contexts. Without this, payloads like `java&Tab;script:alert(1)`
401
- // bypass the scheme allowlist (the literal `&Tab;` between `java`
402
- // and `script:` doesn't match any denied scheme; the browser then
403
- // decodes the entity, strips the tab, and executes javascript:).
404
- s = s.replace(/&([A-Za-z][A-Za-z0-9]+);/g, function (m, name) {
405
- if (Object.prototype.hasOwnProperty.call(NAMED_ENTITY_ASCII, name)) {
406
- return NAMED_ENTITY_ASCII[name];
407
- }
408
- return m;
409
- });
410
- // Strip embedded whitespace + control chars + zero-widths the
411
- // URL parser would tolerate.
412
- s = s.replace(C0_CTRL_RE_G, "").replace(ZW_RE_G, "");
373
+ var s = codepointClass.stripUrlSchemeWhitespace(
374
+ codepointClass.decodeMarkupEntities(String(rawUrl || "").trim()));
413
375
  var m = s.match(/^([A-Za-z][A-Za-z0-9+.-]*):/);
414
376
  return m ? m[1].toLowerCase() : "";
415
377
  }
@@ -443,8 +405,19 @@ function _isClobberGlobal(name) {
443
405
  }
444
406
 
445
407
  function _isCssDangerous(value) {
408
+ // A style attribute is HTML/XML character-reference-decoded before the CSS
409
+ // parser sees it, so `ex&#x70;ression(` reaches CSS as `expression(` and
410
+ // `behavior&colon;` as `behavior:`. Match against the decoded value — the same
411
+ // normalization the URL-scheme check performs — so an entity-encoded CSS
412
+ // payload can't be served verbatim past the danger patterns.
413
+ // Also fold the URL-scheme whitespace a browser strips inside url(...) -- tab /
414
+ // lf / cr -- so an entity-hidden tab in a CSS URL scheme (url(java&Tab;script:))
415
+ // cannot defeat the contiguous `javascript:` danger pattern, the same bypass the
416
+ // URL-scheme check folds away for href.
417
+ var decoded = codepointClass.stripUrlSchemeWhitespace(
418
+ codepointClass.decodeMarkupEntities(value));
446
419
  for (var i = 0; i < CSS_DANGEROUS_PATTERNS.length; i += 1) {
447
- if (CSS_DANGEROUS_PATTERNS[i].test(value)) return true;
420
+ if (CSS_DANGEROUS_PATTERNS[i].test(decoded)) return true;
448
421
  }
449
422
  return false;
450
423
  }
@@ -101,8 +101,11 @@ var MAGIC_BYTES = Object.freeze([
101
101
  { mime: "image/heic", bytes: [0x66, 0x74, 0x79, 0x70, 0x68, 0x65, 0x69, 0x78], offset: 4 },
102
102
  { mime: "image/avif", bytes: [0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66], offset: 4 },
103
103
  // SVG (XML) — `<?xml` or `<svg` starting bytes (after any UTF-8 BOM).
104
- { mime: "image/svg+xml", bytes: [0x3C, 0x3F, 0x78, 0x6D, 0x6C] }, // `<?xml`
105
- { mime: "image/svg+xml", bytes: [0x3C, 0x73, 0x76, 0x67] }, // `<svg`
104
+ // textFamily: a leading UTF-8 BOM is legal before XML/SVG text and is skipped
105
+ // when matching these; binary rasters (above) are matched only at their real
106
+ // offset, so a BOM-prefixed raster is NOT accepted.
107
+ { mime: "image/svg+xml", bytes: [0x3C, 0x3F, 0x78, 0x6D, 0x6C], textFamily: true }, // `<?xml`
108
+ { mime: "image/svg+xml", bytes: [0x3C, 0x73, 0x76, 0x67], textFamily: true }, // `<svg`
106
109
  ]);
107
110
 
108
111
  // ---- Profile presets ----
@@ -163,12 +166,21 @@ function _bytesAt(buf, offset, sig) {
163
166
 
164
167
  function _detectMagicMimes(buf) {
165
168
  if (!buf || typeof buf.length !== "number") return [];
169
+ // A leading UTF-8 BOM (EF BB BF) is legal only before the text-family images
170
+ // (SVG / XML); skip it ONLY for those entries so a BOM-prefixed SVG still
171
+ // matches its `<?xml` / `<svg` signature and routes to guardSvg at every
172
+ // profile. Binary rasters (PNG/JPEG/GIF/...) must carry their signature at
173
+ // its real offset — applying the BOM shift to them would let a BOM-prefixed
174
+ // raster masquerade as valid, bypassing strict magic validation. So the
175
+ // shift is gated on entry.textFamily.
176
+ var bom = (buf.length >= 3 && buf[0] === 0xEF && buf[1] === 0xBB && buf[2] === 0xBF) ? 3 : 0;
166
177
  var hits = [];
167
178
  for (var i = 0; i < MAGIC_BYTES.length; i += 1) {
168
179
  var entry = MAGIC_BYTES[i];
169
- var offset = entry.offset || 0;
180
+ var shift = entry.textFamily ? bom : 0;
181
+ var offset = (entry.offset || 0) + shift;
170
182
  if (!_bytesAt(buf, offset, entry.bytes)) continue;
171
- if (entry.tail && !_bytesAt(buf, entry.tailOffset, entry.tail)) continue;
183
+ if (entry.tail && !_bytesAt(buf, entry.tailOffset + shift, entry.tail)) continue;
172
184
  hits.push(entry.mime);
173
185
  }
174
186
  return hits;
@@ -182,8 +194,15 @@ function _detectIssues(metadata, opts) {
182
194
  snippet: "image metadata is not an object" }];
183
195
  }
184
196
 
197
+ // Measure the byte cap only for measurable values. A hostile bag whose
198
+ // `bytes` is a plain Array or array-like object carries a numeric `.length`
199
+ // but is NOT a byte-carrier — measuring it would throw, breaking validate's
200
+ // documented never-throw contract; byteLengthOfIfMeasurable returns null for
201
+ // those, so the cap is skipped (magic detection below is O(1)-bounded
202
+ // regardless of size) instead of crashing the caller.
185
203
  var bytes = metadata.bytes;
186
- if (bytes && typeof bytes.length === "number" && safeBuffer.byteLengthOf(bytes) > opts.maxBytes) {
204
+ var byteCount = safeBuffer.byteLengthOfIfMeasurable(bytes);
205
+ if (byteCount !== null && byteCount > opts.maxBytes) {
187
206
  return [{ kind: "image-cap", severity: "high",
188
207
  ruleId: "image.image-cap",
189
208
  snippet: "image bytes exceed maxBytes " + opts.maxBytes }];
@@ -198,10 +198,18 @@ var LITERAL_SMUGGLE_RE = /\{[0-9]+\+?\}(?!\s*$)/;
198
198
  function validate(line, opts) {
199
199
  opts = opts || {};
200
200
  var profileName = typeof opts.profile === "string" ? opts.profile : DEFAULT_PROFILE;
201
- if (opts.posture && COMPLIANCE_POSTURES[opts.posture]) {
201
+ // hasOwnProperty on both lookups: opts.profile / opts.posture are caller
202
+ // input, and a bare bracket read resolves an inherited Object.prototype
203
+ // key (constructor / __proto__ / toString / ...) to a truthy value —
204
+ // PROFILES["constructor"] is the Object function, so `if (!caps)` never
205
+ // fires and every byte / literal cap compares against `undefined` (fails
206
+ // open). An unknown posture is ignored (falls through to profile/default);
207
+ // an unknown profile throws bad-profile.
208
+ if (opts.posture && Object.prototype.hasOwnProperty.call(COMPLIANCE_POSTURES, opts.posture)) {
202
209
  profileName = COMPLIANCE_POSTURES[opts.posture];
203
210
  }
204
- var caps = PROFILES[profileName];
211
+ var caps = Object.prototype.hasOwnProperty.call(PROFILES, profileName)
212
+ ? PROFILES[profileName] : undefined;
205
213
  if (!caps) {
206
214
  throw new GuardImapCommandError("guard-imap-command/bad-profile",
207
215
  "guardImapCommand.validate: unknown profile '" + profileName + "'");