@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
@@ -102,19 +102,30 @@ function _matchGlobPart(part, channel, fromIdx) {
102
102
  if (channel.substr(pos, lit.length) !== lit) return -1;
103
103
  pos += lit.length;
104
104
  } else if (i === segments.length - 1) {
105
- // Trailing literal: search forward in this segment (no '.' jump).
105
+ // Trailing literal after the final '*'. The '*' gap between the
106
+ // previous literal and this one matches non-'.' chars only, so the
107
+ // literal must START at or before the next '.' boundary — but the
108
+ // literal itself MAY contain '.' (it is matched verbatim, e.g. the
109
+ // '.created' tail in 'orders.*.created'). Greedy: pick the
110
+ // rightmost dot-free-reachable start.
106
111
  var hardStop = channel.indexOf(".", pos);
107
- var searchEnd = hardStop === -1 ? channel.length : hardStop;
108
- if (lit === "") { pos = searchEnd; break; }
109
- var found = channel.lastIndexOf(lit, searchEnd - lit.length);
110
- if (found < pos) return -1;
111
- pos = found + lit.length;
112
+ var maxStart = hardStop === -1 ? channel.length : hardStop;
113
+ if (lit === "") { pos = maxStart; break; }
114
+ var placed = -1;
115
+ for (var s = maxStart; s >= pos; s--) {
116
+ if (channel.substr(s, lit.length) === lit) { placed = s; break; }
117
+ }
118
+ if (placed < 0) return -1;
119
+ pos = placed + lit.length;
112
120
  } else {
113
- // Middle literal: find next occurrence within current segment.
121
+ // Middle literal after a '*'. The '*' gap must be dot-free, so the
122
+ // literal must START at or before the next '.'; the literal itself
123
+ // MAY contain '.'. Leftmost occurrence keeps the preceding '*'
124
+ // minimal.
114
125
  var hardStop2 = channel.indexOf(".", pos);
115
- var searchEnd2 = hardStop2 === -1 ? channel.length : hardStop2;
126
+ var maxStart2 = hardStop2 === -1 ? channel.length : hardStop2;
116
127
  var f2 = channel.indexOf(lit, pos);
117
- if (f2 < 0 || f2 + lit.length > searchEnd2) return -1;
128
+ if (f2 < 0 || f2 > maxStart2) return -1;
118
129
  pos = f2 + lit.length;
119
130
  }
120
131
  }
@@ -467,7 +467,8 @@ function create(config) {
467
467
  // dispatches both calls to the same backend.
468
468
  var rowBuilt = _select()
469
469
  .columns(["_id", "queueName", "payload", "repeatCron", "repeatTimezone",
470
- "flowId", "flowChildName", "priority", "classification", "traceId"])
470
+ "flowId", "flowChildName", "priority", "classification", "traceId",
471
+ "maxAttempts"])
471
472
  .where("_id", jobId)
472
473
  .toSql();
473
474
  var rowRes = await store.execute(rowBuilt.sql, rowBuilt.params);
