@sonordev/site-kit 6.0.0 → 6.0.1

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 (217) hide show
  1. package/agent-manifest.json +1 -1
  2. package/dist/{AnalyticsProvider-AZQXLRWN.js → AnalyticsProvider-4RLYTVWO.js} +10 -10
  3. package/dist/{AnalyticsProvider-AZQXLRWN.js.map → AnalyticsProvider-4RLYTVWO.js.map} +1 -1
  4. package/dist/{AnalyticsProvider-6QVM2B6O.mjs → AnalyticsProvider-YU6QANW5.mjs} +6 -6
  5. package/dist/{AnalyticsProvider-6QVM2B6O.mjs.map → AnalyticsProvider-YU6QANW5.mjs.map} +1 -1
  6. package/dist/{ArticleViewTracker-AEWJMXQQ.mjs → ArticleViewTracker-LI44SA4T.mjs} +5 -5
  7. package/dist/{ArticleViewTracker-AEWJMXQQ.mjs.map → ArticleViewTracker-LI44SA4T.mjs.map} +1 -1
  8. package/dist/{ArticleViewTracker-CFBTQ46B.js → ArticleViewTracker-OQB2VT73.js} +6 -6
  9. package/dist/{ArticleViewTracker-CFBTQ46B.js.map → ArticleViewTracker-OQB2VT73.js.map} +1 -1
  10. package/dist/ChatWidget-56SW5ITH.mjs +15 -0
  11. package/dist/{ChatWidget-6626OPXO.mjs.map → ChatWidget-56SW5ITH.mjs.map} +1 -1
  12. package/dist/ChatWidget-HR3OC3WA.js +24 -0
  13. package/dist/{ChatWidget-U24AYLXF.js.map → ChatWidget-HR3OC3WA.js.map} +1 -1
  14. package/dist/EngageWidget-HXGI3ZKG.js +21 -0
  15. package/dist/{EngageWidget-XUTDFRF3.js.map → EngageWidget-HXGI3ZKG.js.map} +1 -1
  16. package/dist/EngageWidget-L4X35N2B.mjs +12 -0
  17. package/dist/{EngageWidget-TR47W2ZI.mjs.map → EngageWidget-L4X35N2B.mjs.map} +1 -1
  18. package/dist/{FileField-DNNC5IPS.mjs → FileField-GSTLU42O.mjs} +5 -5
  19. package/dist/{FileField-DNNC5IPS.mjs.map → FileField-GSTLU42O.mjs.map} +1 -1
  20. package/dist/{FileField-R4RQG77G.js → FileField-N2P6E2PN.js} +6 -6
  21. package/dist/{FileField-R4RQG77G.js.map → FileField-N2P6E2PN.js.map} +1 -1
  22. package/dist/{FormSpotlight-7ILRAD3W.js → FormSpotlight-QLXOS5LN.js} +9 -9
  23. package/dist/{FormSpotlight-7ILRAD3W.js.map → FormSpotlight-QLXOS5LN.js.map} +1 -1
  24. package/dist/{FormSpotlight-MXY4I46H.mjs → FormSpotlight-UFATQTN3.mjs} +3 -3
  25. package/dist/{FormSpotlight-MXY4I46H.mjs.map → FormSpotlight-UFATQTN3.mjs.map} +1 -1
  26. package/dist/{FormStage-CVD3I3SE.js → FormStage-4HYDMCYU.js} +9 -9
  27. package/dist/{FormStage-CVD3I3SE.js.map → FormStage-4HYDMCYU.js.map} +1 -1
  28. package/dist/{FormStage-FDJGRGEU.mjs → FormStage-SYOKD5TJ.mjs} +3 -3
  29. package/dist/{FormStage-FDJGRGEU.mjs.map → FormStage-SYOKD5TJ.mjs.map} +1 -1
  30. package/dist/ManagedForm-3TDSIRCM.mjs +16 -0
  31. package/dist/{ManagedForm-5675CLWS.mjs.map → ManagedForm-3TDSIRCM.mjs.map} +1 -1
  32. package/dist/ManagedForm-TUSGW5EH.js +25 -0
  33. package/dist/{ManagedForm-KYIK54SL.js.map → ManagedForm-TUSGW5EH.js.map} +1 -1
  34. package/dist/{ManagedNewsletterForm-DFLDGNQU.mjs → ManagedNewsletterForm-CNGCBA2N.mjs} +7 -7
  35. package/dist/{ManagedNewsletterForm-DFLDGNQU.mjs.map → ManagedNewsletterForm-CNGCBA2N.mjs.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-IH3MRJOD.js → ManagedNewsletterForm-XJEPVJRM.js} +8 -8
  37. package/dist/{ManagedNewsletterForm-IH3MRJOD.js.map → ManagedNewsletterForm-XJEPVJRM.js.map} +1 -1
  38. package/dist/{SignalCore-ZH3R6XD3.mjs → SignalCore-ARRVP6F7.mjs} +5 -5
  39. package/dist/{SignalCore-ZH3R6XD3.mjs.map → SignalCore-ARRVP6F7.mjs.map} +1 -1
  40. package/dist/{SignalCore-6LYIZFXK.js → SignalCore-AXK6RCR4.js} +11 -11
  41. package/dist/{SignalCore-6LYIZFXK.js.map → SignalCore-AXK6RCR4.js.map} +1 -1
  42. package/dist/SitemapSync-42VKJUOU.mjs +9 -0
  43. package/dist/{SitemapSync-PKBXWVI6.mjs.map → SitemapSync-42VKJUOU.mjs.map} +1 -1
  44. package/dist/SitemapSync-GAGREAX6.js +18 -0
  45. package/dist/{SitemapSync-PZ76V5MX.js.map → SitemapSync-GAGREAX6.js.map} +1 -1
  46. package/dist/analytics/index.js +9 -9
  47. package/dist/analytics/index.mjs +4 -4
  48. package/dist/articles/index.js +1 -1
  49. package/dist/articles/index.mjs +1 -1
  50. package/dist/articles/server-ui.js +1 -1
  51. package/dist/articles/server-ui.mjs +1 -1
  52. package/dist/{chunk-YYEBFQGS.js → chunk-4NBJDP6Y.js} +4 -4
  53. package/dist/{chunk-YYEBFQGS.js.map → chunk-4NBJDP6Y.js.map} +1 -1
  54. package/dist/{chunk-254IW4FC.js → chunk-4VCR6TXK.js} +5 -5
  55. package/dist/{chunk-254IW4FC.js.map → chunk-4VCR6TXK.js.map} +1 -1
  56. package/dist/{chunk-3GHPFLEH.js → chunk-5ABTBPPK.js} +15 -15
  57. package/dist/{chunk-3GHPFLEH.js.map → chunk-5ABTBPPK.js.map} +1 -1
  58. package/dist/{chunk-RZGVNDO6.mjs → chunk-6URNNS3V.mjs} +4 -4
  59. package/dist/{chunk-RZGVNDO6.mjs.map → chunk-6URNNS3V.mjs.map} +1 -1
  60. package/dist/{chunk-MS2EE6LT.js → chunk-6YEPFH3Q.js} +10 -10
  61. package/dist/{chunk-MS2EE6LT.js.map → chunk-6YEPFH3Q.js.map} +1 -1
  62. package/dist/{chunk-HX5JPNMN.js → chunk-6ZOMIPU5.js} +8 -8
  63. package/dist/{chunk-HX5JPNMN.js.map → chunk-6ZOMIPU5.js.map} +1 -1
  64. package/dist/chunk-7MAHP735.mjs +6 -0
  65. package/dist/{chunk-2KRAY5NC.mjs.map → chunk-7MAHP735.mjs.map} +1 -1
  66. package/dist/{chunk-3LCJJ6Y6.js → chunk-AQMQOH7V.js} +3 -3
  67. package/dist/{chunk-3LCJJ6Y6.js.map → chunk-AQMQOH7V.js.map} +1 -1
  68. package/dist/{chunk-JMNBU2RG.mjs → chunk-BIU234TJ.mjs} +8 -8
  69. package/dist/{chunk-JMNBU2RG.mjs.map → chunk-BIU234TJ.mjs.map} +1 -1
  70. package/dist/{chunk-RDPI27TS.mjs → chunk-BJ4T65OK.mjs} +4 -2
  71. package/dist/chunk-BJ4T65OK.mjs.map +1 -0
  72. package/dist/{chunk-RPCODOWG.mjs → chunk-BMH2D2EP.mjs} +3 -3
  73. package/dist/{chunk-RPCODOWG.mjs.map → chunk-BMH2D2EP.mjs.map} +1 -1
  74. package/dist/{chunk-N6CB7MK7.js → chunk-BWSYPQ5E.js} +6 -6
  75. package/dist/{chunk-N6CB7MK7.js.map → chunk-BWSYPQ5E.js.map} +1 -1
  76. package/dist/chunk-F3EAAAZ3.js +8 -0
  77. package/dist/{chunk-EL74YDNX.js.map → chunk-F3EAAAZ3.js.map} +1 -1
  78. package/dist/{chunk-SCRB5DZM.js → chunk-FKFVN3GT.js} +8 -8
  79. package/dist/{chunk-SCRB5DZM.js.map → chunk-FKFVN3GT.js.map} +1 -1
  80. package/dist/{chunk-G6KQ3C3W.js → chunk-G3L26XQ7.js} +4 -2
  81. package/dist/chunk-G3L26XQ7.js.map +1 -0
  82. package/dist/{chunk-YGDQVZEL.js → chunk-GCZHKHEH.js} +5 -5
  83. package/dist/{chunk-YGDQVZEL.js.map → chunk-GCZHKHEH.js.map} +1 -1
  84. package/dist/{chunk-7TKSRUQU.mjs → chunk-GJCQVVO3.mjs} +7 -7
  85. package/dist/{chunk-7TKSRUQU.mjs.map → chunk-GJCQVVO3.mjs.map} +1 -1
  86. package/dist/{chunk-QVBAAPNT.mjs → chunk-GKPVGVHY.mjs} +3 -3
  87. package/dist/{chunk-QVBAAPNT.mjs.map → chunk-GKPVGVHY.mjs.map} +1 -1
  88. package/dist/{chunk-YWLBQ3L5.mjs → chunk-IDOHDP7D.mjs} +4 -4
  89. package/dist/{chunk-YWLBQ3L5.mjs.map → chunk-IDOHDP7D.mjs.map} +1 -1
  90. package/dist/{chunk-HOOVYWTO.mjs → chunk-KUHMHKG5.mjs} +4 -4
  91. package/dist/{chunk-HOOVYWTO.mjs.map → chunk-KUHMHKG5.mjs.map} +1 -1
  92. package/dist/{chunk-NR52QHOD.mjs → chunk-L63DFM4R.mjs} +3 -3
  93. package/dist/{chunk-NR52QHOD.mjs.map → chunk-L63DFM4R.mjs.map} +1 -1
  94. package/dist/{chunk-ZR4TYCQW.mjs → chunk-LCYODFNY.mjs} +3 -3
  95. package/dist/{chunk-ZR4TYCQW.mjs.map → chunk-LCYODFNY.mjs.map} +1 -1
  96. package/dist/{chunk-QEM2F2DC.mjs → chunk-LFASEDBO.mjs} +3 -3
  97. package/dist/{chunk-QEM2F2DC.mjs.map → chunk-LFASEDBO.mjs.map} +1 -1
  98. package/dist/{chunk-CZGGUPPQ.js → chunk-LZPICBND.js} +15 -15
  99. package/dist/{chunk-CZGGUPPQ.js.map → chunk-LZPICBND.js.map} +1 -1
  100. package/dist/{chunk-PJYTYM5G.mjs → chunk-NNQG25M2.mjs} +3 -3
  101. package/dist/{chunk-PJYTYM5G.mjs.map → chunk-NNQG25M2.mjs.map} +1 -1
  102. package/dist/{chunk-MIYGP34I.js → chunk-NVOYCK2S.js} +14 -14
  103. package/dist/{chunk-MIYGP34I.js.map → chunk-NVOYCK2S.js.map} +1 -1
  104. package/dist/{chunk-JXCMCASE.mjs → chunk-NVWUXCUQ.mjs} +3 -3
  105. package/dist/{chunk-JXCMCASE.mjs.map → chunk-NVWUXCUQ.mjs.map} +1 -1
  106. package/dist/{chunk-XKXZ4OW4.mjs → chunk-NYNL6UQV.mjs} +4 -4
  107. package/dist/{chunk-XKXZ4OW4.mjs.map → chunk-NYNL6UQV.mjs.map} +1 -1
  108. package/dist/{chunk-BZG34WHF.js → chunk-P2HOVWJW.js} +14 -14
  109. package/dist/{chunk-BZG34WHF.js.map → chunk-P2HOVWJW.js.map} +1 -1
  110. package/dist/{chunk-MCG4BSRW.js → chunk-PKZMNDZJ.js} +5 -5
  111. package/dist/{chunk-MCG4BSRW.js.map → chunk-PKZMNDZJ.js.map} +1 -1
  112. package/dist/{chunk-HFCQGSD2.js → chunk-QD4BNYMM.js} +18 -18
  113. package/dist/{chunk-HFCQGSD2.js.map → chunk-QD4BNYMM.js.map} +1 -1
  114. package/dist/{chunk-GQ3SDRL6.mjs → chunk-QJ3SMLND.mjs} +3 -3
  115. package/dist/{chunk-GQ3SDRL6.mjs.map → chunk-QJ3SMLND.mjs.map} +1 -1
  116. package/dist/{chunk-3OCXVTN5.mjs → chunk-QP56JXMH.mjs} +3 -3
  117. package/dist/{chunk-3OCXVTN5.mjs.map → chunk-QP56JXMH.mjs.map} +1 -1
  118. package/dist/{chunk-2WEBUZNP.mjs → chunk-QXPGIOU7.mjs} +3 -3
  119. package/dist/{chunk-2WEBUZNP.mjs.map → chunk-QXPGIOU7.mjs.map} +1 -1
  120. package/dist/{chunk-KA4NNWOK.js → chunk-R6UE6MC5.js} +7 -7
  121. package/dist/{chunk-KA4NNWOK.js.map → chunk-R6UE6MC5.js.map} +1 -1
  122. package/dist/{chunk-CSSNZGTU.mjs → chunk-RX4TVHSN.mjs} +3 -3
  123. package/dist/{chunk-CSSNZGTU.mjs.map → chunk-RX4TVHSN.mjs.map} +1 -1
  124. package/dist/{chunk-2YSB4FIC.mjs → chunk-SU42KCQD.mjs} +4 -4
  125. package/dist/{chunk-2YSB4FIC.mjs.map → chunk-SU42KCQD.mjs.map} +1 -1
  126. package/dist/{chunk-TCZHRSWY.js → chunk-TC3JSQUS.js} +4 -4
  127. package/dist/{chunk-TCZHRSWY.js.map → chunk-TC3JSQUS.js.map} +1 -1
  128. package/dist/{chunk-RC4L4DV2.mjs → chunk-U6F6AN23.mjs} +4 -4
  129. package/dist/{chunk-RC4L4DV2.mjs.map → chunk-U6F6AN23.mjs.map} +1 -1
  130. package/dist/{chunk-D47W5DE4.js → chunk-UCBBZXJI.js} +4 -4
  131. package/dist/{chunk-D47W5DE4.js.map → chunk-UCBBZXJI.js.map} +1 -1
  132. package/dist/{chunk-QOCLSJIU.js → chunk-UILVPI2R.js} +3 -3
  133. package/dist/{chunk-QOCLSJIU.js.map → chunk-UILVPI2R.js.map} +1 -1
  134. package/dist/{chunk-WDEGGHTB.js → chunk-ULSFOC3J.js} +12 -12
  135. package/dist/{chunk-WDEGGHTB.js.map → chunk-ULSFOC3J.js.map} +1 -1
  136. package/dist/{chunk-TCCGP3FT.mjs → chunk-WLCPBZOS.mjs} +3 -3
  137. package/dist/{chunk-TCCGP3FT.mjs.map → chunk-WLCPBZOS.mjs.map} +1 -1
  138. package/dist/{chunk-WV5YQL3W.mjs → chunk-XLFTZV34.mjs} +3 -3
  139. package/dist/{chunk-WV5YQL3W.mjs.map → chunk-XLFTZV34.mjs.map} +1 -1
  140. package/dist/{chunk-5DSUPTBU.js → chunk-XWKY46NU.js} +11 -11
  141. package/dist/{chunk-5DSUPTBU.js.map → chunk-XWKY46NU.js.map} +1 -1
  142. package/dist/{chunk-XSBKR3VF.mjs → chunk-YTJKVWHY.mjs} +4 -4
  143. package/dist/{chunk-XSBKR3VF.mjs.map → chunk-YTJKVWHY.mjs.map} +1 -1
  144. package/dist/{chunk-VINLIMAX.js → chunk-ZRWIMNQF.js} +3 -3
  145. package/dist/{chunk-VINLIMAX.js.map → chunk-ZRWIMNQF.js.map} +1 -1
  146. package/dist/{chunk-3U5SVB4W.js → chunk-ZYJYBE5G.js} +4 -4
  147. package/dist/{chunk-3U5SVB4W.js.map → chunk-ZYJYBE5G.js.map} +1 -1
  148. package/dist/cli/index.js +3 -3
  149. package/dist/cli/index.mjs +1 -1
  150. package/dist/client/index.js +4 -4
  151. package/dist/client/index.mjs +3 -3
  152. package/dist/commerce/index.js +57 -57
  153. package/dist/commerce/index.mjs +5 -5
  154. package/dist/engage/index.js +10 -10
  155. package/dist/engage/index.mjs +7 -7
  156. package/dist/fleet/index.js +8 -8
  157. package/dist/fleet/index.mjs +4 -4
  158. package/dist/forms/index.js +16 -16
  159. package/dist/forms/index.mjs +9 -9
  160. package/dist/forms/server.js +10 -10
  161. package/dist/forms/server.mjs +8 -8
  162. package/dist/forms/static.js +7 -7
  163. package/dist/forms/static.mjs +6 -6
  164. package/dist/images/index.js +11 -11
  165. package/dist/images/index.mjs +4 -4
  166. package/dist/index.js +63 -63
  167. package/dist/index.mjs +9 -9
  168. package/dist/layout/client.js +8 -8
  169. package/dist/layout/client.mjs +7 -7
  170. package/dist/layout/index.js +10 -10
  171. package/dist/layout/index.mjs +8 -8
  172. package/dist/llms/index.js +12 -12
  173. package/dist/llms/index.mjs +2 -2
  174. package/dist/llms/writeLLMsTxt.d.ts +6 -0
  175. package/dist/llms/writeLLMsTxt.d.ts.map +1 -1
  176. package/dist/maps/index.js +5 -5
  177. package/dist/maps/index.mjs +3 -3
  178. package/dist/search/index.js +4 -4
  179. package/dist/search/index.mjs +3 -3
  180. package/dist/seo/client.js +5 -5
  181. package/dist/seo/client.mjs +4 -4
  182. package/dist/seo/index.js +5 -5
  183. package/dist/seo/index.mjs +4 -4
  184. package/dist/seo/register-sitemap-cli-impl.d.ts +2 -0
  185. package/dist/seo/register-sitemap-cli-impl.d.ts.map +1 -1
  186. package/dist/seo/register-sitemap-cli.d.ts +1 -0
  187. package/dist/seo/register-sitemap-cli.d.ts.map +1 -1
  188. package/dist/seo/register-sitemap-cli.js +7 -3
  189. package/dist/seo/register-sitemap-cli.mjs +7 -3
  190. package/dist/server/index.js +3 -3
  191. package/dist/server/index.mjs +2 -2
  192. package/dist/shared/version.d.ts +1 -1
  193. package/dist/signal/index.js +11 -11
  194. package/dist/signal/index.mjs +2 -2
  195. package/dist/sitemap/index.d.ts +6 -0
  196. package/dist/sitemap/index.d.ts.map +1 -1
  197. package/dist/sitemap/index.js +3 -2
  198. package/dist/sitemap/index.js.map +1 -1
  199. package/dist/sitemap/index.mjs +2 -1
  200. package/dist/sitemap/index.mjs.map +1 -1
  201. package/dist/sync/index.js +17 -17
  202. package/dist/sync/index.mjs +4 -4
  203. package/dist/{writeLLMsTxt-QJFXBHZF.mjs → writeLLMsTxt-LYYC3ZSN.mjs} +2 -2
  204. package/dist/{writeLLMsTxt-ATADOUVZ.js → writeLLMsTxt-XHLHJ5XY.js} +3 -3
  205. package/package.json +1 -1
  206. package/dist/ChatWidget-6626OPXO.mjs +0 -15
  207. package/dist/ChatWidget-U24AYLXF.js +0 -24
  208. package/dist/EngageWidget-TR47W2ZI.mjs +0 -12
  209. package/dist/EngageWidget-XUTDFRF3.js +0 -21
  210. package/dist/ManagedForm-5675CLWS.mjs +0 -16
  211. package/dist/ManagedForm-KYIK54SL.js +0 -25
  212. package/dist/SitemapSync-PKBXWVI6.mjs +0 -9
  213. package/dist/SitemapSync-PZ76V5MX.js +0 -18
  214. package/dist/chunk-2KRAY5NC.mjs +0 -6
  215. package/dist/chunk-EL74YDNX.js +0 -8
  216. package/dist/chunk-G6KQ3C3W.js.map +0 -1
  217. package/dist/chunk-RDPI27TS.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { resolveFetch } from './chunk-BQP6JIE2.mjs';
