@sonordev/site-kit 6.3.6 → 6.4.0

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 (274) hide show
  1. package/agent-manifest.json +8 -2
  2. package/dist/{AnalyticsProvider-XDVJTAPN.mjs → AnalyticsProvider-4K5T7OQ7.mjs} +6 -6
  3. package/dist/{AnalyticsProvider-XDVJTAPN.mjs.map → AnalyticsProvider-4K5T7OQ7.mjs.map} +1 -1
  4. package/dist/{AnalyticsProvider-L3GWK5PO.js → AnalyticsProvider-QXZN5O6D.js} +10 -10
  5. package/dist/{AnalyticsProvider-L3GWK5PO.js.map → AnalyticsProvider-QXZN5O6D.js.map} +1 -1
  6. package/dist/{ArticleViewTracker-7AJJTGFY.mjs → ArticleViewTracker-BUG2TOHS.mjs} +5 -5
  7. package/dist/{ArticleViewTracker-7AJJTGFY.mjs.map → ArticleViewTracker-BUG2TOHS.mjs.map} +1 -1
  8. package/dist/{ArticleViewTracker-YMGW6ZXB.js → ArticleViewTracker-FFMHR7AY.js} +6 -6
  9. package/dist/{ArticleViewTracker-YMGW6ZXB.js.map → ArticleViewTracker-FFMHR7AY.js.map} +1 -1
  10. package/dist/{ChatWidget-MR64ZLOG.mjs → ChatWidget-CRQPBDEF.mjs} +7 -7
  11. package/dist/{ChatWidget-MR64ZLOG.mjs.map → ChatWidget-CRQPBDEF.mjs.map} +1 -1
  12. package/dist/{ChatWidget-IAYEXLNX.js → ChatWidget-XFYLVXAX.js} +10 -10
  13. package/dist/{ChatWidget-IAYEXLNX.js.map → ChatWidget-XFYLVXAX.js.map} +1 -1
  14. package/dist/EngageWidget-S234YAT2.js +21 -0
  15. package/dist/{EngageWidget-BF7DH4GO.js.map → EngageWidget-S234YAT2.js.map} +1 -1
  16. package/dist/EngageWidget-SQU4T7CI.mjs +12 -0
  17. package/dist/{EngageWidget-RANSIKC3.mjs.map → EngageWidget-SQU4T7CI.mjs.map} +1 -1
  18. package/dist/{FileField-7ZNQ5BID.mjs → FileField-HNEBEBLB.mjs} +5 -5
  19. package/dist/{FileField-7ZNQ5BID.mjs.map → FileField-HNEBEBLB.mjs.map} +1 -1
  20. package/dist/{FileField-VRKATE4G.js → FileField-XG4EYAZW.js} +6 -6
  21. package/dist/{FileField-VRKATE4G.js.map → FileField-XG4EYAZW.js.map} +1 -1
  22. package/dist/{FormSpotlight-VQJ2QWIU.js → FormSpotlight-IODREOPN.js} +9 -9
  23. package/dist/{FormSpotlight-VQJ2QWIU.js.map → FormSpotlight-IODREOPN.js.map} +1 -1
  24. package/dist/{FormSpotlight-QNH7XGYS.mjs → FormSpotlight-VKD774PZ.mjs} +3 -3
  25. package/dist/{FormSpotlight-QNH7XGYS.mjs.map → FormSpotlight-VKD774PZ.mjs.map} +1 -1
  26. package/dist/{FormStage-3JIN6X6O.js → FormStage-37KKZQH4.js} +9 -9
  27. package/dist/{FormStage-3JIN6X6O.js.map → FormStage-37KKZQH4.js.map} +1 -1
  28. package/dist/{FormStage-XB4JNFCH.mjs → FormStage-PRZNRYNC.mjs} +3 -3
  29. package/dist/{FormStage-XB4JNFCH.mjs.map → FormStage-PRZNRYNC.mjs.map} +1 -1
  30. package/dist/ManagedForm-4PZOCKCV.mjs +16 -0
  31. package/dist/{ManagedForm-E6F4FLVY.mjs.map → ManagedForm-4PZOCKCV.mjs.map} +1 -1
  32. package/dist/ManagedForm-JCMEE626.js +25 -0
  33. package/dist/{ManagedForm-Q5UFMUBE.js.map → ManagedForm-JCMEE626.js.map} +1 -1
  34. package/dist/{ManagedNewsletterForm-UTNOJ5T4.js → ManagedNewsletterForm-CTC33B2U.js} +7 -7
  35. package/dist/{ManagedNewsletterForm-UTNOJ5T4.js.map → ManagedNewsletterForm-CTC33B2U.js.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-OEEC3GVY.mjs → ManagedNewsletterForm-KMZG24OE.mjs} +6 -6
  37. package/dist/{ManagedNewsletterForm-OEEC3GVY.mjs.map → ManagedNewsletterForm-KMZG24OE.mjs.map} +1 -1
  38. package/dist/{SignalCore-4AUWHMYK.js → SignalCore-YHT7WPXV.js} +11 -11
  39. package/dist/{SignalCore-4AUWHMYK.js.map → SignalCore-YHT7WPXV.js.map} +1 -1
  40. package/dist/{SignalCore-PWN5X6FF.mjs → SignalCore-YIPKKIUG.mjs} +5 -5
  41. package/dist/{SignalCore-PWN5X6FF.mjs.map → SignalCore-YIPKKIUG.mjs.map} +1 -1
  42. package/dist/SitemapSync-GN4OXIM2.js +18 -0
  43. package/dist/{SitemapSync-DHJ25PSH.js.map → SitemapSync-GN4OXIM2.js.map} +1 -1
  44. package/dist/SitemapSync-NG763CGN.mjs +9 -0
  45. package/dist/{SitemapSync-ZA2MNM63.mjs.map → SitemapSync-NG763CGN.mjs.map} +1 -1
  46. package/dist/analytics/index.js +9 -9
  47. package/dist/analytics/index.mjs +4 -4
  48. package/dist/articles/AuthorPage.d.ts +1 -1
  49. package/dist/articles/AuthorPage.d.ts.map +1 -1
  50. package/dist/articles/author-schema.d.ts +59 -13
  51. package/dist/articles/author-schema.d.ts.map +1 -1
  52. package/dist/articles/index.js +24 -23
  53. package/dist/articles/index.js.map +1 -1
  54. package/dist/articles/index.mjs +12 -11
  55. package/dist/articles/index.mjs.map +1 -1
  56. package/dist/articles/routes.d.ts +9 -0
  57. package/dist/articles/routes.d.ts.map +1 -1
  58. package/dist/articles/server-core.d.ts +5 -2
  59. package/dist/articles/server-core.d.ts.map +1 -1
  60. package/dist/articles/server-ui.js +45 -45
  61. package/dist/articles/server-ui.mjs +8 -8
  62. package/dist/articles/server.d.ts +5 -2
  63. package/dist/articles/server.d.ts.map +1 -1
  64. package/dist/articles/server.js +72 -56
  65. package/dist/articles/server.mjs +3 -3
  66. package/dist/articles/types.d.ts +17 -0
  67. package/dist/articles/types.d.ts.map +1 -1
  68. package/dist/{chunk-PQICWWQW.mjs → chunk-24LFAQEG.mjs} +5 -5
  69. package/dist/{chunk-PQICWWQW.mjs.map → chunk-24LFAQEG.mjs.map} +1 -1
  70. package/dist/chunk-3AOKYAZ2.js +135 -0
  71. package/dist/chunk-3AOKYAZ2.js.map +1 -0
  72. package/dist/{chunk-UJIKP35G.mjs → chunk-4C3INRHE.mjs} +4 -4
  73. package/dist/{chunk-UJIKP35G.mjs.map → chunk-4C3INRHE.mjs.map} +1 -1
  74. package/dist/{chunk-ZR43XFUM.js → chunk-55J2KE7D.js} +3 -3
  75. package/dist/chunk-55J2KE7D.js.map +1 -0
  76. package/dist/{chunk-B2NO5QVY.mjs → chunk-5BARLEAI.mjs} +3 -3
  77. package/dist/{chunk-B2NO5QVY.mjs.map → chunk-5BARLEAI.mjs.map} +1 -1
  78. package/dist/{chunk-BJKA3XRS.mjs → chunk-5T3J24K4.mjs} +4 -4
  79. package/dist/{chunk-BJKA3XRS.mjs.map → chunk-5T3J24K4.mjs.map} +1 -1
  80. package/dist/{chunk-3J5L5DIK.js → chunk-5W4S7XQD.js} +3 -3
  81. package/dist/{chunk-3J5L5DIK.js.map → chunk-5W4S7XQD.js.map} +1 -1
  82. package/dist/{chunk-6DCAMW62.mjs → chunk-6C47333H.mjs} +3 -3
  83. package/dist/chunk-6C47333H.mjs.map +1 -0
  84. package/dist/{chunk-YKZ3EVAQ.mjs → chunk-6QPKC6XP.mjs} +3 -3
  85. package/dist/{chunk-YKZ3EVAQ.mjs.map → chunk-6QPKC6XP.mjs.map} +1 -1
  86. package/dist/{chunk-JOYMIGR2.mjs → chunk-7K6L33BX.mjs} +22 -22
  87. package/dist/{chunk-JS75ORH7.js → chunk-ATPQ6264.js} +24 -24
  88. package/dist/{chunk-5J4FKRGH.mjs → chunk-BI7DH42Z.mjs} +4 -4
  89. package/dist/{chunk-5J4FKRGH.mjs.map → chunk-BI7DH42Z.mjs.map} +1 -1
  90. package/dist/{chunk-J4C3JAJF.js → chunk-C7J4XLBN.js} +15 -15
  91. package/dist/{chunk-J4C3JAJF.js.map → chunk-C7J4XLBN.js.map} +1 -1
  92. package/dist/{chunk-LWCAZDY2.js → chunk-CDRQYJUT.js} +4 -4
  93. package/dist/{chunk-LWCAZDY2.js.map → chunk-CDRQYJUT.js.map} +1 -1
  94. package/dist/chunk-CIB3RHNZ.js +8 -0
  95. package/dist/{chunk-6SBRD5KT.js.map → chunk-CIB3RHNZ.js.map} +1 -1
  96. package/dist/{chunk-FRUBUQOH.js → chunk-CUZ3I6CO.js} +5 -5
  97. package/dist/{chunk-FRUBUQOH.js.map → chunk-CUZ3I6CO.js.map} +1 -1
  98. package/dist/{chunk-PMWF5CRL.js → chunk-EWDWLY74.js} +11 -11
  99. package/dist/{chunk-PMWF5CRL.js.map → chunk-EWDWLY74.js.map} +1 -1
  100. package/dist/{chunk-OLVCGOXZ.js → chunk-F2GECCK7.js} +12 -12
  101. package/dist/{chunk-OLVCGOXZ.js.map → chunk-F2GECCK7.js.map} +1 -1
  102. package/dist/chunk-GFSQMK35.mjs +127 -0
  103. package/dist/chunk-GFSQMK35.mjs.map +1 -0
  104. package/dist/{chunk-2MEMK5XC.js → chunk-GGGX54ZE.js} +14 -14
  105. package/dist/{chunk-2MEMK5XC.js.map → chunk-GGGX54ZE.js.map} +1 -1
  106. package/dist/{chunk-6MOGGEY3.mjs → chunk-GSU6VTCZ.mjs} +3 -3
  107. package/dist/{chunk-6MOGGEY3.mjs.map → chunk-GSU6VTCZ.mjs.map} +1 -1
  108. package/dist/{chunk-3POB4JKR.js → chunk-GXSSFQ5D.js} +15 -15
  109. package/dist/{chunk-3POB4JKR.js.map → chunk-GXSSFQ5D.js.map} +1 -1
  110. package/dist/{chunk-BJ4T65OK.mjs → chunk-H4TSADY3.mjs} +3 -3
  111. package/dist/{chunk-BJ4T65OK.mjs.map → chunk-H4TSADY3.mjs.map} +1 -1
  112. package/dist/{chunk-2UZULHI4.js → chunk-HSLPN3QK.js} +7 -7
  113. package/dist/{chunk-2UZULHI4.js.map → chunk-HSLPN3QK.js.map} +1 -1
  114. package/dist/{chunk-EB33U2WT.js → chunk-HTCNRTN6.js} +129 -69
  115. package/dist/chunk-HTCNRTN6.js.map +1 -0
  116. package/dist/{chunk-3Q3Y6OQE.mjs → chunk-JXRGIE3V.mjs} +4 -4
  117. package/dist/{chunk-3Q3Y6OQE.mjs.map → chunk-JXRGIE3V.mjs.map} +1 -1
  118. package/dist/chunk-K3PVUXKB.mjs +6 -0
  119. package/dist/{chunk-3V6DIQI7.mjs.map → chunk-K3PVUXKB.mjs.map} +1 -1
  120. package/dist/{chunk-KMONA7CT.mjs → chunk-KOPFFKG2.mjs} +3 -3
  121. package/dist/{chunk-KMONA7CT.mjs.map → chunk-KOPFFKG2.mjs.map} +1 -1
  122. package/dist/{chunk-UAOQVHZW.js → chunk-KZBDH5A3.js} +4 -4
  123. package/dist/{chunk-UAOQVHZW.js.map → chunk-KZBDH5A3.js.map} +1 -1
  124. package/dist/{chunk-SB4CJX2X.mjs → chunk-LPDXS2B2.mjs} +3 -3
  125. package/dist/{chunk-SB4CJX2X.mjs.map → chunk-LPDXS2B2.mjs.map} +1 -1
  126. package/dist/{chunk-6I5O5CTL.mjs → chunk-M3JCHPK3.mjs} +127 -67
  127. package/dist/chunk-M3JCHPK3.mjs.map +1 -0
  128. package/dist/{chunk-LFF32POH.mjs → chunk-M62L2N5A.mjs} +3 -3
  129. package/dist/{chunk-LFF32POH.mjs.map → chunk-M62L2N5A.mjs.map} +1 -1
  130. package/dist/{chunk-G3L26XQ7.js → chunk-OIPG3EGM.js} +5 -5
  131. package/dist/{chunk-G3L26XQ7.js.map → chunk-OIPG3EGM.js.map} +1 -1
  132. package/dist/{chunk-X3MY4PL7.mjs → chunk-QAQTDHHT.mjs} +10 -14
  133. package/dist/chunk-QAQTDHHT.mjs.map +1 -0
  134. package/dist/{chunk-KB7SIIVY.mjs → chunk-QOKMH2TD.mjs} +3 -3
  135. package/dist/{chunk-KB7SIIVY.mjs.map → chunk-QOKMH2TD.mjs.map} +1 -1
  136. package/dist/{chunk-HXHRS3PX.mjs → chunk-RCB6HEHM.mjs} +3 -3
  137. package/dist/{chunk-HXHRS3PX.mjs.map → chunk-RCB6HEHM.mjs.map} +1 -1
  138. package/dist/{chunk-NNZDWY3L.mjs → chunk-RH4XEXTK.mjs} +3 -3
  139. package/dist/{chunk-NAA5J2JM.js → chunk-RQROZLH3.js} +47 -51
  140. package/dist/chunk-RQROZLH3.js.map +1 -0
  141. package/dist/{chunk-VGBUC2JP.js → chunk-S5QKNXLQ.js} +10 -10
  142. package/dist/{chunk-VGBUC2JP.js.map → chunk-S5QKNXLQ.js.map} +1 -1
  143. package/dist/{chunk-5DZVQW35.mjs → chunk-SBTA6B6Y.mjs} +4 -4
  144. package/dist/{chunk-5DZVQW35.mjs.map → chunk-SBTA6B6Y.mjs.map} +1 -1
  145. package/dist/{chunk-5YA6SI4Z.mjs → chunk-TIFVAASU.mjs} +2 -2
  146. package/dist/{chunk-R26FAQWF.mjs → chunk-TPDDSEL3.mjs} +3 -3
  147. package/dist/{chunk-R26FAQWF.mjs.map → chunk-TPDDSEL3.mjs.map} +1 -1
  148. package/dist/{chunk-X5J3PYZJ.js → chunk-U4CYO4NG.js} +5 -5
  149. package/dist/{chunk-X5J3PYZJ.js.map → chunk-U4CYO4NG.js.map} +1 -1
  150. package/dist/{chunk-TE3YNZVH.js → chunk-U5NFIHLY.js} +4 -4
  151. package/dist/{chunk-TE3YNZVH.js.map → chunk-U5NFIHLY.js.map} +1 -1
  152. package/dist/{chunk-L6BQIDSZ.mjs → chunk-USQPRLSG.mjs} +8 -8
  153. package/dist/{chunk-L6BQIDSZ.mjs.map → chunk-USQPRLSG.mjs.map} +1 -1
  154. package/dist/{chunk-5XDOBM5S.js → chunk-VDEQVXNV.js} +3 -3
  155. package/dist/{chunk-5XDOBM5S.js.map → chunk-VDEQVXNV.js.map} +1 -1
  156. package/dist/{chunk-SAOUAIRS.js → chunk-VMNPLCZB.js} +14 -14
  157. package/dist/{chunk-SAOUAIRS.js.map → chunk-VMNPLCZB.js.map} +1 -1
  158. package/dist/{chunk-ANYCUTS5.js → chunk-W7IAG5YD.js} +3 -3
  159. package/dist/{chunk-ANYCUTS5.js.map → chunk-W7IAG5YD.js.map} +1 -1
  160. package/dist/{chunk-K6ZQVDP4.mjs → chunk-WIWHM47B.mjs} +3 -3
  161. package/dist/{chunk-K6ZQVDP4.mjs.map → chunk-WIWHM47B.mjs.map} +1 -1
  162. package/dist/{chunk-I7AZC5ZQ.js → chunk-XXSSUCJB.js} +2 -2
  163. package/dist/{chunk-7NFSSPGM.js → chunk-XZHR4E2D.js} +8 -8
  164. package/dist/{chunk-7NFSSPGM.js.map → chunk-XZHR4E2D.js.map} +1 -1
  165. package/dist/{chunk-E7EV2AHT.js → chunk-YACU35MY.js} +9 -9
  166. package/dist/{chunk-E7EV2AHT.js.map → chunk-YACU35MY.js.map} +1 -1
  167. package/dist/chunk-YMZNEDFP.js +39 -0
  168. package/dist/chunk-YMZNEDFP.js.map +1 -0
  169. package/dist/{chunk-CXYGKK4U.mjs → chunk-YRKWJCML.mjs} +3 -3
  170. package/dist/{chunk-CXYGKK4U.mjs.map → chunk-YRKWJCML.mjs.map} +1 -1
  171. package/dist/chunk-Z2URIOKG.mjs +36 -0
  172. package/dist/chunk-Z2URIOKG.mjs.map +1 -0
  173. package/dist/{chunk-W46QIVBM.mjs → chunk-ZEBOOUBP.mjs} +3 -3
  174. package/dist/{chunk-W46QIVBM.mjs.map → chunk-ZEBOOUBP.mjs.map} +1 -1
  175. package/dist/{chunk-SNXJXPB6.js → chunk-ZOBUA65N.js} +6 -6
  176. package/dist/{chunk-SNXJXPB6.js.map → chunk-ZOBUA65N.js.map} +1 -1
  177. package/dist/{chunk-NN2YE5WT.js → chunk-ZUQSVCMD.js} +3 -3
  178. package/dist/cli/index.js +211 -211
  179. package/dist/cli/index.mjs +151 -151
  180. package/dist/client/index.js +4 -4
  181. package/dist/client/index.mjs +3 -3
  182. package/dist/commerce/index.js +57 -57
  183. package/dist/commerce/index.mjs +5 -5
  184. package/dist/engage/DesignRenderer.d.ts.map +1 -1
  185. package/dist/engage/EngageWidget.d.ts.map +1 -1
  186. package/dist/engage/element-rules.d.ts +39 -0
  187. package/dist/engage/element-rules.d.ts.map +1 -0
  188. package/dist/engage/index.js +9 -9
  189. package/dist/engage/index.mjs +6 -6
  190. package/dist/fleet/index.js +8 -8
  191. package/dist/fleet/index.mjs +4 -4
  192. package/dist/forms/index.js +13 -13
  193. package/dist/forms/index.mjs +7 -7
  194. package/dist/forms/server.js +2 -2
  195. package/dist/forms/server.mjs +1 -1
  196. package/dist/images/index.js +11 -11
  197. package/dist/images/index.mjs +4 -4
  198. package/dist/index.js +63 -63
  199. package/dist/index.mjs +9 -9
  200. package/dist/layout/client.js +8 -8
  201. package/dist/layout/client.mjs +7 -7
  202. package/dist/layout/index.js +10 -10
  203. package/dist/layout/index.mjs +8 -8
  204. package/dist/{lib-6HOOMENJ.js → lib-6GWWPDJR.js} +7 -7
  205. package/dist/lib-BD4KKQBI.mjs +4 -0
  206. package/dist/{lib-R7IQ4ZHE.mjs → lib-N5PD6JNJ.mjs} +2 -2
  207. package/dist/{lib-BGAWCSUH.js → lib-WFB5RLEQ.js} +8 -8
  208. package/dist/llms/index.d.ts +2 -0
  209. package/dist/llms/index.d.ts.map +1 -1
  210. package/dist/llms/index.js +129 -14
  211. package/dist/llms/index.js.map +1 -1
  212. package/dist/llms/index.mjs +115 -5
  213. package/dist/llms/index.mjs.map +1 -1
  214. package/dist/llms/revalidate.d.ts +3 -0
  215. package/dist/llms/revalidate.d.ts.map +1 -1
  216. package/dist/llms/seo-revalidate.d.ts +105 -0
  217. package/dist/llms/seo-revalidate.d.ts.map +1 -0
  218. package/dist/maps/index.js +5 -5
  219. package/dist/maps/index.mjs +3 -3
  220. package/dist/mcp/transport.d.ts +166 -0
  221. package/dist/mcp/transport.d.ts.map +1 -0
  222. package/dist/mcp/transport.js +137 -0
  223. package/dist/mcp/transport.js.map +1 -0
  224. package/dist/mcp/transport.mjs +123 -0
  225. package/dist/mcp/transport.mjs.map +1 -0
  226. package/dist/search/index.js +4 -4
  227. package/dist/search/index.mjs +3 -3
  228. package/dist/seo/client.js +5 -5
  229. package/dist/seo/client.mjs +4 -4
  230. package/dist/seo/index.js +5 -5
  231. package/dist/seo/index.mjs +4 -4
  232. package/dist/seo/register-sitemap-cli.js +3 -3
  233. package/dist/seo/register-sitemap-cli.mjs +2 -2
  234. package/dist/server/index.js +3 -3
  235. package/dist/server/index.mjs +2 -2
  236. package/dist/shared/build-entries.d.ts +7 -0
  237. package/dist/shared/build-entries.d.ts.map +1 -1
  238. package/dist/shared/request-guards.d.ts +27 -0
  239. package/dist/shared/request-guards.d.ts.map +1 -0
  240. package/dist/shared/version.d.ts +1 -1
  241. package/dist/signal/index.js +11 -11
  242. package/dist/signal/index.mjs +2 -2
  243. package/dist/sitemap/index.js +3 -3
  244. package/dist/sitemap/index.mjs +2 -2
  245. package/dist/sync/index.js +17 -17
  246. package/dist/sync/index.mjs +4 -4
  247. package/dist/{web-vitals.attribution-7LKLZ5GR.mjs → web-vitals.attribution-CHXXWO72.mjs} +3 -3
  248. package/dist/web-vitals.attribution-CHXXWO72.mjs.map +1 -0
  249. package/dist/{web-vitals.attribution-ONVYQNRB.js → web-vitals.attribution-SQVZNHN3.js} +3 -3
  250. package/dist/web-vitals.attribution-SQVZNHN3.js.map +1 -0
  251. package/dist/{writeLLMsTxt-LYYC3ZSN.mjs → writeLLMsTxt-IYJILIU3.mjs} +3 -3
  252. package/dist/{writeLLMsTxt-XHLHJ5XY.js → writeLLMsTxt-SQG4B63X.js} +4 -4
  253. package/package.json +6 -1
  254. package/dist/EngageWidget-BF7DH4GO.js +0 -21
  255. package/dist/EngageWidget-RANSIKC3.mjs +0 -12
  256. package/dist/ManagedForm-E6F4FLVY.mjs +0 -16
  257. package/dist/ManagedForm-Q5UFMUBE.js +0 -25
  258. package/dist/SitemapSync-DHJ25PSH.js +0 -18
  259. package/dist/SitemapSync-ZA2MNM63.mjs +0 -9
  260. package/dist/chunk-3V6DIQI7.mjs +0 -6
  261. package/dist/chunk-6DCAMW62.mjs.map +0 -1
  262. package/dist/chunk-6I5O5CTL.mjs.map +0 -1
  263. package/dist/chunk-6SBRD5KT.js +0 -8
  264. package/dist/chunk-EB33U2WT.js.map +0 -1
  265. package/dist/chunk-NAA5J2JM.js.map +0 -1
  266. package/dist/chunk-X3MY4PL7.mjs.map +0 -1
  267. package/dist/chunk-YRCR7WY3.js +0 -65
  268. package/dist/chunk-YRCR7WY3.js.map +0 -1
  269. package/dist/chunk-ZL35JCDA.mjs +0 -61
  270. package/dist/chunk-ZL35JCDA.mjs.map +0 -1
  271. package/dist/chunk-ZR43XFUM.js.map +0 -1
  272. package/dist/lib-RSDMEKDQ.mjs +0 -4
  273. package/dist/web-vitals.attribution-7LKLZ5GR.mjs.map +0 -1
  274. package/dist/web-vitals.attribution-ONVYQNRB.js.map +0 -1
