@sonordev/site-kit 3.3.0 → 3.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 (200) hide show
  1. package/agent-manifest.json +13 -1
  2. package/dist/AnalyticsProvider-ARAWVJPX.js +30 -0
  3. package/dist/{AnalyticsProvider-26VS3CQR.js.map → AnalyticsProvider-ARAWVJPX.js.map} +1 -1
  4. package/dist/AnalyticsProvider-HIGSPNRA.mjs +9 -0
  5. package/dist/{AnalyticsProvider-AMHG4DIE.mjs.map → AnalyticsProvider-HIGSPNRA.mjs.map} +1 -1
  6. package/dist/ChatWidget-47KAOFLG.mjs +9 -0
  7. package/dist/{ChatWidget-UKPEQEHB.mjs.map → ChatWidget-47KAOFLG.mjs.map} +1 -1
  8. package/dist/ChatWidget-BDES6WUR.js +18 -0
  9. package/dist/{ChatWidget-NIYNSMLU.js.map → ChatWidget-BDES6WUR.js.map} +1 -1
  10. package/dist/EngageWidget-HPZAI6SU.mjs +8 -0
  11. package/dist/{EngageWidget-S76ZMDEF.mjs.map → EngageWidget-HPZAI6SU.mjs.map} +1 -1
  12. package/dist/EngageWidget-X3NIWGMZ.js +17 -0
  13. package/dist/{EngageWidget-33QCFWQW.js.map → EngageWidget-X3NIWGMZ.js.map} +1 -1
  14. package/dist/{SignalCore-2UXXM4FF.js → SignalCore-K2CTZ52G.js} +61 -43
  15. package/dist/SignalCore-K2CTZ52G.js.map +1 -0
  16. package/dist/{SignalCore-2AUGAOQT.mjs → SignalCore-XABEH2GA.mjs} +55 -37
  17. package/dist/SignalCore-XABEH2GA.mjs.map +1 -0
  18. package/dist/SitemapSync-4BALOI4B.js +16 -0
  19. package/dist/{SitemapSync-WQJMHJNY.js.map → SitemapSync-4BALOI4B.js.map} +1 -1
  20. package/dist/SitemapSync-OQPRGBG3.mjs +7 -0
  21. package/dist/{SitemapSync-RBHXPQAQ.mjs.map → SitemapSync-OQPRGBG3.mjs.map} +1 -1
  22. package/dist/analytics/index.js +13 -12
  23. package/dist/analytics/index.mjs +6 -5
  24. package/dist/{chunk-2RLG4KBJ.mjs → chunk-3SIIYHVE.mjs} +5 -5
  25. package/dist/{chunk-2RLG4KBJ.mjs.map → chunk-3SIIYHVE.mjs.map} +1 -1
  26. package/dist/{chunk-PLQ4CUNI.mjs → chunk-472FTEPP.mjs} +4 -4
  27. package/dist/{chunk-PLQ4CUNI.mjs.map → chunk-472FTEPP.mjs.map} +1 -1
  28. package/dist/{chunk-BOTWTNHW.js → chunk-56X3IUOL.js} +16 -16
  29. package/dist/{chunk-BOTWTNHW.js.map → chunk-56X3IUOL.js.map} +1 -1
  30. package/dist/{chunk-QOFC3BYG.js → chunk-5SJKYZID.js} +9 -28
  31. package/dist/chunk-5SJKYZID.js.map +1 -0
  32. package/dist/{chunk-SLOZWRWU.mjs → chunk-5WEADCND.mjs} +4 -4
  33. package/dist/{chunk-SLOZWRWU.mjs.map → chunk-5WEADCND.mjs.map} +1 -1
  34. package/dist/chunk-6EDVCUAG.mjs +29 -0
  35. package/dist/chunk-6EDVCUAG.mjs.map +1 -0
  36. package/dist/{chunk-EL6ZMYD2.js → chunk-6Q72JAL2.js} +8 -8
  37. package/dist/{chunk-EL6ZMYD2.js.map → chunk-6Q72JAL2.js.map} +1 -1
  38. package/dist/{chunk-BPKDRTEA.js → chunk-7523LJ52.js} +9 -9
  39. package/dist/{chunk-BPKDRTEA.js.map → chunk-7523LJ52.js.map} +1 -1
  40. package/dist/{chunk-EM4DFSC5.js → chunk-7UYUVHCR.js} +4 -4
  41. package/dist/{chunk-EM4DFSC5.js.map → chunk-7UYUVHCR.js.map} +1 -1
  42. package/dist/{chunk-EE6SFAZP.mjs → chunk-AX4AROLH.mjs} +5 -14
  43. package/dist/chunk-AX4AROLH.mjs.map +1 -0
  44. package/dist/{chunk-G4FJJK6J.js → chunk-C37DFD5F.js} +14 -14
  45. package/dist/{chunk-G4FJJK6J.js.map → chunk-C37DFD5F.js.map} +1 -1
  46. package/dist/chunk-CDETOO5W.js +8 -0
  47. package/dist/{chunk-EOENN46G.js.map → chunk-CDETOO5W.js.map} +1 -1
  48. package/dist/{chunk-I2M533CW.js → chunk-E4VA4FYW.js} +8 -8
  49. package/dist/{chunk-I2M533CW.js.map → chunk-E4VA4FYW.js.map} +1 -1
  50. package/dist/chunk-EU2UGO25.js +52 -0
  51. package/dist/chunk-EU2UGO25.js.map +1 -0
  52. package/dist/{chunk-NNPF4KRZ.mjs → chunk-G3G4HQT3.mjs} +49 -5
  53. package/dist/chunk-G3G4HQT3.mjs.map +1 -0
  54. package/dist/{chunk-XOCQANYF.js → chunk-HV7IYMXK.js} +61 -17
  55. package/dist/chunk-HV7IYMXK.js.map +1 -0
  56. package/dist/{chunk-K2P7KPEQ.js → chunk-IB34IYMN.js} +14 -31
  57. package/dist/chunk-IB34IYMN.js.map +1 -0
  58. package/dist/chunk-IBMOX3YE.mjs +48 -0
  59. package/dist/chunk-IBMOX3YE.mjs.map +1 -0
  60. package/dist/{chunk-6BDXN4X3.mjs → chunk-IURQA3H5.mjs} +3 -3
  61. package/dist/{chunk-6BDXN4X3.mjs.map → chunk-IURQA3H5.mjs.map} +1 -1
  62. package/dist/chunk-JEOKDUPQ.js +45 -0
  63. package/dist/chunk-JEOKDUPQ.js.map +1 -0
  64. package/dist/{chunk-5KVT66R6.mjs → chunk-JRUNONG5.mjs} +3 -3
  65. package/dist/{chunk-5KVT66R6.mjs.map → chunk-JRUNONG5.mjs.map} +1 -1
  66. package/dist/chunk-LOS5D6B3.js +72 -0
  67. package/dist/chunk-LOS5D6B3.js.map +1 -0
  68. package/dist/{chunk-WEHJRE3H.mjs → chunk-LQHZFUZJ.mjs} +8 -25
  69. package/dist/chunk-LQHZFUZJ.mjs.map +1 -0
  70. package/dist/{chunk-P3QZRG2Z.js → chunk-MCDQM75H.js} +15 -15
  71. package/dist/{chunk-P3QZRG2Z.js.map → chunk-MCDQM75H.js.map} +1 -1
  72. package/dist/{chunk-6UK5JIKE.js → chunk-MJV6RC7I.js} +3 -3
  73. package/dist/{chunk-6UK5JIKE.js.map → chunk-MJV6RC7I.js.map} +1 -1
  74. package/dist/{chunk-PUGRSMAV.mjs → chunk-O4RVFKQW.mjs} +3 -3
  75. package/dist/{chunk-PUGRSMAV.mjs.map → chunk-O4RVFKQW.mjs.map} +1 -1
  76. package/dist/{chunk-WAYG3LS2.js → chunk-O7B7IEXY.js} +14 -14
  77. package/dist/{chunk-WAYG3LS2.js.map → chunk-O7B7IEXY.js.map} +1 -1
  78. package/dist/{chunk-M4HLDK62.mjs → chunk-PYA4BR2N.mjs} +6 -25
  79. package/dist/chunk-PYA4BR2N.mjs.map +1 -0
  80. package/dist/{chunk-X72PFC4X.mjs → chunk-QE53WRXW.mjs} +4 -4
  81. package/dist/{chunk-X72PFC4X.mjs.map → chunk-QE53WRXW.mjs.map} +1 -1
  82. package/dist/{chunk-DLJZYWP3.mjs → chunk-QGV7FEUI.mjs} +7 -43
  83. package/dist/chunk-QGV7FEUI.mjs.map +1 -0
  84. package/dist/chunk-QJU6HBSK.mjs +39 -0
  85. package/dist/chunk-QJU6HBSK.mjs.map +1 -0
  86. package/dist/{chunk-FX3VR4BF.js → chunk-RMUOY6XB.js} +7 -7
  87. package/dist/{chunk-FX3VR4BF.js.map → chunk-RMUOY6XB.js.map} +1 -1
  88. package/dist/{chunk-ILLOVVVP.mjs → chunk-VE5XLADP.mjs} +3 -3
  89. package/dist/{chunk-ILLOVVVP.mjs.map → chunk-VE5XLADP.mjs.map} +1 -1
  90. package/dist/chunk-VJMPIRSD.js +31 -0
  91. package/dist/chunk-VJMPIRSD.js.map +1 -0
  92. package/dist/{chunk-Z26CMPBX.js → chunk-VMVEL4WU.js} +7 -43
  93. package/dist/chunk-VMVEL4WU.js.map +1 -0
  94. package/dist/{chunk-ZCZEKWFW.mjs → chunk-VNQFKBKF.mjs} +3 -3
  95. package/dist/{chunk-ZCZEKWFW.mjs.map → chunk-VNQFKBKF.mjs.map} +1 -1
  96. package/dist/{chunk-FO6Y27AH.mjs → chunk-WS4GNH3F.mjs} +4 -4
  97. package/dist/{chunk-FO6Y27AH.mjs.map → chunk-WS4GNH3F.mjs.map} +1 -1
  98. package/dist/{chunk-AXFM4MFK.mjs → chunk-WVAY4ZWC.mjs} +9 -9
  99. package/dist/{chunk-AXFM4MFK.mjs.map → chunk-WVAY4ZWC.mjs.map} +1 -1
  100. package/dist/{chunk-3BNFUMLL.js → chunk-XB57AM6T.js} +5 -14
  101. package/dist/chunk-XB57AM6T.js.map +1 -0
  102. package/dist/chunk-XIJ4F6IE.mjs +63 -0
  103. package/dist/chunk-XIJ4F6IE.mjs.map +1 -0
  104. package/dist/{chunk-M2EGCGIT.js → chunk-XKV73RDH.js} +9 -7
  105. package/dist/{chunk-M2EGCGIT.js.map → chunk-XKV73RDH.js.map} +1 -1
  106. package/dist/chunk-YCQHE2XT.mjs +6 -0
  107. package/dist/{chunk-S4FJIG6Y.mjs.map → chunk-YCQHE2XT.mjs.map} +1 -1
  108. package/dist/cli/index.js +2 -2
  109. package/dist/cli/index.mjs +1 -1
  110. package/dist/client/index.js +6 -5
  111. package/dist/client/index.mjs +2 -1
  112. package/dist/commerce/index.js +52 -51
  113. package/dist/commerce/index.mjs +7 -6
  114. package/dist/discover-Q5RWC27Y.js +21 -0
  115. package/dist/discover-Q5RWC27Y.js.map +1 -0
  116. package/dist/discover-ROPVYJJP.mjs +4 -0
  117. package/dist/discover-ROPVYJJP.mjs.map +1 -0
  118. package/dist/engage/index.js +10 -9
  119. package/dist/engage/index.js.map +1 -1
  120. package/dist/engage/index.mjs +7 -6
  121. package/dist/engage/index.mjs.map +1 -1
  122. package/dist/fleet/index.js +7 -7
  123. package/dist/fleet/index.mjs +3 -3
  124. package/dist/forms/index.js +13 -12
  125. package/dist/forms/index.js.map +1 -1
  126. package/dist/forms/index.mjs +5 -4
  127. package/dist/forms/index.mjs.map +1 -1
  128. package/dist/images/index.js +10 -10
  129. package/dist/images/index.mjs +3 -3
  130. package/dist/index.d.mts +1 -0
  131. package/dist/index.d.ts +1 -0
  132. package/dist/index.js +74 -64
  133. package/dist/index.js.map +1 -1
  134. package/dist/index.mjs +12 -10
  135. package/dist/index.mjs.map +1 -1
  136. package/dist/landing/index.d.mts +21 -0
  137. package/dist/landing/index.d.ts +21 -0
  138. package/dist/landing/index.js +21 -0
  139. package/dist/landing/index.js.map +1 -0
  140. package/dist/landing/index.mjs +4 -0
  141. package/dist/landing/index.mjs.map +1 -0
  142. package/dist/layout/client.js +8 -7
  143. package/dist/layout/client.mjs +7 -6
  144. package/dist/layout/index.js +9 -8
  145. package/dist/layout/index.js.map +1 -1
  146. package/dist/layout/index.mjs +7 -6
  147. package/dist/layout/index.mjs.map +1 -1
  148. package/dist/maps/index.js +4 -4
  149. package/dist/maps/index.mjs +2 -2
  150. package/dist/metadata-D_GiY8LJ.d.mts +36 -0
  151. package/dist/metadata-D_GiY8LJ.d.ts +36 -0
  152. package/dist/middleware/index.js +2 -8
  153. package/dist/middleware/index.js.map +1 -1
  154. package/dist/middleware/index.mjs +2 -8
  155. package/dist/middleware/index.mjs.map +1 -1
  156. package/dist/seo/client.js +5 -4
  157. package/dist/seo/client.mjs +4 -3
  158. package/dist/seo/index.js +14 -13
  159. package/dist/seo/index.js.map +1 -1
  160. package/dist/seo/index.mjs +6 -5
  161. package/dist/seo/index.mjs.map +1 -1
  162. package/dist/seo/register-sitemap-cli.js +64 -96
  163. package/dist/seo/register-sitemap-cli.js.map +1 -1
  164. package/dist/seo/register-sitemap-cli.mjs +62 -94
  165. package/dist/seo/register-sitemap-cli.mjs.map +1 -1
  166. package/dist/seo/server.js +5 -5
  167. package/dist/seo/server.mjs +1 -1
  168. package/dist/signal/index.js +11 -11
  169. package/dist/signal/index.mjs +2 -2
  170. package/dist/sitemap/index.d.mts +15 -17
  171. package/dist/sitemap/index.d.ts +15 -17
  172. package/dist/sitemap/index.js +14 -37
  173. package/dist/sitemap/index.js.map +1 -1
  174. package/dist/sitemap/index.mjs +11 -34
  175. package/dist/sitemap/index.mjs.map +1 -1
  176. package/dist/sync/index.js +15 -15
  177. package/dist/sync/index.mjs +3 -3
  178. package/package.json +11 -1
  179. package/dist/AnalyticsProvider-26VS3CQR.js +0 -29
  180. package/dist/AnalyticsProvider-AMHG4DIE.mjs +0 -8
  181. package/dist/ChatWidget-NIYNSMLU.js +0 -17
  182. package/dist/ChatWidget-UKPEQEHB.mjs +0 -8
  183. package/dist/EngageWidget-33QCFWQW.js +0 -16
  184. package/dist/EngageWidget-S76ZMDEF.mjs +0 -7
  185. package/dist/SignalCore-2AUGAOQT.mjs.map +0 -1
  186. package/dist/SignalCore-2UXXM4FF.js.map +0 -1
  187. package/dist/SitemapSync-RBHXPQAQ.mjs +0 -6
  188. package/dist/SitemapSync-WQJMHJNY.js +0 -15
  189. package/dist/chunk-3BNFUMLL.js.map +0 -1
  190. package/dist/chunk-DLJZYWP3.mjs.map +0 -1
  191. package/dist/chunk-EE6SFAZP.mjs.map +0 -1
  192. package/dist/chunk-EOENN46G.js +0 -8
  193. package/dist/chunk-K2P7KPEQ.js.map +0 -1
  194. package/dist/chunk-M4HLDK62.mjs.map +0 -1
  195. package/dist/chunk-NNPF4KRZ.mjs.map +0 -1
  196. package/dist/chunk-QOFC3BYG.js.map +0 -1
  197. package/dist/chunk-S4FJIG6Y.mjs +0 -6
  198. package/dist/chunk-WEHJRE3H.mjs.map +0 -1
  199. package/dist/chunk-XOCQANYF.js.map +0 -1
  200. package/dist/chunk-Z26CMPBX.js.map +0 -1
