@blamejs/blamejs-shop 0.5.19 → 0.5.21

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 (194) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +1 -0
  3. package/SECURITY.md +17 -0
  4. package/lib/addresses.js +2 -2
  5. package/lib/admin.js +49 -45
  6. package/lib/affiliates.js +7 -23
  7. package/lib/announcement-bar.js +5 -22
  8. package/lib/api-keys.js +4 -13
  9. package/lib/asset-manifest.json +1 -1
  10. package/lib/banner-ab-tests.js +5 -9
  11. package/lib/blog-articles.js +8 -26
  12. package/lib/captcha-gate.js +7 -17
  13. package/lib/carrier-accounts.js +3 -10
  14. package/lib/catalog-drafts.js +5 -12
  15. package/lib/category-navigation.js +4 -20
  16. package/lib/cms-blocks.js +4 -7
  17. package/lib/compliance-export.js +4 -11
  18. package/lib/consent-ledger.js +2 -4
  19. package/lib/cost-layers.js +56 -21
  20. package/lib/customer-import.js +2 -2
  21. package/lib/customer-notes.js +7 -23
  22. package/lib/customer-roles.js +3 -5
  23. package/lib/customer-segments.js +17 -14
  24. package/lib/customer-surveys.js +7 -14
  25. package/lib/customers.js +2 -4
  26. package/lib/dispute-resolution.js +5 -13
  27. package/lib/dropship-forwarding.js +3 -5
  28. package/lib/dunning.js +2 -7
  29. package/lib/email-ab-tests.js +4 -8
  30. package/lib/email-campaigns.js +25 -14
  31. package/lib/email-warmup.js +2 -7
  32. package/lib/experiments.js +6 -10
  33. package/lib/externaldb-d1.js +78 -44
  34. package/lib/geolocation.js +18 -28
  35. package/lib/gift-options.js +5 -23
  36. package/lib/knowledge-base.js +7 -22
  37. package/lib/line-gift-wrap.js +3 -17
  38. package/lib/live-chat.js +5 -18
  39. package/lib/metered-usage.js +3 -8
  40. package/lib/notifications.js +3 -7
  41. package/lib/operator-accounts.js +3 -5
  42. package/lib/operator-approvals.js +6 -8
  43. package/lib/operator-audit-log.js +2 -7
  44. package/lib/operator-help-center.js +5 -21
  45. package/lib/operator-inbox.js +4 -11
  46. package/lib/operator-roles.js +5 -7
  47. package/lib/order-escalation.js +2 -2
  48. package/lib/order-export.js +24 -20
  49. package/lib/order-notes.js +4 -14
  50. package/lib/order-ratings.js +4 -10
  51. package/lib/payment-methods.js +5 -13
  52. package/lib/payment-retries.js +2 -7
  53. package/lib/payment.js +103 -58
  54. package/lib/pixel-events.js +8 -23
  55. package/lib/plan-changes.js +2 -7
  56. package/lib/product-qa.js +4 -8
  57. package/lib/promo-banners.js +7 -15
  58. package/lib/purchase-orders.js +3 -6
  59. package/lib/push-notifications.js +7 -32
  60. package/lib/pwa-manifest.js +6 -11
  61. package/lib/quotes.js +5 -9
  62. package/lib/referrals.js +10 -6
  63. package/lib/reviews.js +4 -10
  64. package/lib/robots-config.js +6 -14
  65. package/lib/sales-tax-filings.js +2 -2
  66. package/lib/search-facets.js +5 -5
  67. package/lib/search-ranking.js +4 -7
  68. package/lib/search-synonyms.js +7 -21
  69. package/lib/security-middleware.js +125 -70
  70. package/lib/seller-signup.js +10 -26
  71. package/lib/sidebar-widgets.js +6 -15
  72. package/lib/site-redirects.js +49 -137
  73. package/lib/sitemap-generator.js +3 -7
  74. package/lib/sms-dispatcher.js +7 -23
  75. package/lib/stock-receipts.js +4 -10
  76. package/lib/storefront-dashboards.js +2 -10
  77. package/lib/storefront-forms.js +9 -22
  78. package/lib/storefront-pages.js +6 -20
  79. package/lib/storefront.js +21 -23
  80. package/lib/subscription-billing.js +3 -8
  81. package/lib/subscription-controls.js +2 -7
  82. package/lib/suggestion-box.js +9 -26
  83. package/lib/support-tickets.js +6 -24
  84. package/lib/tax-remittance.js +2 -2
  85. package/lib/tenants.js +2 -7
  86. package/lib/text-guard.js +137 -35
  87. package/lib/theme-assets.js +4 -16
  88. package/lib/translations.js +3 -6
  89. package/lib/trust-badges.js +4 -7
  90. package/lib/vendor/MANIFEST.json +107 -97
  91. package/lib/vendor/blamejs/CHANGELOG.md +180 -0
  92. package/lib/vendor/blamejs/NOTICE +14 -10
  93. package/lib/vendor/blamejs/README.md +17 -5
  94. package/lib/vendor/blamejs/index.js +2 -0
  95. package/lib/vendor/blamejs/lib/acme.js +9 -9
  96. package/lib/vendor/blamejs/lib/api-snapshot.js +35 -16
  97. package/lib/vendor/blamejs/lib/app-shutdown.js +1 -1
  98. package/lib/vendor/blamejs/lib/archive-adapters.js +1 -1
  99. package/lib/vendor/blamejs/lib/archive.js +13 -24
  100. package/lib/vendor/blamejs/lib/auth/access-lock.js +2 -1
  101. package/lib/vendor/blamejs/lib/auth/bot-challenge.js +3 -6
  102. package/lib/vendor/blamejs/lib/auth/ciba.js +32 -3
  103. package/lib/vendor/blamejs/lib/auth/oauth.js +65 -8
  104. package/lib/vendor/blamejs/lib/auth/password.js +1 -1
  105. package/lib/vendor/blamejs/lib/auth/saml.js +21 -3
  106. package/lib/vendor/blamejs/lib/auth-bot-challenge.js +3 -3
  107. package/lib/vendor/blamejs/lib/backup/index.js +5 -5
  108. package/lib/vendor/blamejs/lib/case-fold-classes.js +491 -0
  109. package/lib/vendor/blamejs/lib/codepoint-class.js +131 -0
  110. package/lib/vendor/blamejs/lib/constants.js +79 -0
  111. package/lib/vendor/blamejs/lib/db-declare-view.js +8 -2
  112. package/lib/vendor/blamejs/lib/error-page.js +20 -1
  113. package/lib/vendor/blamejs/lib/external-db.js +5 -1
  114. package/lib/vendor/blamejs/lib/flag-evaluation-context.js +24 -6
  115. package/lib/vendor/blamejs/lib/flag.js +28 -2
  116. package/lib/vendor/blamejs/lib/framework-schema.js +14 -3
  117. package/lib/vendor/blamejs/lib/guard-regex.js +2345 -89
  118. package/lib/vendor/blamejs/lib/http-client.js +217 -40
  119. package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
  120. package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +3 -2
  121. package/lib/vendor/blamejs/lib/mail-dav.js +26 -26
  122. package/lib/vendor/blamejs/lib/mail-deploy.js +10 -10
  123. package/lib/vendor/blamejs/lib/mail-scan.js +3 -0
  124. package/lib/vendor/blamejs/lib/mail-store.js +7 -1
  125. package/lib/vendor/blamejs/lib/mail.js +5 -1
  126. package/lib/vendor/blamejs/lib/middleware/age-gate.js +3 -2
  127. package/lib/vendor/blamejs/lib/middleware/api-encrypt.js +1 -1
  128. package/lib/vendor/blamejs/lib/middleware/assetlinks.js +2 -1
  129. package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +3 -2
  130. package/lib/vendor/blamejs/lib/middleware/bearer-auth.js +2 -1
  131. package/lib/vendor/blamejs/lib/middleware/compression.js +1 -1
  132. package/lib/vendor/blamejs/lib/middleware/cors.js +1 -1
  133. package/lib/vendor/blamejs/lib/middleware/csp-report.js +5 -5
  134. package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +2 -1
  135. package/lib/vendor/blamejs/lib/middleware/daily-byte-quota.js +2 -2
  136. package/lib/vendor/blamejs/lib/middleware/deny-response.js +2 -1
  137. package/lib/vendor/blamejs/lib/middleware/dpop.js +2 -2
  138. package/lib/vendor/blamejs/lib/middleware/fetch-metadata.js +2 -1
  139. package/lib/vendor/blamejs/lib/middleware/flag-context.js +17 -0
  140. package/lib/vendor/blamejs/lib/middleware/idempotency-key.js +10 -8
  141. package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +3 -2
  142. package/lib/vendor/blamejs/lib/middleware/require-aal.js +3 -2
  143. package/lib/vendor/blamejs/lib/middleware/require-auth.js +4 -3
  144. package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +4 -3
  145. package/lib/vendor/blamejs/lib/middleware/require-content-type.js +3 -2
  146. package/lib/vendor/blamejs/lib/middleware/require-methods.js +3 -2
  147. package/lib/vendor/blamejs/lib/middleware/require-mtls.js +3 -2
  148. package/lib/vendor/blamejs/lib/middleware/security-txt.js +2 -1
  149. package/lib/vendor/blamejs/lib/middleware/web-app-manifest.js +2 -1
  150. package/lib/vendor/blamejs/lib/network-dns-resolver.js +1 -1
  151. package/lib/vendor/blamejs/lib/network-dns.js +3 -3
  152. package/lib/vendor/blamejs/lib/network-nts.js +35 -14
  153. package/lib/vendor/blamejs/lib/network-proxy.js +42 -4
  154. package/lib/vendor/blamejs/lib/network-smtp-policy.js +1 -1
  155. package/lib/vendor/blamejs/lib/network-tls.js +341 -11
  156. package/lib/vendor/blamejs/lib/nist-crosswalk.js +2 -2
  157. package/lib/vendor/blamejs/lib/ntp-check.js +30 -19
  158. package/lib/vendor/blamejs/lib/object-store/azure-blob.js +1 -1
  159. package/lib/vendor/blamejs/lib/object-store/gcs.js +1 -1
  160. package/lib/vendor/blamejs/lib/object-store/http-put.js +2 -1
  161. package/lib/vendor/blamejs/lib/object-store/sigv4-bucket-ops.js +5 -5
  162. package/lib/vendor/blamejs/lib/object-store/sigv4.js +2 -2
  163. package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +4 -2
  164. package/lib/vendor/blamejs/lib/openapi.js +1 -1
  165. package/lib/vendor/blamejs/lib/pqc-agent.js +4 -7
  166. package/lib/vendor/blamejs/lib/problem-details.js +2 -1
  167. package/lib/vendor/blamejs/lib/redis-client.js +12 -1
  168. package/lib/vendor/blamejs/lib/regex-linear.js +1349 -0
  169. package/lib/vendor/blamejs/lib/render.js +531 -7
  170. package/lib/vendor/blamejs/lib/request-helpers.js +181 -5
  171. package/lib/vendor/blamejs/lib/router.js +37 -13
  172. package/lib/vendor/blamejs/lib/safe-async.js +142 -0
  173. package/lib/vendor/blamejs/lib/safe-icap.js +3 -0
  174. package/lib/vendor/blamejs/lib/safe-sql.js +15 -3
  175. package/lib/vendor/blamejs/lib/self-update.js +2 -2
  176. package/lib/vendor/blamejs/lib/testing.js +54 -7
  177. package/lib/vendor/blamejs/lib/validate-opts.js +56 -0
  178. package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +62 -25
  179. package/lib/vendor/blamejs/lib/vendor/blamejs-pki.cjs +2004 -142
  180. package/lib/vendor/blamejs/lib/vendor/browser/noble-ciphers.mjs +727 -0
  181. package/lib/vendor/blamejs/lib/vendor/browser/noble-hashes.mjs +1070 -0
  182. package/lib/vendor/blamejs/lib/vendor/browser/noble-post-quantum.mjs +1090 -0
  183. package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +510 -227
  184. package/lib/vendor/blamejs/lib/webhook-hmac.js +19 -2
  185. package/lib/vendor/blamejs/lib/webhook.js +1 -1
  186. package/lib/vendor/blamejs/lib/ws-client.js +24 -2
  187. package/lib/vendor/blamejs/package.json +1 -1
  188. package/lib/vendor/blamejs/sbom.cdx.json +6 -6
  189. package/lib/vendor-invoices.js +3 -6
  190. package/lib/vendors.js +5 -19
  191. package/lib/webhook-receiver.js +46 -83
  192. package/lib/webhook-subscriptions.js +3 -13
  193. package/lib/wishlist-sharing.js +5 -10
  194. package/package.json +1 -1