@@ -503,6 +504,11 @@ function create(config) {
503
504
  var unsealedRow = cryptoField.unsealRow(SEAL_TABLE, row);
504
505
  var cron = scheduler.parseCron(unsealedRow.repeatCron);
505
506
  var nextMs = scheduler.nextCronFire(cron, new Date(nowMs), unsealedRow.repeatTimezone || null);
507
+ // Carry the operator's maxAttempts forward: the next occurrence must
508
+ // keep the same retry budget the operator configured, not silently
509
+ // reset to the enqueue default. A non-positive / non-finite value
510
+ // falls back to undefined so enqueue applies its own default.
511
+ var repeatMax = Number(unsealedRow.maxAttempts);
506
512
  await enqueue(unsealedRow.queueName,
507
513
  unsealedRow.payload ? safeJson.parse(unsealedRow.payload, { maxBytes: C.BYTES.mib(64) }) : null,
508
514
  {
@@ -514,6 +520,7 @@ function create(config) {
514
520
  availableAt: nextMs,
515
521
  repeat: { cron: unsealedRow.repeatCron, timezone: unsealedRow.repeatTimezone },
516
522
  priority: Number(unsealedRow.priority) || 0,
523
+ maxAttempts: (isFinite(repeatMax) && repeatMax > 0) ? repeatMax : undefined,
517
524
  classification: unsealedRow.classification || null,
518
525
  traceId: unsealedRow.traceId || null,
519
526
  });
@@ -532,12 +532,17 @@ function create(opts) {
532
532
  var cron = scheduler.parseCron(unsealed.repeatCron);
533
533
  var nextMs = scheduler.nextCronFire(
534
534
  cron, new Date(nowMs), unsealed.repeatTimezone || null);
535
+ // Carry the operator's maxAttempts forward so the next occurrence keeps
536
+ // the configured retry budget instead of silently resetting to the
537
+ // enqueue default (mirrors queue-local's cron-repeat).
538
+ var repeatMax = Number(unsealed.maxAttempts);
535
539
  await enqueue(unsealed.queueName,
536
540
  unsealed.payload ? safeJson.parse(unsealed.payload) : null,
537
541
  {
538
542
  availableAt: nextMs,
539
543
  repeat: { cron: unsealed.repeatCron, timezone: unsealed.repeatTimezone },
540
544
  priority: Number(unsealed.priority) || 0,
545
+ maxAttempts: (isFinite(repeatMax) && repeatMax > 0) ? repeatMax : undefined,
541
546
  classification: unsealed.classification || null,
542
547
  traceId: unsealed.traceId || null,
543
548
  });
@@ -1055,8 +1055,62 @@ function installForPosture(posture, primitives) {
1055
1055
  });
1056
1056
  }
1057
1057
 
1058
+ var TEXT_REDACT_MARKER = "[redacted]";
1059
+
1060
+ /**
1061
+ * @primitive b.redact.redactText
1062
+ * @signature b.redact.redactText(str)
1063
+ * @since 0.17.13
1064
+ * @status stable
1065
+ * @related b.redact.redact
1066
+ *
1067
+ * Scrub credentials EMBEDDED in a free-text string in place, keeping the
1068
+ * surrounding prose — for log messages and other operator-facing text where a
1069
+ * secret may be interpolated mid-sentence. Unlike `redact` (structured,
1070
+ * whole-value, anchored), this uses word-boundary fragment replacement so
1071
+ * "login failed: &lt;jwt&gt; for bob" keeps everything but the jwt. Detects PEM
1072
+ * blocks, JWTs, AWS access keys, URL-userinfo passwords, bearer tokens,
1073
+ * `key=secret` assignments, SSN/EIN, and Luhn-valid PANs. The high-entropy
1074
+ * api-key-shape detector is deliberately excluded (on free text it eats
1075
+ * ordinary IDs / hashes / base64). Drop-safe: never throws (it runs on the
1076
+ * hot-path log-emit sink); on any error it returns a fully-masked marker rather
1077
+ * than the raw input. Every quantifier is length-capped (ReDoS backstop).
1078
+ *
1079
+ * @example
1080
+ * b.redact.redactText("token=AKIAIOSFODNN7EXAMPLE ok"); // → "token=[redacted] ok"
1081
+ */
1082
+ function redactText(str) {
1083
+ if (typeof str !== "string" || str.length === 0) return str;
1084
+ try {
1085
+ return str
1086
+ // PEM / OpenSSH private-key blocks (multi-line).
1087
+ .replace(/-----BEGIN [A-Z0-9 ]{1,40}-----[\s\S]{0,8192}?-----END [A-Z0-9 ]{1,40}-----/g, TEXT_REDACT_MARKER)
1088
+ // JWT — three base64url segments, word-boundary anchored for embedding.
1089
+ .replace(/\beyJ[A-Za-z0-9_-]{1,4096}\.[A-Za-z0-9_-]{1,8192}\.[A-Za-z0-9_-]{1,4096}\b/g, TEXT_REDACT_MARKER)
1090
+ // AWS access-key IDs.
1091
+ .replace(/\b(?:AKIA|ASIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASCA)[A-Z0-9]{16}\b/g, TEXT_REDACT_MARKER)
1092
+ // Credentials in a URL userinfo: scheme://user:secret@host.
1093
+ .replace(/([a-z][a-z0-9+.-]{0,32}:\/\/[^\s:@/]{1,256}:)[^\s@/]{1,256}(@)/gi, "$1" + TEXT_REDACT_MARKER + "$2")
1094
+ // Bearer tokens.
1095
+ .replace(/\b([Bb]earer\s{1,4})[A-Za-z0-9._~+/-]{8,4096}=*/g, "$1" + TEXT_REDACT_MARKER)
1096
+ // key=secret / password: secret style assignments.
1097
+ .replace(/\b((?:api[_-]?key|access[_-]?token|secret|password|passwd|pwd|token)\s{0,4}[=:]\s{0,4})[^\s&;"']{6,4096}/gi, "$1" + TEXT_REDACT_MARKER)
1098
+ // SSN / EIN.
1099
+ .replace(/\b\d{3}-\d{2}-\d{4}\b/g, TEXT_REDACT_MARKER)
1100
+ .replace(/\b\d{2}-\d{7}\b/g, TEXT_REDACT_MARKER)
1101
+ // Credit-card / PAN — Luhn-validated so ordinary long digit runs survive.
1102
+ .replace(/\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{1,7}\b/g, function (m) {
1103
+ var inner = m.replace(/[\s-]/g, "");
1104
+ return (inner.length >= 13 && inner.length <= 19 && _luhnCheck(inner)) ? TEXT_REDACT_MARKER : m;
1105
+ });
1106
+ } catch (_e) {
1107
+ return TEXT_REDACT_MARKER;
1108
+ }
1109
+ }
1110
+
1058
1111
  module.exports = {
1059
1112
  redact: redact,
1113
+ redactText: redactText,
1060
1114
  registerFieldRule: registerFieldRule,
1061
1115
  registerValueDetector: registerValueDetector,
1062
1116
  classifyDefaults: classifyDefaults,
@@ -50,6 +50,7 @@
50
50
  var nodeFs = require("node:fs");
51
51
  var nodePath = require("node:path");
52
52
  var atomicFile = require("./atomic-file");
53
+ var safePath = require("./safe-path");
53
54
  var C = require("./constants");
54
55
  var backupCrypto = require("./backup/crypto");
55
56
  var backupManifest = require("./backup/manifest");
@@ -226,7 +227,11 @@ async function extract(opts) {
226
227
  continue;
227
228
  }
228
229
 
229
- var blobPath = nodePath.join(bundleDir, entry.encryptedPath);
230
+ // Resolve the manifest-declared encrypted-blob path THROUGH the base with
231
+ // safePath -- a tampered manifest could otherwise carry a traversal /
232
+ // absolute / drive-letter / NTFS-ADS encryptedPath and read a file outside
233
+ // the bundle. manifest.validate is a first-line check; this is the sink.
234
+ var blobPath = safePath.resolve(bundleDir, entry.encryptedPath);
230
235
  // Cap the read to the manifest's declared encryptedSize so an oversize-on-
231
236
  // disk blob is refused BEFORE it is read into memory (was: read fully, then
232
237
  // compare → an OOM window for a huge swapped blob). A valid blob is exactly
@@ -282,7 +287,10 @@ async function extract(opts) {
282
287
  " — bundle is corrupted or manifest tampered");
283
288
  }
284
289
 
285
- var destPath = nodePath.join(stagingDir, entry.relativePath);
290
+ // Resolve the restore destination THROUGH the staging base with safePath
291
+ // so a tampered relativePath (traversal / absolute / drive-letter / ADS)
292
+ // cannot escape stagingDir when the decrypted file is written.
293
+ var destPath = safePath.resolve(stagingDir, entry.relativePath);
286
294
  atomicFile.ensureDir(nodePath.dirname(destPath));
287
295
  atomicFile.writeSync(destPath, plaintext, { fileMode: 0o600 });
288
296
 
@@ -310,6 +310,25 @@ function create(opts) {
310
310
  "extract failed: " + ((e && e.message) || String(e)));
311
311
  }
312
312
 
313
+ // Defense-in-depth: never swap a zero-file extract over a populated
314
+ // dataDir. A zero-file staging dir moved over the live dataDir is a
315
+ // silent full wipe. The manifest validator now refuses an empty
316
+ // manifest (the attacker path), but an opts.filter that matched no
317
+ // entry also yields fileCount 0 — an operator mistake that must not
318
+ // destroy live data with a success report. If the dataDir is already
319
+ // empty a zero-file swap is a harmless no-op, so gate on non-empty.
320
+ var dataDirEntries = [];
321
+ try { dataDirEntries = nodeFs.readdirSync(dataDir); } catch (_e) { dataDirEntries = []; }
322
+ if (extracted.fileCount === 0 && dataDirEntries.length > 0) {
323
+ _cleanupTmp();
324
+ _emitAudit("restore.failure",
325
+ { bundleId: bundleId, reason: "refusing zero-file restore over a non-empty dataDir" },
326
+ "failure");
327
+ throw new RestoreError("restore/empty-extract-refused",
328
+ "refusing to swap a zero-file restore over the non-empty dataDir '" + dataDir +
329
+ "' (a filter matched no manifest entry, or the manifest is empty) — this would wipe live data");
330
+ }
331
+
313
332
  // 3. Atomic swap. On swap failure, the stagingDir is preserved so
314
333
  // an operator can recover manually — we do NOT delete it here.
315
334
  var swapResult;
@@ -492,7 +492,7 @@ function create(opts) {
492
492
  // tables), the central registry is authoritative. Honors
493
493
  // the same skip semantics as the per-row field.
494
494
  if (rule.subjectField && row[rule.subjectField]) {
495
- var holdsRegistry = legalHold._getSingleton();
495
+ var holdsRegistry = legalHold()._getSingleton();
496
496
  if (holdsRegistry && holdsRegistry.isHeld(row[rule.subjectField])) {
497
497
  summary.legalHoldsHonored++;
498
498
  _emit("retention.row.legal_hold_skipped",
@@ -623,7 +623,7 @@ var COMPLIANCE_RETENTION_FLOOR_MS = Object.freeze({
623
623
  * matched). Throws on an unknown posture so config-time typos surface.
624
624
  *
625
625
  * @example
626
- * var ttl = b.retention.complianceFloor("hipaa", b.C.TIME.days(180));
626
+ * var ttl = b.retention.complianceFloor("hipaa", b.constants.TIME.days(180));
627
627
  * // → 189216000000 (HIPAA's 6-year floor wins over the 180-day candidate)
628
628
  *
629
629
  * var sox = b.retention.complianceFloor("sox", 0);
@@ -641,7 +641,12 @@ function complianceFloor(posture, candidateTtlMs) {
641
641
  "complianceFloor: posture must be a string (pass one, or set the active " +
642
642
  "posture via applyPosture / b.compliance.set), got " + JSON.stringify(posture));
643
643
  }
644
- var floor = COMPLIANCE_RETENTION_FLOOR_MS[posture];
644
+ // Own-key lookup only: `posture` is operator-supplied, so a value colliding
645
+ // with an Object.prototype member ("valueOf" / "toString" / "constructor" /
646
+ // "hasOwnProperty" / ...) must be treated as unknown and throw below — not
647
+ // resolve to the inherited prototype function and be returned as a "floor".
648
+ var floor = Object.prototype.hasOwnProperty.call(COMPLIANCE_RETENTION_FLOOR_MS, posture)
649
+ ? COMPLIANCE_RETENTION_FLOOR_MS[posture] : undefined;
645
650
  if (floor === undefined) {
646
651
  throw new RetentionError("retention/unknown-posture",
647
652
  "complianceFloor: unknown posture '" + posture + "'; expected one of " +
@@ -691,7 +696,10 @@ function applyPosture(posture) {
691
696
  STATE.activeFloorMs = null;
692
697
  return null;
693
698
  }
694
- var floor = COMPLIANCE_RETENTION_FLOOR_MS[posture];
699
+ // Own-key lookup only — a proto-member posture name must not inherit a
700
+ // prototype function as the floor (see complianceFloor above).
701
+ var floor = Object.prototype.hasOwnProperty.call(COMPLIANCE_RETENTION_FLOOR_MS, posture)
702
+ ? COMPLIANCE_RETENTION_FLOOR_MS[posture] : undefined;
695
703
  STATE.activePosture = posture;
696
704
  STATE.activeFloorMs = (typeof floor === "number") ? floor : null;
697
705
  return { posture: posture, floorMs: STATE.activeFloorMs };
@@ -298,6 +298,18 @@ function compilePattern(pattern) {
298
298
  // object on match, null otherwise. Single non-empty trailing slash
299
299
  // difference is treated as a no-match (callers that want trailing-slash
300
300
  // tolerance normalize the path before dispatch).
301
+ // Collapse a leading run of slashes in a request target to a single "/" so a
302
+ // `//host/path` network-path reference becomes a plain path. Shared by handle()
303
+ // (routing + the value written back onto req.url) and _check0RttReplay (the
304
+ // early-data replay key) so both derive from ONE canonical target: otherwise
305
+ // `//x`, `///x`, and `/x` route to the same endpoint but would each mint a
306
+ // distinct replay-cache key, letting an attacker replay Early-Data by varying
307
+ // the leading-slash run.
308
+ function _canonicalRequestTarget(url) {
309
+ var t = String(url == null ? "/" : url);
310
+ return t.charAt(0) === "/" && t.charAt(1) === "/" ? t.replace(/^\/+/, "/") : t;
311
+ }
312
+
301
313
  function _matchCompiled(compiled, pathname) {
302
314
  var pathSegments = pathname.split("/");
303
315
  var patSegments = compiled.segments;
@@ -747,11 +759,50 @@ class Router {
747
759
  }
748
760
 
749
761
  async handle(req, res) {
750
- // Compose an absolute URL from the request's path + Host header so
751
- // safeUrl.parse can validate the protocol + length. The "http://"
752
- // base is the relative-resolution origin; the request's actual
753
- // scheme lives in requestHelpers.requestProtocol elsewhere.
754
- var absolute = "http://" + (req.headers.host || "localhost") + (req.url || "/");
762
+ // Derive the request path + query from req.url ALONE, resolved against a
763
+ // FIXED internal authority the Host header must NEVER influence which
764
+ // route is dispatched. Host is client-controlled: a value like
765
+ // "trusted/admin" bleeds its path segment into WHATWG-URL's pathname
766
+ // parsing (a leading "/admin" prepended), so a request whose request-line
767
+ // is "/x" would route as "/admin/x" while req.url stays "/x". That
768
+ // desyncs req.pathname (the value the route matcher AND every path-scoped
769
+ // guard compare against) from req.url, and a front proxy that ACLs on the
770
+ // visible request path is bypassed — the proxy sees "/x", the origin
771
+ // dispatches "/admin/x". Parsing req.url against a constant base keeps
772
+ // req.pathname a pure function of the request target. The request's real
773
+ // scheme + host live on req.headers.host / requestHelpers.requestProtocol
774
+ // for the consumers (canonical-URL, CORS, host-allowlist) that need them.
775
+ var reqTarget = req.url || "/";
776
+ // Only an origin-form request target — beginning with "/" (RFC 9112
777
+ // §3.2.1) — is routable by a path router. Reject an absolute-form
778
+ // (`http://host/path`), authority-form (`host:port`), or asterisk-form
779
+ // (`OPTIONS *`) target with 400 rather than coercing it into a routable
780
+ // path by prefixing: prefixing would turn `http://evil/admin` into
781
+ // `/http://evil/admin`, which a `/:x` or catch-all route would still match
782
+ // — the opposite of failing closed. A "/"-leading target (including one
783
+ // with a redundant leading slash like `//x`, a valid absolute-path with an
784
+ // empty first segment) is safe: parsed against the fixed authority it
785
+ // becomes a pathname, never a host, so the Host header still cannot steer
786
+ // routing.
787
+ if (reqTarget.charAt(0) !== "/") {
788
+ res.statusCode = 400;
789
+ res.end("400 Bad Request: non-origin-form request target");
790
+ return;
791
+ }
792
+ // Collapse a leading run of slashes to a single "/". A `//host/path` target
793
+ // is a valid absolute-path (empty first segment) so it need not be refused,
794
+ // but left intact it stays a network-path reference: any consumer that
795
+ // resolves req.url as a URL reference (`new URL(req.url, base)`) would read
796
+ // the first segment as an AUTHORITY — a Host bleed / SSRF. Normalizing here
797
+ // (via the same canonical-target helper the 0-RTT replay key uses), and
798
+ // writing the result back onto req.url, keeps it a pure path for the route
799
+ // matcher AND every downstream req.url reader.
800
+ var canonicalTarget = _canonicalRequestTarget(reqTarget);
801
+ if (canonicalTarget !== reqTarget) {
802
+ reqTarget = canonicalTarget;
803
+ req.url = reqTarget;
804
+ }
805
+ var absolute = "http://blamejs.invalid" + reqTarget;
755
806
  var parsed = safeUrl.parse(absolute, {
756
807
  allowedProtocols: safeUrl.ALLOW_HTTP_ALL,
757
808
  });
@@ -930,7 +981,10 @@ class Router {
930
981
  this._reap0RttCache(nowMs);
931
982
  var hash = require("node:crypto").createHash("sha3-512");
932
983
  hash.update(String(req.method || "") + "\n");
933
- hash.update(String(req.url || "") + "\n");
984
+ // Canonical target collapse a leading slash run so `//x` and `/x`, which
985
+ // dispatch to the same route, share one replay key (varying the leading
986
+ // slashes must not mint a fresh key and defeat the replay window).
987
+ hash.update(_canonicalRequestTarget(req.url) + "\n");
934
988
  hash.update(String((req.headers && req.headers["host"]) || "") + "\n");
935
989
  hash.update(String((req.headers && req.headers["authorization"]) || "") + "\n");
936
990
  hash.update(String((req.headers && req.headers["date"]) || "") + "\n");
@@ -366,6 +366,38 @@ function byteLengthOf(value, encoding) {
366
366
  "Buffer, or Uint8Array; got " + (value === null ? "null" : typeof value));
367
367
  }
368
368
 
369
+ /**
370
+ * @primitive b.safeBuffer.byteLengthOfIfMeasurable
371
+ * @signature b.safeBuffer.byteLengthOfIfMeasurable(value)
372
+ * @since 0.16.36
373
+ * @related b.safeBuffer.byteLengthOf
374
+ *
375
+ * Like `byteLengthOf`, but returns `null` for a value that is not a
376
+ * measurable byte-carrier (a plain `Array`, an array-like object with a
377
+ * numeric `.length`, a number, ...) instead of throwing.
378
+ *
379
+ * For capping the size of an UNTRUSTED metadata bag whose byte field may be
380
+ * any shape: a content guard measures its cap only when the value is
381
+ * measurable and treats an unmeasurable value as uncapped-here — its
382
+ * magic/shape inspection reads only the leading bytes, so it is O(1)-bounded
383
+ * regardless of a claimed `.length` — rather than throwing out of its
384
+ * documented never-throw-on-hostile-metadata inspection contract. Route a
385
+ * hostile-metadata byte cap through this instead of gating `byteLengthOf` on
386
+ * a hand-rolled `typeof x.length === "number"` check (which admits array-likes
387
+ * and crashes `byteLengthOf`).
388
+ *
389
+ * @example
390
+ * var b = require("blamejs");
391
+ * b.safeBuffer.byteLengthOfIfMeasurable("abc"); // → 3
392
+ * b.safeBuffer.byteLengthOfIfMeasurable([1, 2, 3]); // → null (a plain Array)
393
+ * b.safeBuffer.byteLengthOfIfMeasurable({ length: 1e9 }); // → null (array-like)
394
+ */
395
+ function byteLengthOfIfMeasurable(value) {
396
+ if (typeof value === "string") return Buffer.byteLength(value, "utf8");
397
+ if (Buffer.isBuffer(value) || value instanceof Uint8Array) return value.length;
398
+ return null;
399
+ }
400
+
369
401
  // ---- boundedChunkCollector ----
370
402
  //
371
403
  // Replaces the unbounded `chunks.push(c); ... Buffer.concat(chunks)`
@@ -872,11 +904,47 @@ function assertHeaderSafe(value, label, ErrorClass, code) {
872
904
  return value;
873
905
  }
874
906
 
907
+ /**
908
+ * @primitive b.safeBuffer.quoteString
909
+ * @signature b.safeBuffer.quoteString(s)
910
+ * @since 0.16.9
911
+ * @status stable
912
+ * @related b.safeBuffer.assertHeaderSafe, b.safeBuffer.foldHeaderText
913
+ *
914
+ * Serialize a value as an RFC quoted-string: coerce to string, escape
915
+ * every backslash and DQUOTE with a leading backslash, and wrap the
916
+ * result in DQUOTEs. One serializer for the quoted-string grammars the
917
+ * framework emits — RFC 8941 §3.3.3 Structured Fields sf-string
918
+ * (Cache-Status, Signature-Input, Server-Timing desc), RFC 8288 Link
919
+ * header parameters, RFC 8601 §2.2 Authentication-Results reason,
920
+ * RFC 3501 §4.3 IMAP quoted strings, and RFC 5804 §1.2 ManageSieve
921
+ * strings — so an unescaped quote can never terminate the string early
922
+ * and smuggle extra parameters into the protocol line.
923
+ *
924
+ * Escaping only — it does not validate a grammar's character range. A
925
+ * grammar that forbids bytes a quoted-string cannot carry (sf-string is
926
+ * printable-ASCII only; IMAP quoted strings cannot carry CR / LF)
927
+ * enforces its range check before calling this.
928
+ *
929
+ * @example
930
+ * var b = require("blamejs");
931
+ * b.safeBuffer.quoteString("cache miss");
932
+ * // → "\"cache miss\""
933
+ *
934
+ * // A quote or backslash in the value cannot break out of the string.
935
+ * b.safeBuffer.quoteString('say "hi"');
936
+ * // → "\"say \\\"hi\\\"\""
937
+ */
938
+ function quoteString(s) {
939
+ return "\"" + String(s).replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\""; // allow:regex-no-length-cap — fixed-char-set escape on caller-bounded input
940
+ }
941
+
875
942
  module.exports = {
876
943
  normalizeText: normalizeText,
877
944
  toBuffer: toBuffer,
878
945
  makeByteCoercer: makeByteCoercer,
879
946
  byteLengthOf: byteLengthOf,
947
+ byteLengthOfIfMeasurable: byteLengthOfIfMeasurable,
880
948
  boundedChunkCollector: boundedChunkCollector,
881
949
  collectStream: collectStream,
882
950
  secureZero: secureZero,
@@ -885,6 +953,7 @@ module.exports = {
885
953
  stripCrlf: stripCrlf,
886
954
  foldHeaderText: foldHeaderText,
887
955
  assertHeaderSafe: assertHeaderSafe,
956
+ quoteString: quoteString,
888
957
  stripTrailingHspace: stripTrailingHspace,
889
958
  indexAfterOpenTag: indexAfterOpenTag,
890
959
  HEX_RE: HEX_RE,
@@ -165,8 +165,14 @@ function safeDecompress(input, opts) {
165
165
  "windowBits", "audit", "ctx"],
166
166
  "safeDecompress");
167
167
 
168
- // Algorithm — required, must be in allowlist
169
- if (typeof opts.algorithm !== "string" || !_algorithms[opts.algorithm]) {
168
+ // Algorithm — required, must be in allowlist. Use an own-property check,
169
+ // not `!_algorithms[algo]`: a bare truthiness/`in` lookup inherits
170
+ // Object.prototype members, so a non-own key ("constructor", "toString",
171
+ // …) would resolve to a prototype function and get invoked below —
172
+ // `Object(buf)` returns the raw input, silently bypassing the allowlist
173
+ // and returning un-decompressed bytes (fail-open).
174
+ if (typeof opts.algorithm !== "string" ||
175
+ !Object.prototype.hasOwnProperty.call(_algorithms, opts.algorithm)) {
170
176
  throw new SafeDecompressError(
171
177
  "safe-decompress/unsupported-algorithm",
172
178
  "safeDecompress: algorithm must be one of " +
@@ -357,14 +357,24 @@ function checkCnameChainDepth(depth, opts) {
357
357
  }
358
358
  }
359
359
 
360
- function _readName(state, pointerDepth) {
360
+ function _readName(state, pointerDepth, acc) {
361
361
  if (pointerDepth > state.caps.maxPointerDepth) {
362
362
  throw new SafeDnsError("safe-dns/oversize-pointer-depth",
363
363
  "safeDns.readName: compression-pointer chain depth=" + pointerDepth +
364
364
  " exceeds maxPointerDepth=" + state.caps.maxPointerDepth + " (RFC 1035 §4.1.4 loop defense)");
365
365
  }
366
+ // Both per-name accountants — the decompressed octet count and the label
367
+ // count — thread through the WHOLE compression-pointer chain via `acc`. A
368
+ // pointer jump continues the same budget instead of restarting it, so the
369
+ // composite name a chain expands to is bounded by the same RFC 1035 §3.1
370
+ // 255-octet / §2.3.4 maxLabels caps that bound a single in-line name. When
371
+ // the accountants were frame-local, each jump began a fresh 255-octet /
372
+ // maxLabels budget, so a chain of N pointers decompressed to ~N x 255 octets
373
+ // and ~N x maxLabels labels past the advertised per-name caps — a
374
+ // decompression-amplification seam. `acc` is undefined for a top-level name
375
+ // (each is measured independently) and shared with every sub-read.
376
+ if (!acc) acc = { bytes: 0, labels: 0 };
366
377
  var labels = [];
367
- var totalBytes = 0;
368
378
  var jumped = false;
369
379
  var afterPointerOff = -1;
370
380
  var off = state.off;
@@ -376,10 +386,10 @@ function _readName(state, pointerDepth) {
376
386
  var byte = state.buf[off];
377
387
  if (byte === 0) {
378
388
  off += 1;
379
- totalBytes += 1;
380
- if (totalBytes > DNS_MAX_NAME_BYTES) {
389
+ acc.bytes += 1;
390
+ if (acc.bytes > DNS_MAX_NAME_BYTES) {
381
391
  throw new SafeDnsError("safe-dns/oversize-name",
382
- "safeDns.readName: wire-name=" + totalBytes + " bytes exceeds RFC 1035 cap=" +
392
+ "safeDns.readName: wire-name=" + acc.bytes + " bytes exceeds RFC 1035 cap=" +
383
393
  DNS_MAX_NAME_BYTES);
384
394
  }
385
395
  break;
@@ -394,20 +404,14 @@ function _readName(state, pointerDepth) {
394
404
  throw new SafeDnsError("safe-dns/truncated-name",
395
405
  "safeDns.readName: compression pointer offset past message end");
396
406
  }
397
- // First compression pointer ends the in-line label walk
398
- // (line break below). `jumped` can never already be true here;
399
- // assign unconditionally per Codex code-quality review.
407
+ // First compression pointer ends the in-line label walk. The pointed-to
408
+ // tail continues accumulating into the SAME `acc`, so the composite
409
+ // decompressed name stays bounded by the per-name octet + label caps.
400
410
  afterPointerOff = off + 2; // RFC 1035 §4.1.4 2-byte pointer width
401
411
  jumped = true;
402
412
  var subState = { off: ptrOff, buf: state.buf, caps: state.caps };
403
- var tailName = _readName(subState, pointerDepth + 1);
413
+ var tailName = _readName(subState, pointerDepth + 1, acc);
404
414
  if (tailName.length) labels.push(tailName);
405
- totalBytes += 2; // RFC 1035 §4.1.4 2-byte pointer width
406
- if (totalBytes > DNS_MAX_NAME_BYTES) {
407
- throw new SafeDnsError("safe-dns/oversize-name",
408
- "safeDns.readName: composite name=" + totalBytes + " bytes exceeds RFC 1035 cap=" +
409
- DNS_MAX_NAME_BYTES);
410
- }
411
415
  break;
412
416
  }
413
417
  if (byte > DNS_MAX_LABEL_BYTES) {
@@ -419,15 +423,16 @@ function _readName(state, pointerDepth) {
419
423
  "safeDns.readName: label content past message end");
420
424
  }
421
425
  labels.push(state.buf.toString("ascii", off + 1, off + 1 + byte));
422
- if (labels.length > state.caps.maxLabels) {
426
+ acc.labels += 1;
427
+ if (acc.labels > state.caps.maxLabels) {
423
428
  throw new SafeDnsError("safe-dns/oversize-labels",
424
- "safeDns.readName: label count=" + labels.length + " exceeds maxLabels=" + state.caps.maxLabels);
429
+ "safeDns.readName: label count=" + acc.labels + " exceeds maxLabels=" + state.caps.maxLabels);
425
430
  }
426
431
  off += 1 + byte;
427
- totalBytes += 1 + byte;
428
- if (totalBytes > DNS_MAX_NAME_BYTES) {
432
+ acc.bytes += 1 + byte;
433
+ if (acc.bytes > DNS_MAX_NAME_BYTES) {
429
434
  throw new SafeDnsError("safe-dns/oversize-name",
430
- "safeDns.readName: wire-name=" + totalBytes + " bytes exceeds RFC 1035 cap=" +
435
+ "safeDns.readName: wire-name=" + acc.bytes + " bytes exceeds RFC 1035 cap=" +
431
436
  DNS_MAX_NAME_BYTES);
432
437
  }
433
438
  }
@@ -281,14 +281,18 @@ function _resolveCaps(opts) {
281
281
  if (typeof opts.profile === "string") {
282
282
  name = opts.profile;
283
283
  } else if (typeof opts.compliancePosture === "string") {
284
- name = COMPLIANCE_POSTURES[opts.compliancePosture] || "strict";
284
+ name = Object.prototype.hasOwnProperty.call(COMPLIANCE_POSTURES, opts.compliancePosture)
285
+ ? COMPLIANCE_POSTURES[opts.compliancePosture] : "strict";
285
286
  }
286
- var caps = PROFILES[name];
287
- if (!caps) {
287
+ // Own-property lookup: `name` derives from attacker/operator opts.profile, so
288
+ // a bare `if (!PROFILES[name])` would let a prototype key ("constructor") pass
289
+ // as a known profile and run under an inherited member (fail-open).
290
+ if (!Object.prototype.hasOwnProperty.call(PROFILES, name)) {
288
291
  throw new SafeIcalError("safe-ical/bad-opt",
289
292
  "safeIcal.parse: unknown profile '" + name +
290
293
  "' (expected strict|balanced|permissive)");
291
294
  }
295
+ var caps = PROFILES[name];
292
296
  return caps;
293
297
  }
294
298
 
@@ -750,7 +750,18 @@ function _filenameFromHeaders(headers) {
750
750
  }
751
751
  if (/^[A-Za-z0-9_-]+'[A-Za-z0-9_-]*'/.test(raw)) {
752
752
  var enc = raw.split("'");
753
- return decodeURIComponent(enc[2]);
753
+ // RFC 2231 / 5987 ext-value percent-decode. A hostile
754
+ // `filename*=UTF-8''%` (truncated %-escape, non-hex digits, or a
755
+ // %-escape sequence that isn't valid UTF-8) makes decodeURIComponent
756
+ // throw a raw URIError, which would escape the SafeMimeError contract
757
+ // and crash the attachment walk. Degrade to the still-encoded segment
758
+ // — best-effort, and downstream filename guards handle the raw form —
759
+ // matching every other decodeURIComponent site in the framework.
760
+ try {
761
+ return decodeURIComponent(enc[2]);
762
+ } catch (_e) {
763
+ return enc[2];
764
+ }
754
765
  }
755
766
  return raw;
756
767
  }