@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
@@ -4,14 +4,18 @@
4
4
  /**
5
5
  * guard-image — image content-safety primitive (b.guardImage).
6
6
  *
7
- * Covers: surface; registry parity; magic-byte / declared-MIME mismatch;
8
- * polyglot rejection; unknown-magic; dimension + frame caps; inspectMagic;
9
- * and the container-framing metadata strip (sanitize) EXIF/XMP out of
10
- * JPEG (APP1), text chunks out of PNG (tEXt), comment/app extensions out of
11
- * GIF, EXIF/XMP RIFF chunks out of WebP with the VP8X flag bits cleared,
12
- * the unsupported-format / malformed refusals, and refuse-before-strip for a
13
- * polyglot / mismatch. The strip is byte-surgery over the linear container
14
- * framing, not a pixel decoder.
7
+ * Covers: surface; registry parity; magic-byte detection across every format
8
+ * (PNG / JPEG / GIF87a-89a / WebP / BMP / ICO / TIFF II-MM / HEIC / AVIF /
9
+ * SVG), incl. truncated / ambiguous / RIFF-not-WEBP headers; declared-vs-actual
10
+ * MIME mismatch; multi-signature polyglot refusal; unknown-magic severity by
11
+ * profile; oversized / dimension / frame caps across strict/balanced/permissive
12
+ * and the hipaa/pci-dss/gdpr/soc2 postures; the operator-feeds-metadata gate
13
+ * (serve / audit-only / refuse by KIND); and the container-framing metadata
14
+ * strip (sanitize) over JPEG APPn/COM (incl. standalone RST, fill-FF collapse,
15
+ * SOS verbatim), PNG text/eXIf/tIME chunks, GIF comment/plain-text/app
16
+ * extensions (loop kept), WebP EXIF/XMP RIFF chunks + VP8X flag clear, plus the
17
+ * unsupported-format / malformed refusals and refuse-before-strip. The strip is
18
+ * byte-surgery over the linear container framing, not a pixel decoder.
15
19
  */
16
20
 
17
21
  var helpers = require("../helpers");
@@ -20,8 +24,299 @@ var check = helpers.check;
20
24
 
21
25
  function _has(buf, s) { return buf.toString("latin1").indexOf(s) !== -1; }
22
26
  function _code(fn) { try { fn(); return null; } catch (e) { return e && e.code; } }
