@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
@@ -341,6 +341,508 @@ function testGuardSvgBadProfile() {
341
341
  threw && /unknown profile/i.test(threw.message));
342
342
  }
343
343
 
344
+ function testGuardSvgSchemeWhitespaceBypass() {
345
+ // Browsers remove ASCII tab (U+0009) / LF (U+000A) / CR (U+000D) from a URL
346
+ // before resolving its scheme (WHATWG URL parser "remove ASCII tab or
347
+ // newline"), so `java<TAB>script:` / `java<LF>script:` navigate as
348
+ // `javascript:`. The guard's scheme decoder even maps the NAMED entities
349
+ // `&Tab;`/`&NewLine;` to those characters (its own comment names
350
+ // `java&Tab;script:` as the threat), but decoding is defeated unless the
351
+ // resulting whitespace is stripped before the scheme match. A miss here is
352
+ // a fail-open: validate returns ok and the gate serves the hostile bytes.
353
+ //
354
+ // The same URL parser also trims a leading/trailing C0-control-OR-SPACE run
355
+ // (U+0000..U+0020) before parsing, so an ENTITY-encoded leading space
356
+ // (`&#32;javascript:` / `&#x20;javascript:`) decodes to " javascript:" and
357
+ // navigates as `javascript:`. A literal leading space is caught by the raw
358
+ // .trim(), but the entity-encoded space survives the decode (space is not a
359
+ // C0 control, not tab/lf/cr), so it must be trimmed after decoding.
360
+ var vectors = [
361
+ ["literal tab", '<svg><a xlink:href="java\tscript:alert(1)">x</a></svg>'],
362
+ ["literal lf", '<svg><a xlink:href="java\nscript:alert(1)">x</a></svg>'],
363
+ ["literal cr", '<svg><a xlink:href="java\rscript:alert(1)">x</a></svg>'],
364
+ ["&Tab; named", '<svg><a xlink:href="java&Tab;script:alert(1)">x</a></svg>'],
365
+ ["&NewLine; named", '<svg><a xlink:href="java&NewLine;script:alert(1)">x</a></svg>'],
366
+ ["&#9; numeric", '<svg><a xlink:href="java&#9;script:alert(1)">x</a></svg>'],
367
+ ["&#32; entity leading space", '<svg><a xlink:href="&#32;javascript:alert(1)">x</a></svg>'],
368
+ ["&#x20; entity leading space", '<svg><a xlink:href="&#x20;javascript:alert(1)">x</a></svg>'],
369
+ ];
370
+ for (var i = 0; i < vectors.length; i++) {
371
+ var rv = b.guardSvg.validate(vectors[i][1], { profile: "balanced" });
372
+ check("scheme bypass (" + vectors[i][0] + ") flagged dangerous-url-scheme",
373
+ rv.ok === false &&
374
+ rv.issues.some(function (issue) { return issue.kind === "dangerous-url-scheme"; }));
375
+ }
376
+
377
+ // A control char the strip set DOES cover (U+0001) must still be caught.
378
+ var rvCtrl = b.guardSvg.validate(
379
+ '<svg><a xlink:href="&#1;javascript:alert(1)">x</a></svg>', { profile: "balanced" });
380
+ check("control-char-prefixed javascript: still flagged (no regression)",
381
+ rvCtrl.issues.some(function (issue) { return issue.kind === "dangerous-url-scheme"; }));
382
+
383
+ // A legitimate https URL is NOT flagged (no false positive from stripping).
384
+ var rvOk = b.guardSvg.validate(
385
+ '<svg><a xlink:href="https://example.com/a">x</a></svg>', { profile: "balanced" });
386
+ check("plain https href not flagged as dangerous scheme",
387
+ !rvOk.issues.some(function (issue) { return issue.kind === "dangerous-url-scheme"; }));
388
+
389
+ // sanitize must strip the tab-obfuscated scheme, not re-emit it.
390
+ var san = b.guardSvg.sanitize('<svg><a xlink:href="java\tscript:alert(1)">x</a></svg>',
391
+ { profile: "balanced" });
392
+ check("sanitize: tab-obfuscated javascript scheme stripped",
393
+ san.indexOf("script:") === -1);
394
+ }
395
+
396
+ function testGuardSvgCssEntityBypass() {
397
+ // A style attribute is HTML/XML character-reference-decoded before the CSS
398
+ // parser sees it, so `ex&#x70;ression(` reaches CSS as `expression(` and
399
+ // `behavior&colon;` as `behavior:`. The css-danger check must decode the
400
+ // same references the URL-scheme check already decodes, or an entity-encoded
401
+ // style payload is served verbatim and executes (stored XSS).
402
+ var vectors = [
403
+ ["numeric &#x70; -> p (expression()",
404
+ '<svg><rect style="width:ex&#x70;ression(alert(1))"/></svg>'],
405
+ ["numeric &#x6A; -> j (url(javascript:))",
406
+ '<svg><rect style="background:url(&#x6A;avascript:alert(1))"/></svg>'],
407
+ ["decimal &#106; -> j (url(javascript:))",
408
+ '<svg><rect style="background:url(&#106;avascript:alert(1))"/></svg>'],
409
+ ["named &colon; -> : (behavior:)",
410
+ '<svg><rect style="behavior&colon;url(evil.htc)"/></svg>'],
411
+ // Whitespace-hidden scheme inside url(): a browser strips tab/lf/cr from a URL
412
+ // before resolving its scheme, so url(java<TAB>script:) navigates as
413
+ // javascript:. The decoded CSS value must also fold that URL whitespace.
414
+ ["named &Tab; -> tab (url(java<TAB>script:))",
415
+ '<svg><rect style="background:url(java&Tab;script:alert(1))"/></svg>'],
416
+ ["numeric &#9; -> tab (url(java<TAB>script:))",
417
+ '<svg><rect style="background:url(java&#9;script:alert(1))"/></svg>'],
418
+ ];
419
+ for (var i = 0; i < vectors.length; i++) {
420
+ var rv = b.guardSvg.validate(vectors[i][1], { profile: "balanced" });
421
+ check("CSS entity bypass (" + vectors[i][0] + ") flagged css-injection",
422
+ rv.issues.some(function (issue) { return issue.kind === "css-injection"; }));
423
+ }
424
+
425
+ // Plain (unencoded) dangerous CSS still flagged (regression guard).
426
+ var plain = b.guardSvg.validate('<svg><rect style="width:expression(alert(1))"/></svg>',
427
+ { profile: "balanced" });
428
+ check("CSS: plain expression( still flagged",
429
+ plain.issues.some(function (issue) { return issue.kind === "css-injection"; }));
430
+
431
+ // No false positive: a benign style value is untouched.
432
+ var benign = b.guardSvg.validate('<svg><rect style="fill:red;stroke-width:2"/></svg>',
433
+ { profile: "balanced" });
434
+ check("CSS: benign style not flagged as css-injection",
435
+ !benign.issues.some(function (issue) { return issue.kind === "css-injection"; }));
436
+ }
437
+
438
+ function testGuardSvgSanitizeAnimationPreserved() {
439
+ // permissive permits animation; a safe-target <animate> must SURVIVE
440
+ // sanitize. Every animation tag is in DANGEROUS_TAGS, so the sanitizer must
441
+ // affirmatively re-permit the safe case — otherwise the open tag is dropped
442
+ // while its (still allowlisted) close tag is emitted, leaving an orphan.
443
+ var safe = '<svg><animate attributeName="cx" to="100"/></svg>';
444
+ var out = b.guardSvg.sanitize(safe, { profile: "permissive" });
445
+ check("sanitize permissive: safe <animate> open tag preserved",
446
+ /<animate\b/i.test(out));
447
+
448
+ var motion = '<svg><animateMotion dur="1s"><mpath xlink:href="#p"/></animateMotion></svg>';
449
+ var outM = b.guardSvg.sanitize(motion, { profile: "permissive" });
450
+ var opens = (outM.match(/<animatemotion\b/gi) || []).length;
451
+ var closes = (outM.match(/<\/animatemotion\b/gi) || []).length;
452
+ check("sanitize permissive: animateMotion open/close balanced (no orphan close)",
453
+ opens === 1 && closes === 1);
454
+
455
+ // Unsafe attributeName animation is still neutralized under permissive.
456
+ var unsafe = '<svg><animate attributeName="href" to="javascript:alert(1)"/></svg>';
457
+ var outU = b.guardSvg.sanitize(unsafe, { profile: "permissive" });
458
+ check("sanitize permissive: unsafe-target <animate> payload dropped",
459
+ outU.indexOf("javascript") === -1);
460
+ }
461
+
462
+ async function testGuardSvgGateFailOpen() {
463
+ var g = b.guardSvg.gate({ profile: "balanced" });
464
+
465
+ var rvScheme = await g.check({
466
+ contentType: "image/svg+xml",
467
+ bytes: Buffer.from('<svg><a xlink:href="java\tscript:alert(1)">x</a></svg>', "utf8"),
468
+ });
469
+ check("gate: tab-obfuscated javascript scheme not served as-is",
470
+ rvScheme.action !== "serve");
471
+
472
+ var rvCss = await g.check({
473
+ contentType: "image/svg+xml",
474
+ bytes: Buffer.from('<svg><rect style="width:ex&#x70;ression(alert(1))"/></svg>', "utf8"),
475
+ });
476
+ check("gate: entity-encoded CSS expression not served as-is",
477
+ rvCss.action !== "serve");
478
+ }
479
+
480
+ function testGuardSvgBadInput() {
481
+ // Non-string / non-Buffer input → a single bad-input issue; validate never
482
+ // throws on hostile input (callers inspect the issue list themselves).
483
+ [123, null, undefined, {}, ["<svg/>"], true].forEach(function (bad, idx) {
484
+ var rv = b.guardSvg.validate(bad, { profile: "strict" });
485
+ check("validate(bad-input #" + idx + ") → ok=false + single bad-input issue",
486
+ rv.ok === false &&
487
+ rv.issues.length === 1 &&
488
+ rv.issues[0].kind === "bad-input" &&
489
+ rv.issues[0].severity === "high");
490
+ });
491
+ // sanitize refuses non-string/non-Buffer at the entry point (throws, since a
492
+ // sanitizer has nothing to serialize back).
493
+ var threw = null;
494
+ try { b.guardSvg.sanitize(123, { profile: "strict" }); }
495
+ catch (e) { threw = e; }
496
+ check("sanitize(number) throws svg.bad-input",
497
+ threw && /string or Buffer/.test(threw.message));
498
+ }
499
+
500
+ function testGuardSvgShortInput() {
501
+ // A sub-2-byte input can't be SVGZ (the gzip signature is 2 bytes) — the
502
+ // length<2 guard must return false, not read past the buffer.
503
+ var rv = b.guardSvg.validate("x", { profile: "strict" });
504
+ check("1-char input NOT mis-detected as SVGZ",
505
+ !rv.issues.some(function (i) { return i.kind === "svgz-compressed"; }));
506
+ var rvBuf = b.guardSvg.validate(Buffer.from([0x1F]), { profile: "strict" });
507
+ check("1-byte 0x1F Buffer NOT mis-detected as SVGZ (needs both magic bytes)",
508
+ !rvBuf.issues.some(function (i) { return i.kind === "svgz-compressed"; }));
509
+ }
510
+
511
+ function testGuardSvgImageDataUrl() {
512
+ // allowImageData (balanced / permissive): a data:image/<raster>; URL on
513
+ // <image> is the ONE permitted use of the otherwise-denylisted data: scheme.
514
+ var okData = '<svg><image href="data:image/png;base64,iVBORw0KGgo="/></svg>';
515
+ var rv = b.guardSvg.validate(okData, { profile: "balanced" });
516
+ check("balanced: data:image/png on <image> allowed (no dangerous-url-scheme)",
517
+ rv.ok === true &&
518
+ !rv.issues.some(function (i) { return i.kind === "dangerous-url-scheme"; }));
519
+ var san = b.guardSvg.sanitize(okData, { profile: "balanced" });
520
+ check("balanced sanitize: data:image/png survives on <image>",
521
+ san.indexOf("data:image/png") !== -1);
522
+
523
+ // The exact same data URL on a NON-image element stays denied — the
524
+ // exception is <image>-scoped, not a blanket data:-image allow.
525
+ var rvA = b.guardSvg.validate(
526
+ '<svg><a xlink:href="data:image/png;base64,iVBORw0KGgo=">x</a></svg>',
527
+ { profile: "balanced" });
528
+ check("balanced: data:image/png on <a> still flagged dangerous-url-scheme",
529
+ rvA.issues.some(function (i) { return i.kind === "dangerous-url-scheme"; }));
530
+
531
+ // A non-raster data: MIME on <image> (text/html) is NOT the image exception.
532
+ var rvHtml = b.guardSvg.validate(
533
+ '<svg><image href="data:text/html;base64,PHNjcmlwdD4="/></svg>',
534
+ { profile: "balanced" });
535
+ check("balanced: data:text/html on <image> flagged dangerous-url-scheme",
536
+ rvHtml.issues.some(function (i) { return i.kind === "dangerous-url-scheme"; }));
537
+
538
+ // strict has allowImageData:false — even a raster data URL on <image> is
539
+ // refused there.
540
+ var rvStrict = b.guardSvg.validate(okData, { profile: "strict" });
541
+ check("strict: data:image/png on <image> refused (allowImageData false)",
542
+ rvStrict.issues.some(function (i) { return i.kind === "dangerous-url-scheme"; }));
543
+ }
544
+
545
+ function testGuardSvgNonAllowlistedScheme() {
546
+ // A scheme that is neither dangerous NOR in the profile's urlSchemes
547
+ // allowlist (ftp under strict) → non-allowlisted-url-scheme (sanitize-class),
548
+ // distinct from the dangerous-scheme denylist hit.
549
+ var svg = '<svg><path href="ftp://host/x" d="M0 0"/></svg>';
550
+ var rv = b.guardSvg.validate(svg, { profile: "strict" });
551
+ check("strict: ftp scheme flagged non-allowlisted-url-scheme (not dangerous)",
552
+ rv.issues.some(function (i) { return i.kind === "non-allowlisted-url-scheme"; }) &&
553
+ !rv.issues.some(function (i) { return i.kind === "dangerous-url-scheme"; }));
554
+ var san = b.guardSvg.sanitize(svg, { profile: "strict" });
555
+ check("strict sanitize: ftp href dropped, benign d preserved",
556
+ san.indexOf("ftp") === -1 && san.indexOf('d="M0 0"') !== -1);
557
+
558
+ // ftp IS in the balanced profile's urlSchemes → not flagged there.
559
+ var rvBal = b.guardSvg.validate('<svg><a xlink:href="ftp://host/x">y</a></svg>',
560
+ { profile: "balanced" });
561
+ check("balanced: ftp scheme allowed (in profile urlSchemes)",
562
+ !rvBal.issues.some(function (i) { return i.kind === "non-allowlisted-url-scheme" ||
563
+ i.kind === "dangerous-url-scheme"; }));
564
+ }
565
+
566
+ function testGuardSvgStructuralCaps() {
567
+ // element-count-cap: total token count over maxElementCount → high issue.
568
+ var manyTokens = "<g></g>".repeat(20);
569
+ var rvEl = b.guardSvg.validate(manyTokens, { profile: "strict", maxElementCount: 5 });
570
+ check("element-count-cap fires when token count exceeds maxElementCount",
571
+ rvEl.issues.some(function (i) { return i.kind === "element-count-cap"; }));
572
+
573
+ // attr-count-cap: attribute count on one tag over maxAttrsPerTag → high issue.
574
+ var manyAttrs = "<circle";
575
+ for (var i = 0; i < 10; i += 1) manyAttrs += ' a' + i + '="1"';
576
+ manyAttrs += "/>";
577
+ var rvAttr = b.guardSvg.validate("<svg>" + manyAttrs + "</svg>",
578
+ { profile: "balanced", maxAttrsPerTag: 3 });
579
+ check("attr-count-cap fires when attribute count exceeds maxAttrsPerTag",
580
+ rvAttr.issues.some(function (i) { return i.kind === "attr-count-cap"; }));
581
+ }
582
+
583
+ function testGuardSvgStandaloneEntityDeclaration() {
584
+ // A bare <!ENTITY ...> OUTSIDE a DOCTYPE (tokenized as a declaration, not a
585
+ // doctype) is still an entity-expansion / XXE vector and must be flagged.
586
+ var rv = b.guardSvg.validate('<!ENTITY xxe "payload"><svg><circle r="1"/></svg>',
587
+ { profile: "strict" });
588
+ check("standalone <!ENTITY> declaration flagged entity-declaration",
589
+ rv.ok === false &&
590
+ rv.issues.some(function (i) { return i.kind === "entity-declaration"; }));
591
+
592
+ // A benign non-ENTITY declaration (<!ATTLIST>) is dropped, no entity flag.
593
+ var rvAttlist = b.guardSvg.validate('<!ATTLIST x y CDATA><svg><circle r="1"/></svg>',
594
+ { profile: "strict" });
595
+ check("non-ENTITY <!ATTLIST> declaration raises no entity-declaration",
596
+ !rvAttlist.issues.some(function (i) { return i.kind === "entity-declaration"; }));
597
+ }
598
+
599
+ function testGuardSvgCdataPiAuditSeverity() {
600
+ // Under balanced, cdataPolicy is "audit" → warn severity (not critical), and
601
+ // ok stays true (warn does not flip ok).
602
+ var rvCdata = b.guardSvg.validate('<svg><![CDATA[x]]><circle r="1"/></svg>',
603
+ { profile: "balanced" });
604
+ check("balanced CDATA → warn severity (audit policy), ok stays true",
605
+ rvCdata.ok === true &&
606
+ rvCdata.issues.some(function (i) {
607
+ return i.kind === "cdata" && i.severity === "warn";
608
+ }));
609
+
610
+ // Under permissive, processingInstrPolicy is "audit" → warn severity.
611
+ var rvPi = b.guardSvg.validate('<?xml-stylesheet href="x"?><svg/>',
612
+ { profile: "permissive" });
613
+ check("permissive processing-instruction → warn severity (audit policy)",
614
+ rvPi.issues.some(function (i) {
615
+ return i.kind === "processing-instruction" && i.severity === "warn";
616
+ }));
617
+ }
618
+
619
+ function testGuardSvgTruncatedTokens() {
620
+ // Truncated / unterminated markup must not silently smuggle content: the
621
+ // tokenizer treats each open-without-close as a token running to EOF.
622
+ var rvCdata = b.guardSvg.validate('<svg><![CDATA[unterminated payload',
623
+ { profile: "strict" });
624
+ check("unterminated CDATA still flagged (scans to EOF)",
625
+ rvCdata.issues.some(function (i) { return i.kind === "cdata"; }));
626
+
627
+ var rvPi = b.guardSvg.validate('<svg><?xml-stylesheet type="text/css"',
628
+ { profile: "strict" });
629
+ check("unterminated processing-instruction still flagged",
630
+ rvPi.issues.some(function (i) { return i.kind === "processing-instruction"; }));
631
+
632
+ // Unterminated DOCTYPE with an internal-subset '[' and no closing ']' / '>'
633
+ // — still detected as a doctype plus its embedded <!ENTITY>.
634
+ var rvDoc = b.guardSvg.validate('<!DOCTYPE svg [<!ENTITY x "y"',
635
+ { profile: "strict" });
636
+ check("unterminated DOCTYPE-with-subset still flags doctype + entity",
637
+ rvDoc.issues.some(function (i) { return i.kind === "doctype"; }) &&
638
+ rvDoc.issues.some(function (i) { return i.kind === "entity-declaration"; }));
639
+
640
+ // Unterminated (no closing '>') start tag for a DANGEROUS element is still
641
+ // caught — the tokenizer scans to EOF and names the tag.
642
+ var rvTag = b.guardSvg.validate('<svg><script', { profile: "strict" });
643
+ check("unterminated <script (no >) still flagged dangerous-tag",
644
+ rvTag.issues.some(function (i) { return i.kind === "dangerous-tag"; }));
645
+
646
+ // Unterminated benign start tag validates clean (no spurious issue) — covers
647
+ // the raw-without-trailing-'>' reconstruction path.
648
+ var rvBenign = b.guardSvg.validate('<svg><circle r="1"', { profile: "strict" });
649
+ check("unterminated benign <circle validates clean", rvBenign.ok === true);
650
+
651
+ // Unterminated quoted attribute value (no closing quote, EOF) — parser must
652
+ // clamp to EOF without crashing.
653
+ var rvQuote = b.guardSvg.validate('<svg><circle r="unterminated', { profile: "strict" });
654
+ check("unterminated quoted attr value handled without error",
655
+ rvQuote && Array.isArray(rvQuote.issues));
656
+
657
+ // Unterminated end tag (no '>') is dropped without error.
658
+ var rvEnd = b.guardSvg.validate('<svg><circle r="1"/></circle', { profile: "strict" });
659
+ check("unterminated end tag handled without error", rvEnd.ok === true);
660
+
661
+ // Unterminated comment (no terminator, runs to EOF) — the hidden text stays
662
+ // inert (not smuggled as a live element).
663
+ var rvComment = b.guardSvg.validate('<svg><circle r="1"/><!-- <script>alert(1)',
664
+ { profile: "strict" });
665
+ check("unterminated comment swallows trailing markup (no dangerous-tag)",
666
+ !rvComment.issues.some(function (i) { return i.kind === "dangerous-tag"; }));
667
+
668
+ // Unterminated DOCTYPE WITHOUT an internal subset '[' and no closing '>' —
669
+ // still flagged as a doctype.
670
+ var rvDocPlain = b.guardSvg.validate('<!DOCTYPE svg PUBLIC "id"', { profile: "strict" });
671
+ check("unterminated bracket-less DOCTYPE still flagged doctype",
672
+ rvDocPlain.issues.some(function (i) { return i.kind === "doctype"; }));
673
+
674
+ // Unterminated generic declaration (no '>') — dropped without error, no
675
+ // spurious entity flag.
676
+ var rvDecl = b.guardSvg.validate('<svg><circle r="1"/></svg><!ATTLIST foo',
677
+ { profile: "strict" });
678
+ check("unterminated <!ATTLIST declaration handled without error",
679
+ rvDecl && Array.isArray(rvDecl.issues) &&
680
+ !rvDecl.issues.some(function (i) { return i.kind === "entity-declaration"; }));
681
+ }
682
+
683
+ function testGuardSvgComment() {
684
+ // A comment's contents are NOT parsed as markup — a <script> hidden inside a
685
+ // comment is inert and must be dropped, not tokenized as a live element.
686
+ var withComment = '<svg><!-- <script>alert(1)</script> --><circle r="1"/></svg>';
687
+ var rv = b.guardSvg.validate(withComment, { profile: "strict" });
688
+ check("comment-wrapped <script> not flagged (comment content inert)",
689
+ rv.ok === true &&
690
+ !rv.issues.some(function (i) { return i.kind === "dangerous-tag"; }));
691
+ var san = b.guardSvg.sanitize(withComment, { profile: "strict" });
692
+ check("sanitize strips the comment entirely (no smuggled script)",
693
+ san.indexOf("<!--") === -1 && san.indexOf("script") === -1);
694
+ }
695
+
696
+ function testGuardSvgSanitizeStructural() {
697
+ // Structural noise (DOCTYPE / declaration / CDATA / PI / comment) is dropped
698
+ // by sanitize, leaving only the allowlisted element.
699
+ var noisy = '<!DOCTYPE svg><!ENTITY z "z"><svg><![CDATA[x]]>' +
700
+ '<?xml-stylesheet href="x"?><!--c--><circle r="1"/></svg>';
701
+ var san = b.guardSvg.sanitize(noisy, { profile: "strict" });
702
+ check("sanitize drops doctype/declaration/cdata/pi/comment structural tokens",
703
+ san.indexOf("DOCTYPE") === -1 && san.indexOf("ENTITY") === -1 &&
704
+ san.indexOf("CDATA") === -1 && san.indexOf("xml-stylesheet") === -1 &&
705
+ san.indexOf("<!--") === -1 && /<circle r="1"\/?>/.test(san));
706
+
707
+ // Nested same-name dangerous element: the body-drop scan must balance the
708
+ // inner <script> against the outer so ALL nested content is removed.
709
+ var nested = '<svg><script>a<script>b</script>c</script><circle r="1"/></svg>';
710
+ var sanNest = b.guardSvg.sanitize(nested, { profile: "strict" });
711
+ check("sanitize body-drop balances nested <script> (no leaked payload)",
712
+ sanNest.indexOf("script") === -1 &&
713
+ sanNest.indexOf(">a") === -1 && sanNest.indexOf("b<") === -1 &&
714
+ sanNest.indexOf("c<") === -1);
715
+
716
+ // Over-cap attribute value is dropped while its element is kept.
717
+ var bigAttr = '<svg><circle foo="' + "a".repeat(100) + '" r="1"/></svg>';
718
+ var sanBig = b.guardSvg.sanitize(bigAttr, { profile: "balanced", maxAttrValueBytes: 20 });
719
+ check("sanitize drops an over-cap attribute value but keeps the element",
720
+ sanBig.indexOf("foo") === -1 && /<circle[^>]*r="1"/.test(sanBig));
721
+
722
+ // External-ref on <use> under allowExternalRefs:false → href stripped, the
723
+ // <use> element itself kept.
724
+ var extUse = '<svg><use xlink:href="icons.svg#x"/></svg>';
725
+ var sanUse = b.guardSvg.sanitize(extUse, { profile: "balanced", allowExternalRefs: false });
726
+ check("sanitize strips external <use> href when allowExternalRefs:false",
727
+ sanUse.indexOf("icons.svg") === -1 && /<use\/?>/.test(sanUse));
728
+
729
+ // Single-quoted + unquoted attribute values are parsed and re-emitted
730
+ // double-quoted (re-serialization normalizes quoting).
731
+ var mixed = "<svg><rect fill='red' width=10 height=10/></svg>";
732
+ var sanMixed = b.guardSvg.sanitize(mixed, { profile: "balanced" });
733
+ check("sanitize normalizes single-quoted + unquoted attrs to double-quoted",
734
+ sanMixed.indexOf('fill="red"') !== -1 &&
735
+ sanMixed.indexOf('width="10"') !== -1 &&
736
+ sanMixed.indexOf('height="10"') !== -1);
737
+ }
738
+
739
+ function testGuardSvgSvgzSanitizeThrows() {
740
+ // sanitize refuses gzipped SVGZ bytes — a text sanitizer must never run on
741
+ // compressed input (operator ungzips + re-sanitizes the inner SVG).
742
+ var threw = null;
743
+ try {
744
+ b.guardSvg.sanitize(Buffer.from([0x1F, 0x8B, 0x08, 0x00, 0x00]), { profile: "strict" });
745
+ } catch (e) { threw = e; }
746
+ check("sanitize(SVGZ magic bytes) throws svg.svgz",
747
+ threw && /SVGZ|ungzip/i.test(threw.message));
748
+ }
749
+
750
+ function testGuardSvgAttrEdgeCases() {
751
+ // Empty URL-bearing attribute value → treated as a fragment (no scheme),
752
+ // never flagged. Exercises the empty-string extraction / fragment paths.
753
+ var rvEmpty = b.guardSvg.validate('<svg><a xlink:href="">x</a></svg>',
754
+ { profile: "balanced" });
755
+ check("empty xlink:href value not flagged as a dangerous scheme",
756
+ !rvEmpty.issues.some(function (i) { return i.kind === "dangerous-url-scheme"; }));
757
+
758
+ // Spaced attribute (name = value) — whitespace around the '=' is skipped.
759
+ var rvSpaced = b.guardSvg.validate('<svg><circle r = "1" /></svg>', { profile: "strict" });
760
+ check("spaced attribute (name = value) parsed cleanly", rvSpaced.ok === true);
761
+
762
+ // Malformed attribute source (leading '=' with no name) must not crash — the
763
+ // scanner breaks out cleanly.
764
+ var rvMal = b.guardSvg.validate('<svg><circle = r="1" /></svg>', { profile: "strict" });
765
+ check("malformed attribute source (leading =) parsed without error",
766
+ rvMal && Array.isArray(rvMal.issues));
767
+
768
+ // Trailing intra-tag whitespace before '>' exercises the whitespace-run break.
769
+ var rvWs = b.guardSvg.validate('<svg><circle r="1" ></circle></svg>', { profile: "strict" });
770
+ check("trailing intra-tag whitespace parsed cleanly", rvWs.ok === true);
771
+ }
772
+
773
+ async function testGuardSvgGateDispositions() {
774
+ // Each disposition class the gate maps, exercised through the real
775
+ // gate().check() consumer path (verdict.action is the observable contract).
776
+ var bidi = String.fromCharCode(0x202E);
777
+ var gStrict = b.guardSvg.gate({ profile: "strict" });
778
+ var gBal = b.guardSvg.gate({ profile: "balanced" });
779
+ var gPerm = b.guardSvg.gate({ profile: "permissive" });
780
+
781
+ // char-threat (bidi) under permissive (bidiPolicy "audit") → audit-only.
782
+ var rvBidi = await gPerm.check({
783
+ bytes: Buffer.from("<svg><title>x" + bidi + "y</title></svg>", "utf8"),
784
+ });
785
+ check("gate: permissive bidi (audit policy) → audit-only",
786
+ rvBidi.action === "audit-only");
787
+
788
+ // doctype (reject policy in every profile) → refuse.
789
+ var rvDoc = await gStrict.check({ bytes: Buffer.from('<!DOCTYPE svg><svg/>', "utf8") });
790
+ check("gate: doctype → refuse", rvDoc.action === "refuse");
791
+
792
+ // cdata under balanced (audit policy) → audit-only.
793
+ var rvCdata = await gBal.check({ bytes: Buffer.from('<svg><![CDATA[x]]></svg>', "utf8") });
794
+ check("gate: balanced cdata (audit policy) → audit-only",
795
+ rvCdata.action === "audit-only");
796
+
797
+ // processing-instruction under permissive (audit policy) → audit-only.
798
+ var rvPi = await gPerm.check({ bytes: Buffer.from('<?xml-stylesheet href="x"?><svg/>', "utf8") });
799
+ check("gate: permissive processing-instruction (audit policy) → audit-only",
800
+ rvPi.action === "audit-only");
801
+
802
+ // non-allowlisted (benign) tag → sanitize.
803
+ var rvNal = await gBal.check({ bytes: Buffer.from('<svg><foobar/></svg>', "utf8") });
804
+ check("gate: non-allowlisted benign tag → sanitize", rvNal.action === "sanitize");
805
+
806
+ // tokenize-failed (input over maxBytes) → refuse.
807
+ var rvTok = await b.guardSvg.gate({ profile: "strict", maxBytes: 10 }).check({
808
+ bytes: Buffer.from('<svg><circle r="10"/></svg>', "utf8"),
809
+ });
810
+ check("gate: tokenize-failed (over maxBytes) → refuse", rvTok.action === "refuse");
811
+
812
+ // element-count-cap → refuse.
813
+ var rvEl = await b.guardSvg.gate({ profile: "strict", maxElementCount: 3 }).check({
814
+ bytes: Buffer.from("<g></g>".repeat(10), "utf8"),
815
+ });
816
+ check("gate: element-count-cap → refuse", rvEl.action === "refuse");
817
+
818
+ // attr-count-cap → refuse.
819
+ var manyAttrs = "<circle";
820
+ for (var i = 0; i < 10; i += 1) manyAttrs += ' a' + i + '="1"';
821
+ manyAttrs += "/>";
822
+ var rvAttrCap = await b.guardSvg.gate({ profile: "balanced", maxAttrsPerTag: 3 }).check({
823
+ bytes: Buffer.from("<svg>" + manyAttrs + "</svg>", "utf8"),
824
+ });
825
+ check("gate: attr-count-cap → refuse", rvAttrCap.action === "refuse");
826
+
827
+ // use-depth-cap → refuse.
828
+ var deep = "";
829
+ for (var j = 0; j < 10; j += 1) deep += "<use>";
830
+ var rvUse = await b.guardSvg.gate({ profile: "balanced", maxUseDepth: 3 }).check({
831
+ bytes: Buffer.from("<svg>" + deep + "</svg>", "utf8"),
832
+ });
833
+ check("gate: use-depth-cap → refuse", rvUse.action === "refuse");
834
+
835
+ // attr-value-too-large → refuse.
836
+ var rvBig = await b.guardSvg.gate({ profile: "balanced", maxAttrValueBytes: 10 }).check({
837
+ bytes: Buffer.from('<svg><circle foo="' + "a".repeat(50) + '"/></svg>', "utf8"),
838
+ });
839
+ check("gate: attr-value-too-large → refuse", rvBig.action === "refuse");
840
+
841
+ // bad-input (ctx.bytes is neither Buffer nor string) → refuse.
842
+ var rvBad = await gStrict.check({ bytes: 12345 });
843
+ check("gate: non-Buffer bytes (bad-input) → refuse", rvBad.action === "refuse");
844
+ }
845
+
344
846
  async function run() {
345
847
  testGuardSvgSurface();
346
848
  testGuardSvgRegistryParity();
@@ -360,7 +862,29 @@ async function run() {
360
862
  testGuardSvgCompliancePosture();
361
863
  testGdprPostureMatchesBalancedTier();
362
864
  testGuardSvgBadProfile();
865
+ testGuardSvgSchemeWhitespaceBypass();
866
+ testGuardSvgCssEntityBypass();
867
+ testGuardSvgSanitizeAnimationPreserved();
868
+ testGuardSvgBadInput();
869
+ testGuardSvgShortInput();
870
+ testGuardSvgImageDataUrl();
871
+ testGuardSvgNonAllowlistedScheme();
872
+ testGuardSvgStructuralCaps();
873
+ testGuardSvgStandaloneEntityDeclaration();
874
+ testGuardSvgCdataPiAuditSeverity();
875
+ testGuardSvgTruncatedTokens();
876
+ testGuardSvgComment();
877
+ testGuardSvgSanitizeStructural();
878
+ testGuardSvgSvgzSanitizeThrows();
879
+ testGuardSvgAttrEdgeCases();
363
880
  await testGuardSvgGate();
881
+ await testGuardSvgGateFailOpen();
882
+ await testGuardSvgGateDispositions();
883
+ }
884
+
885
+ if (require.main === module) {
886
+ run().then(function () { console.log("OK — " + helpers.getChecks() + " checks"); })
887
+ .catch(function (e) { console.error(helpers.formatErr(e)); process.exit(1); });
364
888
  }
365
889
 
366
890
  module.exports = { run: run };
@@ -0,0 +1,71 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) blamejs contributors
3
+ "use strict";
4
+ /**
5
+ * guard-template — SSTI content-safety primitive (b.guardTemplate).
6
+ *
7
+ * Covers the pass-through-or-throw sanitize contract: benign text returns
8
+ * unchanged, while a string carrying template-engine syntax throws
9
+ * GuardTemplateError with the offending rule id. Jinja `{{...}}` / ERB
10
+ * `<%...%>` / Pug interpolation shapes are refused at EVERY profile —
11
+ * the SSTI class is never an operator opt-in.
12
+ */
13
+
14
+ var helpers = require("../helpers");
15
+ var b = helpers.b;
16
+ var check = helpers.check;
17
+
18
+ function _code(fn) { try { fn(); return null; } catch (e) { return e && e.code; } }
19
+
20
+ function testGuardTemplateSurface() {
21
+ check("guardTemplate is an object", typeof b.guardTemplate === "object");
22
+ check("guardTemplate.NAME === 'template'", b.guardTemplate.NAME === "template");
23
+ check("guardTemplate.sanitize is a function", typeof b.guardTemplate.sanitize === "function");
24
+ check("guardTemplate registered in guardAll",
25
+ b.guardAll.allGuards().some(function (g) { return (g.name || g.NAME) === "template"; }));
26
+ check("frameworkError.GuardTemplateError exposed",
27
+ typeof b.frameworkError.GuardTemplateError === "function");
28
+ }
29
+
30
+ function testSanitizeCleanPassthrough() {
31
+ // Plain prose with no engine syntax survives sanitize verbatim.
32
+ var out = b.guardTemplate.sanitize("Hello world", { profile: "strict" });
33
+ check("benign text passes through unchanged", out === "Hello world");
34
+ }
35
+
36
+ function testSanitizeRefusesJinjaExpression() {
37
+ // `{{7*7}}` is the canonical SSTI probe (Jinja / Twig / Handlebars).
38
+ check("jinja expression refused under strict",
39
+ _code(function () { b.guardTemplate.sanitize("Hello {{7*7}}", { profile: "strict" }); })
40
+ === "template.jinja-expression");
41
+ }
42
+
43
+ function testSanitizeRefusesErbEveryProfile() {
44
+ // ERB `<%= ... %>` interpolation is refused even at permissive.
45
+ check("ERB expression refused at permissive",
46
+ _code(function () { b.guardTemplate.sanitize("x <%= 7 %>", { profile: "permissive" }); })
47
+ === "template.erb-expression");
48
+ }
49
+
50
+ function testSanitizeThrowsGuardTemplateError() {
51
+ var caught = null;
52
+ try { b.guardTemplate.sanitize("#{name}", { profile: "strict" }); }
53
+ catch (e) { caught = e; }
54
+ check("sanitize throws a GuardTemplateError instance",
55
+ caught instanceof b.frameworkError.GuardTemplateError);
56
+ }
57
+
58
+ function run() {
59
+ testGuardTemplateSurface();
60
+ testSanitizeCleanPassthrough();
61
+ testSanitizeRefusesJinjaExpression();
62
+ testSanitizeRefusesErbEveryProfile();
63
+ testSanitizeThrowsGuardTemplateError();
64
+ }
65
+
66
+ module.exports = { run: run };
67
+
68
+ if (require.main === module) {
69
+ try { run(); console.log("[guard-template] OK — " + helpers.getChecks() + " checks passed"); }
70
+ catch (e) { console.error("FAIL:", e.stack || e); process.exit(1); }
71
+ }