@blamejs/blamejs-shop 0.5.12 → 0.5.14

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 (522) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/lib/asset-manifest.json +1 -1
  3. package/lib/sales-tax-filings.js +143 -0
  4. package/lib/vendor/MANIFEST.json +632 -416
  5. package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
  6. package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
  7. package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
  8. package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
  9. package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
  10. package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
  11. package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
  12. package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
  13. package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
  14. package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
  15. package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
  16. package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
  17. package/lib/vendor/blamejs/.gitignore +2 -0
  18. package/lib/vendor/blamejs/CHANGELOG.md +122 -0
  19. package/lib/vendor/blamejs/NOTICE +26 -1
  20. package/lib/vendor/blamejs/SECURITY.md +1 -1
  21. package/lib/vendor/blamejs/api-snapshot.json +207 -5
  22. package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
  23. package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
  24. package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
  25. package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
  26. package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
  27. package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
  28. package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
  29. package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
  30. package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
  31. package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
  32. package/lib/vendor/blamejs/index.js +6 -0
  33. package/lib/vendor/blamejs/lib/a2a.js +4 -4
  34. package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
  35. package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
  36. package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
  37. package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
  38. package/lib/vendor/blamejs/lib/archive-read.js +8 -0
  39. package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
  40. package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
  41. package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
  42. package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
  43. package/lib/vendor/blamejs/lib/audit.js +71 -8
  44. package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
  45. package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
  46. package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
  47. package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
  48. package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
  49. package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
  50. package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
  51. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
  52. package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
  53. package/lib/vendor/blamejs/lib/backup/index.js +16 -5
  54. package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
  55. package/lib/vendor/blamejs/lib/base32.js +21 -0
  56. package/lib/vendor/blamejs/lib/break-glass.js +19 -10
  57. package/lib/vendor/blamejs/lib/bundler.js +5 -1
  58. package/lib/vendor/blamejs/lib/cache-status.js +3 -7
  59. package/lib/vendor/blamejs/lib/calendar.js +21 -1
  60. package/lib/vendor/blamejs/lib/cbor.js +12 -1
  61. package/lib/vendor/blamejs/lib/cert.js +29 -11
  62. package/lib/vendor/blamejs/lib/cli.js +94 -24
  63. package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
  64. package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
  65. package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
  66. package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
  67. package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
  68. package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
  69. package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
  70. package/lib/vendor/blamejs/lib/content-digest.js +2 -1
  71. package/lib/vendor/blamejs/lib/cookies.js +13 -3
  72. package/lib/vendor/blamejs/lib/cose.js +31 -16
  73. package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
  74. package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
  75. package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
  76. package/lib/vendor/blamejs/lib/crypto.js +314 -19
  77. package/lib/vendor/blamejs/lib/csp.js +11 -3
  78. package/lib/vendor/blamejs/lib/daemon.js +270 -24
  79. package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
  80. package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
  81. package/lib/vendor/blamejs/lib/db-query.js +34 -7
  82. package/lib/vendor/blamejs/lib/db.js +18 -6
  83. package/lib/vendor/blamejs/lib/dbsc.js +17 -0
  84. package/lib/vendor/blamejs/lib/dev.js +21 -2
  85. package/lib/vendor/blamejs/lib/dsr.js +157 -102
  86. package/lib/vendor/blamejs/lib/external-db.js +41 -2
  87. package/lib/vendor/blamejs/lib/file-upload.js +25 -7
  88. package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
  89. package/lib/vendor/blamejs/lib/forms.js +113 -27
  90. package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
  91. package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
  92. package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
  93. package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
  94. package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
  95. package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
  96. package/lib/vendor/blamejs/lib/guard-html.js +26 -53
  97. package/lib/vendor/blamejs/lib/guard-image.js +24 -5
  98. package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
  99. package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
  100. package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
  101. package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
  102. package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
  103. package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
  104. package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
  105. package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
  106. package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
  107. package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
  108. package/lib/vendor/blamejs/lib/guard-time.js +1 -1
  109. package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
  110. package/lib/vendor/blamejs/lib/html-balance.js +3 -3
  111. package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
  112. package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
  113. package/lib/vendor/blamejs/lib/http-client.js +39 -7
  114. package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
  115. package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
  116. package/lib/vendor/blamejs/lib/i18n.js +35 -21
  117. package/lib/vendor/blamejs/lib/incident-report.js +8 -1
  118. package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
  119. package/lib/vendor/blamejs/lib/json-path.js +23 -1
  120. package/lib/vendor/blamejs/lib/jwk.js +20 -3
  121. package/lib/vendor/blamejs/lib/link-header.js +2 -1
  122. package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
  123. package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
  124. package/lib/vendor/blamejs/lib/log-stream.js +8 -3
  125. package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
  126. package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
  127. package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
  128. package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
  129. package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
  130. package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
  131. package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
  132. package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
  133. package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
  134. package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
  135. package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
  136. package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
  137. package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
  138. package/lib/vendor/blamejs/lib/mail.js +15 -5
  139. package/lib/vendor/blamejs/lib/metrics.js +268 -63
  140. package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
  141. package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
  142. package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
  143. package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
  144. package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
  145. package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
  146. package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
  147. package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
  148. package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
  149. package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
  150. package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
  151. package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
  152. package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
  153. package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
  154. package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
  155. package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
  156. package/lib/vendor/blamejs/lib/network-dns.js +21 -2
  157. package/lib/vendor/blamejs/lib/network-tls.js +69 -7
  158. package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
  159. package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
  160. package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
  161. package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
  162. package/lib/vendor/blamejs/lib/outbox.js +1 -1
  163. package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
  164. package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
  165. package/lib/vendor/blamejs/lib/permissions.js +6 -3
  166. package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
  167. package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
  168. package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
  169. package/lib/vendor/blamejs/lib/pubsub.js +20 -9
  170. package/lib/vendor/blamejs/lib/queue-local.js +8 -1
  171. package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
  172. package/lib/vendor/blamejs/lib/redact.js +54 -0
  173. package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
  174. package/lib/vendor/blamejs/lib/restore.js +19 -0
  175. package/lib/vendor/blamejs/lib/retention.js +12 -4
  176. package/lib/vendor/blamejs/lib/router.js +60 -6
  177. package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
  178. package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
  179. package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
  180. package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
  181. package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
  182. package/lib/vendor/blamejs/lib/safe-object.js +80 -0
  183. package/lib/vendor/blamejs/lib/safe-path.js +52 -4
  184. package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
  185. package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
  186. package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
  187. package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
  188. package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
  189. package/lib/vendor/blamejs/lib/scheduler.js +8 -1
  190. package/lib/vendor/blamejs/lib/security-assert.js +6 -6
  191. package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
  192. package/lib/vendor/blamejs/lib/self-update.js +517 -87
  193. package/lib/vendor/blamejs/lib/server-timing.js +2 -4
  194. package/lib/vendor/blamejs/lib/session.js +34 -12
  195. package/lib/vendor/blamejs/lib/sql.js +15 -1
  196. package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
  197. package/lib/vendor/blamejs/lib/static.js +55 -13
  198. package/lib/vendor/blamejs/lib/storage.js +8 -2
  199. package/lib/vendor/blamejs/lib/subject.js +6 -1
  200. package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
  201. package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
  202. package/lib/vendor/blamejs/lib/tsa.js +34 -13
  203. package/lib/vendor/blamejs/lib/uri-template.js +8 -1
  204. package/lib/vendor/blamejs/lib/vault/index.js +13 -0
  205. package/lib/vendor/blamejs/lib/vc.js +44 -5
  206. package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
  207. package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
  208. package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
  209. package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
  210. package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
  211. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
  212. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
  213. package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
  214. package/lib/vendor/blamejs/lib/watcher.js +89 -17
  215. package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
  216. package/lib/vendor/blamejs/lib/webhook.js +12 -2
  217. package/lib/vendor/blamejs/lib/ws-client.js +32 -1
  218. package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
  219. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
  220. package/lib/vendor/blamejs/package-lock.json +2 -2
  221. package/lib/vendor/blamejs/package.json +1 -1
  222. package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
  223. package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
  224. package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
  225. package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
  226. package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
  227. package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
  228. package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
  229. package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
  230. package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
  231. package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
  232. package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
  233. package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
  234. package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
  235. package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
  236. package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
  237. package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
  238. package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
  239. package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
  240. package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
  241. package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
  242. package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
  243. package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
  244. package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
  245. package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
  246. package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
  247. package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
  248. package/lib/vendor/blamejs/socket.yml +94 -0
  249. package/lib/vendor/blamejs/test/00-primitives.js +605 -0
  250. package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
  251. package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
  252. package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
  253. package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
  254. package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
  255. package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
  256. package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
  257. package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
  258. package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
  259. package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
  260. package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
  261. package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
  262. package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
  263. package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
  264. package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
  265. package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
  266. package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
  267. package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
  268. package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
  269. package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
  270. package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
  271. package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
  272. package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
  273. package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
  274. package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
  275. package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
  276. package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
  277. package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
  278. package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
  279. package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
  280. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
  281. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
  282. package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
  283. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
  284. package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
  285. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
  286. package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
  287. package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
  288. package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
  289. package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
  290. package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
  291. package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
  292. package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
  293. package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
  294. package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
  295. package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
  296. package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
  297. package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
  298. package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
  299. package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
  300. package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
  301. package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
  302. package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
  303. package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
  304. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
  305. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
  306. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
  307. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
  308. package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
  309. package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
  310. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
  311. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
  312. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
  313. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
  314. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
  315. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
  316. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
  317. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
  318. package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
  319. package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
  320. package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
  321. package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
  322. package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
  323. package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
  324. package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
  325. package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
  326. package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
  327. package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
  328. package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
  329. package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
  330. package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
  331. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
  332. package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
  333. package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
  334. package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
  335. package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
  336. package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
  337. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
  338. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
  339. package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
  340. package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
  341. package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
  342. package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
  343. package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
  344. package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
  345. package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
  346. package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
  347. package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
  348. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
  349. package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
  350. package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
  351. package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
  352. package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
  353. package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
  354. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
  355. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
  356. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
  357. package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
  358. package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
  359. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
  360. package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
  361. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
  362. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
  363. package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
  364. package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
  365. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
  366. package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
  367. package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
  368. package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
  369. package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
  370. package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
  371. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
  372. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
  373. package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
  374. package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
  375. package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
  376. package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
  377. package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
  378. package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
  379. package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
  380. package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
  381. package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
  382. package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
  383. package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
  384. package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
  385. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
  386. package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
  387. package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
  388. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
  389. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
  390. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
  391. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
  392. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
  393. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
  394. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
  395. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
  396. package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
  397. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
  398. package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
  399. package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
  400. package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
  401. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
  402. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
  403. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
  404. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
  405. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
  406. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
  407. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
  408. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
  409. package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
  410. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
  411. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
  412. package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
  413. package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
  414. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
  415. package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
  416. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
  417. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
  418. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
  419. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
  420. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
  421. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
  422. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
  423. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
  424. package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
  425. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
  426. package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
  427. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
  428. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
  429. package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
  430. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
  431. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
  432. package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
  433. package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
  434. package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
  435. package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
  436. package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
  437. package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
  438. package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
  439. package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
  440. package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
  441. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
  442. package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
  443. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
  444. package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
  445. package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
  446. package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
  447. package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
  448. package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
  449. package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
  450. package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
  451. package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
  452. package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
  453. package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
  454. package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
  455. package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
  456. package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
  457. package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
  458. package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
  459. package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
  460. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
  461. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
  462. package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
  463. package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
  464. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
  465. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
  466. package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
  467. package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
  468. package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
  469. package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
  470. package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
  471. package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
  472. package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
  473. package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
  474. package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
  475. package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
  476. package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
  477. package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
  478. package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
  479. package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
  480. package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
  481. package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
  482. package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
  483. package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
  484. package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
  485. package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
  486. package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
  487. package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
  488. package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
  489. package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
  490. package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
  491. package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
  492. package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
  493. package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
  494. package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
  495. package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
  496. package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
  497. package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
  498. package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
  499. package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
  500. package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
  501. package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
  502. package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
  503. package/lib/vendor/blamejs/test/smoke.js +2 -0
  504. package/package.json +1 -1
  505. package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
  506. package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
  507. package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
  508. package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
  509. package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
  510. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
  511. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
  512. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
  513. package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
  514. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
  515. package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
  516. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
  517. package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
  518. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
  519. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
  520. package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
  521. package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
  522. package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