27
+ function _throws(fn) { try { fn(); return false; } catch (e) { void e; return true; } }
28
+ function _hasKind(issues, kind) {
29
+ return issues.some(function (it) { return it.kind === kind; });
30
+ }
31
+ function _hasKindSev(issues, kind, sev) {
32
+ return issues.some(function (it) { return it.kind === kind && it.severity === sev; });
33
+ }
34
+
35
+ // ---- magic-byte fixtures (built from hex/latin1 so the source stays ASCII) ----
36
+
37
+ var PNG_MAGIC = Buffer.from([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]);
38
+ var JPEG_MAGIC = Buffer.from([0xFF, 0xD8, 0xFF]);
39
+ var GIF87 = Buffer.from("GIF87a", "latin1");
40
+ var GIF89 = Buffer.from("GIF89a", "latin1");
41
+ var BMP_MAGIC = Buffer.from([0x42, 0x4D]);
42
+ var ICO_MAGIC = Buffer.from([0x00, 0x00, 0x01, 0x00]);
43
+ var TIFF_II = Buffer.from([0x49, 0x49, 0x2A, 0x00]);
44
+ var TIFF_MM = Buffer.from([0x4D, 0x4D, 0x00, 0x2A]);
45
+ var WEBP = Buffer.concat([Buffer.from("RIFF", "latin1"), Buffer.from([4, 0, 0, 0]), Buffer.from("WEBP", "latin1")]);
46
+ var RIFF_WAVE = Buffer.concat([Buffer.from("RIFF", "latin1"), Buffer.from([4, 0, 0, 0]), Buffer.from("WAVE", "latin1")]);
47
+ var HEIC = Buffer.concat([Buffer.from([0, 0, 0, 0x18]), Buffer.from("ftypheic", "latin1")]);
48
+ var HEIX = Buffer.concat([Buffer.from([0, 0, 0, 0x18]), Buffer.from("ftypheix", "latin1")]);
49
+ var AVIF = Buffer.concat([Buffer.from([0, 0, 0, 0x18]), Buffer.from("ftypavif", "latin1")]);
50
+ var SVG_XML = Buffer.from("<?xml?>", "latin1");
51
+ var SVG_TAG = Buffer.from("<svg/>", "latin1");
52
+
53
+ // UTF-8 BOM (EF BB BF) precedes text-family images (SVG/XML) in the wild.
54
+ var BOM = Buffer.from([0xEF, 0xBB, 0xBF]);
55
+ var BOM_XML = Buffer.concat([BOM, SVG_XML]);
56
+ var BOM_SVG = Buffer.concat([BOM, SVG_TAG]);
57
+
58
+ // A single buffer matching BOTH JPEG (offset 0) and HEIC (ftyp at offset 4) —
59
+ // a synthetic but genuine multi-signature polyglot.
60
+ var POLYGLOT = Buffer.concat([Buffer.from([0xFF, 0xD8, 0xFF, 0x00]), Buffer.from("ftypheic", "latin1")]);
61
+
62
+ function testGuardImageSurface() {
63
+ check("guardImage is an object", typeof b.guardImage === "object");
64
+ check("guardImage.NAME === 'image'", b.guardImage.NAME === "image");
65
+ check("guardImage.PROFILES has strict", !!b.guardImage.PROFILES["strict"]);
66
+ check("guardImage.PROFILES has balanced", !!b.guardImage.PROFILES["balanced"]);
67
+ check("guardImage.PROFILES has permissive", !!b.guardImage.PROFILES["permissive"]);
68
+ check("guardImage.COMPLIANCE_POSTURES gdpr", !!b.guardImage.COMPLIANCE_POSTURES["gdpr"]);
69
+ check("guardImage.validate is a function", typeof b.guardImage.validate === "function");
70
+ check("guardImage.sanitize is a function", typeof b.guardImage.sanitize === "function");
71
+ check("guardImage.gate is a function", typeof b.guardImage.gate === "function");
72
+ check("guardImage.inspectMagic is a function", typeof b.guardImage.inspectMagic === "function");
73
+ check("frameworkError.GuardImageError exposed", typeof b.frameworkError.GuardImageError === "function");
74
+ }
75
+
76
+ function testGuardImageRegistryParity() {
77
+ check("guardImage registered in guardAll",
78
+ b.guardAll.allGuards().some(function (g) { return (g.name || g.NAME) === "image"; }));
79
+ }
80
+
81
+ function testInspectMagic() {
82
+ check("inspectMagic detects png",
83
+ b.guardImage.inspectMagic(PNG_MAGIC).indexOf("image/png") !== -1);
84
+ check("inspectMagic empty on garbage",
85
+ b.guardImage.inspectMagic(Buffer.from([0x00, 0x01, 0x02])).length === 0);
86
+ }
87
+
88
+ function testInspectMagicAllFormats() {
89
+ check("inspectMagic: jpeg", b.guardImage.inspectMagic(JPEG_MAGIC).indexOf("image/jpeg") !== -1);
90
+ check("inspectMagic: gif87a", b.guardImage.inspectMagic(GIF87).indexOf("image/gif") !== -1);
91
+ check("inspectMagic: gif89a", b.guardImage.inspectMagic(GIF89).indexOf("image/gif") !== -1);
92
+ check("inspectMagic: webp (RIFF+WEBP)", b.guardImage.inspectMagic(WEBP).indexOf("image/webp") !== -1);
93
+ check("inspectMagic: bmp", b.guardImage.inspectMagic(BMP_MAGIC).indexOf("image/bmp") !== -1);
94
+ check("inspectMagic: ico", b.guardImage.inspectMagic(ICO_MAGIC).indexOf("image/x-icon") !== -1);
95
+ check("inspectMagic: tiff-II", b.guardImage.inspectMagic(TIFF_II).indexOf("image/tiff") !== -1);
96
+ check("inspectMagic: tiff-MM", b.guardImage.inspectMagic(TIFF_MM).indexOf("image/tiff") !== -1);
97
+ check("inspectMagic: heic", b.guardImage.inspectMagic(HEIC).indexOf("image/heic") !== -1);
98
+ check("inspectMagic: heix (heic alias)", b.guardImage.inspectMagic(HEIX).indexOf("image/heic") !== -1);
99
+ check("inspectMagic: avif", b.guardImage.inspectMagic(AVIF).indexOf("image/avif") !== -1);
100
+ check("inspectMagic: svg (<?xml)", b.guardImage.inspectMagic(SVG_XML).indexOf("image/svg+xml") !== -1);
101
+ check("inspectMagic: svg (<svg)", b.guardImage.inspectMagic(SVG_TAG).indexOf("image/svg+xml") !== -1);
102
+
103
+ // RIFF but not WEBP (a WAV) — the tail-mismatch continue branch: no webp hit.
104
+ check("inspectMagic: RIFF/WAVE is not webp", b.guardImage.inspectMagic(RIFF_WAVE).length === 0);
105
+ // Sub-magic-length buffer can match nothing.
106
+ check("inspectMagic: 2-byte buffer (< jpeg magic) → []",
107
+ b.guardImage.inspectMagic(Buffer.from([0xFF, 0xD8])).length === 0);
108
+ // Pure inspection — never throws on non-Buffer / no-length input.
109
+ check("inspectMagic: null → []", b.guardImage.inspectMagic(null).length === 0);
110
+ check("inspectMagic: undefined → []", b.guardImage.inspectMagic(undefined).length === 0);
111
+ check("inspectMagic: no-length obj → []", b.guardImage.inspectMagic({}).length === 0);
112
+ }
113
+
114
+ // ---- BUG A (RED-first): a UTF-8-BOM-prefixed SVG must still route to guardSvg ----
115
+ //
116
+ // The @module block documents SVG detection "after any UTF-8 BOM", and the
117
+ // svgRoutingPolicy is "reject" at EVERY profile. But a BOM-prefixed SVG matched
118
+ // no signature, so it fell through to unknown-magic — audit-only (SERVED) under
119
+ // balanced/permissive — a fail-open of the "route SVG at every profile"
120
+ // invariant, and a mis-classification (unknown-magic, not svg-routing) even
121
+ // under strict.
122
+ function testInspectMagicBomSvg() {
123
+ check("inspectMagic: BOM + <?xml detected as svg",
124
+ b.guardImage.inspectMagic(BOM_XML).indexOf("image/svg+xml") !== -1);
125
+ check("inspectMagic: BOM + <svg detected as svg",
126
+ b.guardImage.inspectMagic(BOM_SVG).indexOf("image/svg+xml") !== -1);
127
+ }
128
+
129
+ function testValidateSvgRoutedEveryProfile() {
130
+ var profiles = ["strict", "balanced", "permissive"];
131
+ for (var pi = 0; pi < profiles.length; pi += 1) {
132
+ var p = profiles[pi];
133
+ // Plain (no-BOM) SVG — the existing baseline.
134
+ var rvPlain = b.guardImage.validate({ bytes: SVG_XML }, { profile: p });
135
+ check("svg (<?xml) routed under " + p, _hasKind(rvPlain.issues, "svg-routing"));
136
+ check("svg (<?xml) refused under " + p, rvPlain.ok === false);
137
+ // BOM-prefixed SVG — the fail-open case.
138
+ var rvBom = b.guardImage.validate({ bytes: BOM_XML }, { profile: p });
139
+ check("BOM-svg routed under " + p, _hasKind(rvBom.issues, "svg-routing"));
140
+ check("BOM-svg refused under " + p, rvBom.ok === false);
141
+ }
142
+ }
23
143
 