@@ -262,10 +262,10 @@ function bodyRes() {
262
262
 
263
263
  /**
264
264
  * @primitive b.testing.streamingRes
265
- * @signature b.testing.streamingRes()
265
+ * @signature b.testing.streamingRes(opts?)
266
266
  * @since 0.1.0
267
267
  * @status stable
268
- * @related b.testing.mockRes, b.testing.bodyRes
268
+ * @related b.testing.mockRes, b.testing.bodyRes, b.render.stream
269
269
  *
270
270
  * Build an EventEmitter-backed response that buffers every `write()`
271
271
  * chunk into `res._chunks` and exposes `res._captured()` as a single
@@ -273,6 +273,16 @@ function bodyRes() {
273
273
  * via repeated `res.write(chunk)` calls (gzip, server-sent events,
274
274
  * NDJSON producers, range responses).
275
275
  *
276
+ * Pass `highWaterMark` to exercise back-pressure. Without it `write()`
277
+ * always returns `true`, which is the one thing a real socket does not
278
+ * do — so a consumer that discards the return value and buffers without
279
+ * limit looks correct here and fails against a slow client. With it the
280
+ * double reports "full" once that many bytes are outstanding and emits
281
+ * `drain` on the next tick, which is the sequence a real socket produces.
282
+ *
283
+ * @opts
284
+ * highWaterMark: 0, // bytes outstanding before write() returns false; 0 disables
285
+ *
276
286
  * @example
277
287
  * var res = b.testing.streamingRes();
278
288
  * res.writeHead(200, { "content-type": "application/octet-stream" });
@@ -281,9 +291,21 @@ function bodyRes() {
281
291
  * res.end();
282
292
  * res._captured().toString("utf8"); // → "hello"
283
293
  * res._statusCode; // → 200
294
+ *
295
+ * var slow = b.testing.streamingRes({ highWaterMark: 4 });
296
+ * slow.write("12345"); // → false, then emits "drain"
284
297
  */
285
- function streamingRes() {
298
+ function streamingRes(opts) {
299
+ opts = opts || {};
300
+ var highWaterMark = opts.highWaterMark === undefined ? 0 : opts.highWaterMark;
301
+ if (typeof highWaterMark !== "number" || !isFinite(highWaterMark) || highWaterMark < 0) {
302
+ throw new TypeError("testing.streamingRes: opts.highWaterMark must be a non-negative number");
303
+ }
286
304
  var res = new EventEmitter();
305
+ res._drainedAt = 0;
306
+ res._written = 0;
307
+ res._pending = 0;
308
+ res._drainScheduled = false;
287
309
  res._chunks = [];
288
310
  res._headers = {};
289
311
  res._statusCode = 200;
@@ -305,9 +327,34 @@ function streamingRes() {
305
327
  res.getHeader = function (k) { return res._headers[k.toLowerCase()]; };
306
328
  res.removeHeader = function (k) { delete res._headers[k.toLowerCase()]; };
307
329
  res.write = function (chunk) {
308
- if (Buffer.isBuffer(chunk)) res._chunks.push(chunk);
309
- else if (typeof chunk === "string") res._chunks.push(Buffer.from(chunk));
310
- return true;
330
+ // The running total, counted as each chunk arrives. Asking `_captured()`
331
+ // for it concatenated every chunk written so far, so a test that streamed
332
+ // many small ones copied the whole response for each — quadratic in the
333
+ // output, in the very helper written to test streaming a lot of it.
334
+ if (Buffer.isBuffer(chunk)) { res._chunks.push(chunk); res._written += chunk.length; }
335
+ else if (typeof chunk === "string") {
336
+ var encoded = Buffer.from(chunk);
337
+ res._chunks.push(encoded);
338
+ res._written += encoded.length;
339
+ }
340
+ // Always returning true left the back-pressure path untestable: a consumer
341
+ // that ignores the return value looks correct against this double and
342
+ // buffers without limit against a slow client. With a highWaterMark the
343
+ // double says "full" once that many bytes are outstanding and emits
344
+ // `drain` on the next tick, which is the sequence a real socket produces.
345
+ if (highWaterMark <= 0) return true;
346
+ res._pending = res._written - res._drainedAt;
347
+ if (res._pending < highWaterMark) return true;
348
+ if (!res._drainScheduled) {
349
+ res._drainScheduled = true;
350
+ setImmediate(function () {
351
+ res._drainScheduled = false;
352
+ res._drainedAt = res._written;
353
+ res._pending = 0;
354
+ res.emit("drain");
355
+ });
356
+ }
357
+ return false;
311
358
  };
312
359
  res.end = function (chunk) {
313
360
  if (chunk != null) res.write(chunk);
@@ -940,7 +987,7 @@ function request(target) {
940
987
  if (target && typeof target.handle === "function") {
941
988
  server = http.createServer(function (req, res) {
942
989
  Promise.resolve(target.handle(req, res)).catch(function (err) {
943
- if (!res.headersSent) res.writeHead(500, { "Content-Type": "text/plain" });
990
+ if (!res.headersSent) res.writeHead(C.HTTP.STATUS.INTERNAL_SERVER_ERROR, { "Content-Type": "text/plain" });
944
991
  try { res.end((err && err.message) || "Internal Server Error"); } catch (_e) { /* response may already be ended */ }
945
992
  });
946
993
  });
@@ -572,6 +572,61 @@ function assignOwnEnumerable(target, source, reservedKeys) {
572
572
  return Object.assign(target, Object.fromEntries(entries));
573
573
  }
574
574
 
575
+ // outboundHttpOpts — the `{ client, allowedHosts }` an operator hands a
576
+ // primitive that dials out on their behalf.
577
+ //
578
+ // A consumer that already owns an instrumented HTTP client — one circuit
579
+ // breaker, one retry policy, one transcript their tests drive — otherwise has
580
+ // every dial a framework primitive makes fall outside all of it, and no way to
581
+ // narrow a mangled or attacker-influenced base URL down to the host they
582
+ // expect. Both halves default to the framework's behaviour: an absent `client`
583
+ // means the caller's own default, an absent `allowedHosts` means the SSRF gate
584
+ // alone. Naming one is a NARROWING, never a widening.
585
+ //
586
+ // `client` is duck-typed on `request` so a consumer's wrapper qualifies without
587
+ // inheriting from anything. `allowedHosts` is passed through to
588
+ // `b.httpClient.request`, which already enforces it.
589
+ //
590
+ // Returns `{ client, allowedHosts }`, each null when not supplied. Codes are
591
+ // derived from `codePrefix` so each primitive keeps its own error namespace:
592
+ // `<prefix>/bad-http`, `<prefix>/bad-http-client`,
593
+ // `<prefix>/bad-http-allowed-hosts`.
594
+ function outboundHttpOpts(value, callerLabel, errorClass, codePrefix) {
595
+ var label = callerLabel || "opts";
596
+ var prefix = codePrefix || "validate-opts";
597
+ if (value === undefined || value === null) return { client: null, allowedHosts: null };
598
+ optionalPlainObject(value, label + ": http", errorClass, prefix + "/bad-http",
599
+ "must be a plain object of { client, allowedHosts }");
600
+ var known = { client: true, allowedHosts: true };
601
+ var keys = Object.keys(value);
602
+ for (var i = 0; i < keys.length; i += 1) {
603
+ if (!Object.prototype.hasOwnProperty.call(known, keys[i])) {
604
+ _throw(errorClass, prefix + "/bad-http",
605
+ label + ": http has unknown option '" + keys[i] +
606
+ "' — expected client, allowedHosts",
607
+ "validate-opts/bad-http");
608
+ }
609
+ }
610
+ optionalObjectWithMethod(value.client, "request", label + ": http.client",
611
+ errorClass, prefix + "/bad-http-client",
612
+ "must be a b.httpClient-shaped object (request fn)");
613
+ optionalNonEmptyStringArray(value.allowedHosts, label + ": http.allowedHosts",
614
+ errorClass, prefix + "/bad-http-allowed-hosts");
615
+ if (value.allowedHosts !== undefined && value.allowedHosts !== null &&
616
+ value.allowedHosts.length === 0) {
617
+ // An empty pin reads as "allow nothing" but would behave as "no pin at
618
+ // all" downstream — refuse it rather than let it quietly widen.
619
+ _throw(errorClass, prefix + "/bad-http-allowed-hosts",
620
+ label + ": http.allowedHosts must name at least one host",
621
+ "validate-opts/bad-http-allowed-hosts");
622
+ }
623
+ return {
624
+ client: value.client || null,
625
+ allowedHosts: (value.allowedHosts && value.allowedHosts.length)
626
+ ? value.allowedHosts.slice() : null,
627
+ };
628
+ }
629
+
575
630
  // observabilityShape — operator-supplied `opts.observability` must
576
631
  // expose an `event` function. Parallel to auditShape; the n=1 catalog
577
632
  // tracks both inline-shape regexes.
@@ -599,6 +654,7 @@ module.exports.optionalNonEmptyString = optionalNonEmptyString;
599
654
  module.exports.optionalNonEmptyStringArray = optionalNonEmptyStringArray;
600
655
  module.exports.optionalObjectWithMethod = optionalObjectWithMethod;
601
656
  module.exports.optionalPlainObject = optionalPlainObject;
657
+ module.exports.outboundHttpOpts = outboundHttpOpts;
602
658
  module.exports.requireNonEmptyString = requireNonEmptyString;
603
659
  module.exports.observabilityShape = observabilityShape;
604
660
  module.exports.requireObject = requireObject;
@@ -6,19 +6,49 @@
6
6
  "license": "MIT",
7
7
  "author": "Paul Miller",
8
8
  "source": "https://github.com/paulmillr/noble-ciphers",
9
+ "_about": "The server and browser bundles are built from ONE npm install in a single vendor-update run, so the two halves of a hybrid exchange cannot be different versions of the same cipher. One `version` field covers both files.",
9
10
  "exports": [
10
11
  "xchacha20poly1305"
11
12
  ],
12
13
  "files": {
13
- "server": "lib/vendor/noble-ciphers.cjs"
14
+ "server": "lib/vendor/noble-ciphers.cjs",
15
+ "browser": "lib/vendor/browser/noble-ciphers.mjs"
14
16
  },
15
- "bundler": "esbuild --format=cjs --platform=node",
16
- "bundledAt": "2026-08-08T00:00:00Z",
17
+ "bundler": "esbuild --format=cjs --platform=node (server), esbuild --format=esm --platform=browser (browser)",
18
+ "bundledAt": "2026-08-10T00:00:00Z",
17
19
  "cpe": "cpe:2.3:a:paulmillr:noble-ciphers:2.3.0:*:*:*:*:node.js:*:*",
18
20
  "hashes": {
19
- "server": "sha256:f3325f480cb8eb814fcb0baaa19336cbbf2b993f48624c6aa9600ffd69d0be5e"
21
+ "server": "sha256:f3325f480cb8eb814fcb0baaa19336cbbf2b993f48624c6aa9600ffd69d0be5e",
22
+ "browser": "sha256:0ffd91540bcb586a29b56e52ee1c29df69097b50776beb4036a07558f7a4e12e"
20
23
  },
21
- "refreshedAt": "2026-08-08T08:35:00.179Z"
24
+ "refreshedAt": "2026-08-10T18:39:35.028Z"
25
+ },
26
+ "@noble/hashes": {
27
+ "version": "2.3.0",
28
+ "license": "MIT",
29
+ "author": "Paul Miller",
30
+ "source": "https://github.com/paulmillr/noble-hashes",
31
+ "_about": "Browser build only. The server side reaches SHAKE256, SHA3-512, HMAC and HKDF through node:crypto, which has carried all four since the Node floor — a .cjs here would be a bundle nothing requires. A browser has no node:crypto, so the client half of a hybrid exchange needs its own copy, and this is the one blamejs owns, hashes, currency-checks and lists in its SBOM rather than a second vendoring path maintained consumer-side. The version matches the copy that @noble/curves and @noble/post-quantum already inline, so the browser hash and the hash inside the server's PQC bundle are the same code.",
32
+ "exports": [
33
+ "shake128",
34
+ "shake256",
35
+ "sha3_256",
36
+ "sha3_512",
37
+ "sha256",
38
+ "sha512",
39
+ "hmac",
40
+ "hkdf"
41
+ ],
42
+ "files": {
43
+ "browser": "lib/vendor/browser/noble-hashes.mjs"
44
+ },
45
+ "bundler": "esbuild --format=esm --platform=browser (browser only)",
46
+ "bundledAt": "2026-08-10T00:00:00Z",
47
+ "cpe": "cpe:2.3:a:paulmillr:noble-hashes:2.3.0:*:*:*:*:node.js:*:*",
48
+ "hashes": {
49
+ "browser": "sha256:dfe4b7ae3c9880e388c8da4b68f44742b229b53afacd1e674179527e33da62b0"
50
+ },
51
+ "refreshedAt": "2026-08-10T18:39:35.028Z"
22
52
  },
23
53
  "@noble/curves": {
24
54
  "version": "2.3.0",
@@ -40,7 +70,7 @@
40
70
  "hashes": {
41
71
  "server": "sha256:b5fe88d1ea780d0581dee6145d666f89d46fc9531b5db35db2e5b16627840890"
42
72
  },
43
- "refreshedAt": "2026-08-08T08:35:00.179Z",
73
+ "refreshedAt": "2026-08-10T18:39:35.028Z",
44
74
  "components": {
45
75
  "@noble/hashes": {
46
76
  "url": "https://github.com/paulmillr/noble-hashes",
@@ -49,7 +79,7 @@
49
79
  }
50
80
  },
51
81
  "@noble/post-quantum": {
52
- "version": "0.6.1",
82
+ "version": "0.7.0",
53
83
  "license": "MIT",
54
84
  "author": "Paul Miller",
55
85
  "source": "https://github.com/paulmillr/noble-post-quantum",
@@ -68,28 +98,35 @@
68
98
  "slh_dsa_shake_192f",
69
99
  "slh_dsa_shake_256f"
70
100
  ],
101
+ "browser_exports": [
102
+ "ml_kem512",
103
+ "ml_kem768",
104
+ "ml_kem1024"
105
+ ],
71
106
  "files": {
72
- "server": "lib/vendor/noble-post-quantum.cjs"
107
+ "server": "lib/vendor/noble-post-quantum.cjs",
108
+ "browser": "lib/vendor/browser/noble-post-quantum.mjs"
73
109
  },
74
- "bundler": "esbuild --format=cjs --platform=node",
75
- "bundledAt": "2026-07-13T00:00:00Z",
76
- "cpe": "cpe:2.3:a:paulmillr:noble-post-quantum:0.6.1:*:*:*:*:node.js:*:*",
110
+ "bundler": "esbuild --format=cjs --platform=node (server), esbuild --format=esm --platform=browser (browser)",
111
+ "bundledAt": "2026-08-10T00:00:00Z",
112
+ "cpe": "cpe:2.3:a:paulmillr:noble-post-quantum:0.7.0:*:*:*:*:node.js:*:*",
77
113
  "hashes": {
78
- "server": "sha256:f9c94094b3c10fe73dac5343289da582454ea6053494fab2bf66099d9103d6c3"
114
+ "server": "sha256:fab7ebe5737793862c473444f4ee5912f79dd1edec86683acbb4eecbca0f5892",
115
+ "browser": "sha256:cae1d5bbdc7184b202b6ca68df6e1db7b0d0f668c77809ded189ca7f271accc9"
79
116
  },
80
- "refreshedAt": "2026-08-08T08:35:00.179Z",
117
+ "refreshedAt": "2026-08-10T18:39:35.028Z",
81
118
  "components": {
82
119
  "@noble/hashes": {
83
120
  "url": "https://github.com/paulmillr/noble-hashes",
84
- "version": "2.2.0"
121
+ "version": "2.3.0"
85
122
  },
86
123
  "@noble/curves": {
87
124
  "url": "https://github.com/paulmillr/noble-curves",
88
- "version": "2.2.0"
125
+ "version": "2.3.0"
89
126
  },
90
127
  "@noble/ciphers": {
91
128
  "url": "https://github.com/paulmillr/noble-ciphers",
92
- "version": "2.2.0"
129
+ "version": "2.3.0"
93
130
  }
94
131
  }
95
132
  },
@@ -114,7 +151,7 @@
114
151
  "hashes": {
115
152
  "server": "sha256:e83195dc9f189385da9c856ef38843f4466f93ea8f3d7fc2efcb1e1b18da6f20"
116
153
  },
117
- "refreshedAt": "2026-08-08T08:35:00.179Z"
154
+ "refreshedAt": "2026-08-10T18:39:35.028Z"
118
155
  },
119
156
  "SecLists-common-passwords-top-10000": {
120
157
  "version": "10k-most-common (master)",
@@ -134,7 +171,7 @@
134
171
  },
135
172
  "runtime_artifact": "lib/vendor/common-passwords-top-10000.data.js",
136
173
  "integrity_layers": "sha256 + sha3-512 + SLH-DSA-SHAKE-256f signature + in-payload canary (where applicable)",
137
- "refreshedAt": "2026-08-08T08:35:00.179Z"
174
+ "refreshedAt": "2026-08-10T18:39:35.028Z"
138
175
  },
139
176
  "bimi-trust-anchors": {
140
177
  "version": "operator-managed",
@@ -159,7 +196,7 @@
159
196
  },
160
197
  "runtime_artifact": "lib/vendor/bimi-trust-anchors.data.js",
161
198
  "integrity_layers": "sha256 + sha3-512 + SLH-DSA-SHAKE-256f signature + in-payload canary (where applicable)",
162
- "refreshedAt": "2026-08-08T08:35:00.179Z"
199
+ "refreshedAt": "2026-08-10T18:39:35.028Z"
163
200
  },
164
201
  "publicsuffix-list": {
165
202
  "version": "master",
@@ -179,10 +216,10 @@
179
216
  },
180
217
  "runtime_artifact": "lib/vendor/public-suffix-list.data.js",
181
218
  "integrity_layers": "sha256 + sha3-512 + SLH-DSA-SHAKE-256f signature + in-payload canary (where applicable)",
182
- "refreshedAt": "2026-08-08T08:35:00.179Z"
219
+ "refreshedAt": "2026-08-10T18:39:35.028Z"
183
220
  },
184
221
  "@blamejs/pki": {
185
- "version": "0.4.3",
222
+ "version": "0.4.13",
186
223
  "license": "Apache-2.0",
187
224
  "author": "blamejs",
188
225
  "source": "https://github.com/blamejs/pki",
@@ -202,12 +239,12 @@
202
239
  "server": "lib/vendor/blamejs-pki.cjs"
203
240
  },
204
241
  "bundler": "esbuild --format=cjs --platform=node --external:crypto --external:node:crypto",
205
- "bundledAt": "2026-08-08T00:00:00Z",
206
- "cpe": "cpe:2.3:a:blamejs:pki:0.4.3:*:*:*:*:node.js:*:*",
242
+ "bundledAt": "2026-08-10T00:00:00Z",
243
+ "cpe": "cpe:2.3:a:blamejs:pki:0.4.13:*:*:*:*:node.js:*:*",
207
244
  "hashes": {
208
- "server": "sha256:153ed8ad45c78cd9590878a185730fd382bf94f4ed2d6c260ee95a41c7887f43"
245
+ "server": "sha256:067ac05899ef04f7851a8d010dc4289e7a01706d5fd2cdc1ce59860631bba284"
209
246
  },
210
- "refreshedAt": "2026-08-08T08:35:00.179Z"
247
+ "refreshedAt": "2026-08-10T18:39:35.028Z"
211
248
  }
212
249
  }
213
250
  }