@@ -1,12 +1,12 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkFX3VR4BF_js = require('./chunk-FX3VR4BF.js');
4
+ var chunkRMUOY6XB_js = require('./chunk-RMUOY6XB.js');
5
5
  var chunkHGNSJXWT_js = require('./chunk-HGNSJXWT.js');
6
6
  var chunkWZHWWOUC_js = require('./chunk-WZHWWOUC.js');
7
- var chunk6UK5JIKE_js = require('./chunk-6UK5JIKE.js');
8
- var chunk3BNFUMLL_js = require('./chunk-3BNFUMLL.js');
9
- var chunkM2EGCGIT_js = require('./chunk-M2EGCGIT.js');
7
+ var chunkMJV6RC7I_js = require('./chunk-MJV6RC7I.js');
8
+ var chunkXB57AM6T_js = require('./chunk-XB57AM6T.js');
9
+ var chunkXKV73RDH_js = require('./chunk-XKV73RDH.js');
10
10
  var react = require('react');
11
11
  var dynamic = require('next/dynamic');
12
12
  var jsxRuntime = require('react/jsx-runtime');
@@ -16,15 +16,15 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
16
  var dynamic__default = /*#__PURE__*/_interopDefault(dynamic);
17
17
 
18
18
  var LazyAnalyticsProvider = dynamic__default.default(
19
- () => import('./AnalyticsProvider-26VS3CQR.js').then((m) => ({ default: m.AnalyticsProvider })),
19
+ () => import('./AnalyticsProvider-ARAWVJPX.js').then((m) => ({ default: m.AnalyticsProvider })),
20
20
  { ssr: false }
21
21
  );