24
- // ---- fixture builders (kept ASCII; metadata payloads carry a sentinel) ----
144
+ // ---- BUG A follow-up (RED-first): the BOM skip must NOT extend to binary
145
+ // rasters. A UTF-8 BOM is legal only before XML/SVG text; a PNG/JPEG/etc.
146
+ // signature must sit at its real offset. Shifting every signature by the BOM
147
+ // width let a `EF BB BF`-prefixed PNG masquerade as a valid raster (ok:true
148
+ // under strict), bypassing strict magic validation. The shift is now gated on
149
+ // the text-family SVG/XML entries only. ----
150
+ function testBomDoesNotBypassRasterMagic() {
151
+ var pngMagic = Buffer.from([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]);
152
+ var bomPng = Buffer.concat([BOM, pngMagic]);
153
+ // BOM-prefixed PNG is NOT a valid PNG (signature not at offset 0) — it must
154
+ // NOT be detected as image/png, and strict validate must refuse it.
155
+ check("inspectMagic: BOM + PNG magic NOT detected as image/png",
156
+ b.guardImage.inspectMagic(bomPng).indexOf("image/png") === -1);
157
+ var rv = b.guardImage.validate({ bytes: bomPng, declaredMime: "image/png" }, { profile: "strict" });
158
+ check("strict: BOM-prefixed PNG refused (not accepted as a raster)", rv.ok === false);
159
+ check("strict: BOM-prefixed PNG raises unknown-magic (signature not at offset 0)",
160
+ _hasKind(rv.issues, "unknown-magic"));
161
+ // Control: a genuine PNG (no BOM) still validates as a raster.
162
+ var rvReal = b.guardImage.validate({ bytes: pngMagic }, { profile: "strict" });
163
+ check("strict: real PNG magic detected as image/png",
164
+ b.guardImage.inspectMagic(pngMagic).indexOf("image/png") !== -1 && !_hasKind(rvReal.issues, "unknown-magic"));
165
+ }
166
+
167
+ // ---- BUG B (RED-first): validate must never throw on hostile metadata ----
168
+ //
169
+ // The @primitive block promises validate is "pure inspection — never mutates
170
+ // input or throws on hostile metadata". A bag whose `bytes` is a plain Array or
171
+ // an array-like object (numeric `.length`, not a Buffer/string/Uint8Array) hit
172
+ // safeBuffer.byteLengthOf, which throws TypeError — crashing a direct caller.
173
+ function testValidateNeverThrowsHostileMetadata() {
174
+ check("validate does not throw on Array-typed bytes",
175
+ _throws(function () { b.guardImage.validate({ bytes: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A] }, { profile: "strict" }); }) === false);
176
+ check("validate does not throw on array-like-object bytes",
177
+ _throws(function () { b.guardImage.validate({ bytes: { length: 5 } }, { profile: "strict" }); }) === false);
178
+ // And it still refuses the unrecognized array-like content rather than crash.
179
+ var rv = b.guardImage.validate({ bytes: { length: 5 } }, { profile: "strict" });
180
+ check("array-like bytes → unknown-magic refuse (not a crash)",
181
+ rv.ok === false && _hasKind(rv.issues, "unknown-magic"));
182
+ }
183
+
184
+ function testValidateMismatchAndPolyglot() {
185
+ var rv = b.guardImage.validate({ bytes: JPEG_MAGIC, declaredMime: "image/png" }, { profile: "strict" });
186
+ check("mismatch: validate ok:false", rv.ok === false);
187
+ check("mismatch: kind reported", _hasKind(rv.issues, "mime-mismatch"));
188
+ }
189
+
190
+ function testValidatePolyglot() {
191
+ var mimes = b.guardImage.inspectMagic(POLYGLOT);
192
+ check("polyglot: inspectMagic returns two formats",
193
+ mimes.indexOf("image/jpeg") !== -1 && mimes.indexOf("image/heic") !== -1);
194
+ // Refused even under permissive (polyglotPolicy is "reject" at every profile).
195
+ var rv = b.guardImage.validate({ bytes: POLYGLOT }, { profile: "permissive" });
196
+ check("polyglot refused under permissive", rv.ok === false);
197
+ check("polyglot: critical severity", _hasKindSev(rv.issues, "polyglot", "critical"));
198
+ }
199
+
200
+ function testValidateUnknownMagicSeverity() {
201
+ var garbage = Buffer.from([0x00, 0x01, 0x02, 0x03, 0x04]);
202
+ var rvS = b.guardImage.validate({ bytes: garbage }, { profile: "strict" });
203
+ check("unknown-magic high under strict (reject policy)",
204
+ rvS.ok === false && _hasKindSev(rvS.issues, "unknown-magic", "high"));
205
+ var rvB = b.guardImage.validate({ bytes: garbage }, { profile: "balanced" });
206
+ check("unknown-magic warn under balanced (audit policy)",
207
+ rvB.ok === true && _hasKindSev(rvB.issues, "unknown-magic", "warn"));
208
+ }
209
+
210
+ function testValidateOversizedBytes() {
211
+ var over = Buffer.alloc(10, 0x89);
212
+ var rv = b.guardImage.validate({ bytes: over }, { profile: "strict", maxBytes: 4 });
213
+ check("oversized bytes → image-cap refuse",
214
+ rv.ok === false && _hasKind(rv.issues, "image-cap"));
215
+ }
216
+
217
+ function testValidateDimensionAndFrameCaps() {
218
+ // Width over the strict 8192 cap (reject) → high.
219
+ var rvW = b.guardImage.validate(
220
+ { bytes: PNG_MAGIC, declaredMime: "image/png", width: 9000, height: 100 }, { profile: "strict" });
221
+ check("width over strict cap → width-cap high refuse",
222
+ rvW.ok === false && _hasKindSev(rvW.issues, "width-cap", "high"));
223
+ // Height over the strict cap → high.
224
+ var rvH = b.guardImage.validate(
225
+ { bytes: PNG_MAGIC, declaredMime: "image/png", width: 100, height: 9000 }, { profile: "strict" });
226
+ check("height over strict cap → height-cap high refuse",
227
+ rvH.ok === false && _hasKindSev(rvH.issues, "height-cap", "high"));
228
+ // Width over the balanced 16384 cap (audit) → warn, ok stays true.
229
+ var rvWB = b.guardImage.validate(
230
+ { bytes: PNG_MAGIC, declaredMime: "image/png", width: 20000 }, { profile: "balanced" });
231
+ check("width over balanced cap → warn (ok true)",
232
+ rvWB.ok === true && _hasKindSev(rvWB.issues, "width-cap", "warn"));
233
+ // Frames over the strict 60 cap (reject) → high.
234
+ var rvF = b.guardImage.validate(
235
+ { bytes: GIF89, declaredMime: "image/gif", frames: 100 }, { profile: "strict" });
236
+ check("frames over strict cap → frames-cap high refuse",
237
+ rvF.ok === false && _hasKindSev(rvF.issues, "frames-cap", "high"));
238
+ // Frames over the balanced 200 cap (audit) → warn.
239
+ var rvFB = b.guardImage.validate(
240
+ { bytes: GIF89, declaredMime: "image/gif", frames: 300 }, { profile: "balanced" });
241
+ check("frames over balanced cap → warn (ok true)",
242
+ rvFB.ok === true && _hasKindSev(rvFB.issues, "frames-cap", "warn"));
243
+ }
244
+
245
+ function testValidateBadInput() {
246
+ var rvNull = b.guardImage.validate(null, { profile: "strict" });
247
+ check("validate(null) → bad-input refuse",
248
+ rvNull.ok === false && _hasKind(rvNull.issues, "bad-input"));
249
+ var rvNum = b.guardImage.validate(42, { profile: "strict" });
250
+ check("validate(non-object) → bad-input refuse",
251
+ rvNum.ok === false && _hasKind(rvNum.issues, "bad-input"));
252
+ }
253
+
254
+ function testValidateBadOpt() {
255
+ check("maxWidth: -1 → bad-opt throw",
256
+ _code(function () { b.guardImage.validate({ bytes: PNG_MAGIC }, { maxWidth: -1 }); }) === "image.bad-opt");
257
+ check("maxFrames: Infinity → bad-opt throw",
258
+ _code(function () { b.guardImage.validate({ bytes: PNG_MAGIC }, { maxFrames: Infinity }); }) === "image.bad-opt");
259
+ }
260
+
261
+ function testCompliancePostures() {
262
+ // hipaa / pci-dss / soc2 map to the strict tier (dimensionsPolicy reject);
263
+ // gdpr maps to balanced (dimensionsPolicy audit). Width 20000 exceeds both
264
+ // the strict (8192) and balanced (16384) caps, so the posture's tier shows.
265
+ var strictPostures = ["hipaa", "pci-dss", "soc2"];
266
+ for (var ci = 0; ci < strictPostures.length; ci += 1) {
267
+ var name = strictPostures[ci];
268
+ var rv = b.guardImage.validate(
269
+ { bytes: PNG_MAGIC, declaredMime: "image/png", width: 20000 },
270
+ { compliancePosture: name });
271
+ check(name + " posture → strict tier refuses oversized width",
272
+ rv.ok === false && _hasKindSev(rv.issues, "width-cap", "high"));
273
+ }
274
+ var rvGdpr = b.guardImage.validate(
275
+ { bytes: PNG_MAGIC, declaredMime: "image/png", width: 20000 },
276
+ { compliancePosture: "gdpr" });
277
+ check("gdpr posture → balanced tier audits oversized width (ok true)",
278
+ rvGdpr.ok === true && _hasKindSev(rvGdpr.issues, "width-cap", "warn"));
279
+ }
280
+
281
+ // ---- the bespoke operator-feeds-metadata gate ----
282
+
283
+ async function testGate() {
284
+ var g = b.guardImage.gate({ profile: "strict" });
285
+ check("gate() returns a gate object", g && typeof g.check === "function");
286
+
287
+ // No metadata → serve (nothing for the operator's decoder to report).
288
+ var rvNone = await g.check({});
289
+ check("gate: no metadata → serve", rvNone.action === "serve");
290
+
291
+ // Clean PNG metadata → serve.
292
+ var rvClean = await g.check({ metadata: {
293
+ bytes: PNG_MAGIC, declaredMime: "image/png", width: 100, height: 100, frames: 1 } });
294
+ check("gate: clean image → serve", rvClean.action === "serve");
295
+
296
+ // MIME-mismatch → refuse.
297
+ var rvMis = await g.check({ metadata: { bytes: JPEG_MAGIC, declaredMime: "image/png" } });
298
+ check("gate: mime-mismatch → refuse", rvMis.action === "refuse");
299
+ check("gate: mismatch issue reported", _hasKind(rvMis.issues, "mime-mismatch"));
300
+
301
+ // Alternative ctx field ctx.imageMetadata.
302
+ var rvAlt = await g.check({ imageMetadata: { bytes: JPEG_MAGIC, declaredMime: "image/png" } });
303
+ check("gate: reads ctx.imageMetadata alias → refuse", rvAlt.action === "refuse");
304
+
305
+ // Warn-level finding (balanced oversized dimension) → audit-only.
306
+ var gBal = b.guardImage.gate({ profile: "balanced" });
307
+ var rvAudit = await gBal.check({ metadata: { bytes: PNG_MAGIC, declaredMime: "image/png", width: 20000 } });
308
+ check("gate: balanced oversized dimension → audit-only", rvAudit.action === "audit-only");
309
+
310
+ // Polyglot → refuse.
311
+ var rvPoly = await g.check({ metadata: { bytes: POLYGLOT } });
312
+ check("gate: polyglot → refuse", rvPoly.action === "refuse");
313
+
314
+ // BOM-SVG through the gate → refuse (route to guardSvg), not a silent serve.
315
+ var rvBomSvg = await g.check({ metadata: { bytes: BOM_XML } });
316
+ check("gate: BOM-svg → refuse (routed, not served)", rvBomSvg.action === "refuse");
317
+ }
318
+
319
+ // ---- the real metadata strip (sanitize) ----
25
320
 