2
- import { SITE_KIT_VERSION } from './chunk-2KRAY5NC.mjs';
2
+ import { SITE_KIT_VERSION } from './chunk-7MAHP735.mjs';
3
3
  import 'server-only';
4
4
 
5
5
  var MINT_PATH = "/api/public/site-token";
@@ -124,5 +124,5 @@ async function mintWithRetry(rawKey, apiUrl) {
124
124
  }
125
125
 
126
126
  export { resolveClientCredential };
127
- //# sourceMappingURL=chunk-PJYTYM5G.mjs.map
128
- //# sourceMappingURL=chunk-PJYTYM5G.mjs.map
127
+ //# sourceMappingURL=chunk-NNQG25M2.mjs.map
128
+ //# sourceMappingURL=chunk-NNQG25M2.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server/mint-site-token.ts"],"names":[],"mappings":"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","file":"chunk-PJYTYM5G.mjs","sourcesContent":["/**\n * @sonordev/site-kit/server — Client-token minting (server-only)\n *\n * SiteKitLayout holds the raw `SONOR_API_KEY` server-side but must NOT ship it to\n * the browser. This mints a short-lived, project-scoped token (server-to-server,\n * authenticated with the raw key, no browser Origin so it passes domain-binding)\n * and returns THAT for the layout to inject instead.\n *\n * `import 'server-only'` makes importing this into a client bundle a hard build\n * error — the raw key stays on the server.\n *\n * FAILS CLOSED. If minting genuinely fails, this throws and the build fails —\n * it does NOT publish the raw key. A failed deploy is loud and recoverable; a\n * leaked project secret in public HTML is neither. The only paths that still\n * return the raw key are a 404 (an older API that predates the endpoint, an\n * expected state during rollout) and the explicit `SONOR_SITE_TOKEN_FALLBACK=raw`\n * escape hatch, for when shipping beats being blocked.\n *\n * That posture is not academic. Through 3.5.0 a throttled mint (HTTP 429)\n * returned the raw key AND cached it for 60s, so every page rendered in that\n * window shipped the secret: one real build came out with 180 of 272 prerendered\n * pages carrying it. The build \"succeeded\" and nothing downstream noticed.\n * Rate limiting is transient by definition — the fix is to wait and retry, not\n * to downgrade to publishing the key.\n *\n * Two things keep the request count low enough that throttling is rare:\n * - a module-level memo, so a worker mints once and every page reuses the seed;\n * - an in-flight map, because that memo is only populated AFTER the await. Next\n * renders pages concurrently, so without coalescing the first N concurrent\n * renders in a process all miss the cache and all fire a request — a\n * stampede per worker, multiplied by one worker per core. That is how a\n * single site exhausted a 60/min budget.\n *\n * SEED FRESHNESS: a static page's seed carries `iat` = build time, and the API\n * refuses to refresh a seed older than SITE_TOKEN_MAX_REFRESH_AGE_SECONDS\n * (sonor-api common/site-auth/site-token.util.ts — currently 400 days, raised\n * from 30 alongside this fix). A site not rebuilt within that window serves a\n * seed the client cannot refresh, and its forms/analytics/engage start failing\n * for new visitors. Keep that limit comfortably longer than the fleet's\n * realistic redeploy gap; marketing sites routinely go many months untouched.\n */\nimport 'server-only'\nimport { SITE_KIT_VERSION } from '../shared/version'\nimport { resolveFetch } from '../shared/fresh-fetch'\n\n// Re-exported for this module's unit tests; the helper lives in shared/fresh-fetch.\nexport { resolveFetch }\n\nconst MINT_PATH = '/api/public/site-token'\nconst MINT_TIMEOUT_MS = 4_000\nconst SITE_TOKEN_PREFIX = 'st1.'\n\n/**\n * Retry budget for transient failures (429 / 5xx / network). Rate limiting is\n * measured per minute, so a few seconds of backoff clears it; the whole ladder\n * costs at most ~20s once per build worker, and only when something is wrong.\n */\nconst MINT_MAX_ATTEMPTS = 4\nconst MINT_BACKOFF_BASE_MS = 500\nconst MINT_BACKOFF_CAP_MS = 8_000\n\ninterface CacheEntry {\n credential: string\n expiresAt: number\n}\nconst cache = new Map<string, CacheEntry>()\n\n/**\n * Requests already in flight, keyed by raw key. The `cache` above is only\n * written after the response lands, so concurrent renders would otherwise each\n * start their own mint. See the module header.\n */\nconst inflight = new Map<string, Promise<string>>()\n\nconst sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms))\n\n/**\n * Honour `Retry-After` when the server sends it (delta-seconds or HTTP date),\n * otherwise exponential backoff. Capped so a misconfigured server cannot stall\n * a build indefinitely.\n */\nfunction retryDelayMs(res: Response | null, attempt: number): number {\n const header = res?.headers?.get?.('retry-after')\n if (header) {\n const seconds = Number(header)\n const ms = Number.isFinite(seconds)\n ? seconds * 1000\n : Date.parse(header) - Date.now()\n if (Number.isFinite(ms) && ms > 0) return Math.min(ms, MINT_BACKOFF_CAP_MS)\n }\n return Math.min(MINT_BACKOFF_BASE_MS * 2 ** attempt, MINT_BACKOFF_CAP_MS)\n}\n\n/** 429 and 5xx are transient; waiting is the correct response to both. */\nconst isRetryableStatus = (status: number) => status === 429 || status >= 500\n\n/**\n * The escape hatch, for when a broken mint must not block a release. Opt-in and\n * loud: it re-enables publishing the project secret in page HTML.\n */\nfunction rawFallbackAllowed(): boolean {\n return (\n typeof process !== 'undefined' &&\n process.env?.SONOR_SITE_TOKEN_FALLBACK === 'raw'\n )\n}\n\nfunction failClosed(reason: string, rawKey: string, now: number): string {\n if (rawFallbackAllowed()) {\n console.warn(\n `[SiteKitLayout] Token mint failed (${reason}) and SONOR_SITE_TOKEN_FALLBACK=raw is set; ` +\n 'injecting the RAW API KEY into page HTML. The key is publicly readable wherever ' +\n 'this page is served — unset the escape hatch once the mint is healthy.',\n )\n cache.set(rawKey, { credential: rawKey, expiresAt: now + 60_000 })\n return rawKey\n }\n throw new Error(\n `site-kit: could not mint a site token (${reason}). Refusing to publish the raw ` +\n 'SONOR_API_KEY in page HTML, so this build fails instead. Check that the mint ' +\n 'endpoint is reachable and the key is valid, then rebuild. To ship anyway — ' +\n 'which publishes the project secret in public HTML — set SONOR_SITE_TOKEN_FALLBACK=raw.',\n )\n}\n\n/*\n * The mint uses Next's saved original fetch (resolveFetch, shared/fresh-fetch.ts,\n * which documents why). A credential is not page data: `cache: 'no-store'` would\n * bail a static route before the request goes out (verified on Next 16.2.9: the\n * mint endpoint received zero requests for a static build, and every page\n * shipped the raw key), and a Data Cache entry would let a fresh deploy re-bake a\n * months-old seed. The module-level memo above is the only cache we want: one\n * mint per build process, and a build-fresh seed on every deploy.\n */\n\n/**\n * Next signals \"this render must go dynamic\" by THROWING (DynamicServerError,\n * static-gen bailout, redirect/notFound digests, React's postpone). Those are\n * the framework's control flow, not a mint failure. Swallowing one makes Next\n * believe the render succeeded statically — which is precisely how the raw key\n * ended up stranded in prerendered HTML with no error anywhere. Let them\n * propagate; only real network/HTTP failures fall back to the raw key.\n *\n * @internal Exported for unit tests; not part of the package's public API.\n */\nexport function isFrameworkSignal(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false\n const e = err as { digest?: unknown; code?: unknown; $$typeof?: unknown }\n if (e.digest === 'DYNAMIC_SERVER_USAGE') return true\n if (e.code === 'NEXT_STATIC_GEN_BAILOUT') return true\n if (typeof e.digest === 'string' && e.digest.startsWith('NEXT_')) return true\n if (e.$$typeof === Symbol.for('react.postpone')) return true\n return false\n}\n\nexport async function resolveClientCredential(\n rawKey: string,\n apiUrl: string,\n): Promise<string> {\n if (!rawKey) return ''\n // Env should hold a raw key; if it already looks like a token, pass it through.\n if (rawKey.startsWith(SITE_TOKEN_PREFIX)) return rawKey\n\n const cached = cache.get(rawKey)\n if (cached && cached.expiresAt > Date.now()) return cached.credential\n\n // Collapse concurrent renders onto one request rather than a stampede.\n const pending = inflight.get(rawKey)\n if (pending) return pending\n\n const request = mintWithRetry(rawKey, apiUrl)\n inflight.set(rawKey, request)\n try {\n return await request\n } finally {\n inflight.delete(rawKey)\n }\n}\n\nasync function mintWithRetry(rawKey: string, apiUrl: string): Promise<string> {\n const base = (apiUrl || 'https://api.sonor.io').replace(/\\/+$/, '')\n let lastReason = 'unknown error'\n\n for (let attempt = 0; attempt < MINT_MAX_ATTEMPTS; attempt++) {\n let res: Response | null = null\n try {\n const { fn: fetchFn, unpatched } = resolveFetch()\n res = await fetchFn(`${base}${MINT_PATH}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': rawKey,\n 'x-sitekit-version': SITE_KIT_VERSION,\n },\n // Only meaningful on the fallback path, where a future Next stopped\n // exposing `_nextOriginalFetch` and we're back on the patched fetch.\n // `revalidate: false` is the one setting that neither bails out of static\n // generation nor downgrades the route to ISR; a Data Cache entry is the\n // lesser evil versus shipping the raw key again.\n ...(unpatched ? {} : ({ next: { revalidate: false } } as RequestInit)),\n signal:\n typeof AbortSignal !== 'undefined' && AbortSignal.timeout\n ? AbortSignal.timeout(MINT_TIMEOUT_MS)\n : undefined,\n })\n } catch (err) {\n // Never swallow the framework's own control flow — see isFrameworkSignal.\n if (isFrameworkSignal(err)) throw err\n lastReason = err instanceof Error ? err.message : 'network error'\n if (attempt < MINT_MAX_ATTEMPTS - 1) {\n await sleep(retryDelayMs(null, attempt))\n continue\n }\n break\n }\n\n if (res.ok) {\n const data: any = await res.json().catch(() => null)\n const token = data?.token\n const expiresIn = typeof data?.expiresIn === 'number' ? data.expiresIn : 3600\n if (typeof token === 'string' && token.startsWith(SITE_TOKEN_PREFIX)) {\n cache.set(rawKey, {\n credential: token,\n expiresAt: Date.now() + Math.min((expiresIn * 1000) / 2, 30 * 60_000),\n })\n return token\n }\n lastReason = 'mint returned no usable token'\n break\n }\n\n // 404 = an API older than the endpoint. Expected during rollout, and the raw\n // key is exactly what such an API still expects, so this stays a fallback\n // rather than a build failure.\n if (res.status === 404) {\n cache.set(rawKey, { credential: rawKey, expiresAt: Date.now() + 60_000 })\n return rawKey\n }\n\n lastReason = `HTTP ${res.status}`\n if (isRetryableStatus(res.status) && attempt < MINT_MAX_ATTEMPTS - 1) {\n const delay = retryDelayMs(res, attempt)\n console.warn(\n `[SiteKitLayout] Token mint returned ${res.status}; retrying in ${Math.round(delay)}ms ` +\n `(attempt ${attempt + 2}/${MINT_MAX_ATTEMPTS}).`,\n )\n await sleep(delay)\n continue\n }\n break\n }\n\n return failClosed(lastReason, rawKey, Date.now())\n}\n"]}
1
+ {"version":3,"sources":["../src/server/mint-site-token.ts"],"names":[],"mappings":"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","file":"chunk-NNQG25M2.mjs","sourcesContent":["/**\n * @sonordev/site-kit/server — Client-token minting (server-only)\n *\n * SiteKitLayout holds the raw `SONOR_API_KEY` server-side but must NOT ship it to\n * the browser. This mints a short-lived, project-scoped token (server-to-server,\n * authenticated with the raw key, no browser Origin so it passes domain-binding)\n * and returns THAT for the layout to inject instead.\n *\n * `import 'server-only'` makes importing this into a client bundle a hard build\n * error — the raw key stays on the server.\n *\n * FAILS CLOSED. If minting genuinely fails, this throws and the build fails —\n * it does NOT publish the raw key. A failed deploy is loud and recoverable; a\n * leaked project secret in public HTML is neither. The only paths that still\n * return the raw key are a 404 (an older API that predates the endpoint, an\n * expected state during rollout) and the explicit `SONOR_SITE_TOKEN_FALLBACK=raw`\n * escape hatch, for when shipping beats being blocked.\n *\n * That posture is not academic. Through 3.5.0 a throttled mint (HTTP 429)\n * returned the raw key AND cached it for 60s, so every page rendered in that\n * window shipped the secret: one real build came out with 180 of 272 prerendered\n * pages carrying it. The build \"succeeded\" and nothing downstream noticed.\n * Rate limiting is transient by definition — the fix is to wait and retry, not\n * to downgrade to publishing the key.\n *\n * Two things keep the request count low enough that throttling is rare:\n * - a module-level memo, so a worker mints once and every page reuses the seed;\n * - an in-flight map, because that memo is only populated AFTER the await. Next\n * renders pages concurrently, so without coalescing the first N concurrent\n * renders in a process all miss the cache and all fire a request — a\n * stampede per worker, multiplied by one worker per core. That is how a\n * single site exhausted a 60/min budget.\n *\n * SEED FRESHNESS: a static page's seed carries `iat` = build time, and the API\n * refuses to refresh a seed older than SITE_TOKEN_MAX_REFRESH_AGE_SECONDS\n * (sonor-api common/site-auth/site-token.util.ts — currently 400 days, raised\n * from 30 alongside this fix). A site not rebuilt within that window serves a\n * seed the client cannot refresh, and its forms/analytics/engage start failing\n * for new visitors. Keep that limit comfortably longer than the fleet's\n * realistic redeploy gap; marketing sites routinely go many months untouched.\n */\nimport 'server-only'\nimport { SITE_KIT_VERSION } from '../shared/version'\nimport { resolveFetch } from '../shared/fresh-fetch'\n\n// Re-exported for this module's unit tests; the helper lives in shared/fresh-fetch.\nexport { resolveFetch }\n\nconst MINT_PATH = '/api/public/site-token'\nconst MINT_TIMEOUT_MS = 4_000\nconst SITE_TOKEN_PREFIX = 'st1.'\n\n/**\n * Retry budget for transient failures (429 / 5xx / network). Rate limiting is\n * measured per minute, so a few seconds of backoff clears it; the whole ladder\n * costs at most ~20s once per build worker, and only when something is wrong.\n */\nconst MINT_MAX_ATTEMPTS = 4\nconst MINT_BACKOFF_BASE_MS = 500\nconst MINT_BACKOFF_CAP_MS = 8_000\n\ninterface CacheEntry {\n credential: string\n expiresAt: number\n}\nconst cache = new Map<string, CacheEntry>()\n\n/**\n * Requests already in flight, keyed by raw key. The `cache` above is only\n * written after the response lands, so concurrent renders would otherwise each\n * start their own mint. See the module header.\n */\nconst inflight = new Map<string, Promise<string>>()\n\nconst sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms))\n\n/**\n * Honour `Retry-After` when the server sends it (delta-seconds or HTTP date),\n * otherwise exponential backoff. Capped so a misconfigured server cannot stall\n * a build indefinitely.\n */\nfunction retryDelayMs(res: Response | null, attempt: number): number {\n const header = res?.headers?.get?.('retry-after')\n if (header) {\n const seconds = Number(header)\n const ms = Number.isFinite(seconds)\n ? seconds * 1000\n : Date.parse(header) - Date.now()\n if (Number.isFinite(ms) && ms > 0) return Math.min(ms, MINT_BACKOFF_CAP_MS)\n }\n return Math.min(MINT_BACKOFF_BASE_MS * 2 ** attempt, MINT_BACKOFF_CAP_MS)\n}\n\n/** 429 and 5xx are transient; waiting is the correct response to both. */\nconst isRetryableStatus = (status: number) => status === 429 || status >= 500\n\n/**\n * The escape hatch, for when a broken mint must not block a release. Opt-in and\n * loud: it re-enables publishing the project secret in page HTML.\n */\nfunction rawFallbackAllowed(): boolean {\n return (\n typeof process !== 'undefined' &&\n process.env?.SONOR_SITE_TOKEN_FALLBACK === 'raw'\n )\n}\n\nfunction failClosed(reason: string, rawKey: string, now: number): string {\n if (rawFallbackAllowed()) {\n console.warn(\n `[SiteKitLayout] Token mint failed (${reason}) and SONOR_SITE_TOKEN_FALLBACK=raw is set; ` +\n 'injecting the RAW API KEY into page HTML. The key is publicly readable wherever ' +\n 'this page is served — unset the escape hatch once the mint is healthy.',\n )\n cache.set(rawKey, { credential: rawKey, expiresAt: now + 60_000 })\n return rawKey\n }\n throw new Error(\n `site-kit: could not mint a site token (${reason}). Refusing to publish the raw ` +\n 'SONOR_API_KEY in page HTML, so this build fails instead. Check that the mint ' +\n 'endpoint is reachable and the key is valid, then rebuild. To ship anyway — ' +\n 'which publishes the project secret in public HTML — set SONOR_SITE_TOKEN_FALLBACK=raw.',\n )\n}\n\n/*\n * The mint uses Next's saved original fetch (resolveFetch, shared/fresh-fetch.ts,\n * which documents why). A credential is not page data: `cache: 'no-store'` would\n * bail a static route before the request goes out (verified on Next 16.2.9: the\n * mint endpoint received zero requests for a static build, and every page\n * shipped the raw key), and a Data Cache entry would let a fresh deploy re-bake a\n * months-old seed. The module-level memo above is the only cache we want: one\n * mint per build process, and a build-fresh seed on every deploy.\n */\n\n/**\n * Next signals \"this render must go dynamic\" by THROWING (DynamicServerError,\n * static-gen bailout, redirect/notFound digests, React's postpone). Those are\n * the framework's control flow, not a mint failure. Swallowing one makes Next\n * believe the render succeeded statically — which is precisely how the raw key\n * ended up stranded in prerendered HTML with no error anywhere. Let them\n * propagate; only real network/HTTP failures fall back to the raw key.\n *\n * @internal Exported for unit tests; not part of the package's public API.\n */\nexport function isFrameworkSignal(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false\n const e = err as { digest?: unknown; code?: unknown; $$typeof?: unknown }\n if (e.digest === 'DYNAMIC_SERVER_USAGE') return true\n if (e.code === 'NEXT_STATIC_GEN_BAILOUT') return true\n if (typeof e.digest === 'string' && e.digest.startsWith('NEXT_')) return true\n if (e.$$typeof === Symbol.for('react.postpone')) return true\n return false\n}\n\nexport async function resolveClientCredential(\n rawKey: string,\n apiUrl: string,\n): Promise<string> {\n if (!rawKey) return ''\n // Env should hold a raw key; if it already looks like a token, pass it through.\n if (rawKey.startsWith(SITE_TOKEN_PREFIX)) return rawKey\n\n const cached = cache.get(rawKey)\n if (cached && cached.expiresAt > Date.now()) return cached.credential\n\n // Collapse concurrent renders onto one request rather than a stampede.\n const pending = inflight.get(rawKey)\n if (pending) return pending\n\n const request = mintWithRetry(rawKey, apiUrl)\n inflight.set(rawKey, request)\n try {\n return await request\n } finally {\n inflight.delete(rawKey)\n }\n}\n\nasync function mintWithRetry(rawKey: string, apiUrl: string): Promise<string> {\n const base = (apiUrl || 'https://api.sonor.io').replace(/\\/+$/, '')\n let lastReason = 'unknown error'\n\n for (let attempt = 0; attempt < MINT_MAX_ATTEMPTS; attempt++) {\n let res: Response | null = null\n try {\n const { fn: fetchFn, unpatched } = resolveFetch()\n res = await fetchFn(`${base}${MINT_PATH}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': rawKey,\n 'x-sitekit-version': SITE_KIT_VERSION,\n },\n // Only meaningful on the fallback path, where a future Next stopped\n // exposing `_nextOriginalFetch` and we're back on the patched fetch.\n // `revalidate: false` is the one setting that neither bails out of static\n // generation nor downgrades the route to ISR; a Data Cache entry is the\n // lesser evil versus shipping the raw key again.\n ...(unpatched ? {} : ({ next: { revalidate: false } } as RequestInit)),\n signal:\n typeof AbortSignal !== 'undefined' && AbortSignal.timeout\n ? AbortSignal.timeout(MINT_TIMEOUT_MS)\n : undefined,\n })\n } catch (err) {\n // Never swallow the framework's own control flow — see isFrameworkSignal.\n if (isFrameworkSignal(err)) throw err\n lastReason = err instanceof Error ? err.message : 'network error'\n if (attempt < MINT_MAX_ATTEMPTS - 1) {\n await sleep(retryDelayMs(null, attempt))\n continue\n }\n break\n }\n\n if (res.ok) {\n const data: any = await res.json().catch(() => null)\n const token = data?.token\n const expiresIn = typeof data?.expiresIn === 'number' ? data.expiresIn : 3600\n if (typeof token === 'string' && token.startsWith(SITE_TOKEN_PREFIX)) {\n cache.set(rawKey, {\n credential: token,\n expiresAt: Date.now() + Math.min((expiresIn * 1000) / 2, 30 * 60_000),\n })\n return token\n }\n lastReason = 'mint returned no usable token'\n break\n }\n\n // 404 = an API older than the endpoint. Expected during rollout, and the raw\n // key is exactly what such an API still expects, so this stays a fallback\n // rather than a build failure.\n if (res.status === 404) {\n cache.set(rawKey, { credential: rawKey, expiresAt: Date.now() + 60_000 })\n return rawKey\n }\n\n lastReason = `HTTP ${res.status}`\n if (isRetryableStatus(res.status) && attempt < MINT_MAX_ATTEMPTS - 1) {\n const delay = retryDelayMs(res, attempt)\n console.warn(\n `[SiteKitLayout] Token mint returned ${res.status}; retrying in ${Math.round(delay)}ms ` +\n `(attempt ${attempt + 2}/${MINT_MAX_ATTEMPTS}).`,\n )\n await sleep(delay)\n continue\n }\n break\n }\n\n return failClosed(lastReason, rawKey, Date.now())\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkMCG4BSRW_js = require('./chunk-MCG4BSRW.js');
5
- var chunk3GHPFLEH_js = require('./chunk-3GHPFLEH.js');
4
+ var chunkPKZMNDZJ_js = require('./chunk-PKZMNDZJ.js');
5
+ var chunk5ABTBPPK_js = require('./chunk-5ABTBPPK.js');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
  var React5 = require('react');
8
8
 
@@ -112,7 +112,7 @@ async function apiPost(endpoint, body = {}) {
112
112
  return null;
113
113
  }
114
114
  try {
115
- const response = await chunk3GHPFLEH_js.sonorFetch(`${apiUrl}${endpoint}`, {
115
+ const response = await chunk5ABTBPPK_js.sonorFetch(`${apiUrl}${endpoint}`, {
116
116
  method: "POST",
117
117
  headers: { "Content-Type": "application/json" },
118
118
  body: JSON.stringify(body)
@@ -279,7 +279,7 @@ async function fetchActiveProcessor() {
279
279
  const { apiUrl, apiKey } = getApiConfig();
280
280
  if (!apiKey) return null;
281
281
  try {
282
- const response = await chunk3GHPFLEH_js.sonorFetch(`${apiUrl}/api/public/commerce/processor`, {
282
+ const response = await chunk5ABTBPPK_js.sonorFetch(`${apiUrl}/api/public/commerce/processor`, {
283
283
  method: "POST",
284
284
  headers: { "Content-Type": "application/json" },
285
285
  body: JSON.stringify({})
@@ -295,7 +295,7 @@ async function registerForEvent(eventId, scheduleId, customer) {
295
295
  const { apiUrl, apiKey } = getApiConfig();
296
296
  const analyticsSessionId = typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null;
297
297
  try {
298
- const response = await chunk3GHPFLEH_js.sonorFetch(`${apiUrl}/api/public/commerce/register`, {
298
+ const response = await chunk5ABTBPPK_js.sonorFetch(`${apiUrl}/api/public/commerce/register`, {
299
299
  method: "POST",
300
300
  headers: { "Content-Type": "application/json" },
301
301
  body: JSON.stringify({
@@ -345,7 +345,7 @@ function toCheckoutBody(options) {
345
345
  async function validateDiscountCode(code, subtotal, offeringIds = []) {
346
346
  const { apiUrl, apiKey } = getApiConfig();
347
347
  try {
348
- const response = await chunk3GHPFLEH_js.sonorFetch(`${apiUrl}/api/public/commerce/discount/validate`, {
348
+ const response = await chunk5ABTBPPK_js.sonorFetch(`${apiUrl}/api/public/commerce/discount/validate`, {
349
349
  method: "POST",
350
350
  headers: { "Content-Type": "application/json" },
351
351
  // offering_ids is the API's name. Older APIs read only that, so
@@ -365,7 +365,7 @@ async function fetchProcessorConfig() {
365
365
  const { apiUrl, apiKey } = getApiConfig();
366
366
  if (!apiKey) return null;
367
367
  try {
368
- const response = await chunk3GHPFLEH_js.sonorFetch(`${apiUrl}/api/public/commerce/processor-config`, {
368
+ const response = await chunk5ABTBPPK_js.sonorFetch(`${apiUrl}/api/public/commerce/processor-config`, {
369
369
  method: "POST",
370
370
  headers: { "Content-Type": "application/json" },
371
371
  body: JSON.stringify({})
@@ -381,7 +381,7 @@ async function createPaymentIntent(options) {
381
381
  const apiKey = getApiKey();
382
382
  const sessionId = typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null;
383
383
  try {
384
- const response = await chunk3GHPFLEH_js.sonorFetch(`${apiUrl}/api/public/commerce/create-payment-intent`, {
384
+ const response = await chunk5ABTBPPK_js.sonorFetch(`${apiUrl}/api/public/commerce/create-payment-intent`, {
385
385
  method: "POST",
386
386
  headers: { "Content-Type": "application/json" },
387
387
  body: JSON.stringify({
@@ -401,7 +401,7 @@ async function createCheckoutSession(optionsOrOfferingId, legacyOptions) {
401
401
  const options = typeof optionsOrOfferingId === "string" ? { offeringId: optionsOrOfferingId, ...legacyOptions } : optionsOrOfferingId;
402
402
  const analyticsSessionId = typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null;
403
403
  try {
404
- const response = await chunk3GHPFLEH_js.sonorFetch(`${apiUrl}/api/public/commerce/checkout`, {
404
+ const response = await chunk5ABTBPPK_js.sonorFetch(`${apiUrl}/api/public/commerce/checkout`, {
405
405
  method: "POST",
406
406
  headers: { "Content-Type": "application/json" },
407
407
  body: JSON.stringify({
@@ -3123,7 +3123,7 @@ function ProductDetail({
3123
3123
  const [checkoutError, setCheckoutError] = React5.useState(null);
3124
3124
  const [showStickyBar, setShowStickyBar] = React5.useState(false);
3125
3125
  const buyButtonRef = React5.useRef(null);
3126
- const analytics = chunkMCG4BSRW_js.useAnalyticsOptional();
3126
+ const analytics = chunkPKZMNDZJ_js.useAnalyticsOptional();
3127
3127
  React5.useEffect(() => {
3128
3128
  if (propProduct) {
3129
3129
  setProduct(propProduct);
@@ -4494,7 +4494,7 @@ function CheckoutForm({
4494
4494
  const [discountResult, setDiscountResult] = React5.useState(null);
4495
4495
  const [applyingDiscount, setApplyingDiscount] = React5.useState(false);
4496
4496
  const isProduct = offering.type === "product";
4497
- const analytics = chunkMCG4BSRW_js.useAnalyticsOptional();
4497
+ const analytics = chunkPKZMNDZJ_js.useAnalyticsOptional();
4498
4498
  React5.useEffect(() => {
4499
4499
  fetchProcessorConfig().then((config) => {
4500
4500
  if (config?.processor) setProcessor(config.processor);
@@ -7270,7 +7270,7 @@ function EventsWidget({
7270
7270
  setLoading(true);
7271
7271
  setError(null);
7272
7272
  try {
7273
- const response = await chunk3GHPFLEH_js.sonorFetch(`${apiUrl}/api/public/commerce/events`, {
7273
+ const response = await chunk5ABTBPPK_js.sonorFetch(`${apiUrl}/api/public/commerce/events`, {
7274
7274
  method: "POST",
7275
7275
  headers: { "Content-Type": "application/json" },
7276
7276
  body: JSON.stringify({
@@ -8067,5 +8067,5 @@ exports.shippingSelection = shippingSelection;
8067
8067
  exports.useEventModal = useEventModal;
8068
8068
  exports.validateAddress = validateAddress;
8069
8069
  exports.validateDiscountCode = validateDiscountCode;
8070
- //# sourceMappingURL=chunk-MIYGP34I.js.map
8071
- //# sourceMappingURL=chunk-MIYGP34I.js.map
8070
+ //# sourceMappingURL=chunk-NVOYCK2S.js.map
8071
+ //# sourceMappingURL=chunk-NVOYCK2S.js.map