22
22
  var LazyEngageWidget = dynamic__default.default(
23
- () => import('./EngageWidget-33QCFWQW.js').then((m) => ({ default: m.EngageWidget })),
23
+ () => import('./EngageWidget-X3NIWGMZ.js').then((m) => ({ default: m.EngageWidget })),
24
24
  { ssr: false }
25
25
  );
26
26
  var LazySitemapSync = dynamic__default.default(
27
- () => import('./SitemapSync-WQJMHJNY.js').then((m) => ({ default: m.SitemapSync })),
27
+ () => import('./SitemapSync-4BALOI4B.js').then((m) => ({ default: m.SitemapSync })),
28
28
  { ssr: false }
29
29
  );
30
30
  function SiteKitClientProviders({
@@ -56,14 +56,14 @@ function SiteKitClientProviders({
56
56
  }
57
57
  const site = chunkWZHWWOUC_js.normalizeSiteHost(resolvedSite) ?? "";
58
58
  if (typeof window !== "undefined") {
59
- chunkM2EGCGIT_js.configureSiteCredential({ credential: apiKey, apiUrl });
59
+ chunkXKV73RDH_js.configureSiteCredential({ credential: apiKey, apiUrl });
60
60
  window.__SITE_KIT_API_URL__ = apiUrl;
61
- window.__SITE_KIT_API_KEY__ = chunkM2EGCGIT_js.currentCredential(apiKey);
61
+ window.__SITE_KIT_API_KEY__ = chunkXKV73RDH_js.currentCredential(apiKey);
62
62
  window.__SITE_KIT_DEBUG__ = debug;
63
63
  window.__SITE_KIT_SITE__ = site;
64
64
  }
65
- const [visitorId] = react.useState(() => chunk3BNFUMLL_js.getOrCreateVisitorId());
66
- const [sessionId] = react.useState(() => chunk3BNFUMLL_js.getOrCreateSessionId());
65
+ const [visitorId] = react.useState(() => chunkXB57AM6T_js.getOrCreateVisitorId());
66
+ const [sessionId] = react.useState(() => chunkXB57AM6T_js.getOrCreateSessionId());
67
67
  const pageMetadataRef = react.useRef(null);
68
68
  const onPageMetadata = react.useCallback((metadata) => {
69
69
  pageMetadataRef.current = metadata;
@@ -72,7 +72,7 @@ function SiteKitClientProviders({
72
72
  if (signal) {
73
73
  const signalConfig = typeof signal === "object" ? signal : {};
74
74
  content = /* @__PURE__ */ jsxRuntime.jsx(
75
- chunk6UK5JIKE_js.SignalBridge,
75
+ chunkMJV6RC7I_js.SignalBridge,
76
76
  {
77
77
  enabled: true,
78
78
  realtime: signalConfig.realtime !== false,
@@ -140,7 +140,7 @@ function SiteKitClientProviders({
140
140
  content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
141
141
  content,
142
142
  modulesReady && /* @__PURE__ */ jsxRuntime.jsx(
143
- chunkFX3VR4BF_js.FleetHeartbeat,
143
+ chunkRMUOY6XB_js.FleetHeartbeat,
144
144
  {
145
145
  apiUrl,
146
146
  apiKey,
@@ -152,9 +152,9 @@ function SiteKitClientProviders({
152
152
  )
153
153
  ] });
154
154
  }
155
- return /* @__PURE__ */ jsxRuntime.jsx(chunk3BNFUMLL_js.SiteKitIdentityProvider, { visitorId, sessionId, children: content });
155
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkXB57AM6T_js.SiteKitIdentityProvider, { visitorId, sessionId, children: content });
156
156
  }
157
157
 
158
158
  exports.SiteKitClientProviders = SiteKitClientProviders;
159
- //# sourceMappingURL=chunk-BOTWTNHW.js.map
160
- //# sourceMappingURL=chunk-BOTWTNHW.js.map
159
+ //# sourceMappingURL=chunk-56X3IUOL.js.map
160
+ //# sourceMappingURL=chunk-56X3IUOL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/layout/SiteKitClientProviders.tsx"],"names":["dynamic","useDeferredActivation","normalizeSiteHost","configureSiteCredential","currentCredential","useState","getOrCreateVisitorId","getOrCreateSessionId","useRef","useCallback","jsx","SignalBridge","jsxs","Fragment","Suspense","FleetHeartbeat","SiteKitIdentityProvider"],"mappings":"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","file":"chunk-BOTWTNHW.js","sourcesContent":["'use client'\n\n/**\n * SiteKitClientProviders — Client Island\n *\n * This is the 'use client' boundary for SiteKitLayout.\n * It composes the client-only providers (Analytics, Engage, Signal, SitemapSync)\n * that require React context or browser APIs.\n *\n * All modules are lazy-loaded via next/dynamic so their JS is only downloaded\n * when the feature is enabled — keeping the initial bundle lightweight.\n *\n * All modules share a unified identity (visitor ID + session ID) via\n * SiteKitIdentityProvider, ensuring consistent tracking across Analytics,\n * Signal, and Engage.\n *\n * Props are passed down from the server-side SiteKitLayout component,\n * which reads env vars at render time.\n */\n\nimport React, { Suspense, useCallback, useRef, useState, type ReactNode } from 'react'\nimport dynamic from 'next/dynamic'\nimport {\n SiteKitIdentityProvider,\n getOrCreateVisitorId,\n getOrCreateSessionId,\n} from '../shared/identity'\nimport { normalizeSiteHost } from '../sites/contract'\n// Defer non-critical module mounting until the page is quiet: the lazy\n// modules below are dynamic(ssr:false) and never render on the server, but\n// rendering them during hydration still kicks off their chunk downloads +\n// mount effects inside the critical startup window. useDeferredActivation\n// holds them until window.load + idle or first interaction — the same\n// strategy as the hand-rolled per-site deferrals this replaces (upforge\n// `deferred-analytics.tsx`, TPS `DeferredAnalytics.tsx`). The hook is public\n// (`@sonordev/site-kit/client`) so sites can reuse it for their own scripts.\nimport { useDeferredActivation } from '../shared/defer'\nimport { configureSiteCredential, currentCredential } from '../shared/siteToken'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\n// Lazy-load feature modules — JS only downloaded when feature is enabled\nconst LazyAnalyticsProvider = dynamic(\n () => import('../analytics/AnalyticsProvider').then(m => ({ default: m.AnalyticsProvider })),\n { ssr: false },\n)\nconst LazyEngageWidget = dynamic(\n () => import('../engage/EngageWidget').then(m => ({ default: m.EngageWidget })),\n { ssr: false },\n)\nconst LazySitemapSync = dynamic(\n () => import('../SitemapSync').then(m => ({ default: m.SitemapSync })),\n { ssr: false },\n)\n// SignalBridge is imported STATICALLY, not via dynamic(ssr:false): it is a\n// tiny SSR-safe context shell that renders children immediately and\n// lazy-loads its machinery (SignalCore) as a childless sibling internally.\n// Wrapping children in a dynamic(ssr:false) component was the old SSR-bailout\n// failure mode — do not reintroduce it.\nimport { SignalBridge } from '../signal/SignalBridge'\n// Fleet heartbeat: a deferred, CHILDLESS SIBLING (like Analytics/Engage) that\n// reports this site's kit version + active modules once per session, so the\n// platform can see version drift across the fleet. Tiny and SSR-safe — renders\n// null until the shared idle gate fires; never wraps page content.\nimport { FleetHeartbeat } from '../fleet/FleetHeartbeat'\nimport type { FleetModule } from '../fleet/contract'\n\nexport interface SiteKitClientProvidersProps {\n children: ReactNode\n apiKey: string\n apiUrl: string\n projectId?: string\n analytics?: boolean | AnalyticsConfig\n engage?: boolean | EngageConfig\n signal?: boolean | SignalConfig\n sitemapSync?: boolean\n /**\n * Fleet heartbeat — reports kit version + active modules to Sonor once per\n * session so the platform can track version drift and key state across every\n * site. Default true. Deferred exactly like Analytics; never in the hydration\n * path, carries no visitor data.\n */\n fleet?: boolean\n /**\n * Defer Analytics / Engage / SitemapSync until window load + idle or first\n * interaction (default true). Pass false to restore legacy eager mounting\n * on hydration. SignalBridge is never deferred — it must apply experiment\n * variants as early as possible.\n */\n defer?: boolean\n debug?: boolean\n}\n\nexport function SiteKitClientProviders({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = true,\n fleet = true,\n defer = true,\n debug = false,\n}: SiteKitClientProvidersProps) {\n // One shared activation gate for all deferred siblings, so they mount in a\n // single commit instead of staggered re-renders.\n const modulesReady = useDeferredActivation(defer)\n // Hoist analytics config so the `site` dimension is resolvable up here.\n const analyticsConfig: AnalyticsConfig =\n typeof analytics === 'object' ? analytics : {}\n\n // Resolve the sub-site identifier — the dimension that lets one Sonor project\n // host many sites (e.g. truepowersystems.com + ohiopowerstudies.com under one\n // TPS project). Precedence: explicit `analytics.site` > NEXT_PUBLIC_SITE_URL\n // host > window.location.host. Always a string (possibly empty).\n const explicitSite = analyticsConfig.site\n const envSiteUrl =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_SITE_URL\n : undefined\n let resolvedSite = explicitSite ?? ''\n if (!resolvedSite && envSiteUrl) {\n try {\n resolvedSite = new URL(envSiteUrl).host\n } catch {\n /* malformed URL — fall through to client-side host */\n }\n }\n if (!resolvedSite && typeof window !== 'undefined') {\n resolvedSite = window.location.host\n }\n // Normalize with the shared site contract (lowercase host, no protocol/path/\n // port) so `__SITE_KIT_SITE__` matches exactly what the Sonor API stores —\n // servers re-normalize with the same rule, so this only makes the client\n // emit the canonical value. Always a string (possibly empty).\n const site = normalizeSiteHost(resolvedSite) ?? ''\n\n // Set window globals for modules that still read from them.\n if (typeof window !== 'undefined') {\n // Seed the client token manager. In 3.2+ `apiKey` is a short-lived minted\n // token that sonorFetch refreshes transparently; the window global is set to\n // the freshest token held (a prior page this session may have refreshed).\n // In raw-key mode (2.x kit or mint-failed fallback) this is a passthrough.\n configureSiteCredential({ credential: apiKey, apiUrl })\n ;(window as any).__SITE_KIT_API_URL__ = apiUrl\n ;(window as any).__SITE_KIT_API_KEY__ = currentCredential(apiKey)\n ;(window as any).__SITE_KIT_DEBUG__ = debug\n ;(window as any).__SITE_KIT_SITE__ = site\n }\n\n // Unified identity — single source of truth for all modules\n const [visitorId] = useState(() => getOrCreateVisitorId())\n const [sessionId] = useState(() => getOrCreateSessionId())\n\n // Page metadata bridge: Analytics writes, Signal reads\n const pageMetadataRef = useRef<Record<string, unknown> | null>(null)\n const onPageMetadata = useCallback((metadata: Record<string, unknown>) => {\n pageMetadataRef.current = metadata\n }, [])\n\n let content = <>{children}</>\n\n // Wrap with SignalBridge if enabled. Safe to wrap: the shell is SSR-safe\n // and renders children straight through — the heavy machinery mounts as a\n // childless sibling inside it. Not gated on modulesReady: experiment\n // variants must apply as early as possible.\n if (signal) {\n const signalConfig: SignalConfig =\n typeof signal === 'object' ? signal : {}\n content = (\n <SignalBridge\n enabled\n realtime={signalConfig.realtime !== false}\n experiments={signalConfig.experiments !== false}\n behaviorTracking={signalConfig.behaviorTracking !== false}\n visitorId={visitorId}\n sessionId={sessionId}\n pageMetadataRef={pageMetadataRef}\n >\n {content}\n </SignalBridge>\n )\n }\n\n // Add Analytics if enabled (renders alongside, doesn't wrap).\n //\n // CRITICAL: LazyAnalyticsProvider is dynamic(..., { ssr: false }). Wrapping\n // {content} inside an ssr:false component makes the entire page tree skip\n // server rendering — the route de-opts to 100% client rendering and the\n // hero / LCP element only paints after hydration (mobile LCP ~4s, Lighthouse\n // ~85). Analytics tracks via effects + a metadata ref, so it never needs to\n // wrap page content — mount it as a childless sibling, exactly like Engage.\n // Each deferred sibling is appended as `{modulesReady && <Module/>}` so the\n // children slot never moves in the tree — flipping ready only mounts the\n // sibling, it never remounts page content.\n if (analytics) {\n content = (\n <>\n {content}\n {modulesReady && (\n <Suspense fallback={null}>\n <LazyAnalyticsProvider\n apiUrl={apiUrl}\n apiKey={apiKey}\n site={site}\n trackPageViews={analyticsConfig.trackPageViews !== false}\n trackWebVitals={analyticsConfig.trackWebVitals !== false}\n trackScrollDepth={analyticsConfig.trackScrollDepth !== false}\n trackClicks={analyticsConfig.trackClicks !== false}\n sessionTimeout={analyticsConfig.sessionDuration}\n excludePaths={analyticsConfig.excludePaths}\n debug={debug}\n externalVisitorId={visitorId}\n externalSessionId={sessionId}\n onPageMetadata={onPageMetadata}\n />\n </Suspense>\n )}\n </>\n )\n }\n\n // Add Engage widget if enabled (renders alongside, doesn't wrap)\n if (engage) {\n const engageConfig: EngageConfig =\n typeof engage === 'object' ? engage : {}\n content = (\n <>\n {content}\n {modulesReady && (\n <LazyEngageWidget\n apiUrl={apiUrl}\n apiKey={apiKey}\n projectId={projectId}\n position={engageConfig.position || 'bottom-right'}\n zIndex={engageConfig.zIndex}\n chatEnabled={engageConfig.chatEnabled !== false}\n />\n )}\n </>\n )\n }\n\n // Add SitemapSync if enabled\n if (sitemapSync) {\n content = (\n <>\n {content}\n {modulesReady && <LazySitemapSync debug={debug} />}\n </>\n )\n }\n\n // Fleet heartbeat — childless sibling on the same modulesReady idle gate.\n // Reports the modules actually enabled on THIS layout (honest client-observable\n // set) so the platform can answer \"which version / modules is each site\n // running\". defer={false}: the modulesReady gate already handled deferral, so\n // the heartbeat fires on mount (still bounded to once per session internally).\n if (fleet) {\n const activeModules: FleetModule[] = []\n if (analytics) activeModules.push('analytics')\n if (engage) activeModules.push('engage')\n if (signal) activeModules.push('signal')\n if (sitemapSync) activeModules.push('sitemapSync')\n content = (\n <>\n {content}\n {modulesReady && (\n <FleetHeartbeat\n apiUrl={apiUrl}\n apiKey={apiKey}\n site={site}\n modules={activeModules}\n defer={false}\n debug={debug}\n />\n )}\n </>\n )\n }\n\n return (\n <SiteKitIdentityProvider visitorId={visitorId} sessionId={sessionId}>\n {content}\n </SiteKitIdentityProvider>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/layout/SiteKitClientProviders.tsx"],"names":["dynamic","useDeferredActivation","normalizeSiteHost","configureSiteCredential","currentCredential","useState","getOrCreateVisitorId","getOrCreateSessionId","useRef","useCallback","jsx","SignalBridge","jsxs","Fragment","Suspense","FleetHeartbeat","SiteKitIdentityProvider"],"mappings":"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","file":"chunk-56X3IUOL.js","sourcesContent":["'use client'\n\n/**\n * SiteKitClientProviders — Client Island\n *\n * This is the 'use client' boundary for SiteKitLayout.\n * It composes the client-only providers (Analytics, Engage, Signal, SitemapSync)\n * that require React context or browser APIs.\n *\n * All modules are lazy-loaded via next/dynamic so their JS is only downloaded\n * when the feature is enabled — keeping the initial bundle lightweight.\n *\n * All modules share a unified identity (visitor ID + session ID) via\n * SiteKitIdentityProvider, ensuring consistent tracking across Analytics,\n * Signal, and Engage.\n *\n * Props are passed down from the server-side SiteKitLayout component,\n * which reads env vars at render time.\n */\n\nimport React, { Suspense, useCallback, useRef, useState, type ReactNode } from 'react'\nimport dynamic from 'next/dynamic'\nimport {\n SiteKitIdentityProvider,\n getOrCreateVisitorId,\n getOrCreateSessionId,\n} from '../shared/identity'\nimport { normalizeSiteHost } from '../sites/contract'\n// Defer non-critical module mounting until the page is quiet: the lazy\n// modules below are dynamic(ssr:false) and never render on the server, but\n// rendering them during hydration still kicks off their chunk downloads +\n// mount effects inside the critical startup window. useDeferredActivation\n// holds them until window.load + idle or first interaction — the same\n// strategy as the hand-rolled per-site deferrals this replaces (upforge\n// `deferred-analytics.tsx`, TPS `DeferredAnalytics.tsx`). The hook is public\n// (`@sonordev/site-kit/client`) so sites can reuse it for their own scripts.\nimport { useDeferredActivation } from '../shared/defer'\nimport { configureSiteCredential, currentCredential } from '../shared/siteToken'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\n// Lazy-load feature modules — JS only downloaded when feature is enabled\nconst LazyAnalyticsProvider = dynamic(\n () => import('../analytics/AnalyticsProvider').then(m => ({ default: m.AnalyticsProvider })),\n { ssr: false },\n)\nconst LazyEngageWidget = dynamic(\n () => import('../engage/EngageWidget').then(m => ({ default: m.EngageWidget })),\n { ssr: false },\n)\nconst LazySitemapSync = dynamic(\n () => import('../SitemapSync').then(m => ({ default: m.SitemapSync })),\n { ssr: false },\n)\n// SignalBridge is imported STATICALLY, not via dynamic(ssr:false): it is a\n// tiny SSR-safe context shell that renders children immediately and\n// lazy-loads its machinery (SignalCore) as a childless sibling internally.\n// Wrapping children in a dynamic(ssr:false) component was the old SSR-bailout\n// failure mode — do not reintroduce it.\nimport { SignalBridge } from '../signal/SignalBridge'\n// Fleet heartbeat: a deferred, CHILDLESS SIBLING (like Analytics/Engage) that\n// reports this site's kit version + active modules once per session, so the\n// platform can see version drift across the fleet. Tiny and SSR-safe — renders\n// null until the shared idle gate fires; never wraps page content.\nimport { FleetHeartbeat } from '../fleet/FleetHeartbeat'\nimport type { FleetModule } from '../fleet/contract'\n\nexport interface SiteKitClientProvidersProps {\n children: ReactNode\n apiKey: string\n apiUrl: string\n projectId?: string\n analytics?: boolean | AnalyticsConfig\n engage?: boolean | EngageConfig\n signal?: boolean | SignalConfig\n sitemapSync?: boolean\n /**\n * Fleet heartbeat — reports kit version + active modules to Sonor once per\n * session so the platform can track version drift and key state across every\n * site. Default true. Deferred exactly like Analytics; never in the hydration\n * path, carries no visitor data.\n */\n fleet?: boolean\n /**\n * Defer Analytics / Engage / SitemapSync until window load + idle or first\n * interaction (default true). Pass false to restore legacy eager mounting\n * on hydration. SignalBridge is never deferred — it must apply experiment\n * variants as early as possible.\n */\n defer?: boolean\n debug?: boolean\n}\n\nexport function SiteKitClientProviders({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = true,\n fleet = true,\n defer = true,\n debug = false,\n}: SiteKitClientProvidersProps) {\n // One shared activation gate for all deferred siblings, so they mount in a\n // single commit instead of staggered re-renders.\n const modulesReady = useDeferredActivation(defer)\n // Hoist analytics config so the `site` dimension is resolvable up here.\n const analyticsConfig: AnalyticsConfig =\n typeof analytics === 'object' ? analytics : {}\n\n // Resolve the sub-site identifier — the dimension that lets one Sonor project\n // host many sites (e.g. truepowersystems.com + ohiopowerstudies.com under one\n // TPS project). Precedence: explicit `analytics.site` > NEXT_PUBLIC_SITE_URL\n // host > window.location.host. Always a string (possibly empty).\n const explicitSite = analyticsConfig.site\n const envSiteUrl =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_SITE_URL\n : undefined\n let resolvedSite = explicitSite ?? ''\n if (!resolvedSite && envSiteUrl) {\n try {\n resolvedSite = new URL(envSiteUrl).host\n } catch {\n /* malformed URL — fall through to client-side host */\n }\n }\n if (!resolvedSite && typeof window !== 'undefined') {\n resolvedSite = window.location.host\n }\n // Normalize with the shared site contract (lowercase host, no protocol/path/\n // port) so `__SITE_KIT_SITE__` matches exactly what the Sonor API stores —\n // servers re-normalize with the same rule, so this only makes the client\n // emit the canonical value. Always a string (possibly empty).\n const site = normalizeSiteHost(resolvedSite) ?? ''\n\n // Set window globals for modules that still read from them.\n if (typeof window !== 'undefined') {\n // Seed the client token manager. In 3.2+ `apiKey` is a short-lived minted\n // token that sonorFetch refreshes transparently; the window global is set to\n // the freshest token held (a prior page this session may have refreshed).\n // In raw-key mode (2.x kit or mint-failed fallback) this is a passthrough.\n configureSiteCredential({ credential: apiKey, apiUrl })\n ;(window as any).__SITE_KIT_API_URL__ = apiUrl\n ;(window as any).__SITE_KIT_API_KEY__ = currentCredential(apiKey)\n ;(window as any).__SITE_KIT_DEBUG__ = debug\n ;(window as any).__SITE_KIT_SITE__ = site\n }\n\n // Unified identity — single source of truth for all modules\n const [visitorId] = useState(() => getOrCreateVisitorId())\n const [sessionId] = useState(() => getOrCreateSessionId())\n\n // Page metadata bridge: Analytics writes, Signal reads\n const pageMetadataRef = useRef<Record<string, unknown> | null>(null)\n const onPageMetadata = useCallback((metadata: Record<string, unknown>) => {\n pageMetadataRef.current = metadata\n }, [])\n\n let content = <>{children}</>\n\n // Wrap with SignalBridge if enabled. Safe to wrap: the shell is SSR-safe\n // and renders children straight through — the heavy machinery mounts as a\n // childless sibling inside it. Not gated on modulesReady: experiment\n // variants must apply as early as possible.\n if (signal) {\n const signalConfig: SignalConfig =\n typeof signal === 'object' ? signal : {}\n content = (\n <SignalBridge\n enabled\n realtime={signalConfig.realtime !== false}\n experiments={signalConfig.experiments !== false}\n behaviorTracking={signalConfig.behaviorTracking !== false}\n visitorId={visitorId}\n sessionId={sessionId}\n pageMetadataRef={pageMetadataRef}\n >\n {content}\n </SignalBridge>\n )\n }\n\n // Add Analytics if enabled (renders alongside, doesn't wrap).\n //\n // CRITICAL: LazyAnalyticsProvider is dynamic(..., { ssr: false }). Wrapping\n // {content} inside an ssr:false component makes the entire page tree skip\n // server rendering — the route de-opts to 100% client rendering and the\n // hero / LCP element only paints after hydration (mobile LCP ~4s, Lighthouse\n // ~85). Analytics tracks via effects + a metadata ref, so it never needs to\n // wrap page content — mount it as a childless sibling, exactly like Engage.\n // Each deferred sibling is appended as `{modulesReady && <Module/>}` so the\n // children slot never moves in the tree — flipping ready only mounts the\n // sibling, it never remounts page content.\n if (analytics) {\n content = (\n <>\n {content}\n {modulesReady && (\n <Suspense fallback={null}>\n <LazyAnalyticsProvider\n apiUrl={apiUrl}\n apiKey={apiKey}\n site={site}\n trackPageViews={analyticsConfig.trackPageViews !== false}\n trackWebVitals={analyticsConfig.trackWebVitals !== false}\n trackScrollDepth={analyticsConfig.trackScrollDepth !== false}\n trackClicks={analyticsConfig.trackClicks !== false}\n sessionTimeout={analyticsConfig.sessionDuration}\n excludePaths={analyticsConfig.excludePaths}\n debug={debug}\n externalVisitorId={visitorId}\n externalSessionId={sessionId}\n onPageMetadata={onPageMetadata}\n />\n </Suspense>\n )}\n </>\n )\n }\n\n // Add Engage widget if enabled (renders alongside, doesn't wrap)\n if (engage) {\n const engageConfig: EngageConfig =\n typeof engage === 'object' ? engage : {}\n content = (\n <>\n {content}\n {modulesReady && (\n <LazyEngageWidget\n apiUrl={apiUrl}\n apiKey={apiKey}\n projectId={projectId}\n position={engageConfig.position || 'bottom-right'}\n zIndex={engageConfig.zIndex}\n chatEnabled={engageConfig.chatEnabled !== false}\n />\n )}\n </>\n )\n }\n\n // Add SitemapSync if enabled\n if (sitemapSync) {\n content = (\n <>\n {content}\n {modulesReady && <LazySitemapSync debug={debug} />}\n </>\n )\n }\n\n // Fleet heartbeat — childless sibling on the same modulesReady idle gate.\n // Reports the modules actually enabled on THIS layout (honest client-observable\n // set) so the platform can answer \"which version / modules is each site\n // running\". defer={false}: the modulesReady gate already handled deferral, so\n // the heartbeat fires on mount (still bounded to once per session internally).\n if (fleet) {\n const activeModules: FleetModule[] = []\n if (analytics) activeModules.push('analytics')\n if (engage) activeModules.push('engage')\n if (signal) activeModules.push('signal')\n if (sitemapSync) activeModules.push('sitemapSync')\n content = (\n <>\n {content}\n {modulesReady && (\n <FleetHeartbeat\n apiUrl={apiUrl}\n apiKey={apiKey}\n site={site}\n modules={activeModules}\n defer={false}\n debug={debug}\n />\n )}\n </>\n )\n }\n\n return (\n <SiteKitIdentityProvider visitorId={visitorId} sessionId={sessionId}>\n {content}\n </SiteKitIdentityProvider>\n )\n}\n"]}
@@ -1,20 +1,10 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkM2EGCGIT_js = require('./chunk-M2EGCGIT.js');
4
+ var chunkJEOKDUPQ_js = require('./chunk-JEOKDUPQ.js');
5
+ var chunkXKV73RDH_js = require('./chunk-XKV73RDH.js');
5
6
  var react = require('react');
6
7
 
7
- function inferPageType(urlPath) {
8
- if (urlPath === "/" || urlPath === "") return "homepage";
9
- if (/^\/services(\/|$)/i.test(urlPath)) return "service";
10
- if (/^\/compare(\/|$)/i.test(urlPath)) return "comparison";
11
- if (/^\/(insights|blog)(\/|$)/i.test(urlPath)) return "blog";
12
- if (/^\/industries(\/|$)/i.test(urlPath)) return "industry";
13
- if (/^\/work(\/|$)/i.test(urlPath)) return "portfolio";
14
- if (/^\/faq(\/|$)/i.test(urlPath)) return "faq";
15
- if (/^\/pricing(\/|$)/i.test(urlPath)) return "pricing";
16
- return "page";
17
- }
18
8
  var SYNC_STAMP_KEY = "_sk_sitemap_synced_at";
19
9
  var SYNC_HASH_KEY = "_sk_sitemap_hash";
20
10
  function isRecentlySynced(throttleMinutes) {
@@ -63,7 +53,7 @@ function getApiConfig() {
63
53
  }
64
54
  async function parseSitemap(sitemapUrl, debug) {
65
55
  try {
66
- const response = await chunkM2EGCGIT_js.sonorFetch(sitemapUrl);
56
+ const response = await chunkXKV73RDH_js.sonorFetch(sitemapUrl);
67
57
  if (!response.ok) {
68
58
  if (debug) console.warn("[SitemapSync] Failed to fetch sitemap:", response.status);
69
59
  return [];
@@ -81,17 +71,8 @@ async function parseSitemap(sitemapUrl, debug) {
81
71
  urls.forEach((url) => {
82
72
  const loc = url.querySelector("loc")?.textContent?.trim();
83
73
  if (!loc) return;
84
- let path;
85
- try {
86
- const urlObj = new URL(loc);
87
- path = urlObj.pathname;
88
- } catch {
89
- path = loc.startsWith("/") ? loc : `/${loc}`;
90
- }
91
- if (path !== "/" && path.endsWith("/")) {
92
- path = path.slice(0, -1);
93
- }
94
- if (path.includes("://") || /\/\/[a-z0-9.-]+\.[a-z]{2,}/i.test(path)) {
74
+ const path = chunkJEOKDUPQ_js.locToPath(loc);
75
+ if (chunkJEOKDUPQ_js.isMalformedSitemapPath(path)) {
95
76
  if (debug) console.warn(`[SitemapSync] Skipping malformed path: ${path}`);
96
77
  return;
97
78
  }
@@ -120,7 +101,7 @@ async function syncToPortal(entries, apiUrl, apiKey, site, debug, mode = "additi
120
101
  return { success: true, created: 0, updated: 0 };
121
102
  }
122
103
  try {
123
- const response = await chunkM2EGCGIT_js.sonorFetch(`${apiUrl}/api/public/seo/register-sitemap`, {
104
+ const response = await chunkXKV73RDH_js.sonorFetch(`${apiUrl}/api/public/seo/register-sitemap`, {
124
105
  method: "POST",
125
106
  headers: {
126
107
  "Content-Type": "application/json"
@@ -130,7 +111,7 @@ async function syncToPortal(entries, apiUrl, apiKey, site, debug, mode = "additi
130
111
  path: e.path,
131
112
  priority: e.priority,
132
113
  changefreq: e.changefreq,
133
- pageType: inferPageType(e.path)
114
+ pageType: chunkJEOKDUPQ_js.inferPageType(e.path)
134
115
  })),
135
116
  mode,
136
117
  // Sub-site host — tagged on every seo_pages row so the dashboard
@@ -211,5 +192,5 @@ function SitemapSync({
211
192
  }
212
193
 
213
194
  exports.SitemapSync = SitemapSync;
214
- //# sourceMappingURL=chunk-QOFC3BYG.js.map
215
- //# sourceMappingURL=chunk-QOFC3BYG.js.map
195
+ //# sourceMappingURL=chunk-5SJKYZID.js.map
196
+ //# sourceMappingURL=chunk-5SJKYZID.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/SitemapSync.tsx"],"names":["sonorFetch","locToPath","isMalformedSitemapPath","inferPageType","useRef","useEffect"],"mappings":"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","file":"chunk-5SJKYZID.js","sourcesContent":["/**\n * SitemapSync - Automatically sync sitemap.xml to Portal API\n *\n * Client-only component. Lives at package root so the main entry does not\n * pull in seo/ (and server-only code). For use in SiteKitProvider and\n * from @sonordev/site-kit/seo.\n *\n * @example\n * ```tsx\n * import { SitemapSync } from '@sonordev/site-kit'\n * // or\n * import { SitemapSync } from '@sonordev/site-kit/seo'\n * ```\n */\n\n'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { sonorFetch } from './shared/sonorFetch'\n// Single source of truth for page-type inference + path normalization, shared\n// with createSitemap (build) and the register-sitemap CLI. Pure string logic,\n// safe in the browser.\nimport { inferPageType, locToPath, isMalformedSitemapPath } from './sitemap/shared'\n\ninterface SitemapSyncProps {\n /** Custom sitemap URL (defaults to /sitemap.xml) */\n sitemapUrl?: string\n /** How often to re-sync in minutes (0 = only on mount, default: 60) */\n syncInterval?: number\n /** Enable debug logging */\n debug?: boolean\n /**\n * Sync mode:\n * - 'additive' (default for runtime): adds/updates pages but never deletes existing ones\n * - 'full-replace': replaces the entire page set (use only for build-time sync via createSitemap)\n */\n mode?: 'additive' | 'full-replace'\n}\n\ninterface SitemapEntry {\n path: string\n lastmod?: string\n changefreq?: string\n priority?: number\n pageType?: string\n}\n\n/**\n * Per-browser-session sync throttle. Build-time sync (createSitemap) is the\n * canonical source of truth; runtime SitemapSync is only a safety net — so\n * re-registering the sitemap on every full page load of every visitor is pure\n * waste (fetch + DOMParser on the visitor's main thread, plus a write per\n * pageview against the API). Stamp the last successful sync in sessionStorage\n * and skip while inside the throttle window.\n */\nconst SYNC_STAMP_KEY = '_sk_sitemap_synced_at'\nconst SYNC_HASH_KEY = '_sk_sitemap_hash'\n\nfunction isRecentlySynced(throttleMinutes: number): boolean {\n try {\n const stamp = sessionStorage.getItem(SYNC_STAMP_KEY)\n if (!stamp) return false\n const elapsed = Date.now() - parseInt(stamp, 10)\n return elapsed >= 0 && elapsed < throttleMinutes * 60 * 1000\n } catch {\n return false // storage unavailable (private mode) — sync as before\n }\n}\n\nfunction stampSynced(): void {\n try {\n sessionStorage.setItem(SYNC_STAMP_KEY, Date.now().toString())\n } catch {\n /* storage unavailable — throttle simply won't apply */\n }\n}\n\n/**\n * Content-hash guard (localStorage, so it survives across sessions): the\n * sitemap of a static site only changes at deploy, so once ONE sync of a given\n * sitemap succeeded from this browser, re-POSTing the identical entry set is\n * pure API load. Hash the parsed entries; skip the POST when unchanged.\n * Keyed by sitemap URL so multiple SitemapSync instances don't collide.\n */\nfunction hashEntries(sitemapUrl: string, entries: SitemapEntry[]): string {\n const text = entries\n .map(e => `${e.path}|${e.lastmod ?? ''}|${e.changefreq ?? ''}|${e.priority ?? ''}`)\n .join('\\n')\n let hash = 0\n for (let i = 0; i < text.length; i++) {\n hash = ((hash << 5) - hash + text.charCodeAt(i)) | 0\n }\n return `${sitemapUrl}:${entries.length}:${hash.toString(16)}`\n}\n\nfunction isAlreadySyncedHash(hash: string): boolean {\n try {\n return localStorage.getItem(SYNC_HASH_KEY) === hash\n } catch {\n return false\n }\n}\n\nfunction storeSyncedHash(hash: string): void {\n try {\n localStorage.setItem(SYNC_HASH_KEY, hash)\n } catch {\n /* storage unavailable — guard simply won't apply */\n }\n}\n\nfunction getApiConfig() {\n if (typeof window === 'undefined') return { apiUrl: '', apiKey: '', site: '' }\n\n const apiUrl = (window as any).__SITE_KIT_API_URL__ || 'https://api.sonor.io'\n const apiKey = (window as any).__SITE_KIT_API_KEY__ || ''\n // Sub-site host — set by SiteKitClientProviders from analytics.site config,\n // NEXT_PUBLIC_SITE_URL host, or window.location.host. Tagged on every\n // seo_pages row from this sitemap so the dashboard can scope the page tree\n // when one Sonor project hosts many sites.\n const site = (window as any).__SITE_KIT_SITE__ || window.location.host || ''\n return { apiUrl, apiKey, site }\n}\n\nasync function parseSitemap(sitemapUrl: string, debug: boolean): Promise<SitemapEntry[]> {\n try {\n const response = await sonorFetch(sitemapUrl)\n if (!response.ok) {\n if (debug) console.warn('[SitemapSync] Failed to fetch sitemap:', response.status)\n return []\n }\n\n const text = await response.text()\n const parser = new DOMParser()\n const doc = parser.parseFromString(text, 'application/xml')\n\n const parseError = doc.querySelector('parsererror')\n if (parseError) {\n if (debug) console.warn('[SitemapSync] Sitemap parse error:', parseError.textContent)\n return []\n }\n\n const urls = doc.querySelectorAll('url')\n const entries: SitemapEntry[] = []\n\n urls.forEach(url => {\n const loc = url.querySelector('loc')?.textContent?.trim()\n if (!loc) return\n\n const path = locToPath(loc)\n\n // Reject malformed paths (embedded domains, double protocols, etc.)\n if (isMalformedSitemapPath(path)) {\n if (debug) console.warn(`[SitemapSync] Skipping malformed path: ${path}`)\n return\n }\n\n const lastmod = url.querySelector('lastmod')?.textContent || undefined\n const changefreq = url.querySelector('changefreq')?.textContent || undefined\n const priorityStr = url.querySelector('priority')?.textContent\n const priority = priorityStr ? parseFloat(priorityStr) : undefined\n\n entries.push({ path, lastmod, changefreq, priority })\n })\n\n if (debug) {\n console.log(`[SitemapSync] Parsed ${entries.length} entries from sitemap`)\n }\n\n return entries\n } catch (error) {\n if (debug) console.error('[SitemapSync] Error parsing sitemap:', error)\n return []\n }\n}\n\nasync function syncToPortal(\n entries: SitemapEntry[],\n apiUrl: string,\n apiKey: string,\n site: string,\n debug: boolean,\n mode: 'additive' | 'full-replace' = 'additive'\n): Promise<{ success: boolean; created: number; updated: number }> {\n if (!apiKey) {\n if (debug) console.warn('[SitemapSync] No API key configured')\n return { success: false, created: 0, updated: 0 }\n }\n\n if (entries.length === 0) {\n if (debug) console.log('[SitemapSync] No entries to sync')\n return { success: true, created: 0, updated: 0 }\n }\n\n try {\n // Registration is idempotent in both modes (same payload → same final\n // state), so retrying a timed-out attempt is safe.\n const response = await sonorFetch(`${apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n entries: entries.map(e => ({\n path: e.path,\n priority: e.priority,\n changefreq: e.changefreq,\n pageType: inferPageType(e.path),\n })),\n mode,\n // Sub-site host — tagged on every seo_pages row so the dashboard\n // can scope the page tree to one microsite. Resolved by\n // SiteKitClientProviders (see __SITE_KIT_SITE__).\n ...(site ? { site } : {}),\n }),\n }, { apiKey })\n\n if (!response.ok) {\n if (debug) console.error('[SitemapSync] API error:', response.status, response.statusText)\n return { success: false, created: 0, updated: 0 }\n }\n\n const result = await response.json()\n\n if (debug) {\n console.log(`[SitemapSync] Synced: ${result.created} created, ${result.updated} updated`)\n }\n\n return {\n success: true,\n created: result.created || 0,\n updated: result.updated || 0,\n }\n } catch (error) {\n if (debug) console.error('[SitemapSync] Sync error:', error)\n return { success: false, created: 0, updated: 0 }\n }\n}\n\nexport function SitemapSync({\n sitemapUrl = '/sitemap.xml',\n syncInterval = 60,\n debug = false,\n mode = 'additive',\n}: SitemapSyncProps) {\n const hasSyncedRef = useRef(false)\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n useEffect(() => {\n // Build-time sync via createSitemap is the canonical source of truth, but\n // it can fail during ISR revalidation (app/ dir unavailable on serverless).\n // Runtime SitemapSync in additive mode is a safe fallback — it adds/updates\n // pages that may be missing without ever deleting existing ones.\n // Full-replace is never safe at runtime — always force additive.\n const effectiveMode: 'additive' | 'full-replace' = 'additive'\n\n // Throttle window: reuse syncInterval when periodic syncing is on,\n // otherwise default to 60 minutes for the on-mount sync.\n const throttleMinutes = syncInterval > 0 ? syncInterval : 60\n\n const doSync = async () => {\n const { apiUrl, apiKey, site } = getApiConfig()\n\n if (!apiKey) {\n if (debug) console.warn('[SitemapSync] No API key found')\n return\n }\n\n if (isRecentlySynced(throttleMinutes)) {\n if (debug) console.log('[SitemapSync] Skipped — synced within the last', throttleMinutes, 'min this session')\n return\n }\n\n if (debug) console.log('[SitemapSync] Starting sitemap sync...', site ? `(site: ${site})` : '')\n\n const entries = await parseSitemap(sitemapUrl, debug)\n\n if (entries.length > 0) {\n const hash = hashEntries(sitemapUrl, entries)\n if (isAlreadySyncedHash(hash)) {\n // This exact sitemap already synced from this browser — the server\n // state can't be improved by re-POSTing it. Stamp the session so we\n // don't even re-fetch/parse for the rest of the throttle window.\n stampSynced()\n if (debug) console.log('[SitemapSync] Skipped POST — sitemap unchanged since last successful sync')\n return\n }\n const result = await syncToPortal(entries, apiUrl, apiKey, site, debug, effectiveMode)\n if (result.success) {\n stampSynced()\n storeSyncedHash(hash)\n }\n }\n }\n\n if (!hasSyncedRef.current) {\n hasSyncedRef.current = true\n doSync()\n }\n\n if (syncInterval > 0) {\n intervalRef.current = setInterval(doSync, syncInterval * 60 * 1000)\n }\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n }\n }, [sitemapUrl, syncInterval, debug, mode])\n\n return null\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- import { useForm } from './chunk-WEHJRE3H.mjs';
3
- import { sonorFetch } from './chunk-FO6Y27AH.mjs';
2
+ import { useForm } from './chunk-LQHZFUZJ.mjs';
3
+ import { sonorFetch } from './chunk-WS4GNH3F.mjs';
4
4
  import { useState, useRef, useEffect, useCallback } from 'react';
5
5
  import ReactMarkdown from 'react-markdown';
6
6
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -1605,5 +1605,5 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1605
1605
  }
1606
1606
 
1607
1607
  export { ChatWidget };
1608
- //# sourceMappingURL=chunk-SLOZWRWU.mjs.map
1609
- //# sourceMappingURL=chunk-SLOZWRWU.mjs.map
1608
+ //# sourceMappingURL=chunk-5WEADCND.mjs.map
1609
+ //# sourceMappingURL=chunk-5WEADCND.mjs.map