26
321
  function _jpegWithExif() {
27
322
  return Buffer.concat([
@@ -39,7 +334,7 @@ function _pngWithText() {
39
334
  Buffer.from("Comment secret-gps", "latin1"), Buffer.from([9, 9, 9, 9])]);
40
335
  var iend = Buffer.concat([Buffer.from([0, 0, 0, 0]), Buffer.from("IEND", "latin1"),
41
336
  Buffer.from([0xAE, 0x42, 0x60, 0x82])]);
42
- return Buffer.concat([Buffer.from([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]), ihdr, text, iend]);
337
+ return Buffer.concat([PNG_MAGIC, ihdr, text, iend]);
43
338
  }
44
339
 
45
340
  function _gifWithComment() {
@@ -61,38 +356,6 @@ function _webpWithExif() {
61
356
  ]);
62
357
  }
63
358
 
64
- function testGuardImageSurface() {
65
- check("guardImage is an object", typeof b.guardImage === "object");
66
- check("guardImage.NAME === 'image'", b.guardImage.NAME === "image");
67
- check("guardImage.PROFILES has strict", !!b.guardImage.PROFILES["strict"]);
68
- check("guardImage.COMPLIANCE_POSTURES gdpr", !!b.guardImage.COMPLIANCE_POSTURES["gdpr"]);
69
- check("guardImage.validate is a function", typeof b.guardImage.validate === "function");
70
- check("guardImage.sanitize is a function", typeof b.guardImage.sanitize === "function");
71
- check("guardImage.gate is a function", typeof b.guardImage.gate === "function");
72
- check("guardImage.inspectMagic is a function", typeof b.guardImage.inspectMagic === "function");
73
- check("frameworkError.GuardImageError exposed", typeof b.frameworkError.GuardImageError === "function");
74
- }
75
-
76
- function testGuardImageRegistryParity() {
77
- check("guardImage registered in guardAll",
78
- b.guardAll.allGuards().some(function (g) { return (g.name || g.NAME) === "image"; }));
79
- }
80
-
81
- function testInspectMagic() {
82
- check("inspectMagic detects png",
83
- b.guardImage.inspectMagic(Buffer.from([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])).indexOf("image/png") !== -1);
84
- check("inspectMagic empty on garbage",
85
- b.guardImage.inspectMagic(Buffer.from([0x00, 0x01, 0x02])).length === 0);
86
- }
87
-
88
- function testValidateMismatchAndPolyglot() {
89
- var rv = b.guardImage.validate({ bytes: Buffer.from([0xFF, 0xD8, 0xFF]), declaredMime: "image/png" }, { profile: "strict" });
90
- check("mismatch: validate ok:false", rv.ok === false);
91
- check("mismatch: kind reported", rv.issues.some(function (i) { return i.kind === "mime-mismatch"; }));
92
- }
93
-
94
- // ---- the real metadata strip ----
95
-
96
359
  function testStripJpegExif() {
97
360
  var src = _jpegWithExif();
98
361
  var out = b.guardImage.sanitize({ bytes: src });
@@ -105,6 +368,51 @@ function testStripJpegExif() {
105
368
  check("jpeg: bag is a fresh object (bytes replaced)", typeof out === "object" && Buffer.isBuffer(out.bytes));
106
369
  }
107
370
 
371
+ // JPEG framing edge cases: standalone RST marker, a 0xFF fill byte before a
372
+ // marker code, kept ICC (APP2), dropped IPTC (APP13) + COM, and SOS entropy
373
+ // preserved verbatim.
374
+ function _jpegRich() {
375
+ return Buffer.concat([
376
+ Buffer.from([0xFF, 0xD8]), // SOI
377
+ Buffer.from([0xFF, 0xE1, 0x00, 0x05]), Buffer.from("px1", "latin1"), // APP1 EXIF — drop
378
+ Buffer.from([0xFF, 0xE2, 0x00, 0x05]), Buffer.from("px2", "latin1"), // APP2 ICC — keep
379
+ Buffer.from([0xFF, 0xED, 0x00, 0x05]), Buffer.from("px3", "latin1"), // APP13 IPTC — drop
380
+ Buffer.from([0xFF, 0xFE, 0x00, 0x05]), Buffer.from("px4", "latin1"), // COM — drop
381
+ Buffer.from([0xFF, 0xD0]), // RST0 standalone — keep
382
+ Buffer.from([0xFF, 0xFF, 0xDB, 0x00, 0x04]), Buffer.from([1, 2]), // fill-FF + DQT — keep
383
+ Buffer.from([0xFF, 0xDA, 0x00, 0x03, 0x01]), Buffer.from("px5entropy", "latin1"), // SOS + entropy — keep verbatim
384
+ Buffer.from([0xFF, 0xD9]), // EOI (inside entropy verbatim)
385
+ ]);
386
+ }
387
+
388
+ function testStripJpegRichFraming() {
389
+ var src = _jpegRich();
390
+ var out = b.guardImage.sanitize({ bytes: src });
391
+ check("jpeg-rich: EXIF (APP1) dropped", !_has(out.bytes, "px1"));
392
+ check("jpeg-rich: IPTC (APP13) dropped", !_has(out.bytes, "px3"));
393
+ check("jpeg-rich: COM dropped", !_has(out.bytes, "px4"));
394
+ check("jpeg-rich: ICC (APP2) preserved", _has(out.bytes, "px2"));
395
+ check("jpeg-rich: SOS entropy preserved verbatim", _has(out.bytes, "px5entropy"));
396
+ check("jpeg-rich: output shrank", out.bytes.length < src.length);
397
+ check("jpeg-rich: SOI intact", out.bytes[0] === 0xFF && out.bytes[1] === 0xD8);
398
+ }
399
+
400
+ function testStripJpegMalformed() {
401
+ // Each input detects as JPEG (FF D8 FF...) + passes validate, then trips a
402
+ // distinct framing check inside the strip.
403
+ check("jpeg: expected-marker malformed",
404
+ _code(function () { b.guardImage.sanitize({ bytes: Buffer.from([0xFF, 0xD8, 0xFF, 0xDB, 0x00, 0x04, 0xAA, 0xBB, 0x00]) }); }) === "image.sanitize-malformed");
405
+ check("jpeg: truncated-marker malformed",
406
+ _code(function () { b.guardImage.sanitize({ bytes: Buffer.from([0xFF, 0xD8, 0xFF, 0xDB, 0x00, 0x04, 0xAA, 0xBB, 0xFF, 0xFF]) }); }) === "image.sanitize-malformed");
407
+ check("jpeg: truncated-segment-length malformed",
408
+ _code(function () { b.guardImage.sanitize({ bytes: Buffer.from([0xFF, 0xD8, 0xFF, 0xE2]) }); }) === "image.sanitize-malformed");
409
+ check("jpeg: bad-segment-length malformed",
410
+ _code(function () { b.guardImage.sanitize({ bytes: Buffer.from([0xFF, 0xD8, 0xFF, 0xE2, 0x00, 0x01]) }); }) === "image.sanitize-malformed");
411
+ // Existing baseline: APP1 length overruns the buffer.
412
+ check("jpeg: segment-overrun malformed",
413
+ _code(function () { b.guardImage.sanitize({ bytes: Buffer.from([0xFF, 0xD8, 0xFF, 0xE1, 0x00, 0xFF]) }); }) === "image.sanitize-malformed");
414
+ }
415
+
108
416
  function testStripPngText() {
109
417
  var out = b.guardImage.sanitize({ bytes: _pngWithText() });
110
418
  check("png: tEXt payload removed", !_has(out.bytes, "secret-gps"));
@@ -113,6 +421,47 @@ function testStripPngText() {
113
421
  check("png: signature intact", out.bytes[0] === 0x89 && out.bytes[1] === 0x50);
114
422
  }
115
423
 
424
+ function _pngChunk(type, data) {
425
+ var len = Buffer.from([(data.length >>> 24) & 0xFF, (data.length >>> 16) & 0xFF,
426
+ (data.length >>> 8) & 0xFF, data.length & 0xFF]);
427
+ return Buffer.concat([len, Buffer.from(type, "latin1"), data, Buffer.from([0, 0, 0, 0])]); // crc placeholder
428
+ }
429
+
430
+ function _pngRich() {
431
+ return Buffer.concat([
432
+ PNG_MAGIC,
433
+ _pngChunk("IHDR", Buffer.from([0, 0, 0, 1, 0, 0, 0, 1, 8, 0, 0, 0, 0])),
434
+ _pngChunk("zTXt", Buffer.from("zpayload", "latin1")),
435
+ _pngChunk("eXIf", Buffer.from("epayload", "latin1")),
436
+ _pngChunk("tIME", Buffer.from("tpayload", "latin1")),
437
+ _pngChunk("iTXt", Buffer.from("ipayload", "latin1")),
438
+ _pngChunk("IDAT", Buffer.from([1, 2, 3, 4])),
439
+ _pngChunk("IEND", Buffer.from([])),
440
+ ]);
441
+ }
442
+
443
+ function testStripPngRichChunks() {
444
+ var out = b.guardImage.sanitize({ bytes: _pngRich() });
445
+ check("png: zTXt dropped", !_has(out.bytes, "zpayload"));
446
+ check("png: eXIf dropped", !_has(out.bytes, "epayload"));
447
+ check("png: tIME dropped", !_has(out.bytes, "tpayload"));
448
+ check("png: iTXt dropped", !_has(out.bytes, "ipayload"));
449
+ check("png: IHDR preserved", _has(out.bytes, "IHDR"));
450
+ check("png: IDAT preserved", _has(out.bytes, "IDAT"));
451
+ check("png: IEND preserved", _has(out.bytes, "IEND"));
452
+ }
453
+
454
+ function testStripPngMalformed() {
455
+ check("png: chunk-overrun malformed",
456
+ _code(function () {
457
+ b.guardImage.sanitize({ bytes: Buffer.concat([PNG_MAGIC, Buffer.from([0, 0, 0, 0xFF]), Buffer.from("IDAT", "latin1")]) });
458
+ }) === "image.sanitize-malformed");
459
+ check("png: chunk-length-exceeds-max malformed",
460
+ _code(function () {
461
+ b.guardImage.sanitize({ bytes: Buffer.concat([PNG_MAGIC, Buffer.from([0xFF, 0xFF, 0xFF, 0xFF]), Buffer.from("IDAT", "latin1")]) });
462
+ }) === "image.sanitize-malformed");
463
+ }
464
+
116
465
  function testStripGifComment() {
117
466
  var out = b.guardImage.sanitize({ bytes: _gifWithComment() });
118
467
  check("gif: comment payload removed", !_has(out.bytes, "secret-gps"));
@@ -120,6 +469,62 @@ function testStripGifComment() {
120
469
  check("gif: trailer preserved", out.bytes[out.bytes.length - 1] === 0x3B);
121
470
  }
122
471
 
472
+ // Build a GIF extension block: 0x21 <label> <sub-block>* 0x00. For app / plain-
473
+ // text extensions the first sub-block is the fixed leading block (app-id / the
474
+ // 12-byte plain-text header).
475
+ function _gifExt(label, subBlocks) {
476
+ var parts = [Buffer.from([0x21, label])];
477
+ for (var i = 0; i < subBlocks.length; i += 1) {
478
+ parts.push(Buffer.from([subBlocks[i].length]));
479
+ parts.push(subBlocks[i]);
480
+ }
481
+ parts.push(Buffer.from([0x00])); // block terminator
482
+ return Buffer.concat(parts);
483
+ }
484
+
485
+ function _gifRich() {
486
+ var headerGct = Buffer.concat([
487
+ Buffer.from("GIF89a", "latin1"),
488
+ Buffer.from([1, 0, 1, 0, 0x80, 0, 0]), // LSD, packed=0x80 (GCT, 2 entries)
489
+ Buffer.from([0, 0, 0, 0, 0, 0]), // 6-byte global color table
490
+ ]);
491
+ var imgDesc = Buffer.concat([
492
+ Buffer.from([0x2C, 0, 0, 0, 0, 1, 0, 1, 0, 0x80]), // image descriptor + LCT flag
493
+ Buffer.from([0, 0, 0, 0, 0, 0]), // 6-byte local color table
494
+ Buffer.from([0x02]), // LZW min code size
495
+ Buffer.from([0x01, 0x44, 0x00]), // sub-block + terminator
496
+ ]);
497
+ return Buffer.concat([
498
+ headerGct,
499
+ _gifExt(0xF9, [Buffer.from([0x00, 0x00, 0x00, 0x00])]), // graphic control — keep
500
+ _gifExt(0xFE, [Buffer.from("gifcmt", "latin1")]), // comment — drop
501
+ _gifExt(0x01, [Buffer.alloc(12, 0), Buffer.from("gifptx", "latin1")]), // plain-text — drop
502
+ _gifExt(0xFF, [Buffer.from("NETSCAPE2.0", "latin1"), Buffer.from([0x01, 0x00, 0x00])]), // loop — keep
503
+ _gifExt(0xFF, [Buffer.from("DROPMEAPPZZ", "latin1"), Buffer.from("gifxmp", "latin1")]), // non-loop app — drop
504
+ imgDesc,
505
+ Buffer.from([0x3B]), // trailer
506
+ ]);
507
+ }
508
+
509
+ function testStripGifRichBlocks() {
510
+ var out = b.guardImage.sanitize({ bytes: _gifRich() });
511
+ check("gif-rich: comment dropped", !_has(out.bytes, "gifcmt"));
512
+ check("gif-rich: plain-text dropped", !_has(out.bytes, "gifptx"));
513
+ check("gif-rich: non-loop app dropped", !_has(out.bytes, "gifxmp") && !_has(out.bytes, "DROPMEAPP"));
514
+ check("gif-rich: NETSCAPE loop preserved", _has(out.bytes, "NETSCAPE2.0"));
515
+ check("gif-rich: header preserved", _has(out.bytes, "GIF89a"));
516
+ check("gif-rich: trailer preserved", out.bytes[out.bytes.length - 1] === 0x3B);
517
+ }
518
+
519
+ function testStripGifMalformed() {
520
+ check("gif: truncated-header malformed",
521
+ _code(function () { b.guardImage.sanitize({ bytes: Buffer.from("GIF89a", "latin1") }); }) === "image.sanitize-malformed");
522
+ check("gif: unknown-block malformed",
523
+ _code(function () {
524
+ b.guardImage.sanitize({ bytes: Buffer.concat([Buffer.from("GIF89a", "latin1"), Buffer.from([1, 0, 1, 0, 0x00, 0, 0]), Buffer.from([0x99])]) });
525
+ }) === "image.sanitize-malformed");
526
+ }
527
+
123
528
  function testStripWebpExif() {
124
529
  var out = b.guardImage.sanitize({ bytes: _webpWithExif() });
125
530
  check("webp: EXIF payload removed", !_has(out.bytes, "secret-gps"));
@@ -127,6 +532,35 @@ function testStripWebpExif() {
127
532
  check("webp: RIFF size rewritten", out.bytes.readUInt32LE(4) === 16);
128
533
  }
129
534
 
535
+ function testStripWebpXmpAndPad() {
536
+ var xmp = Buffer.concat([
537
+ Buffer.from("RIFF", "latin1"), Buffer.from([0, 0, 0, 0]), Buffer.from("WEBP", "latin1"),
538
+ Buffer.from("VP8 ", "latin1"), Buffer.from([4, 0, 0, 0]), Buffer.from([1, 2, 3, 4]),
539
+ Buffer.from("XMP ", "latin1"), Buffer.from([6, 0, 0, 0]), Buffer.from("wxmpz0", "latin1"),
540
+ ]);
541
+ var outXmp = b.guardImage.sanitize({ bytes: xmp });
542
+ check("webp: XMP chunk dropped", !_has(outXmp.bytes, "wxmpz0"));
543
+ check("webp: VP8 preserved past XMP drop", _has(outXmp.bytes, "VP8 "));
544
+
545
+ // Final chunk with an odd size and no trailing pad byte — tolerated.
546
+ var oddNoPad = Buffer.concat([
547
+ Buffer.from("RIFF", "latin1"), Buffer.from([0, 0, 0, 0]), Buffer.from("WEBP", "latin1"),
548
+ Buffer.from("VP8 ", "latin1"), Buffer.from([3, 0, 0, 0]), Buffer.from([1, 2, 3]),
549
+ ]);
550
+ var outOdd = b.guardImage.sanitize({ bytes: oddNoPad });
551
+ check("webp: odd-size final chunk without pad tolerated", _has(outOdd.bytes, "VP8 "));
552
+ }
553
+
554
+ function testStripWebpMalformed() {
555
+ check("webp: chunk-overrun malformed",
556
+ _code(function () {
557
+ b.guardImage.sanitize({ bytes: Buffer.concat([
558
+ Buffer.from("RIFF", "latin1"), Buffer.from([0, 0, 0, 0]), Buffer.from("WEBP", "latin1"),
559
+ Buffer.from("VP8 ", "latin1"), Buffer.from([0xFF, 0, 0, 0]),
560
+ ]) });
561
+ }) === "image.sanitize-malformed");
562
+ }
563
+
130
564
  function testStripWebpVp8xFlags() {
131
565
  var webpx = Buffer.concat([
132
566
  Buffer.from("RIFF", "latin1"), Buffer.from([0, 0, 0, 0]), Buffer.from("WEBP", "latin1"),
@@ -162,25 +596,65 @@ function testBmpPassthrough() {
162
596
  check("bmp: passes through (no metadata container)", out.bytes === bmp);
163
597
  }
164
598
 
165
- function run() {
599
+ function testSanitizePassthroughShapes() {
600
+ // ICO carries no metadata container — same-reference passthrough.
601
+ var icoBag = { bytes: Buffer.from([0x00, 0x00, 0x01, 0x00, 0, 0, 0, 0]) };
602
+ check("ico: passes through unchanged", b.guardImage.sanitize(icoBag) === icoBag);
603
+ // Non-Buffer bytes (Array) are not utf8-decoded — the bag returns unchanged.
604
+ var arrBag = { bytes: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A] };
605
+ check("sanitize: non-Buffer bytes pass through (same bag)", b.guardImage.sanitize(arrBag) === arrBag);
606
+ // No bytes at all → bag returned unchanged.
607
+ var emptyBag = {};
608
+ check("sanitize: no bytes → bag unchanged", b.guardImage.sanitize(emptyBag) === emptyBag);
609
+ }
610
+
611
+ function testSanitizeBadInput() {
612
+ check("sanitize(null) → bad-input refuse",
613
+ _code(function () { b.guardImage.sanitize(null); }) === "image.bad-input");
614
+ }
615
+
616
+ async function run() {
166
617
  testGuardImageSurface();
167
618
  testGuardImageRegistryParity();
168
619
  testInspectMagic();
620
+ testInspectMagicAllFormats();
621
+ testInspectMagicBomSvg();
622
+ testValidateSvgRoutedEveryProfile();
623
+ testBomDoesNotBypassRasterMagic();
624
+ testValidateNeverThrowsHostileMetadata();
169
625
  testValidateMismatchAndPolyglot();
626
+ testValidatePolyglot();
627
+ testValidateUnknownMagicSeverity();
628
+ testValidateOversizedBytes();
629
+ testValidateDimensionAndFrameCaps();
630
+ testValidateBadInput();
631
+ testValidateBadOpt();
632
+ testCompliancePostures();
633
+ await testGate();
170
634
  testStripJpegExif();
635
+ testStripJpegRichFraming();
636
+ testStripJpegMalformed();
171
637
  testStripPngText();
638
+ testStripPngRichChunks();
639
+ testStripPngMalformed();
172
640
  testStripGifComment();
641
+ testStripGifRichBlocks();
642
+ testStripGifMalformed();
173
643
  testStripWebpExif();
644
+ testStripWebpXmpAndPad();
645
+ testStripWebpMalformed();
174
646
  testStripWebpVp8xFlags();
175
647
  testRefuseBeforeStrip();
176
648
  testRefuseUnsupportedFormat();
177
649
  testRefuseMalformed();
178
650
  testBmpPassthrough();
651
+ testSanitizePassthroughShapes();
652
+ testSanitizeBadInput();
179
653
  }
180
654
 
181
655
  module.exports = { run: run };
182
656
 
183
657
  if (require.main === module) {
184
- try { run(); console.log("[guard-image] OK — " + helpers.getChecks() + " checks passed"); }
185
- catch (e) { console.error("FAIL:", e.stack || e); process.exit(1); }
658
+ run().then(function () { console.log("[guard-image] OK — " + helpers.getChecks() + " checks passed"); })
659
+ .catch(function (e) { console.error("FAIL:", helpers.formatErr(e)); process.exit(1); });
186
660
  }