@@ -1,11 +1,11 @@
1
- import { parse } from './chunk-5YA6SI4Z.mjs';
1
+ import { parse } from './chunk-TIFVAASU.mjs';
2
2
  import { __commonJS, __export, __toESM, __publicField } from './chunk-BEXTDHO4.mjs';
3
3
  import { isatty } from 'tty';
4
4
  import { inspect, formatWithOptions, styleText } from 'util';
5
5
 
6
- // node_modules/.pnpm/jsesc@3.1.0/node_modules/jsesc/jsesc.js
6
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/jsesc@3.1.0/node_modules/jsesc/jsesc.js
7
7
  var require_jsesc = __commonJS({
8
- "node_modules/.pnpm/jsesc@3.1.0/node_modules/jsesc/jsesc.js"(exports, module) {
8
+ "../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/jsesc@3.1.0/node_modules/jsesc/jsesc.js"(exports, module) {
9
9
  var object = {};
10
10
  var hasOwnProperty = object.hasOwnProperty;
11
11
  var forOwn = (object2, callback) => {
@@ -278,7 +278,7 @@ var require_jsesc = __commonJS({
278
278
  }
279
279
  });
280
280
 
281
- // node_modules/.pnpm/obug@2.1.4/node_modules/obug/dist/core.js
281
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/obug@2.1.4/node_modules/obug/dist/core.js
282
282
  function coerce(value) {
283
283
  if (value instanceof Error) return value.stack || value.message;
284
284
  return value;
@@ -544,7 +544,7 @@ function createDebug2(namespace, options) {
544
544
  }
545
545
  enable(env.DEBUG || "");
546
546
 
547
- // node_modules/.pnpm/@babel+code-frame@8.0.0/node_modules/@babel/code-frame/lib/common-shared.js
547
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+code-frame@8.0.0/node_modules/@babel/code-frame/lib/common-shared.js
548
548
  var NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
549
549
  function getMarkerLines(loc, source, opts, startLineBaseZero) {
550
550
  const startLoc = {
@@ -659,7 +659,7 @@ ${frame}`;
659
659
  return defs2.reset(frame);
660
660
  }
661
661
 
662
- // node_modules/.pnpm/js-tokens@10.0.0/node_modules/js-tokens/index.js
662
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/js-tokens@10.0.0/node_modules/js-tokens/index.js
663
663
  var HashbangComment;
664
664
  var Identifier;
665
665
  var JSXIdentifier;
@@ -1076,7 +1076,7 @@ jsTokens = function* (input, { jsx = false } = {}) {
1076
1076
  };
1077
1077
  var js_tokens_default = jsTokens;
1078
1078
 
1079
- // node_modules/.pnpm/@babel+helper-validator-identifier@8.0.4/node_modules/@babel/helper-validator-identifier/lib/identifier.js
1079
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+helper-validator-identifier@8.0.4/node_modules/@babel/helper-validator-identifier/lib/identifier.js
1080
1080
  var bmpIdentifierStart = /[\p{ID_Start}\u088f\u0c5c\u0cdc\ua7ce\ua7cf\ua7d2\ua7d4\ua7f1]/u;
1081
1081
  var bmpIdentifier = /[\p{ID_Continue}\u088f\u0c5c\u0cdc\ua7ce\ua7cf\ua7d2\ua7d4\ua7f1\u1acf-\u1add\u1ae0-\u1aeb]/u;
1082
1082
  var supplementaryIdentifierStartCodes = [2368, 25, 1388, 2, 3817, 43, 20677, 24, 3, 24, 287, 4, 6146, 7, 1290, 21, 98, 114, 22734, 30, 2, 2, 2, 1, 2, 6, 3, 4, 10, 1, 53307, 5, 5987, 11, 21763, 4297];
@@ -1135,7 +1135,7 @@ function isIdentifierName(name) {
1135
1135
  return !isFirst;
1136
1136
  }
1137
1137
 
1138
- // node_modules/.pnpm/@babel+helper-validator-identifier@8.0.4/node_modules/@babel/helper-validator-identifier/lib/index.js
1138
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+helper-validator-identifier@8.0.4/node_modules/@babel/helper-validator-identifier/lib/index.js
1139
1139
  var reservedWords = {
1140
1140
  keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"],
1141
1141
  strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"],
@@ -1154,7 +1154,7 @@ function isKeyword(word) {
1154
1154
  return keywords.has(word);
1155
1155
  }
1156
1156
 
1157
- // node_modules/.pnpm/@babel+code-frame@8.0.0/node_modules/@babel/code-frame/lib/index.js
1157
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+code-frame@8.0.0/node_modules/@babel/code-frame/lib/index.js
1158
1158
  function isColorSupported() {
1159
1159
  return styleText("red", "-") !== "-";
1160
1160
  }
@@ -1299,7 +1299,7 @@ function codeFrameColumns(rawLines, loc, opts = {}) {
1299
1299
  } : void 0);
1300
1300
  }
1301
1301
 
1302
- // node_modules/.pnpm/@babel+types@8.0.4/node_modules/@babel/types/lib/index.js
1302
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+types@8.0.4/node_modules/@babel/types/lib/index.js
1303
1303
  var lib_exports = {};
1304
1304
  __export(lib_exports, {
1305
1305
  ACCESSOR_TYPES: () => ACCESSOR_TYPES,
@@ -2551,7 +2551,7 @@ __export(lib_exports, {
2551
2551
  yieldExpression: () => yieldExpression
2552
2552
  });
2553
2553
 
2554
- // node_modules/.pnpm/@babel+helper-string-parser@8.0.0/node_modules/@babel/helper-string-parser/lib/index.js
2554
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+helper-string-parser@8.0.0/node_modules/@babel/helper-string-parser/lib/index.js
2555
2555
  var _isDigit = function isDigit(code) {
2556
2556
  return code >= 48 && code <= 57;
2557
2557
  };
@@ -2803,7 +2803,7 @@ function readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors) {
2803
2803
  };
2804
2804
  }
2805
2805
 
2806
- // node_modules/.pnpm/@babel+types@8.0.4/node_modules/@babel/types/lib/index.js
2806
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+types@8.0.4/node_modules/@babel/types/lib/index.js
2807
2807
  function shallowEqual(actual, expected) {
2808
2808
  const keys2 = Object.keys(expected);
2809
2809
  for (const key of keys2) {
@@ -13899,7 +13899,7 @@ var react = {
13899
13899
  buildChildren
13900
13900
  };
13901
13901
 
13902
- // node_modules/.pnpm/@babel+helper-globals@8.0.0/node_modules/@babel/helper-globals/data/builtin-lower.json
13902
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+helper-globals@8.0.0/node_modules/@babel/helper-globals/data/builtin-lower.json
13903
13903
  var builtin_lower_default = [
13904
13904
  "decodeURI",
13905
13905
  "decodeURIComponent",
@@ -13916,7 +13916,7 @@ var builtin_lower_default = [
13916
13916
  "unescape"
13917
13917
  ];
13918
13918
 
13919
- // node_modules/.pnpm/@babel+helper-globals@8.0.0/node_modules/@babel/helper-globals/data/builtin-upper.json
13919
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+helper-globals@8.0.0/node_modules/@babel/helper-globals/data/builtin-upper.json
13920
13920
  var builtin_upper_default = [
13921
13921
  "AggregateError",
13922
13922
  "Array",
@@ -13969,7 +13969,7 @@ var builtin_upper_default = [
13969
13969
  "WeakSet"
13970
13970
  ];
13971
13971
 
13972
- // node_modules/.pnpm/@jridgewell+sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs
13972
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@jridgewell+sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs
13973
13973
  var comma = ",".charCodeAt(0);
13974
13974
  var semicolon = ";".charCodeAt(0);
13975
13975
  var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@@ -14137,7 +14137,7 @@ function encode(decoded) {
14137
14137
  return writer.flush();
14138
14138
  }
14139
14139
 
14140
- // node_modules/.pnpm/@jridgewell+resolve-uri@3.1.2/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs
14140
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@jridgewell+resolve-uri@3.1.2/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs
14141
14141
  var schemeRegex = /^[\w+.-]+:\/\//;
14142
14142
  var urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?(\?[^#]*)?(#.*)?/;
14143
14143
  var fileRegex = /^file:(?:\/\/((?![a-z]:)[^/#?]*)?)?(\/?[^#?]*)(\?[^#]*)?(#.*)?/i;
@@ -14306,7 +14306,7 @@ function resolve(input, base) {
14306
14306
  }
14307
14307
  }
14308
14308
 
14309
- // node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs
14309
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs
14310
14310
  function stripFilename(path) {
14311
14311
  if (!path) return "";
14312
14312
  const index3 = path.lastIndexOf("/");
@@ -14492,7 +14492,7 @@ function traceSegmentInternal(segments, memo, line, column, bias) {
14492
14492
  return index3;
14493
14493
  }
14494
14494
 
14495
- // node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs
14495
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs
14496
14496
  var SetArray = class {
14497
14497
  constructor() {
14498
14498
  this._indexes = { __proto__: null };
@@ -14690,7 +14690,7 @@ function addMappingInternal(skipable, map, mapping) {
14690
14690
  );
14691
14691
  }
14692
14692
 
14693
- // node_modules/.pnpm/@babel+generator@8.0.0/node_modules/@babel/generator/lib/index.js
14693
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+generator@8.0.0/node_modules/@babel/generator/lib/index.js
14694
14694
  var import_jsesc = __toESM(require_jsesc(), 1);
14695
14695
  var SourceMap = class {
14696
14696
  constructor(opts, code) {
@@ -19348,7 +19348,7 @@ function generate(ast, opts = {}, code) {
19348
19348
  return printer.generate(ast);
19349
19349
  }
19350
19350
 
19351
- // node_modules/.pnpm/@babel+template@8.0.0/node_modules/@babel/template/lib/index.js
19351
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+template@8.0.0/node_modules/@babel/template/lib/index.js
19352
19352
  var {
19353
19353
  assertExpressionStatement: assertExpressionStatement2
19354
19354
  } = lib_exports;
@@ -19888,7 +19888,7 @@ var index2 = Object.assign(smart.bind(void 0), {
19888
19888
  ast: smart.ast
19889
19889
  });
19890
19890
 
19891
- // node_modules/.pnpm/@babel+traverse@8.0.4/node_modules/@babel/traverse/lib/index.js
19891
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+traverse@8.0.4/node_modules/@babel/traverse/lib/index.js
19892
19892
  var ReferencedIdentifier = ["Identifier", "JSXIdentifier"];
19893
19893
  var ReferencedMemberExpression = ["MemberExpression"];
19894
19894
  var BindingIdentifier = ["Identifier"];
@@ -24839,4 +24839,4 @@ traverse3.hasType = function(tree, type, denylistTypes) {
24839
24839
  traverse3.cache = cache;
24840
24840
 
24841
24841
  export { Hub, NodePath_Final, Scope, isArrayExpression, isFunctionDeclaration, isIdentifier, isJSXAttribute, isJSXExpressionContainer, isJSXIdentifier, isJSXMemberExpression, isJSXText, isObjectExpression, isStringLiteral, isTemplateLiteral, isVariableDeclarator, traverse3 as traverse, visitors };
24842
- //# sourceMappingURL=chunk-JOYMIGR2.mjs.map
24842
+ //# sourceMappingURL=chunk-7K6L33BX.mjs.map
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var chunkI7AZC5ZQ_js = require('./chunk-I7AZC5ZQ.js');
3
+ var chunkXXSSUCJB_js = require('./chunk-XXSSUCJB.js');
4
4
  var chunkSNAQBZPT_js = require('./chunk-SNAQBZPT.js');
5
5
  var tty = require('tty');
6
6
  var util = require('util');
7
7
 
8
- // node_modules/.pnpm/jsesc@3.1.0/node_modules/jsesc/jsesc.js
8
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/jsesc@3.1.0/node_modules/jsesc/jsesc.js
9
9
  var require_jsesc = chunkSNAQBZPT_js.__commonJS({
10
- "node_modules/.pnpm/jsesc@3.1.0/node_modules/jsesc/jsesc.js"(exports, module) {
10
+ "../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/jsesc@3.1.0/node_modules/jsesc/jsesc.js"(exports, module) {
11
11
  var object = {};
12
12
  var hasOwnProperty = object.hasOwnProperty;
13
13
  var forOwn = (object2, callback) => {
@@ -280,7 +280,7 @@ var require_jsesc = chunkSNAQBZPT_js.__commonJS({
280
280
  }
281
281
  });
282
282
 
283
- // node_modules/.pnpm/obug@2.1.4/node_modules/obug/dist/core.js
283
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/obug@2.1.4/node_modules/obug/dist/core.js
284
284
  function coerce(value) {
285
285
  if (value instanceof Error) return value.stack || value.message;
286
286
  return value;
@@ -546,7 +546,7 @@ function createDebug2(namespace, options) {
546
546
  }
547
547
  enable(env.DEBUG || "");
548
548
 
549
- // node_modules/.pnpm/@babel+code-frame@8.0.0/node_modules/@babel/code-frame/lib/common-shared.js
549
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+code-frame@8.0.0/node_modules/@babel/code-frame/lib/common-shared.js
550
550
  var NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
551
551
  function getMarkerLines(loc, source, opts, startLineBaseZero) {
552
552
  const startLoc = {
@@ -661,7 +661,7 @@ ${frame}`;
661
661
  return defs2.reset(frame);
662
662
  }
663
663
 
664
- // node_modules/.pnpm/js-tokens@10.0.0/node_modules/js-tokens/index.js
664
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/js-tokens@10.0.0/node_modules/js-tokens/index.js
665
665
  var HashbangComment;
666
666
  var Identifier;
667
667
  var JSXIdentifier;
@@ -1078,7 +1078,7 @@ jsTokens = function* (input, { jsx = false } = {}) {
1078
1078
  };
1079
1079
  var js_tokens_default = jsTokens;
1080
1080
 
1081
- // node_modules/.pnpm/@babel+helper-validator-identifier@8.0.4/node_modules/@babel/helper-validator-identifier/lib/identifier.js
1081
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+helper-validator-identifier@8.0.4/node_modules/@babel/helper-validator-identifier/lib/identifier.js
1082
1082
  var bmpIdentifierStart = /[\p{ID_Start}\u088f\u0c5c\u0cdc\ua7ce\ua7cf\ua7d2\ua7d4\ua7f1]/u;
1083
1083
  var bmpIdentifier = /[\p{ID_Continue}\u088f\u0c5c\u0cdc\ua7ce\ua7cf\ua7d2\ua7d4\ua7f1\u1acf-\u1add\u1ae0-\u1aeb]/u;
1084
1084
  var supplementaryIdentifierStartCodes = [2368, 25, 1388, 2, 3817, 43, 20677, 24, 3, 24, 287, 4, 6146, 7, 1290, 21, 98, 114, 22734, 30, 2, 2, 2, 1, 2, 6, 3, 4, 10, 1, 53307, 5, 5987, 11, 21763, 4297];
@@ -1137,7 +1137,7 @@ function isIdentifierName(name) {
1137
1137
  return !isFirst;
1138
1138
  }
1139
1139
 
1140
- // node_modules/.pnpm/@babel+helper-validator-identifier@8.0.4/node_modules/@babel/helper-validator-identifier/lib/index.js
1140
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+helper-validator-identifier@8.0.4/node_modules/@babel/helper-validator-identifier/lib/index.js
1141
1141
  var reservedWords = {
1142
1142
  keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"],
1143
1143
  strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"],
@@ -1156,7 +1156,7 @@ function isKeyword(word) {
1156
1156
  return keywords.has(word);
1157
1157
  }
1158
1158
 
1159
- // node_modules/.pnpm/@babel+code-frame@8.0.0/node_modules/@babel/code-frame/lib/index.js
1159
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+code-frame@8.0.0/node_modules/@babel/code-frame/lib/index.js
1160
1160
  function isColorSupported() {
1161
1161
  return util.styleText("red", "-") !== "-";
1162
1162
  }
@@ -1301,7 +1301,7 @@ function codeFrameColumns(rawLines, loc, opts = {}) {
1301
1301
  } : void 0);
1302
1302
  }
1303
1303
 
1304
- // node_modules/.pnpm/@babel+types@8.0.4/node_modules/@babel/types/lib/index.js
1304
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+types@8.0.4/node_modules/@babel/types/lib/index.js
1305
1305
  var lib_exports = {};
1306
1306
  chunkSNAQBZPT_js.__export(lib_exports, {
1307
1307
  ACCESSOR_TYPES: () => ACCESSOR_TYPES,
@@ -2553,7 +2553,7 @@ chunkSNAQBZPT_js.__export(lib_exports, {
2553
2553
  yieldExpression: () => yieldExpression
2554
2554
  });
2555
2555
 
2556
- // node_modules/.pnpm/@babel+helper-string-parser@8.0.0/node_modules/@babel/helper-string-parser/lib/index.js
2556
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+helper-string-parser@8.0.0/node_modules/@babel/helper-string-parser/lib/index.js
2557
2557
  var _isDigit = function isDigit(code) {
2558
2558
  return code >= 48 && code <= 57;
2559
2559
  };
@@ -2805,7 +2805,7 @@ function readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors) {
2805
2805
  };
2806
2806
  }
2807
2807
 
2808
- // node_modules/.pnpm/@babel+types@8.0.4/node_modules/@babel/types/lib/index.js
2808
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+types@8.0.4/node_modules/@babel/types/lib/index.js
2809
2809
  function shallowEqual(actual, expected) {
2810
2810
  const keys2 = Object.keys(expected);
2811
2811
  for (const key of keys2) {
@@ -13901,7 +13901,7 @@ var react = {
13901
13901
  buildChildren
13902
13902
  };
13903
13903
 
13904
- // node_modules/.pnpm/@babel+helper-globals@8.0.0/node_modules/@babel/helper-globals/data/builtin-lower.json
13904
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+helper-globals@8.0.0/node_modules/@babel/helper-globals/data/builtin-lower.json
13905
13905
  var builtin_lower_default = [
13906
13906
  "decodeURI",
13907
13907
  "decodeURIComponent",
@@ -13918,7 +13918,7 @@ var builtin_lower_default = [
13918
13918
  "unescape"
13919
13919
  ];
13920
13920
 
13921
- // node_modules/.pnpm/@babel+helper-globals@8.0.0/node_modules/@babel/helper-globals/data/builtin-upper.json
13921
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+helper-globals@8.0.0/node_modules/@babel/helper-globals/data/builtin-upper.json
13922
13922
  var builtin_upper_default = [
13923
13923
  "AggregateError",
13924
13924
  "Array",
@@ -13971,7 +13971,7 @@ var builtin_upper_default = [
13971
13971
  "WeakSet"
13972
13972
  ];
13973
13973
 
13974
- // node_modules/.pnpm/@jridgewell+sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs
13974
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@jridgewell+sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs
13975
13975
  var comma = ",".charCodeAt(0);
13976
13976
  var semicolon = ";".charCodeAt(0);
13977
13977
  var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@@ -14139,7 +14139,7 @@ function encode(decoded) {
14139
14139
  return writer.flush();
14140
14140
  }
14141
14141
 
14142
- // node_modules/.pnpm/@jridgewell+resolve-uri@3.1.2/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs
14142
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@jridgewell+resolve-uri@3.1.2/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs
14143
14143
  var schemeRegex = /^[\w+.-]+:\/\//;
14144
14144
  var urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?(\?[^#]*)?(#.*)?/;
14145
14145
  var fileRegex = /^file:(?:\/\/((?![a-z]:)[^/#?]*)?)?(\/?[^#?]*)(\?[^#]*)?(#.*)?/i;
@@ -14308,7 +14308,7 @@ function resolve(input, base) {
14308
14308
  }
14309
14309
  }
14310
14310
 
14311
- // node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs
14311
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs
14312
14312
  function stripFilename(path) {
14313
14313
  if (!path) return "";
14314
14314
  const index3 = path.lastIndexOf("/");
@@ -14494,7 +14494,7 @@ function traceSegmentInternal(segments, memo, line, column, bias) {
14494
14494
  return index3;
14495
14495
  }
14496
14496
 
14497
- // node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs
14497
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs
14498
14498
  var SetArray = class {
14499
14499
  constructor() {
14500
14500
  this._indexes = { __proto__: null };
@@ -14692,7 +14692,7 @@ function addMappingInternal(skipable, map, mapping) {
14692
14692
  );
14693
14693
  }
14694
14694
 
14695
- // node_modules/.pnpm/@babel+generator@8.0.0/node_modules/@babel/generator/lib/index.js
14695
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+generator@8.0.0/node_modules/@babel/generator/lib/index.js
14696
14696
  var import_jsesc = chunkSNAQBZPT_js.__toESM(require_jsesc(), 1);
14697
14697
  var SourceMap = class {
14698
14698
  constructor(opts, code) {
@@ -19350,7 +19350,7 @@ function generate(ast, opts = {}, code) {
19350
19350
  return printer.generate(ast);
19351
19351
  }
19352
19352
 
19353
- // node_modules/.pnpm/@babel+template@8.0.0/node_modules/@babel/template/lib/index.js
19353
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+template@8.0.0/node_modules/@babel/template/lib/index.js
19354
19354
  var {
19355
19355
  assertExpressionStatement: assertExpressionStatement2
19356
19356
  } = lib_exports;
@@ -19616,7 +19616,7 @@ function parseWithCodeFrame(code, parserOpts, syntacticPlaceholders) {
19616
19616
  plugins
19617
19617
  };
19618
19618
  try {
19619
- return chunkI7AZC5ZQ_js.parse(code, parserOpts);
19619
+ return chunkXXSSUCJB_js.parse(code, parserOpts);
19620
19620
  } catch (err) {
19621
19621
  const loc = err.loc;
19622
19622
  if (loc) {
@@ -19890,7 +19890,7 @@ var index2 = Object.assign(smart.bind(void 0), {
19890
19890
  ast: smart.ast
19891
19891
  });
19892
19892
 
19893
- // node_modules/.pnpm/@babel+traverse@8.0.4/node_modules/@babel/traverse/lib/index.js
19893
+ // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/@babel+traverse@8.0.4/node_modules/@babel/traverse/lib/index.js
19894
19894
  var ReferencedIdentifier = ["Identifier", "JSXIdentifier"];
19895
19895
  var ReferencedMemberExpression = ["MemberExpression"];
19896
19896
  var BindingIdentifier = ["Identifier"];
@@ -22547,7 +22547,7 @@ function replaceWithSourceString(replacement) {
22547
22547
  let ast;
22548
22548
  try {
22549
22549
  replacement = `(${replacement})`;
22550
- ast = chunkI7AZC5ZQ_js.parse(replacement);
22550
+ ast = chunkXXSSUCJB_js.parse(replacement);
22551
22551
  } catch (err) {
22552
22552
  const loc = err.loc;
22553
22553
  if (loc) {
@@ -24857,4 +24857,4 @@ exports.isTemplateLiteral = isTemplateLiteral;
24857
24857
  exports.isVariableDeclarator = isVariableDeclarator;
24858
24858
  exports.traverse = traverse3;
24859
24859
  exports.visitors = visitors;
24860
- //# sourceMappingURL=chunk-JS75ORH7.js.map
24860
+ //# sourceMappingURL=chunk-ATPQ6264.js.map
@@ -2,8 +2,8 @@
2
2
  import { sanitizeFleetVersion, buildFleetHeartbeatPayload } from './chunk-4WCA2HM6.mjs';
3
3
  import { useDeferredActivation } from './chunk-ZVBLXXNJ.mjs';
4
4
  import { resolveAnalyticsTarget } from './chunk-A6UYV475.mjs';
5
- import { sonorFetch } from './chunk-BJKA3XRS.mjs';
6
- import { SITE_KIT_VERSION } from './chunk-3V6DIQI7.mjs';
5
+ import { sonorFetch } from './chunk-5T3J24K4.mjs';
6
+ import { SITE_KIT_VERSION } from './chunk-K3PVUXKB.mjs';
7
7
  import { useRef, useEffect } from 'react';
8
8
 
9
9
  // src/fleet/heartbeat.ts
@@ -97,5 +97,5 @@ function FleetHeartbeat({
97
97
  }
98
98
 
99
99
  export { FLEET_HEARTBEAT_PATH, FleetHeartbeat, detectNextVersion, sendFleetHeartbeat };
100
- //# sourceMappingURL=chunk-5J4FKRGH.mjs.map
101
- //# sourceMappingURL=chunk-5J4FKRGH.mjs.map
100
+ //# sourceMappingURL=chunk-BI7DH42Z.mjs.map
101
+ //# sourceMappingURL=chunk-BI7DH42Z.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fleet/heartbeat.ts","../src/fleet/FleetHeartbeat.tsx"],"names":[],"mappings":"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","file":"chunk-5J4FKRGH.mjs","sourcesContent":["/**\n * @sonordev/site-kit/fleet — heartbeat sender (single source of truth for the POST)\n *\n * One place that turns fleet inputs into a validated payload and ships it to\n * `/api/public/fleet/heartbeat`. Used by BOTH the client component\n * (FleetHeartbeat) and any build-time caller, so the send path never forks.\n *\n * It routes through the shared analytics send gate and `sonorFetch`, which stamps\n * the x-sitekit-version header, attaches x-api-key, and honors the auth\n * circuit breaker — a site on a stale/canceled key will not spam the API.\n */\n\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from '../shared/reporting-gate'\nimport { sonorFetch } from '../shared/sonorFetch'\nimport { SITE_KIT_VERSION } from '../shared/version'\nimport {\n buildFleetHeartbeatPayload,\n sanitizeFleetVersion,\n type FleetHeartbeatPayload,\n type FleetHeartbeatSource,\n type FleetModule,\n} from './contract'\n\n/** Canonical ingest path — resolved against the site's Sonor API origin. */\nexport const FLEET_HEARTBEAT_PATH = '/api/public/fleet/heartbeat'\n\nexport interface SendFleetHeartbeatOptions extends AnalyticsGateOptions {\n /** Sonor API origin (e.g. https://api.sonor.io). Trailing slash tolerated. */\n apiUrl: string\n /** Project API key — scopes the request; the project is resolved server-side. */\n apiKey: string\n /** Client-observable active modules (validated/deduped by the contract). */\n modules?: FleetModule[] | string[]\n /** Normalized host for the multi-site sub-dimension (server re-normalizes). */\n site?: string | null\n /** Installed Next.js version, if the caller can resolve it. */\n nextVersion?: string | null\n /** 'client' (runtime boot) or 'build' (CI). Default 'client'. */\n source?: FleetHeartbeatSource\n /** Override the reported kit version. Defaults to the runtime SITE_KIT_VERSION. */\n kitVersion?: string\n /** Log one info line with the result. Never logs at error level. */\n debug?: boolean\n}\n\n/**\n * Best-effort runtime detection of the host Next.js version. Unreliable by\n * design — Next does not expose its version consistently across app/pages\n * router — so it returns null unless a site injects `__SITE_KIT_NEXT_VERSION__`\n * or `window.next.version` is present. Build-time callers should pass\n * `nextVersion` explicitly (resolvable from `next/package.json`).\n */\nexport function detectNextVersion(): string | null {\n if (typeof window === 'undefined') return null\n const w = window as unknown as {\n __SITE_KIT_NEXT_VERSION__?: string\n next?: { version?: string }\n }\n return sanitizeFleetVersion(w.__SITE_KIT_NEXT_VERSION__ ?? w.next?.version ?? null)\n}\n\n/**\n * Fire one heartbeat. Fire-and-forget by contract: it never throws — a\n * telemetry POST must never break a visitor's page or a site's build. Returns\n * true only when the POST was accepted (2xx).\n */\nexport async function sendFleetHeartbeat(opts: SendFleetHeartbeatOptions): Promise<boolean> {\n const { apiUrl, apiKey } = opts\n if (!apiUrl || !apiKey) return false\n const target = resolveAnalyticsTarget(opts)\n if (!target) return false\n\n const payload: FleetHeartbeatPayload = buildFleetHeartbeatPayload({\n kitVersion: opts.kitVersion || SITE_KIT_VERSION,\n nextVersion: opts.nextVersion,\n modules: opts.modules,\n site: opts.site,\n source: opts.source,\n })\n\n try {\n const res = await sonorFetch(\n `${target.apiUrl.replace(/\\/$/, '')}${FLEET_HEARTBEAT_PATH}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n },\n { apiKey: target.apiKey, retries: 0 },\n )\n if (opts.debug) {\n // info, never error: a visitor's console must stay clean (Lighthouse).\n console.info(\n `[Sonor fleet] heartbeat ${res.status} v${payload.kit_version} [${payload.modules.join(',') || 'none'}]`,\n )\n }\n return res.ok\n } catch (err) {\n if (opts.debug) console.info('[Sonor fleet] heartbeat skipped (network)', err)\n return false\n }\n}\n","/**\n * @sonordev/site-kit/fleet — FleetHeartbeat\n *\n * A childless, effect-only client component that reports this site's build\n * fingerprint (kit version, Next.js version, active modules, host) to Sonor\n * exactly once per browser session. It exists so the platform can answer\n * \"which version / modules / key state is each site running\" without shelling\n * into every client repo.\n *\n * It is mounted as a deferred, CHILDLESS SIBLING — never a wrapper — by\n * SiteKitClientProviders, behind the same idle/first-interaction gate as\n * Analytics and Engage, so it never enters the critical hydration path (see\n * CLAUDE.md \"the page must server-render\"). It renders null and carries no\n * visitor data.\n */\n\n'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { useDeferredActivation } from '../shared/defer'\nimport { SITE_KIT_VERSION } from '../shared/version'\nimport { detectNextVersion, sendFleetHeartbeat } from './heartbeat'\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from '../shared/reporting-gate'\nimport type { FleetModule } from './contract'\n\n/** Session guard key — one heartbeat per session, re-sent when version/host changes. */\nconst SESSION_GUARD_KEY = '_sk_fleet_hb'\n\nexport interface FleetHeartbeatProps extends AnalyticsGateOptions {\n /** Sonor API origin. Falls back to `window.__SITE_KIT_API_URL__` then api.sonor.io. */\n apiUrl?: string\n /** Project API key. Falls back to `window.__SITE_KIT_API_KEY__`. */\n apiKey?: string\n /** Host for the multi-site sub-dimension. Falls back to `__SITE_KIT_SITE__` then location.host. */\n site?: string | null\n /** Client-observable active modules (SiteKitClientProviders passes the enabled set). */\n modules?: FleetModule[]\n /** Installed Next.js version if known; otherwise best-effort runtime detection. */\n nextVersion?: string | null\n /**\n * Self-defer to idle / first interaction. Default true so standalone use is\n * safe. SiteKitClientProviders already gates the mount and passes false.\n */\n defer?: boolean\n /** Send at most once per browser session per (version, host). Default true. */\n oncePerSession?: boolean\n debug?: boolean\n}\n\nexport function FleetHeartbeat({\n apiUrl,\n apiKey,\n site,\n modules,\n nextVersion,\n defer = true,\n oncePerSession = true,\n debug = false,\n allowInFrame = false,\n allowLocalhost = false,\n}: FleetHeartbeatProps) {\n const ready = useDeferredActivation(defer)\n const sentRef = useRef(false)\n\n useEffect(() => {\n if (!ready || sentRef.current) return\n if (typeof window === 'undefined') return\n\n const w = window as unknown as {\n __SITE_KIT_API_URL__?: string\n __SITE_KIT_API_KEY__?: string\n __SITE_KIT_SITE__?: string\n }\n const target = resolveAnalyticsTarget({ apiUrl, apiKey, allowInFrame, allowLocalhost, debug })\n if (!target) return // Gate before stamping session storage.\n const { apiUrl: url, apiKey: key } = target\n\n const resolvedSite = site ?? w.__SITE_KIT_SITE__ ?? window.location.host ?? ''\n\n // Once-per-session-per-(version,host): keeps heartbeat volume to one POST\n // per visitor session while still re-reporting after an upgrade or on a\n // different sub-site. Storage-disabled browsers simply send once per load.\n if (oncePerSession) {\n const stamp = `${SITE_KIT_VERSION}:${resolvedSite}`\n try {\n if (sessionStorage.getItem(SESSION_GUARD_KEY) === stamp) {\n sentRef.current = true\n return\n }\n sessionStorage.setItem(SESSION_GUARD_KEY, stamp)\n } catch {\n /* storage unavailable — fall through and send this load */\n }\n }\n\n sentRef.current = true\n void sendFleetHeartbeat({\n apiUrl: url,\n apiKey: key,\n site: resolvedSite,\n modules,\n nextVersion: nextVersion ?? detectNextVersion(),\n source: 'client',\n allowInFrame,\n allowLocalhost,\n debug,\n })\n }, [ready, apiUrl, apiKey, site, modules, nextVersion, oncePerSession, debug, allowInFrame, allowLocalhost])\n\n return null\n}\n"]}
1
+ {"version":3,"sources":["../src/fleet/heartbeat.ts","../src/fleet/FleetHeartbeat.tsx"],"names":[],"mappings":";;;;;;;;AAwBO,IAAM,oBAAA,GAAuB;AA4B7B,SAAS,iBAAA,GAAmC;AACjD,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,MAAA;AAIV,EAAA,OAAO,qBAAqB,CAAA,CAAE,yBAAA,IAA6B,CAAA,CAAE,IAAA,EAAM,WAAW,IAAI,CAAA;AACpF;AAOA,eAAsB,mBAAmB,IAAA,EAAmD;AAC1F,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,IAAA;AAC3B,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,EAAQ,OAAO,KAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,uBAAuB,IAAI,CAAA;AAC1C,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,EAAA,MAAM,UAAiC,0BAAA,CAA2B;AAAA,IAChE,UAAA,EAAY,KAAK,UAAA,IAAc,gBAAA;AAAA,IAC/B,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,QAAQ,IAAA,CAAK;AAAA,GACd,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAM,UAAA;AAAA,MAChB,CAAA,EAAG,OAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,EAAE,CAAC,GAAG,oBAAoB,CAAA,CAAA;AAAA,MAC1D;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,OAC9B;AAAA,MACA,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAA;AAAE,KACtC;AACA,IAAA,IAAI,KAAK,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,wBAAA,EAA2B,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK,OAAA,CAAQ,WAAW,CAAA,EAAA,EAAK,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,IAAK,MAAM,CAAA,CAAA;AAAA,OACvG;AAAA,IACF;AACA,IAAA,OAAO,GAAA,CAAI,EAAA;AAAA,EACb,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,IAAA,CAAK,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,6CAA6C,GAAG,CAAA;AAC7E,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AC3EA,IAAM,iBAAA,GAAoB,cAAA;AAuBnB,SAAS,cAAA,CAAe;AAAA,EAC7B,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA,GAAQ,IAAA;AAAA,EACR,cAAA,GAAiB,IAAA;AAAA,EACjB,KAAA,GAAQ,KAAA;AAAA,EACR,YAAA,GAAe,KAAA;AAAA,EACf,cAAA,GAAiB;AACnB,CAAA,EAAwB;AACtB,EAAA,MAAM,KAAA,GAAQ,sBAAsB,KAAK,CAAA;AACzC,EAAA,MAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAE5B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAA,IAAS,OAAA,CAAQ,OAAA,EAAS;AAC/B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,IAAA,MAAM,CAAA,GAAI,MAAA;AAKV,IAAA,MAAM,MAAA,GAAS,uBAAuB,EAAE,MAAA,EAAQ,QAAQ,YAAA,EAAc,cAAA,EAAgB,OAAO,CAAA;AAC7F,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAK,MAAA,EAAQ,KAAI,GAAI,MAAA;AAErC,IAAA,MAAM,eAAe,IAAA,IAAQ,CAAA,CAAE,iBAAA,IAAqB,MAAA,CAAO,SAAS,IAAA,IAAQ,EAAA;AAK5E,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA;AACjD,MAAA,IAAI;AACF,QAAA,IAAI,cAAA,CAAe,OAAA,CAAQ,iBAAiB,CAAA,KAAM,KAAA,EAAO;AACvD,UAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,UAAA;AAAA,QACF;AACA,QAAA,cAAA,CAAe,OAAA,CAAQ,mBAAmB,KAAK,CAAA;AAAA,MACjD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,IAAA,KAAK,kBAAA,CAAmB;AAAA,MACtB,MAAA,EAAQ,GAAA;AAAA,MACR,MAAA,EAAQ,GAAA;AAAA,MACR,IAAA,EAAM,YAAA;AAAA,MACN,OAAA;AAAA,MACA,WAAA,EAAa,eAAe,iBAAA,EAAkB;AAAA,MAC9C,MAAA,EAAQ,QAAA;AAAA,MACR,YAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,WAAA,EAAa,cAAA,EAAgB,KAAA,EAAO,YAAA,EAAc,cAAc,CAAC,CAAA;AAE3G,EAAA,OAAO,IAAA;AACT","file":"chunk-BI7DH42Z.mjs","sourcesContent":["/**\n * @sonordev/site-kit/fleet — heartbeat sender (single source of truth for the POST)\n *\n * One place that turns fleet inputs into a validated payload and ships it to\n * `/api/public/fleet/heartbeat`. Used by BOTH the client component\n * (FleetHeartbeat) and any build-time caller, so the send path never forks.\n *\n * It routes through the shared analytics send gate and `sonorFetch`, which stamps\n * the x-sitekit-version header, attaches x-api-key, and honors the auth\n * circuit breaker — a site on a stale/canceled key will not spam the API.\n */\n\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from '../shared/reporting-gate'\nimport { sonorFetch } from '../shared/sonorFetch'\nimport { SITE_KIT_VERSION } from '../shared/version'\nimport {\n buildFleetHeartbeatPayload,\n sanitizeFleetVersion,\n type FleetHeartbeatPayload,\n type FleetHeartbeatSource,\n type FleetModule,\n} from './contract'\n\n/** Canonical ingest path — resolved against the site's Sonor API origin. */\nexport const FLEET_HEARTBEAT_PATH = '/api/public/fleet/heartbeat'\n\nexport interface SendFleetHeartbeatOptions extends AnalyticsGateOptions {\n /** Sonor API origin (e.g. https://api.sonor.io). Trailing slash tolerated. */\n apiUrl: string\n /** Project API key — scopes the request; the project is resolved server-side. */\n apiKey: string\n /** Client-observable active modules (validated/deduped by the contract). */\n modules?: FleetModule[] | string[]\n /** Normalized host for the multi-site sub-dimension (server re-normalizes). */\n site?: string | null\n /** Installed Next.js version, if the caller can resolve it. */\n nextVersion?: string | null\n /** 'client' (runtime boot) or 'build' (CI). Default 'client'. */\n source?: FleetHeartbeatSource\n /** Override the reported kit version. Defaults to the runtime SITE_KIT_VERSION. */\n kitVersion?: string\n /** Log one info line with the result. Never logs at error level. */\n debug?: boolean\n}\n\n/**\n * Best-effort runtime detection of the host Next.js version. Unreliable by\n * design — Next does not expose its version consistently across app/pages\n * router — so it returns null unless a site injects `__SITE_KIT_NEXT_VERSION__`\n * or `window.next.version` is present. Build-time callers should pass\n * `nextVersion` explicitly (resolvable from `next/package.json`).\n */\nexport function detectNextVersion(): string | null {\n if (typeof window === 'undefined') return null\n const w = window as unknown as {\n __SITE_KIT_NEXT_VERSION__?: string\n next?: { version?: string }\n }\n return sanitizeFleetVersion(w.__SITE_KIT_NEXT_VERSION__ ?? w.next?.version ?? null)\n}\n\n/**\n * Fire one heartbeat. Fire-and-forget by contract: it never throws — a\n * telemetry POST must never break a visitor's page or a site's build. Returns\n * true only when the POST was accepted (2xx).\n */\nexport async function sendFleetHeartbeat(opts: SendFleetHeartbeatOptions): Promise<boolean> {\n const { apiUrl, apiKey } = opts\n if (!apiUrl || !apiKey) return false\n const target = resolveAnalyticsTarget(opts)\n if (!target) return false\n\n const payload: FleetHeartbeatPayload = buildFleetHeartbeatPayload({\n kitVersion: opts.kitVersion || SITE_KIT_VERSION,\n nextVersion: opts.nextVersion,\n modules: opts.modules,\n site: opts.site,\n source: opts.source,\n })\n\n try {\n const res = await sonorFetch(\n `${target.apiUrl.replace(/\\/$/, '')}${FLEET_HEARTBEAT_PATH}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n },\n { apiKey: target.apiKey, retries: 0 },\n )\n if (opts.debug) {\n // info, never error: a visitor's console must stay clean (Lighthouse).\n console.info(\n `[Sonor fleet] heartbeat ${res.status} v${payload.kit_version} [${payload.modules.join(',') || 'none'}]`,\n )\n }\n return res.ok\n } catch (err) {\n if (opts.debug) console.info('[Sonor fleet] heartbeat skipped (network)', err)\n return false\n }\n}\n","/**\n * @sonordev/site-kit/fleet — FleetHeartbeat\n *\n * A childless, effect-only client component that reports this site's build\n * fingerprint (kit version, Next.js version, active modules, host) to Sonor\n * exactly once per browser session. It exists so the platform can answer\n * \"which version / modules / key state is each site running\" without shelling\n * into every client repo.\n *\n * It is mounted as a deferred, CHILDLESS SIBLING — never a wrapper — by\n * SiteKitClientProviders, behind the same idle/first-interaction gate as\n * Analytics and Engage, so it never enters the critical hydration path (see\n * CLAUDE.md \"the page must server-render\"). It renders null and carries no\n * visitor data.\n */\n\n'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { useDeferredActivation } from '../shared/defer'\nimport { SITE_KIT_VERSION } from '../shared/version'\nimport { detectNextVersion, sendFleetHeartbeat } from './heartbeat'\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from '../shared/reporting-gate'\nimport type { FleetModule } from './contract'\n\n/** Session guard key — one heartbeat per session, re-sent when version/host changes. */\nconst SESSION_GUARD_KEY = '_sk_fleet_hb'\n\nexport interface FleetHeartbeatProps extends AnalyticsGateOptions {\n /** Sonor API origin. Falls back to `window.__SITE_KIT_API_URL__` then api.sonor.io. */\n apiUrl?: string\n /** Project API key. Falls back to `window.__SITE_KIT_API_KEY__`. */\n apiKey?: string\n /** Host for the multi-site sub-dimension. Falls back to `__SITE_KIT_SITE__` then location.host. */\n site?: string | null\n /** Client-observable active modules (SiteKitClientProviders passes the enabled set). */\n modules?: FleetModule[]\n /** Installed Next.js version if known; otherwise best-effort runtime detection. */\n nextVersion?: string | null\n /**\n * Self-defer to idle / first interaction. Default true so standalone use is\n * safe. SiteKitClientProviders already gates the mount and passes false.\n */\n defer?: boolean\n /** Send at most once per browser session per (version, host). Default true. */\n oncePerSession?: boolean\n debug?: boolean\n}\n\nexport function FleetHeartbeat({\n apiUrl,\n apiKey,\n site,\n modules,\n nextVersion,\n defer = true,\n oncePerSession = true,\n debug = false,\n allowInFrame = false,\n allowLocalhost = false,\n}: FleetHeartbeatProps) {\n const ready = useDeferredActivation(defer)\n const sentRef = useRef(false)\n\n useEffect(() => {\n if (!ready || sentRef.current) return\n if (typeof window === 'undefined') return\n\n const w = window as unknown as {\n __SITE_KIT_API_URL__?: string\n __SITE_KIT_API_KEY__?: string\n __SITE_KIT_SITE__?: string\n }\n const target = resolveAnalyticsTarget({ apiUrl, apiKey, allowInFrame, allowLocalhost, debug })\n if (!target) return // Gate before stamping session storage.\n const { apiUrl: url, apiKey: key } = target\n\n const resolvedSite = site ?? w.__SITE_KIT_SITE__ ?? window.location.host ?? ''\n\n // Once-per-session-per-(version,host): keeps heartbeat volume to one POST\n // per visitor session while still re-reporting after an upgrade or on a\n // different sub-site. Storage-disabled browsers simply send once per load.\n if (oncePerSession) {\n const stamp = `${SITE_KIT_VERSION}:${resolvedSite}`\n try {\n if (sessionStorage.getItem(SESSION_GUARD_KEY) === stamp) {\n sentRef.current = true\n return\n }\n sessionStorage.setItem(SESSION_GUARD_KEY, stamp)\n } catch {\n /* storage unavailable — fall through and send this load */\n }\n }\n\n sentRef.current = true\n void sendFleetHeartbeat({\n apiUrl: url,\n apiKey: key,\n site: resolvedSite,\n modules,\n nextVersion: nextVersion ?? detectNextVersion(),\n source: 'client',\n allowInFrame,\n allowLocalhost,\n debug,\n })\n }, [ready, apiUrl, apiKey, site, modules, nextVersion, oncePerSession, debug, allowInFrame, allowLocalhost])\n\n return null\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkTE3YNZVH_js = require('./chunk-TE3YNZVH.js');
4
- var chunk6SBRD5KT_js = require('./chunk-6SBRD5KT.js');
3
+ var chunkU5NFIHLY_js = require('./chunk-U5NFIHLY.js');
4
+ var chunkCIB3RHNZ_js = require('./chunk-CIB3RHNZ.js');
5
5
 
6
6
  // src/shared/fetchWithRetry.ts
7
7
  function backoffDelay(attempt, response) {
@@ -50,7 +50,7 @@ var pausedKeys = (() => {
50
50
  var warnedThisPage = false;
51
51
  function isAuthPaused(credential) {
52
52
  if (typeof window === "undefined") return false;
53
- const id = chunkTE3YNZVH_js.credentialBreakerId(credential);
53
+ const id = chunkU5NFIHLY_js.credentialBreakerId(credential);
54
54
  const until = pausedKeys.get(id);
55
55
  if (!until) return false;
56
56
  if (Date.now() >= until) {
@@ -60,7 +60,7 @@ function isAuthPaused(credential) {
60
60
  return true;
61
61
  }
62
62
  function tripBreaker(credential) {
63
- pausedKeys.set(chunkTE3YNZVH_js.credentialBreakerId(credential), Date.now() + AUTH_BREAK_MS);
63
+ pausedKeys.set(chunkU5NFIHLY_js.credentialBreakerId(credential), Date.now() + AUTH_BREAK_MS);
64
64
  if (!warnedThisPage) {
65
65
  warnedThisPage = true;
66
66
  console.info(
@@ -70,13 +70,13 @@ function tripBreaker(credential) {
70
70
  }
71
71
  async function sonorFetch(url, init = {}, options = {}) {
72
72
  let credential = options.apiKey;
73
- if (credential !== void 0 || chunkTE3YNZVH_js.isTokenMode()) {
74
- credential = await chunkTE3YNZVH_js.getFreshCredential(options.apiKey);
73
+ if (credential !== void 0 || chunkU5NFIHLY_js.isTokenMode()) {
74
+ credential = await chunkU5NFIHLY_js.getFreshCredential(options.apiKey);
75
75
  }
76
76
  const headers = new Headers(init.headers || {});
77
- headers.set("x-sitekit-version", chunk6SBRD5KT_js.SITE_KIT_VERSION);
77
+ headers.set("x-sitekit-version", chunkCIB3RHNZ_js.SITE_KIT_VERSION);
78
78
  if (credential) {
79
- if (chunkTE3YNZVH_js.isTokenMode()) {
79
+ if (chunkU5NFIHLY_js.isTokenMode()) {
80
80
  headers.set("x-api-key", credential);
81
81
  headers.delete("authorization");
82
82
  } else if (!headers.has("x-api-key")) {
@@ -87,11 +87,11 @@ async function sonorFetch(url, init = {}, options = {}) {
87
87
  return new Response(null, { status: 401, statusText: "sonor-auth-paused" });
88
88
  }
89
89
  let response = await fetchWithRetry(url, { ...init, headers }, options);
90
- if ((response.status === 401 || response.status === 403) && typeof window !== "undefined" && chunkTE3YNZVH_js.isSiteToken(credential)) {
91
- const refreshed = await chunkTE3YNZVH_js.refreshSiteToken();
90
+ if ((response.status === 401 || response.status === 403) && typeof window !== "undefined" && chunkU5NFIHLY_js.isSiteToken(credential)) {
91
+ const refreshed = await chunkU5NFIHLY_js.refreshSiteToken();
92
92
  if (refreshed && refreshed !== credential) {
93
93
  const retryHeaders = new Headers(init.headers || {});
94
- retryHeaders.set("x-sitekit-version", chunk6SBRD5KT_js.SITE_KIT_VERSION);
94
+ retryHeaders.set("x-sitekit-version", chunkCIB3RHNZ_js.SITE_KIT_VERSION);
95
95
  retryHeaders.set("x-api-key", refreshed);
96
96
  retryHeaders.delete("authorization");
97
97
  credential = refreshed;
@@ -104,7 +104,7 @@ async function sonorFetch(url, init = {}, options = {}) {
104
104
  return response;
105
105
  }
106
106
  function sonorBeacon(url, payload, apiKey) {
107
- const credential = chunkTE3YNZVH_js.currentCredential(apiKey);
107
+ const credential = chunkU5NFIHLY_js.currentCredential(apiKey);
108
108
  const body = typeof payload === "string" ? payload : JSON.stringify(payload);
109
109
  try {
110
110
  void fetch(url, {
@@ -112,7 +112,7 @@ function sonorBeacon(url, payload, apiKey) {
112
112
  keepalive: true,
113
113
  headers: {
114
114
  "Content-Type": "application/json",
115
- "x-sitekit-version": chunk6SBRD5KT_js.SITE_KIT_VERSION,
115
+ "x-sitekit-version": chunkCIB3RHNZ_js.SITE_KIT_VERSION,
116
116
  ...credential ? { "x-api-key": credential } : {}
117
117
  },
118
118
  body
@@ -130,5 +130,5 @@ function sonorBeacon(url, payload, apiKey) {
130
130
 
131
131
  exports.sonorBeacon = sonorBeacon;
132
132
  exports.sonorFetch = sonorFetch;
133
- //# sourceMappingURL=chunk-J4C3JAJF.js.map
134
- //# sourceMappingURL=chunk-J4C3JAJF.js.map
133
+ //# sourceMappingURL=chunk-C7J4XLBN.js.map
134
+ //# sourceMappingURL=chunk-C7J4XLBN.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/fetchWithRetry.ts","../src/shared/sonorFetch.ts"],"names":["credentialBreakerId","isTokenMode","getFreshCredential","SITE_KIT_VERSION","isSiteToken","refreshSiteToken","currentCredential"],"mappings":"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","file":"chunk-J4C3JAJF.js","sourcesContent":["/**\n * @sonordev/site-kit shared - Resilient fetch\n *\n * Single source of truth for client-side resilient fetch (forms, SitemapSync).\n * Adds a per-attempt timeout and retries transient failures (network errors,\n * request timeouts, HTTP 429, and 5xx) with exponential backoff.\n *\n * A form submission must survive a brief API blip — a deploy, a cold start, a\n * dropped packet. A single un-retried fetch turning into \"Something went wrong\"\n * is how leads get lost. The explicit abort also matters on its own: a request\n * left to hang until the browser's own network timeout logs a console error\n * (net::ERR_TIMED_OUT) that fails Lighthouse best-practices; an aborted fetch\n * logs nothing.\n */\n\nexport interface FetchRetryOptions {\n /** Number of retries AFTER the first attempt (default 2 → up to 3 tries total). */\n retries?: number\n /** Per-attempt timeout in milliseconds (default 15000). */\n timeoutMs?: number\n}\n\nfunction backoffDelay(attempt: number, response?: Response): number {\n // Honor a Retry-After header on 429 responses when present.\n if (response?.status === 429) {\n const header = response.headers.get('retry-after')\n const seconds = header ? parseInt(header, 10) : NaN\n if (!Number.isNaN(seconds) && seconds > 0) return Math.min(seconds * 1000, 10000)\n }\n // Exponential backoff: 500ms, 1s, 2s, ... capped at 8s.\n return Math.min(8000, 500 * 2 ** attempt)\n}\n\n/**\n * fetch() with a timeout and automatic retries for transient failures.\n *\n * Non-transient responses (2xx, 3xx, and 4xx other than 429) are returned to\n * the caller as-is — only 429/5xx and thrown network/timeout errors are retried.\n * If every attempt fails with a thrown error, the last error is re-thrown.\n */\nexport async function fetchWithRetry(\n url: string,\n init: RequestInit,\n options: FetchRetryOptions = {},\n): Promise<Response> {\n const retries = options.retries ?? 2\n const timeoutMs = options.timeoutMs ?? 15000\n let lastError: unknown\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeoutMs)\n try {\n const response = await fetch(url, { ...init, signal: controller.signal })\n clearTimeout(timer)\n\n if ((response.status === 429 || response.status >= 500) && attempt < retries) {\n await new Promise((resolve) => setTimeout(resolve, backoffDelay(attempt, response)))\n continue\n }\n return response\n } catch (error) {\n clearTimeout(timer)\n lastError = error\n // Network failure or timeout (AbortController) — retry while attempts remain.\n if (attempt < retries) {\n await new Promise((resolve) => setTimeout(resolve, backoffDelay(attempt)))\n continue\n }\n }\n }\n\n throw lastError instanceof Error\n ? lastError\n : new Error('Network request failed after multiple attempts. Please try again.')\n}\n","/**\n * @sonordev/site-kit shared - Canonical client transport\n *\n * Single source of truth for how site-kit talks to Sonor from the browser.\n * Every client-side module (analytics, forms, commerce, engage, maps, images,\n * SitemapSync) routes through here instead of bare fetch(), which gives the\n * whole kit, in one place:\n *\n * - per-attempt timeout + retry with backoff (via fetchWithRetry) — a hung\n * request left to the browser's own network timeout logs a console error\n * (net::ERR_TIMED_OUT) that fails Lighthouse best-practices\n * - the x-sitekit-version header on every request, so the platform can see\n * which kit version each site actually runs from live traffic\n * - CREDENTIAL LIFECYCLE: sites on 3.2+ ship a short-lived minted token instead\n * of the raw key. This transport resolves the freshest token (refreshing a\n * stale seed transparently), and on a 401/403 for a token it refreshes once\n * and retries before giving up. A raw key (2.x kit, or the mint-failed\n * fallback) is a pure passthrough — legacy behavior is unchanged.\n * - an auth circuit breaker: after a 401/403 the credential is paused for a few\n * minutes and ONE friendly console.info is emitted — a site on a stale or\n * canceled key must not spam the API or the visitor's console. Keyed by the\n * project (from the token) so it survives token rotation.\n * - sonorBeacon for unload-time telemetry that keeps the credential in headers;\n * navigator.sendBeacon can't set headers and forced the key into the URL,\n * where server and CDN access logs capture it\n *\n * Non-idempotent endpoints (checkout, payment intents, uploads) must pass\n * { retries: 0 } — they still get the timeout, but never an automatic retry.\n */\nimport { fetchWithRetry, type FetchRetryOptions } from './fetchWithRetry'\nimport { SITE_KIT_VERSION } from './version'\nimport {\n credentialBreakerId,\n currentCredential,\n getFreshCredential,\n isSiteToken,\n isTokenMode,\n refreshSiteToken,\n} from './siteToken'\n\nexport interface SonorFetchOptions extends FetchRetryOptions {\n /** Project credential — the minted token (3.2+) or raw key. Sent as x-api-key. */\n apiKey?: string\n}\n\n/** How long a credential stays paused after an auth failure. */\nconst AUTH_BREAK_MS = 5 * 60_000\n\n// breaker id → epoch ms until which requests are paused. Shared on window for\n// the same reason as the token state (see siteToken.ts): duplicated module\n// copies must trip and observe ONE breaker, not one each. Never applies on the\n// server, so a per-module Map there is fine.\nconst BREAKER_STATE_KEY = '__SONOR_AUTH_BREAKER__'\nconst pausedKeys: Map<string, number> = (() => {\n if (typeof window === 'undefined') return new Map()\n const w = window as unknown as Record<string, Map<string, number> | undefined>\n return (w[BREAKER_STATE_KEY] ??= new Map())\n})()\nlet warnedThisPage = false\n\n/** True when a previous 401/403 has paused this credential (browser only). */\nexport function isAuthPaused(credential?: string): boolean {\n if (typeof window === 'undefined') return false\n const id = credentialBreakerId(credential)\n const until = pausedKeys.get(id)\n if (!until) return false\n if (Date.now() >= until) {\n pausedKeys.delete(id)\n return false\n }\n return true\n}\n\nfunction tripBreaker(credential?: string): void {\n pausedKeys.set(credentialBreakerId(credential), Date.now() + AUTH_BREAK_MS)\n if (!warnedThisPage) {\n warnedThisPage = true\n // info, not error: a visitor's console must stay clean (Lighthouse\n // errors-in-console), and copy never names env vars or key formats.\n console.info(\n \"[Sonor] This site couldn't authenticate with Sonor, so data features are paused for a few minutes. If this keeps happening, the site is likely running an outdated API key.\",\n )\n }\n}\n\nexport async function sonorFetch(\n url: string,\n init: RequestInit = {},\n options: SonorFetchOptions = {},\n): Promise<Response> {\n // Resolve the credential to send. In token mode this may transparently refresh\n // a stale seed before the first request; in raw-key mode it's a passthrough.\n let credential = options.apiKey\n if (credential !== undefined || isTokenMode()) {\n credential = await getFreshCredential(options.apiKey)\n }\n\n const headers = new Headers(init.headers || {})\n headers.set('x-sitekit-version', SITE_KIT_VERSION)\n if (credential) {\n if (isTokenMode()) {\n // Token mode: `credential` is the freshest token (refreshed just above if\n // the seed was stale). It MUST override any x-api-key a caller hand-set — a\n // stale build-time seed passed as a header would otherwise pin the request\n // and defeat refresh entirely. Also drop a caller-set Authorization:\n // extractApiKey() server-side prefers `Authorization: Bearer` over\n // x-api-key, so a stale Bearer seed would win even once we set a fresh\n // x-api-key. This is the single place the client credential is chosen — do\n // not re-attach it as a header at call sites.\n headers.set('x-api-key', credential)\n headers.delete('authorization')\n } else if (!headers.has('x-api-key')) {\n // Raw-key mode: legacy passthrough — respect a caller-supplied header.\n headers.set('x-api-key', credential)\n }\n }\n\n if (isAuthPaused(credential)) {\n // Synthetic response keeps every caller's !response.ok path working\n // without a network round trip while the breaker is open.\n return new Response(null, { status: 401, statusText: 'sonor-auth-paused' })\n }\n\n let response = await fetchWithRetry(url, { ...init, headers }, options)\n\n // A token can rotate or expire mid-session. On the first auth failure, try ONE\n // refresh + retry before tripping the breaker — only for token credentials\n // (raw keys have nothing to refresh).\n if (\n (response.status === 401 || response.status === 403) &&\n typeof window !== 'undefined' &&\n isSiteToken(credential)\n ) {\n const refreshed = await refreshSiteToken()\n if (refreshed && refreshed !== credential) {\n const retryHeaders = new Headers(init.headers || {})\n retryHeaders.set('x-sitekit-version', SITE_KIT_VERSION)\n retryHeaders.set('x-api-key', refreshed)\n // Same reason as the initial request: a caller-set stale Bearer would win\n // over our fresh x-api-key server-side, so strip it on the retry too.\n retryHeaders.delete('authorization')\n credential = refreshed\n response = await fetchWithRetry(url, { ...init, headers: retryHeaders }, options)\n }\n }\n\n if (\n (response.status === 401 || response.status === 403) &&\n typeof window !== 'undefined' &&\n credential\n ) {\n tripBreaker(credential)\n }\n\n return response\n}\n\n/**\n * Fire-and-forget telemetry that survives page unload.\n *\n * Uses fetch({ keepalive: true }) so auth travels in headers. Falls back to\n * navigator.sendBeacon (no auth headers possible — the server may reject it,\n * but we never put the key in the URL) only when keepalive fetch is missing.\n *\n * Cannot await a refresh at unload time, so it sends the freshest token already\n * held (currentCredential) rather than the possibly-stale seed the caller passed.\n */\nexport function sonorBeacon(url: string, payload: unknown, apiKey?: string): void {\n const credential = currentCredential(apiKey)\n const body = typeof payload === 'string' ? payload : JSON.stringify(payload)\n try {\n void fetch(url, {\n method: 'POST',\n keepalive: true,\n headers: {\n 'Content-Type': 'application/json',\n 'x-sitekit-version': SITE_KIT_VERSION,\n ...(credential ? { 'x-api-key': credential } : {}),\n },\n body,\n }).catch(() => {\n /* page is closing — best effort */\n })\n } catch {\n try {\n if (typeof navigator !== 'undefined' && navigator.sendBeacon) {\n navigator.sendBeacon(url, new Blob([body], { type: 'application/json' }))\n }\n } catch {\n /* nothing left to try */\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/fetchWithRetry.ts","../src/shared/sonorFetch.ts"],"names":["credentialBreakerId","isTokenMode","getFreshCredential","SITE_KIT_VERSION","isSiteToken","refreshSiteToken","currentCredential"],"mappings":";;;;;;AAsBA,SAAS,YAAA,CAAa,SAAiB,QAAA,EAA6B;AAElE,EAAA,IAAI,QAAA,EAAU,WAAW,GAAA,EAAK;AAC5B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACjD,IAAA,MAAM,OAAA,GAAU,MAAA,GAAS,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA,GAAI,GAAA;AAChD,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,IAAK,OAAA,GAAU,CAAA,EAAG,OAAO,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,GAAA,EAAM,GAAK,CAAA;AAAA,EAClF;AAEA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,GAAM,KAAK,OAAO,CAAA;AAC1C;AASA,eAAsB,cAAA,CACpB,GAAA,EACA,IAAA,EACA,OAAA,GAA6B,EAAC,EACX;AACnB,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,IAAA;AACvC,EAAA,IAAI,SAAA;AAEJ,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,OAAA,EAAS,OAAA,EAAA,EAAW;AACnD,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAC5D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,UAAA,CAAW,MAAA,EAAQ,CAAA;AACxE,MAAA,YAAA,CAAa,KAAK,CAAA;AAElB,MAAA,IAAA,CAAK,SAAS,MAAA,KAAW,GAAA,IAAO,SAAS,MAAA,IAAU,GAAA,KAAQ,UAAU,OAAA,EAAS;AAC5E,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,UAAA,CAAW,SAAS,YAAA,CAAa,OAAA,EAAS,QAAQ,CAAC,CAAC,CAAA;AACnF,QAAA;AAAA,MACF;AACA,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,SAAA,GAAY,KAAA;AAEZ,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,MAAM,IAAI,QAAQ,CAAC,OAAA,KAAY,WAAW,OAAA,EAAS,YAAA,CAAa,OAAO,CAAC,CAAC,CAAA;AACzE,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,YAAqB,KAAA,GACvB,SAAA,GACA,IAAI,MAAM,mEAAmE,CAAA;AACnF;;;AC7BA,IAAM,gBAAgB,CAAA,GAAI,GAAA;AAM1B,IAAM,iBAAA,GAAoB,wBAAA;AAC1B,IAAM,cAAmC,MAAM;AAC7C,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,2BAAW,GAAA,EAAI;AAClD,EAAA,MAAM,CAAA,GAAI,MAAA;AACV,EAAA,OAAQ,CAAA,CAAA,iBAAA,CAAA,KAAA,CAAA,CAAA,iBAAA,CAAA,uBAA6B,GAAA,EAAI,CAAA;AAC3C,CAAA,GAAG;AACH,IAAI,cAAA,GAAiB,KAAA;AAGd,SAAS,aAAa,UAAA,EAA8B;AACzD,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,MAAM,EAAA,GAAKA,qCAAoB,UAAU,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AAC/B,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,IAAI,IAAA,CAAK,GAAA,EAAI,IAAK,KAAA,EAAO;AACvB,IAAA,UAAA,CAAW,OAAO,EAAE,CAAA;AACpB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAY,UAAA,EAA2B;AAC9C,EAAA,UAAA,CAAW,IAAIA,oCAAA,CAAoB,UAAU,GAAG,IAAA,CAAK,GAAA,KAAQ,aAAa,CAAA;AAC1E,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,cAAA,GAAiB,IAAA;AAGjB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AACF;AAEA,eAAsB,WACpB,GAAA,EACA,IAAA,GAAoB,EAAC,EACrB,OAAA,GAA6B,EAAC,EACX;AAGnB,EAAA,IAAI,aAAa,OAAA,CAAQ,MAAA;AACzB,EAAA,IAAI,UAAA,KAAe,MAAA,IAAaC,4BAAA,EAAY,EAAG;AAC7C,IAAA,UAAA,GAAa,MAAMC,mCAAA,CAAmB,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtD;AAEA,EAAA,MAAM,UAAU,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA;AAC9C,EAAA,OAAA,CAAQ,GAAA,CAAI,qBAAqBC,iCAAgB,CAAA;AACjD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAIF,8BAAY,EAAG;AASjB,MAAA,OAAA,CAAQ,GAAA,CAAI,aAAa,UAAU,CAAA;AACnC,MAAA,OAAA,CAAQ,OAAO,eAAe,CAAA;AAAA,IAChC,CAAA,MAAA,IAAW,CAAC,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,EAAG;AAEpC,MAAA,OAAA,CAAQ,GAAA,CAAI,aAAa,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAG5B,IAAA,OAAO,IAAI,SAAS,IAAA,EAAM,EAAE,QAAQ,GAAA,EAAK,UAAA,EAAY,qBAAqB,CAAA;AAAA,EAC5E;AAEA,EAAA,IAAI,QAAA,GAAW,MAAM,cAAA,CAAe,GAAA,EAAK,EAAE,GAAG,IAAA,EAAM,OAAA,EAAQ,EAAG,OAAO,CAAA;AAKtE,EAAA,IAAA,CACG,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,MAAA,KAAW,GAAA,KAChD,OAAO,MAAA,KAAW,WAAA,IAClBG,4BAAA,CAAY,UAAU,CAAA,EACtB;AACA,IAAA,MAAM,SAAA,GAAY,MAAMC,iCAAA,EAAiB;AACzC,IAAA,IAAI,SAAA,IAAa,cAAc,UAAA,EAAY;AACzC,MAAA,MAAM,eAAe,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA;AACnD,MAAA,YAAA,CAAa,GAAA,CAAI,qBAAqBF,iCAAgB,CAAA;AACtD,MAAA,YAAA,CAAa,GAAA,CAAI,aAAa,SAAS,CAAA;AAGvC,MAAA,YAAA,CAAa,OAAO,eAAe,CAAA;AACnC,MAAA,UAAA,GAAa,SAAA;AACb,MAAA,QAAA,GAAW,MAAM,eAAe,GAAA,EAAK,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,YAAA,EAAa,EAAG,OAAO,CAAA;AAAA,IAClF;AAAA,EACF;AAEA,EAAA,IAAA,CACG,QAAA,CAAS,WAAW,GAAA,IAAO,QAAA,CAAS,WAAW,GAAA,KAChD,OAAO,MAAA,KAAW,WAAA,IAClB,UAAA,EACA;AACA,IAAA,WAAA,CAAY,UAAU,CAAA;AAAA,EACxB;AAEA,EAAA,OAAO,QAAA;AACT;AAYO,SAAS,WAAA,CAAY,GAAA,EAAa,OAAA,EAAkB,MAAA,EAAuB;AAChF,EAAA,MAAM,UAAA,GAAaG,mCAAkB,MAAM,CAAA;AAC3C,EAAA,MAAM,OAAO,OAAO,OAAA,KAAY,WAAW,OAAA,GAAU,IAAA,CAAK,UAAU,OAAO,CAAA;AAC3E,EAAA,IAAI;AACF,IAAA,KAAK,MAAM,GAAA,EAAK;AAAA,MACd,MAAA,EAAQ,MAAA;AAAA,MACR,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,mBAAA,EAAqBH,iCAAA;AAAA,QACrB,GAAI,UAAA,GAAa,EAAE,WAAA,EAAa,UAAA,KAAe;AAAC,OAClD;AAAA,MACA;AAAA,KACD,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAEf,CAAC,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AACN,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,UAAA,EAAY;AAC5D,QAAA,SAAA,CAAU,UAAA,CAAW,GAAA,EAAK,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,EAAE,IAAA,EAAM,kBAAA,EAAoB,CAAC,CAAA;AAAA,MAC1E;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF","file":"chunk-C7J4XLBN.js","sourcesContent":["/**\n * @sonordev/site-kit shared - Resilient fetch\n *\n * Single source of truth for client-side resilient fetch (forms, SitemapSync).\n * Adds a per-attempt timeout and retries transient failures (network errors,\n * request timeouts, HTTP 429, and 5xx) with exponential backoff.\n *\n * A form submission must survive a brief API blip — a deploy, a cold start, a\n * dropped packet. A single un-retried fetch turning into \"Something went wrong\"\n * is how leads get lost. The explicit abort also matters on its own: a request\n * left to hang until the browser's own network timeout logs a console error\n * (net::ERR_TIMED_OUT) that fails Lighthouse best-practices; an aborted fetch\n * logs nothing.\n */\n\nexport interface FetchRetryOptions {\n /** Number of retries AFTER the first attempt (default 2 → up to 3 tries total). */\n retries?: number\n /** Per-attempt timeout in milliseconds (default 15000). */\n timeoutMs?: number\n}\n\nfunction backoffDelay(attempt: number, response?: Response): number {\n // Honor a Retry-After header on 429 responses when present.\n if (response?.status === 429) {\n const header = response.headers.get('retry-after')\n const seconds = header ? parseInt(header, 10) : NaN\n if (!Number.isNaN(seconds) && seconds > 0) return Math.min(seconds * 1000, 10000)\n }\n // Exponential backoff: 500ms, 1s, 2s, ... capped at 8s.\n return Math.min(8000, 500 * 2 ** attempt)\n}\n\n/**\n * fetch() with a timeout and automatic retries for transient failures.\n *\n * Non-transient responses (2xx, 3xx, and 4xx other than 429) are returned to\n * the caller as-is — only 429/5xx and thrown network/timeout errors are retried.\n * If every attempt fails with a thrown error, the last error is re-thrown.\n */\nexport async function fetchWithRetry(\n url: string,\n init: RequestInit,\n options: FetchRetryOptions = {},\n): Promise<Response> {\n const retries = options.retries ?? 2\n const timeoutMs = options.timeoutMs ?? 15000\n let lastError: unknown\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeoutMs)\n try {\n const response = await fetch(url, { ...init, signal: controller.signal })\n clearTimeout(timer)\n\n if ((response.status === 429 || response.status >= 500) && attempt < retries) {\n await new Promise((resolve) => setTimeout(resolve, backoffDelay(attempt, response)))\n continue\n }\n return response\n } catch (error) {\n clearTimeout(timer)\n lastError = error\n // Network failure or timeout (AbortController) — retry while attempts remain.\n if (attempt < retries) {\n await new Promise((resolve) => setTimeout(resolve, backoffDelay(attempt)))\n continue\n }\n }\n }\n\n throw lastError instanceof Error\n ? lastError\n : new Error('Network request failed after multiple attempts. Please try again.')\n}\n","/**\n * @sonordev/site-kit shared - Canonical client transport\n *\n * Single source of truth for how site-kit talks to Sonor from the browser.\n * Every client-side module (analytics, forms, commerce, engage, maps, images,\n * SitemapSync) routes through here instead of bare fetch(), which gives the\n * whole kit, in one place:\n *\n * - per-attempt timeout + retry with backoff (via fetchWithRetry) — a hung\n * request left to the browser's own network timeout logs a console error\n * (net::ERR_TIMED_OUT) that fails Lighthouse best-practices\n * - the x-sitekit-version header on every request, so the platform can see\n * which kit version each site actually runs from live traffic\n * - CREDENTIAL LIFECYCLE: sites on 3.2+ ship a short-lived minted token instead\n * of the raw key. This transport resolves the freshest token (refreshing a\n * stale seed transparently), and on a 401/403 for a token it refreshes once\n * and retries before giving up. A raw key (2.x kit, or the mint-failed\n * fallback) is a pure passthrough — legacy behavior is unchanged.\n * - an auth circuit breaker: after a 401/403 the credential is paused for a few\n * minutes and ONE friendly console.info is emitted — a site on a stale or\n * canceled key must not spam the API or the visitor's console. Keyed by the\n * project (from the token) so it survives token rotation.\n * - sonorBeacon for unload-time telemetry that keeps the credential in headers;\n * navigator.sendBeacon can't set headers and forced the key into the URL,\n * where server and CDN access logs capture it\n *\n * Non-idempotent endpoints (checkout, payment intents, uploads) must pass\n * { retries: 0 } — they still get the timeout, but never an automatic retry.\n */\nimport { fetchWithRetry, type FetchRetryOptions } from './fetchWithRetry'\nimport { SITE_KIT_VERSION } from './version'\nimport {\n credentialBreakerId,\n currentCredential,\n getFreshCredential,\n isSiteToken,\n isTokenMode,\n refreshSiteToken,\n} from './siteToken'\n\nexport interface SonorFetchOptions extends FetchRetryOptions {\n /** Project credential — the minted token (3.2+) or raw key. Sent as x-api-key. */\n apiKey?: string\n}\n\n/** How long a credential stays paused after an auth failure. */\nconst AUTH_BREAK_MS = 5 * 60_000\n\n// breaker id → epoch ms until which requests are paused. Shared on window for\n// the same reason as the token state (see siteToken.ts): duplicated module\n// copies must trip and observe ONE breaker, not one each. Never applies on the\n// server, so a per-module Map there is fine.\nconst BREAKER_STATE_KEY = '__SONOR_AUTH_BREAKER__'\nconst pausedKeys: Map<string, number> = (() => {\n if (typeof window === 'undefined') return new Map()\n const w = window as unknown as Record<string, Map<string, number> | undefined>\n return (w[BREAKER_STATE_KEY] ??= new Map())\n})()\nlet warnedThisPage = false\n\n/** True when a previous 401/403 has paused this credential (browser only). */\nexport function isAuthPaused(credential?: string): boolean {\n if (typeof window === 'undefined') return false\n const id = credentialBreakerId(credential)\n const until = pausedKeys.get(id)\n if (!until) return false\n if (Date.now() >= until) {\n pausedKeys.delete(id)\n return false\n }\n return true\n}\n\nfunction tripBreaker(credential?: string): void {\n pausedKeys.set(credentialBreakerId(credential), Date.now() + AUTH_BREAK_MS)\n if (!warnedThisPage) {\n warnedThisPage = true\n // info, not error: a visitor's console must stay clean (Lighthouse\n // errors-in-console), and copy never names env vars or key formats.\n console.info(\n \"[Sonor] This site couldn't authenticate with Sonor, so data features are paused for a few minutes. If this keeps happening, the site is likely running an outdated API key.\",\n )\n }\n}\n\nexport async function sonorFetch(\n url: string,\n init: RequestInit = {},\n options: SonorFetchOptions = {},\n): Promise<Response> {\n // Resolve the credential to send. In token mode this may transparently refresh\n // a stale seed before the first request; in raw-key mode it's a passthrough.\n let credential = options.apiKey\n if (credential !== undefined || isTokenMode()) {\n credential = await getFreshCredential(options.apiKey)\n }\n\n const headers = new Headers(init.headers || {})\n headers.set('x-sitekit-version', SITE_KIT_VERSION)\n if (credential) {\n if (isTokenMode()) {\n // Token mode: `credential` is the freshest token (refreshed just above if\n // the seed was stale). It MUST override any x-api-key a caller hand-set — a\n // stale build-time seed passed as a header would otherwise pin the request\n // and defeat refresh entirely. Also drop a caller-set Authorization:\n // extractApiKey() server-side prefers `Authorization: Bearer` over\n // x-api-key, so a stale Bearer seed would win even once we set a fresh\n // x-api-key. This is the single place the client credential is chosen — do\n // not re-attach it as a header at call sites.\n headers.set('x-api-key', credential)\n headers.delete('authorization')\n } else if (!headers.has('x-api-key')) {\n // Raw-key mode: legacy passthrough — respect a caller-supplied header.\n headers.set('x-api-key', credential)\n }\n }\n\n if (isAuthPaused(credential)) {\n // Synthetic response keeps every caller's !response.ok path working\n // without a network round trip while the breaker is open.\n return new Response(null, { status: 401, statusText: 'sonor-auth-paused' })\n }\n\n let response = await fetchWithRetry(url, { ...init, headers }, options)\n\n // A token can rotate or expire mid-session. On the first auth failure, try ONE\n // refresh + retry before tripping the breaker — only for token credentials\n // (raw keys have nothing to refresh).\n if (\n (response.status === 401 || response.status === 403) &&\n typeof window !== 'undefined' &&\n isSiteToken(credential)\n ) {\n const refreshed = await refreshSiteToken()\n if (refreshed && refreshed !== credential) {\n const retryHeaders = new Headers(init.headers || {})\n retryHeaders.set('x-sitekit-version', SITE_KIT_VERSION)\n retryHeaders.set('x-api-key', refreshed)\n // Same reason as the initial request: a caller-set stale Bearer would win\n // over our fresh x-api-key server-side, so strip it on the retry too.\n retryHeaders.delete('authorization')\n credential = refreshed\n response = await fetchWithRetry(url, { ...init, headers: retryHeaders }, options)\n }\n }\n\n if (\n (response.status === 401 || response.status === 403) &&\n typeof window !== 'undefined' &&\n credential\n ) {\n tripBreaker(credential)\n }\n\n return response\n}\n\n/**\n * Fire-and-forget telemetry that survives page unload.\n *\n * Uses fetch({ keepalive: true }) so auth travels in headers. Falls back to\n * navigator.sendBeacon (no auth headers possible — the server may reject it,\n * but we never put the key in the URL) only when keepalive fetch is missing.\n *\n * Cannot await a refresh at unload time, so it sends the freshest token already\n * held (currentCredential) rather than the possibly-stale seed the caller passed.\n */\nexport function sonorBeacon(url: string, payload: unknown, apiKey?: string): void {\n const credential = currentCredential(apiKey)\n const body = typeof payload === 'string' ? payload : JSON.stringify(payload)\n try {\n void fetch(url, {\n method: 'POST',\n keepalive: true,\n headers: {\n 'Content-Type': 'application/json',\n 'x-sitekit-version': SITE_KIT_VERSION,\n ...(credential ? { 'x-api-key': credential } : {}),\n },\n body,\n }).catch(() => {\n /* page is closing — best effort */\n })\n } catch {\n try {\n if (typeof navigator !== 'undefined' && navigator.sendBeacon) {\n navigator.sendBeacon(url, new Blob([body], { type: 'application/json' }))\n }\n } catch {\n /* nothing left to try */\n }\n }\n}\n"]}