@@ -0,0 +1,624 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) blamejs contributors
3
+ "use strict";
4
+ /**
5
+ * b.auditTools — audit-chain inspection / export / archive / verify /
6
+ * purge. This canonical suite drives the error, adversarial, defensive
7
+ * and option-default branches of every verb:
8
+ *
9
+ * - input validation (passphrase / out-dir / date coercion / mutually-
10
+ * exclusive out+returnBytes),
11
+ * - corrupt-bundle rejection in _readBundle (missing / oversized /
12
+ * checksum-mismatched blobs, bad format / kind),
13
+ * - chain-integrity failure surfacing in verifyBundle (prevHash break,
14
+ * rowHash break, first/last-rowHash disagreement, checkpoint binding),
15
+ * - purge refusal paths (unverified archive, wrong kind, non-monotonic,
16
+ * anchor mismatch, dual-control gate),
17
+ * - the CADF export mapping across every outcome / field shape.
18
+ *
19
+ * The happy paths run against a real encrypted db + audit chain +
20
+ * ML-DSA-signed checkpoint (setupTestDb) so the default readers /
21
+ * signature verifier / writer / reader are exercised end-to-end. The
22
+ * adversarial paths tamper written bundles on disk or inject the
23
+ * operator-overridable readers, never a fake crypto primitive.
24
+ */
25
+
26
+ var helpers = require("../helpers");
27
+ var b = helpers.b;
28
+ var check = helpers.check;
29
+ var fs = helpers.fs;
30
+ var os = helpers.os;
31
+ var path = helpers.path;
32
+ var setupTestDb = helpers.setupTestDb;
33
+ var teardownTestDb = helpers.teardownTestDb;
34
+ var backupCrypto = require("../../lib/backup/crypto");
35
+
36
+ var PASS = Buffer.from("audit-tools-canonical-test-passphrase");
37
+ var ZERO = "0".repeat(128);
38
+
39
+ var _seq = 0;
40
+ function _freshOut(root, name) { _seq += 1; return path.join(root, name + "-" + _seq); }
41
+
42
+ async function _expectCode(fn, code) {
43
+ var threw = null;
44
+ try { await fn(); } catch (e) { threw = e; }
45
+ return threw && threw.code === code;
46
+ }
47
+
48
+ function _copyBundle(src, dst) {
49
+ fs.mkdirSync(dst, { recursive: true });
50
+ var entries = fs.readdirSync(src);
51
+ for (var i = 0; i < entries.length; i++) {
52
+ fs.copyFileSync(path.join(src, entries[i]), path.join(dst, entries[i]));
53
+ }
54
+ return dst;
55
+ }
56
+
57
+ function _flipByte(file) {
58
+ var buf = fs.readFileSync(file);
59
+ buf[0] = buf[0] ^ 0xff;
60
+ fs.writeFileSync(file, buf);
61
+ }
62
+
63
+ function _editManifest(dir, mutate) {
64
+ var p = path.join(dir, "manifest.json");
65
+ var m = JSON.parse(fs.readFileSync(p, "utf8"));
66
+ mutate(m);
67
+ fs.writeFileSync(p, JSON.stringify(m));
68
+ }
69
+
70
+ // ---------------------------------------------------------------------------
71
+ // Pure / no-db branches: input validation, date coercion, CADF mapping,
72
+ // withRecordedAtIso, the reader-injection error paths that throw before any
73
+ // filesystem or db touch.
74
+ // ---------------------------------------------------------------------------
75
+ async function runInputValidation(root) {
76
+ // _requirePassphrase — missing (not Buffer/string), and empty.
77
+ check("archive: missing passphrase rejected",
78
+ await _expectCode(function () { return b.auditTools.archive({}); }, "audit-tools/no-passphrase"));
79
+ check("archive: empty-string passphrase rejected",
80
+ await _expectCode(function () { return b.auditTools.archive({ passphrase: "" }); }, "audit-tools/no-passphrase"));
81
+ check("archive: empty-Buffer passphrase rejected",
82
+ await _expectCode(function () { return b.auditTools.archive({ passphrase: Buffer.alloc(0) }); }, "audit-tools/no-passphrase"));
83
+
84
+ // _requireOutDir — not a string, and already-exists.
85
+ check("archive: missing out (no returnBytes) rejected",
86
+ await _expectCode(function () { return b.auditTools.archive({ passphrase: PASS, before: Date.now() }); }, "audit-tools/no-outdir"));
87
+ var existing = _freshOut(root, "already-there");
88
+ fs.mkdirSync(existing, { recursive: true });
89
+ check("archive: refuses to overwrite an existing out dir",
90
+ await _expectCode(function () {
91
+ return b.auditTools.archive({ passphrase: PASS, before: Date.now(), out: existing });
92
+ }, "audit-tools/outdir-exists"));
93
+
94
+ // out + returnBytes are mutually exclusive on every verb that offers both.
95
+ check("archive: out + returnBytes rejected",
96
+ await _expectCode(function () {
97
+ return b.auditTools.archive({ passphrase: PASS, returnBytes: true, out: _freshOut(root, "x"), before: Date.now() });
98
+ }, "audit-tools/out-and-return-bytes"));
99
+ check("exportSlice: out + returnBytes rejected",
100
+ await _expectCode(function () {
101
+ return b.auditTools.exportSlice({ passphrase: PASS, returnBytes: true, out: _freshOut(root, "x") });
102
+ }, "audit-tools/out-and-return-bytes"));
103
+ check("forensicSnapshot: out + returnBytes rejected",
104
+ await _expectCode(function () {
105
+ return b.auditTools.forensicSnapshot({ passphrase: PASS, returnBytes: true, out: _freshOut(root, "x"), since: Date.now(), reason: "x" });
106
+ }, "audit-tools/out-and-return-bytes"));
107
+
108
+ // exportSlice missing out.
109
+ check("exportSlice: missing out rejected",
110
+ await _expectCode(function () { return b.auditTools.exportSlice({ passphrase: PASS }); }, "audit-tools/no-outdir"));
111
+
112
+ // archive: before is required (date coercion of undefined → null).
113
+ check("archive: missing before rejected",
114
+ await _expectCode(function () {
115
+ return b.auditTools.archive({ passphrase: PASS, out: _freshOut(root, "nb") });
116
+ }, "audit-tools/no-before"));
117
+
118
+ // _toMs adversarial via archive (bad string / bad type).
119
+ check("archive: unparseable before string rejected",
120
+ await _expectCode(function () {
121
+ return b.auditTools.archive({ passphrase: PASS, out: _freshOut(root, "bd"), before: "not-a-date" });
122
+ }, "audit-tools/bad-date"));
123
+ check("archive: non-date-typed before rejected",
124
+ await _expectCode(function () {
125
+ return b.auditTools.archive({ passphrase: PASS, out: _freshOut(root, "bt"), before: true });
126
+ }, "audit-tools/bad-date"));
127
+
128
+ // forensicSnapshot required-opt branches (returnBytes skips the out check).
129
+ check("forensicSnapshot: missing since rejected",
130
+ await _expectCode(function () {
131
+ return b.auditTools.forensicSnapshot({ passphrase: PASS, returnBytes: true, reason: "x" });
132
+ }, "audit-tools/no-since"));
133
+ check("forensicSnapshot: missing/empty reason rejected",
134
+ await _expectCode(function () {
135
+ return b.auditTools.forensicSnapshot({ passphrase: PASS, returnBytes: true, since: Date.now() });
136
+ }, "audit-tools/no-reason"));
137
+
138
+ // verifyBundle / purge entry-point validation.
139
+ check("verifyBundle: missing passphrase rejected",
140
+ await _expectCode(function () { return b.auditTools.verifyBundle({ in: "/nope" }); }, "audit-tools/no-passphrase"));
141
+ check("verifyBundle: missing in rejected",
142
+ await _expectCode(function () { return b.auditTools.verifyBundle({ passphrase: PASS }); }, "audit-tools/no-indir"));
143
+ check("purge: confirm must be exactly true",
144
+ await _expectCode(function () { return b.auditTools.purge({ archive: "/x", passphrase: PASS }); }, "audit-tools/no-confirm"));
145
+ check("purge: missing archive path rejected",
146
+ await _expectCode(function () { return b.auditTools.purge({ confirm: true, passphrase: PASS }); }, "audit-tools/no-archive"));
147
+ check("purge: missing passphrase rejected",
148
+ await _expectCode(function () { return b.auditTools.purge({ confirm: true, archive: "/x" }); }, "audit-tools/no-passphrase"));
149
+ }
150
+
151
+ async function runReaderInjectedErrors(root) {
152
+ async function empty() { return []; }
153
+ // archive: no rows match.
154
+ check("archive: no matching rows rejected",
155
+ await _expectCode(function () {
156
+ return b.auditTools.archive({ passphrase: PASS, out: _freshOut(root, "e"), before: Date.now(), readRows: empty });
157
+ }, "audit-tools/empty"));
158
+ // archive: no covering checkpoint.
159
+ var oneRow = [{ _id: "r1", monotonicCounter: 1, recordedAt: 1, action: "a", prevHash: ZERO, rowHash: "aa", nonce: Buffer.from("nn") }];
160
+ check("archive: no covering checkpoint rejected",
161
+ await _expectCode(function () {
162
+ return b.auditTools.archive({
163
+ passphrase: PASS, out: _freshOut(root, "nc"), before: Date.now(),
164
+ readRows: function () { return Promise.resolve(oneRow); },
165
+ readCoveringCheckpoint: function () { return Promise.resolve(null); },
166
+ });
167
+ }, "audit-tools/no-covering-checkpoint"));
168
+
169
+ // exportSlice: empty + non-contiguous.
170
+ check("exportSlice: no matching rows rejected",
171
+ await _expectCode(function () {
172
+ return b.auditTools.exportSlice({ passphrase: PASS, out: _freshOut(root, "ee"), readRows: empty });
173
+ }, "audit-tools/empty"));
174
+ check("exportSlice: non-contiguous slice rejected",
175
+ await _expectCode(function () {
176
+ return b.auditTools.exportSlice({
177
+ passphrase: PASS, out: _freshOut(root, "ncg"),
178
+ readRows: function () { return Promise.resolve([{ monotonicCounter: 1 }, { monotonicCounter: 3 }]); },
179
+ });
180
+ }, "audit-tools/non-contiguous"));
181
+
182
+ // archive witness path: covering checkpoint anchors a counter beyond the
183
+ // purgeable slice tip, so the in-between rows ride as verification
184
+ // witnesses. Fake rows suffice — the build only reads counters/hashes.
185
+ function fakeRow(c) {
186
+ return { _id: "w" + c, monotonicCounter: c, recordedAt: c * 10, action: "seed", prevHash: ZERO, rowHash: "hh" + c, nonce: Buffer.from("n" + c) };
187
+ }
188
+ var witnessBuilt = await b.auditTools.archive({
189
+ passphrase: PASS, returnBytes: true, before: Date.now(),
190
+ readRows: function (crit) {
191
+ if (crit.beforeMs != null) return Promise.resolve([fakeRow(1), fakeRow(2), fakeRow(3)]);
192
+ return Promise.resolve([fakeRow(4), fakeRow(5)]); // witnesses 4..5
193
+ },
194
+ readCoveringCheckpoint: function () {
195
+ return Promise.resolve({ atMonotonicCounter: 5, atRowHash: "hh5", publicKeyFingerprint: "fp", _id: "ck" });
196
+ },
197
+ readPredecessorRowHash: function () { return Promise.resolve(ZERO); },
198
+ });
199
+ check("archive witness path: purgeable rowCount excludes witnesses", witnessBuilt.rowCount === 3);
200
+ var wPlain = (await backupCrypto.decryptWithPassphrase(
201
+ witnessBuilt.files["rows.enc"], PASS, witnessBuilt.manifest.salts.rows)).toString("utf8");
202
+ check("archive witness path: rows.enc carries slice + witness lines",
203
+ wPlain.split("\n").filter(Boolean).length === 5);
204
+
205
+ // archive: witnesses required by the checkpoint anchor are not all
206
+ // available → the slice cannot be proven to chain to the signed anchor.
207
+ check("archive: missing anchor witnesses rejected",
208
+ await _expectCode(function () {
209
+ return b.auditTools.archive({
210
+ passphrase: PASS, returnBytes: true, before: Date.now(),
211
+ readRows: function (crit) {
212
+ if (crit.beforeMs != null) return Promise.resolve([fakeRow(1), fakeRow(2), fakeRow(3)]);
213
+ return Promise.resolve([fakeRow(4)]); // tip 4 ≠ anchor 5
214
+ },
215
+ readCoveringCheckpoint: function () {
216
+ return Promise.resolve({ atMonotonicCounter: 5, atRowHash: "hh5", publicKeyFingerprint: "fp", _id: "ck" });
217
+ },
218
+ readPredecessorRowHash: function () { return Promise.resolve(ZERO); },
219
+ });
220
+ }, "audit-tools/anchor-rows-missing"));
221
+ }
222
+
223
+ async function runCadfMapping() {
224
+ var base = Date.UTC(2026, 4, 1, 0, 0, 0);
225
+ var rows = [
226
+ { _id: "e1", monotonicCounter: 1, recordedAt: base, action: "auth.login", outcome: "success",
227
+ actorUserIdHash: "h-alice", actorIp: "10.0.0.5", actorSessionId: "s-1", resourceKind: "session", resourceId: "r1",
228
+ reason: "policy allow", metadata: { k: 1 }, prevHash: ZERO, rowHash: "aa" },
229
+ { _id: "e2", monotonicCounter: 2, recordedAt: base + 1, action: "auth.fail", outcome: "failure",
230
+ actorUserId: "bob", resourceId: "r2", metadata: '{"j":2}', prevHash: "aa", rowHash: "bb" },
231
+ { _id: "e3", monotonicCounter: 3, recordedAt: base + 2, action: "policy.deny", outcome: "denied",
232
+ metadata: "{not json", prevHash: "bb", rowHash: "cc" },
233
+ { _id: "e4", monotonicCounter: 4, recordedAt: base + 3, action: "sys.warn", outcome: "warning",
234
+ metadata: null, prevHash: "cc", rowHash: "dd" },
235
+ { _id: "e5", monotonicCounter: 5, recordedAt: base + 4, action: "sys.odd", outcome: "quantum",
236
+ prevHash: "dd", rowHash: "ee" },
237
+ { _id: "e6", monotonicCounter: 6, recordedAt: base + 5, action: "sys.blank", prevHash: "ee", rowHash: "ff" },
238
+ ];
239
+ async function readRows() { return rows; }
240
+
241
+ // Range with explicit from/to (ISO round-trip) via exportAudit default dispatch.
242
+ var batch = await b.auditTools.exportAudit({ from: new Date(base), to: base + 100, readRows: readRows });
243
+ check("exportAudit: defaults to cadf batch envelope",
244
+ batch.typeURI.indexOf("event-batch") !== -1 && batch.events.length === 6);
245
+ check("cadf: range.from is ISO", batch.range.from === new Date(base).toISOString());
246
+ check("cadf: success outcome preserved", batch.events[0].outcome === "success");
247
+ check("cadf: object metadata attached", batch.events[0].attachments && batch.events[0].attachments.length === 1);
248
+ check("cadf: actorIp mapped to initiator address",
249
+ batch.events[0].initiator.addresses && batch.events[0].initiator.addresses[0].url === "10.0.0.5");
250
+ check("cadf: reason mapped", batch.events[0].reason && batch.events[0].reason.reasonCode === "policy allow");
251
+ check("cadf: resourceKind → target typeURI", /session$/.test(batch.events[0].target.typeURI));
252
+ check("cadf: failure outcome preserved", batch.events[1].outcome === "failure");
253
+ check("cadf: string metadata parsed", batch.events[1].attachments && /"j":2/.test(batch.events[1].attachments[0].content));
254
+ check("cadf: actorUserId fallback initiator id", batch.events[1].initiator.id === "bob");
255
+ check("cadf: resourceId fallback target id", batch.events[1].target.id === "r2");
256
+ check("cadf: no actorIp → no addresses", batch.events[1].initiator.addresses === undefined);
257
+ check("cadf: denied → failure outcome", batch.events[2].outcome === "failure");
258
+ check("cadf: unparseable metadata falls back to raw",
259
+ batch.events[2].attachments && /not json/.test(batch.events[2].attachments[0].content));
260
+ check("cadf: unknown initiator id when no actor fields", batch.events[2].initiator.id === "unknown");
261
+ check("cadf: n/a target when no resource fields", batch.events[2].target.id === "n/a");
262
+ check("cadf: warning → unknown outcome", batch.events[3].outcome === "unknown");
263
+ check("cadf: null metadata → no attachments", batch.events[3].attachments === undefined);
264
+ check("cadf: unrecognized outcome passes through", batch.events[4].outcome === "quantum");
265
+ check("cadf: absent outcome → unknown", batch.events[5].outcome === "unknown");
266
+ check("cadf: no reason → undefined", batch.events[5].reason === undefined);
267
+
268
+ // Range with no from/to → both null; _toMs(undefined) → null branch.
269
+ var openBatch = await b.auditTools.exportCadf({ readRows: readRows });
270
+ check("cadf: open range yields null bounds",
271
+ openBatch.range.from === null && openBatch.range.to === null);
272
+
273
+ // exportCadf / exportAudit bad-format rejections.
274
+ check("exportCadf: non-cadf format rejected",
275
+ await _expectCode(function () { return b.auditTools.exportCadf({ format: "cef", readRows: readRows }); }, "audit-tools/bad-format"));
276
+ check("exportAudit: unknown format rejected",
277
+ await _expectCode(function () { return b.auditTools.exportAudit({ format: "xml", readRows: readRows }); }, "audit-tools/bad-format"));
278
+
279
+ // _toMs Date-instance + parseable-string positive paths, and adversarial.
280
+ var isoBatch = await b.auditTools.exportCadf({ from: "2026-01-01T00:00:00Z", readRows: readRows });
281
+ check("cadf: parseable ISO string from-bound applied",
282
+ isoBatch.range.from === new Date("2026-01-01T00:00:00Z").toISOString());
283
+ check("exportCadf: unparseable from string rejected",
284
+ await _expectCode(function () { return b.auditTools.exportCadf({ from: "nonsense", readRows: readRows }); }, "audit-tools/bad-date"));
285
+ check("exportCadf: non-date-typed from rejected",
286
+ await _expectCode(function () { return b.auditTools.exportCadf({ from: {}, readRows: readRows }); }, "audit-tools/bad-date"));
287
+ }
288
+
289
+ async function runForensicSuccess(root) {
290
+ // Fake but contiguous rows starting at counter 1 → the default predecessor
291
+ // reader short-circuits to ZERO_HASH without any db touch.
292
+ function frow(c) {
293
+ return { _id: "f" + c, monotonicCounter: c, recordedAt: c * 1000, action: "sys.evt", outcome: "success", prevHash: ZERO, rowHash: "rr" + c, nonce: Buffer.from("n" + c) };
294
+ }
295
+ async function readRows() { return [frow(1), frow(2), frow(3)]; }
296
+
297
+ // returnBytes: assembles the slice files plus the IR wrapper in memory.
298
+ var snap = await b.auditTools.forensicSnapshot({
299
+ returnBytes: true, since: 0, passphrase: PASS, reason: "IR drill", incidentId: "inc-1",
300
+ actor: { id: "alice", role: "incident-commander" }, readRows: readRows,
301
+ });
302
+ check("forensicSnapshot: returnBytes yields the IR wrapper file", Buffer.isBuffer(snap.files["forensic-snapshot.json"]));
303
+ check("forensicSnapshot: returnBytes yields the slice rows.enc", Buffer.isBuffer(snap.files["rows.enc"]));
304
+ check("forensicSnapshot: snapshotKind is forensic", snap.snapshotKind === "forensic");
305
+ check("forensicSnapshot: incidentId + actor carried", snap.incidentId === "inc-1" && snap.actor.role === "incident-commander");
306
+ check("forensicSnapshot: runtime fingerprint captured", snap.runtime && snap.runtime.nodeVersion === process.version);
307
+ check("forensicSnapshot: no disk manifestPath in returnBytes mode", snap.manifestPath === undefined);
308
+
309
+ // on-disk: writes rows.enc + manifest.json + forensic-snapshot.json.
310
+ var fdir = _freshOut(root, "forensic");
311
+ var snap2 = await b.auditTools.forensicSnapshot({ out: fdir, since: 0, passphrase: PASS, reason: "IR onto disk", readRows: readRows });
312
+ check("forensicSnapshot: on-disk returns a manifestPath", typeof snap2.manifestPath === "string" && /forensic-snapshot\.json$/.test(snap2.manifestPath));
313
+ check("forensicSnapshot: on-disk wrote the IR wrapper", fs.existsSync(snap2.manifestPath));
314
+ check("forensicSnapshot: omitted incidentId/actor default to null", snap2.incidentId === null && snap2.actor === null);
315
+ }
316
+
317
+ function runWithRecordedAtIso() {
318
+ check("withRecordedAtIso: null passes through", b.auditTools.withRecordedAtIso(null) === null);
319
+ check("withRecordedAtIso: undefined passes through", b.auditTools.withRecordedAtIso(undefined) === undefined);
320
+ var n = b.auditTools.withRecordedAtIso({ _id: "x", recordedAt: 1762560000000 });
321
+ check("withRecordedAtIso: number recordedAt → ISO added", n.recordedAtIso === new Date(1762560000000).toISOString());
322
+ var big = b.auditTools.withRecordedAtIso({ _id: "x", recordedAt: 1762560000000n });
323
+ check("withRecordedAtIso: bigint recordedAt → ISO added", big.recordedAtIso === new Date(1762560000000).toISOString());
324
+ var inf = b.auditTools.withRecordedAtIso({ _id: "x", recordedAt: Infinity });
325
+ check("withRecordedAtIso: non-finite recordedAt → no ISO", inf.recordedAtIso === undefined);
326
+ var str = b.auditTools.withRecordedAtIso({ _id: "x", recordedAt: "2025" });
327
+ check("withRecordedAtIso: non-numeric recordedAt → unchanged", str.recordedAtIso === undefined);
328
+ }
329
+
330
+ // ---------------------------------------------------------------------------
331
+ // Integrated: real encrypted db + audit chain + signed checkpoint.
332
+ // ---------------------------------------------------------------------------
333
+ async function _seedAuditRows(count) {
334
+ b.audit.registerNamespace("test");
335
+ for (var i = 0; i < count; i++) {
336
+ await b.audit.record({ actor: { userId: "u-" + i }, action: "test.seeded", outcome: "success", metadata: { i: i } });
337
+ }
338
+ await b.audit.flush();
339
+ }
340
+
341
+ async function runIntegrated(root) {
342
+ var dir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-at-db-"));
343
+ var archiveDir = _freshOut(root, "archive");
344
+ var tornDown = false;
345
+ try {
346
+ await setupTestDb(dir);
347
+ await _seedAuditRows(6);
348
+ await b.audit.checkpoint();
349
+
350
+ var realRows = await b.clusterStorage.executeAll("SELECT * FROM audit_log ORDER BY monotonicCounter ASC");
351
+ check("seeded a real audit chain", realRows.length >= 6);
352
+ var firstCounter = Number(realRows[0].monotonicCounter);
353
+ var lastCounter = Number(realRows[realRows.length - 1].monotonicCounter);
354
+
355
+ // ---- archive happy path (default readers + signer + writer) ----
356
+ var arch = await b.auditTools.archive({ out: archiveDir, before: new Date(Date.now() + 3600000), passphrase: PASS });
357
+ check("archive: wrote a bundle with rowCount", arch.rowCount === realRows.length);
358
+ check("archive: manifest is archive kind", arch.manifest.kind === "archive");
359
+
360
+ // ---- verifyBundle happy variants ----
361
+ var ok = await b.auditTools.verifyBundle({ in: archiveDir, passphrase: PASS });
362
+ check("verifyBundle: archive verifies ok", ok.ok === true && ok.kind === "archive");
363
+ check("verifyBundle: rowsVerified matches", ok.rowsVerified === realRows.length);
364
+ var okRows = await b.auditTools.verifyBundle({ in: archiveDir, passphrase: PASS, includeRows: true });
365
+ check("verifyBundle: includeRows attaches decrypted rows", Array.isArray(okRows.rows) && okRows.rows.length === realRows.length);
366
+ var okNoSig = await b.auditTools.verifyBundle({ in: archiveDir, passphrase: PASS, verifyCheckpointSignature: false });
367
+ check("verifyBundle: signature check can be skipped", okNoSig.ok === true);
368
+ var badSig = await b.auditTools.verifyBundle({ in: archiveDir, passphrase: PASS, verifySignature: function () { return false; } });
369
+ check("verifyBundle: failing signature verifier → not ok", badSig.ok === false && /signature/.test(badSig.reason));
370
+
371
+ // ---- exportSlice happy (default readers, predecessor at chain origin) ----
372
+ var exportDir = _freshOut(root, "export");
373
+ var exp = await b.auditTools.exportSlice({ out: exportDir, from: 0, to: Date.now() + 3600000, passphrase: PASS });
374
+ check("exportSlice: wrote an export bundle", exp.manifest.kind === "export" && exp.rowCount === realRows.length);
375
+ var okExp = await b.auditTools.verifyBundle({ in: exportDir, passphrase: PASS });
376
+ check("verifyBundle: export bundle verifies ok", okExp.ok === true && okExp.kind === "export");
377
+
378
+ // ---- exportSlice with a predecessor beyond the chain origin (firstCounter>1) ----
379
+ if (realRows.length >= 3) {
380
+ var midDir = _freshOut(root, "mid");
381
+ var midRows = realRows.slice(2); // starts at counter firstCounter+2
382
+ var midExp = await b.auditTools.exportSlice({
383
+ out: midDir, passphrase: PASS,
384
+ readRows: function () { return Promise.resolve(midRows); },
385
+ });
386
+ check("exportSlice: mid-chain slice records a real predecessor hash",
387
+ midExp.manifest.range.predecessorRowHash === String(realRows[1].rowHash));
388
+ var okMid = await b.auditTools.verifyBundle({ in: midDir, passphrase: PASS });
389
+ check("verifyBundle: mid-chain slice verifies against its predecessor", okMid.ok === true);
390
+ }
391
+
392
+ // ---- rowHash break: a row whose content was mutated after hashing ----
393
+ var tamperedRows = realRows.map(function (r, idx) {
394
+ return idx === 1 ? Object.assign({}, r, { action: "TAMPERED-" + r.action }) : r;
395
+ });
396
+ var rhDir = _freshOut(root, "rowhash-break");
397
+ await b.auditTools.exportSlice({
398
+ out: rhDir, passphrase: PASS,
399
+ readRows: function () { return Promise.resolve(tamperedRows); },
400
+ readPredecessorRowHash: function () { return Promise.resolve(String(realRows[0].prevHash)); },
401
+ });
402
+ var rhRes = await b.auditTools.verifyBundle({ in: rhDir, passphrase: PASS });
403
+ check("verifyBundle: mutated row content → rowHash mismatch", rhRes.ok === false && /rowHash mismatch/.test(rhRes.reason));
404
+
405
+ // ---- prevHash break via tampered manifest predecessor witness ----
406
+ var pbDir = _copyBundle(archiveDir, _freshOut(root, "prevhash-break"));
407
+ _editManifest(pbDir, function (m) { m.range.predecessorRowHash = "f".repeat(128); });
408
+ var pbRes = await b.auditTools.verifyBundle({ in: pbDir, passphrase: PASS });
409
+ check("verifyBundle: wrong predecessor witness → prevHash mismatch", pbRes.ok === false && /prevHash mismatch/.test(pbRes.reason));
410
+
411
+ // ---- first/last rowHash disagreement with the manifest ----
412
+ var frDir = _copyBundle(archiveDir, _freshOut(root, "first-mismatch"));
413
+ _editManifest(frDir, function (m) { m.range.firstRowHash = "e".repeat(128); });
414
+ var frRes = await b.auditTools.verifyBundle({ in: frDir, passphrase: PASS });
415
+ check("verifyBundle: firstRowHash disagreement flagged", frRes.ok === false && /firstRowHash/.test(frRes.reason));
416
+ var lrDir = _copyBundle(archiveDir, _freshOut(root, "last-mismatch"));
417
+ _editManifest(lrDir, function (m) { m.range.lastRowHash = "e".repeat(128); });
418
+ var lrRes = await b.auditTools.verifyBundle({ in: lrDir, passphrase: PASS });
419
+ check("verifyBundle: lastRowHash disagreement flagged", lrRes.ok === false && /lastRowHash/.test(lrRes.reason));
420
+
421
+ // ---- checkpoint atMonotonicCounter below the slice tip (build-time inject) ----
422
+ if (realRows.length >= 2) {
423
+ var lowDir = _freshOut(root, "ckpt-low");
424
+ await b.auditTools.archive({
425
+ out: lowDir, before: new Date(Date.now() + 3600000), passphrase: PASS,
426
+ readRows: function () { return Promise.resolve(realRows); },
427
+ readCoveringCheckpoint: function () {
428
+ return Promise.resolve({ atMonotonicCounter: firstCounter, atRowHash: String(realRows[0].rowHash), publicKeyFingerprint: "fp", _id: "ck-low" });
429
+ },
430
+ });
431
+ var lowRes = await b.auditTools.verifyBundle({ in: lowDir, passphrase: PASS });
432
+ check("verifyBundle: checkpoint below lastCounter flagged", lowRes.ok === false && /atMonotonicCounter/.test(lowRes.reason));
433
+ }
434
+
435
+ // ---- checkpoint atRowHash not bound to the anchored slice row ----
436
+ var bindDir = _freshOut(root, "ckpt-unbound");
437
+ await b.auditTools.archive({
438
+ out: bindDir, before: new Date(Date.now() + 3600000), passphrase: PASS,
439
+ readRows: function () { return Promise.resolve(realRows); },
440
+ readCoveringCheckpoint: function () {
441
+ return Promise.resolve({ atMonotonicCounter: lastCounter, atRowHash: "f".repeat(128), publicKeyFingerprint: "fp", _id: "ck-unbound" });
442
+ },
443
+ });
444
+ var bindRes = await b.auditTools.verifyBundle({ in: bindDir, passphrase: PASS, verifyCheckpointSignature: false });
445
+ check("verifyBundle: checkpoint atRowHash not bound to slice flagged", bindRes.ok === false && /atRowHash does not match/.test(bindRes.reason));
446
+
447
+ // ---- checkpoint anchoring a counter NOT present in the bundle ----
448
+ // An attacker pairs a checkpoint claiming a high anchor counter with a
449
+ // slice that omits that row. Re-encrypt checkpoint.enc on a written copy
450
+ // with an anchor counter beyond every bundle row and refresh the manifest
451
+ // checksum so the read passes to the binding step.
452
+ var absentDir = _copyBundle(archiveDir, _freshOut(root, "anchor-absent"));
453
+ var forgedCkpt = await backupCrypto.encryptWithFreshSalt(
454
+ JSON.stringify({ atMonotonicCounter: lastCounter + 5, atRowHash: "a".repeat(128) }), PASS);
455
+ fs.writeFileSync(path.join(absentDir, "checkpoint.enc"), forgedCkpt.encrypted);
456
+ _editManifest(absentDir, function (m) {
457
+ m.salts.checkpoint = forgedCkpt.salt;
458
+ m.checksum.checkpointSha3_512 = backupCrypto.checksum(forgedCkpt.encrypted);
459
+ m.checkpoint.atMonotonicCounter = lastCounter + 5;
460
+ });
461
+ var absentRes = await b.auditTools.verifyBundle({ in: absentDir, passphrase: PASS, verifyCheckpointSignature: false });
462
+ check("verifyBundle: checkpoint anchoring an absent counter is unbound",
463
+ absentRes.ok === false && /no such row is present/.test(absentRes.reason));
464
+
465
+ // ---- _readBundle corrupt-blob rejections (tamper written copies) ----
466
+ var rcDir = _copyBundle(archiveDir, _freshOut(root, "rows-checksum"));
467
+ _flipByte(path.join(rcDir, "rows.enc"));
468
+ check("verifyBundle: tampered rows.enc → checksum mismatch",
469
+ await _expectCode(function () { return b.auditTools.verifyBundle({ in: rcDir, passphrase: PASS }); }, "audit-tools/rows-checksum-mismatch"));
470
+
471
+ var nrDir = _copyBundle(archiveDir, _freshOut(root, "no-rows"));
472
+ fs.rmSync(path.join(nrDir, "rows.enc"));
473
+ check("verifyBundle: missing rows.enc rejected",
474
+ await _expectCode(function () { return b.auditTools.verifyBundle({ in: nrDir, passphrase: PASS }); }, "audit-tools/no-rows-blob"));
475
+
476
+ var nmDir = _freshOut(root, "no-manifest");
477
+ fs.mkdirSync(nmDir, { recursive: true });
478
+ check("verifyBundle: missing manifest rejected",
479
+ await _expectCode(function () { return b.auditTools.verifyBundle({ in: nmDir, passphrase: PASS }); }, "audit-tools/no-manifest"));
480
+
481
+ var tmDir = _freshOut(root, "manifest-too-large");
482
+ fs.mkdirSync(tmDir, { recursive: true });
483
+ fs.writeFileSync(path.join(tmDir, "manifest.json"), Buffer.alloc(5242880, 0x61)); // 5 MiB > 4 MiB cap
484
+ check("verifyBundle: oversized manifest rejected",
485
+ await _expectCode(function () { return b.auditTools.verifyBundle({ in: tmDir, passphrase: PASS }); }, "audit-tools/bad-format"));
486
+
487
+ var bfDir = _copyBundle(archiveDir, _freshOut(root, "bad-format"));
488
+ _editManifest(bfDir, function (m) { m.format = "not-a-blamejs-bundle"; });
489
+ check("verifyBundle: wrong manifest format rejected",
490
+ await _expectCode(function () { return b.auditTools.verifyBundle({ in: bfDir, passphrase: PASS }); }, "audit-tools/bad-format"));
491
+
492
+ var bkDir = _copyBundle(archiveDir, _freshOut(root, "bad-kind"));
493
+ _editManifest(bkDir, function (m) { m.kind = "bogus"; });
494
+ check("verifyBundle: unknown manifest kind rejected",
495
+ await _expectCode(function () { return b.auditTools.verifyBundle({ in: bkDir, passphrase: PASS }); }, "audit-tools/bad-kind"));
496
+
497
+ var ncDir = _copyBundle(archiveDir, _freshOut(root, "no-ckpt"));
498
+ fs.rmSync(path.join(ncDir, "checkpoint.enc"));
499
+ check("verifyBundle: archive missing checkpoint.enc rejected",
500
+ await _expectCode(function () { return b.auditTools.verifyBundle({ in: ncDir, passphrase: PASS }); }, "audit-tools/no-checkpoint-blob"));
501
+
502
+ var ccDir = _copyBundle(archiveDir, _freshOut(root, "ckpt-checksum"));
503
+ _flipByte(path.join(ccDir, "checkpoint.enc"));
504
+ check("verifyBundle: tampered checkpoint.enc → checksum mismatch",
505
+ await _expectCode(function () { return b.auditTools.verifyBundle({ in: ccDir, passphrase: PASS }); }, "audit-tools/checkpoint-checksum-mismatch"));
506
+
507
+ var ctDir = _copyBundle(archiveDir, _freshOut(root, "ckpt-too-large"));
508
+ fs.writeFileSync(path.join(ctDir, "checkpoint.enc"), Buffer.alloc(5242880, 0x62)); // 5 MiB > 4 MiB cap
509
+ check("verifyBundle: oversized checkpoint.enc rejected",
510
+ await _expectCode(function () { return b.auditTools.verifyBundle({ in: ctDir, passphrase: PASS }); }, "audit-tools/checkpoint-too-large"));
511
+
512
+ check("verifyBundle: nonexistent bundle dir rejected",
513
+ await _expectCode(function () { return b.auditTools.verifyBundle({ in: path.join(root, "does-not-exist"), passphrase: PASS }); }, "audit-tools/no-bundle"));
514
+
515
+ // ---- _defaultReadPredecessorRowHash: ungrounded predecessor throws ----
516
+ check("exportSlice: ungrounded predecessor rejected",
517
+ await _expectCode(function () {
518
+ return b.auditTools.exportSlice({
519
+ out: _freshOut(root, "ungrounded"), passphrase: PASS,
520
+ readRows: function () { return Promise.resolve([Object.assign({}, realRows[0], { monotonicCounter: 999999 })]); },
521
+ });
522
+ }, "audit-tools/no-predecessor"));
523
+
524
+ // ---- purge refusal paths (no db mutation) ----
525
+ check("purge: unverified archive rejected",
526
+ await _expectCode(function () { return b.auditTools.purge({ confirm: true, archive: pbDir, passphrase: PASS }); }, "audit-tools/archive-not-ok"));
527
+ check("purge: non-archive bundle kind rejected",
528
+ await _expectCode(function () { return b.auditTools.purge({ confirm: true, archive: exportDir, passphrase: PASS }); }, "audit-tools/wrong-kind"));
529
+ check("purge: predecessor not matching prior anchor rejected",
530
+ await _expectCode(function () {
531
+ return b.auditTools.purge({
532
+ confirm: true, archive: archiveDir, passphrase: PASS,
533
+ readAnchor: function () { return Promise.resolve({ lastPurgedCounter: firstCounter - 1, lastPurgedRowHash: "d".repeat(128) }); },
534
+ apply: function () { return Promise.resolve({ rowsDeleted: 0, checkpointsDeleted: 0, archiveBundleId: "x" }); },
535
+ });
536
+ }, "audit-tools/anchor-mismatch"));
537
+
538
+ // ---- dual-control gate refusals + a consumed-grant success (injected apply) ----
539
+ var gate = function () { return { m: 2, n: 3 }; };
540
+ check("purge: dual control without a grant rejected",
541
+ await _expectCode(function () {
542
+ return b.auditTools.purge({ confirm: true, archive: archiveDir, passphrase: PASS, checkDualControlGate: gate });
543
+ }, "audit-tools/dual-control-required"));
544
+ check("purge: not-ready grant rejected",
545
+ await _expectCode(function () {
546
+ return b.auditTools.purge({ confirm: true, archive: archiveDir, passphrase: PASS, checkDualControlGate: gate, dualControlGrant: { ready: false, action: "auditTools.purge" } });
547
+ }, "audit-tools/dual-control-grant-not-ready"));
548
+ check("purge: grant bound to a different action rejected",
549
+ await _expectCode(function () {
550
+ return b.auditTools.purge({ confirm: true, archive: archiveDir, passphrase: PASS, checkDualControlGate: gate, dualControlGrant: { ready: true, action: "db.eraseHard" } });
551
+ }, "audit-tools/dual-control-grant-mismatch"));
552
+ var gateOk = await b.auditTools.purge({
553
+ confirm: true, archive: archiveDir, passphrase: PASS, checkDualControlGate: gate,
554
+ dualControlGrant: { ready: true, action: "auditTools.purge" },
555
+ readAnchor: function () { return Promise.resolve(null); },
556
+ apply: function () { return Promise.resolve({ rowsDeleted: realRows.length, checkpointsDeleted: 1, archiveBundleId: "gid" }); },
557
+ });
558
+ check("purge: consumed dual-control grant proceeds", gateOk.purged === true && gateOk.dualControlConsumed === true);
559
+
560
+ // ---- real purge (default anchor read + apply) mutates the chain ----
561
+ var purged = await b.auditTools.purge({ confirm: true, archive: archiveDir, passphrase: PASS });
562
+ check("purge: real purge deletes live rows", purged.purged === true && purged.rowsDeleted > 0);
563
+ check("purge: reports no dual-control consumed (gate not declared)", purged.dualControlConsumed === false);
564
+
565
+ // ---- second purge of the same bundle is now non-monotonic ----
566
+ check("purge: replay against a set anchor is non-monotonic",
567
+ await _expectCode(function () { return b.auditTools.purge({ confirm: true, archive: archiveDir, passphrase: PASS }); }, "audit-tools/non-monotonic-purge"));
568
+
569
+ // ---- _defaultReadPredecessorRowHash anchor branch: predecessor purged ----
570
+ await _seedAuditRows(2);
571
+ var postRows = await b.clusterStorage.executeAll("SELECT * FROM audit_log ORDER BY monotonicCounter ASC");
572
+ if (postRows.length) {
573
+ var pDir = _freshOut(root, "post-purge");
574
+ var postExp = await b.auditTools.exportSlice({
575
+ out: pDir, passphrase: PASS,
576
+ readRows: function () { return Promise.resolve(postRows); },
577
+ });
578
+ // The predecessor for a slice whose first row sits right after a purged
579
+ // range resolves through the purge anchor's lastPurgedRowHash rather than
580
+ // a (now-deleted) predecessor row — the branch under test here.
581
+ check("exportSlice: predecessor resolves via the purge anchor",
582
+ postExp.manifest.range.predecessorRowHash === String(purged.lastPurgedRowHash));
583
+ // documents current behavior: after an in-process purge empties audit_log,
584
+ // subsequently-recorded rows restart their prevHash at ZERO_HASH (the live
585
+ // chain resumes from an empty table), so a slice of those rows chain-walks
586
+ // to a prevHash discontinuity against the anchor predecessor. The chain
587
+ // resume semantics live in the audit module, not audit-tools.
588
+ var okPost = await b.auditTools.verifyBundle({ in: pDir, passphrase: PASS });
589
+ check("verifyBundle: post-purge live rows restart the chain (discontinuity surfaced)",
590
+ okPost.ok === false && /prevHash mismatch/.test(okPost.reason));
591
+ }
592
+
593
+ // ---- teardown, then verify without a live signer: default verifier
594
+ // catches the un-initialized audit-sign keypair and reports not-ok. ----
595
+ await teardownTestDb(dir);
596
+ tornDown = true;
597
+ var noSigner = await b.auditTools.verifyBundle({ in: exportDir, passphrase: PASS });
598
+ check("verifyBundle: export still verifies with no live signer", noSigner.ok === true);
599
+ } finally {
600
+ if (!tornDown) { try { await teardownTestDb(dir); } catch (_e) {} }
601
+ try { fs.rmSync(dir, { recursive: true, force: true }); } catch (_e) {}
602
+ }
603
+ }
604
+
605
+ async function run() {
606
+ var root = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-at-"));
607
+ try {
608
+ await runInputValidation(root);
609
+ await runReaderInjectedErrors(root);
610
+ await runCadfMapping();
611
+ await runForensicSuccess(root);
612
+ runWithRecordedAtIso();
613
+ await runIntegrated(root);
614
+ } finally {
615
+ try { fs.rmSync(root, { recursive: true, force: true }); } catch (_e) {}
616
+ }
617
+ console.log("OK — audit-tools tests");
618
+ }
619
+
620
+ module.exports = { run: run };
621
+ if (require.main === module) {
622
+ run().then(function () { process.exit(0); })
623
+ .catch(function (err) { process.exitCode = 1; throw err; });
624
+ }