@sonordev/site-kit 5.7.0 → 5.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (752) hide show
  1. package/README.md +3 -3
  2. package/agent-manifest.json +14 -2
  3. package/dist/AnalyticsProvider-ERNSZ4DH.mjs +12 -0
  4. package/dist/{AnalyticsProvider-EWF7JN2X.mjs.map → AnalyticsProvider-ERNSZ4DH.mjs.map} +1 -1
  5. package/dist/AnalyticsProvider-HE6V5UJD.js +33 -0
  6. package/dist/{AnalyticsProvider-GJFG7YXA.js.map → AnalyticsProvider-HE6V5UJD.js.map} +1 -1
  7. package/dist/{BlogViewTracker-CKYG6MYU.mjs → BlogViewTracker-2NQ5LBVR.mjs} +13 -10
  8. package/dist/BlogViewTracker-2NQ5LBVR.mjs.map +1 -0
  9. package/dist/{BlogViewTracker-2D3IJPJK.js → BlogViewTracker-4OGWSC2Q.js} +14 -11
  10. package/dist/BlogViewTracker-4OGWSC2Q.js.map +1 -0
  11. package/dist/ChatWidget-67CHHONZ.js +24 -0
  12. package/dist/{ChatWidget-AWP6GBVW.js.map → ChatWidget-67CHHONZ.js.map} +1 -1
  13. package/dist/ChatWidget-T4RICLLT.mjs +15 -0
  14. package/dist/{ChatWidget-Z5QXDZP3.mjs.map → ChatWidget-T4RICLLT.mjs.map} +1 -1
  15. package/dist/EngageWidget-TDW2ZI3Q.js +21 -0
  16. package/dist/{EngageWidget-VT4DYXVO.js.map → EngageWidget-TDW2ZI3Q.js.map} +1 -1
  17. package/dist/EngageWidget-WXEQTV4X.mjs +12 -0
  18. package/dist/{EngageWidget-BKEY5TPO.mjs.map → EngageWidget-WXEQTV4X.mjs.map} +1 -1
  19. package/dist/{FileField-62ZWZMQK.js → FileField-DEVOXJSO.js} +6 -6
  20. package/dist/{FileField-62ZWZMQK.js.map → FileField-DEVOXJSO.js.map} +1 -1
  21. package/dist/{FileField-JJN5QKDL.mjs → FileField-Y5YM365S.mjs} +5 -5
  22. package/dist/{FileField-JJN5QKDL.mjs.map → FileField-Y5YM365S.mjs.map} +1 -1
  23. package/dist/{FormSpotlight-URS4XRS7.js → FormSpotlight-4Q5FM3YS.js} +25 -21
  24. package/dist/FormSpotlight-4Q5FM3YS.js.map +1 -0
  25. package/dist/{FormSpotlight-OTFB6QM5.mjs → FormSpotlight-T3ASGUYB.mjs} +11 -7
  26. package/dist/FormSpotlight-T3ASGUYB.mjs.map +1 -0
  27. package/dist/{FormStage-FVKMIV73.js → FormStage-PSAIPZBS.js} +20 -15
  28. package/dist/FormStage-PSAIPZBS.js.map +1 -0
  29. package/dist/{FormStage-VPGOCMAV.mjs → FormStage-U5V4MI5Q.mjs} +9 -4
  30. package/dist/FormStage-U5V4MI5Q.mjs.map +1 -0
  31. package/dist/ManagedForm-EAZOMNSL.mjs +16 -0
  32. package/dist/{ManagedForm-CXVDJMHN.mjs.map → ManagedForm-EAZOMNSL.mjs.map} +1 -1
  33. package/dist/ManagedForm-R6DJXU34.js +25 -0
  34. package/dist/{ManagedForm-FGNTDGED.js.map → ManagedForm-R6DJXU34.js.map} +1 -1
  35. package/dist/{ManagedNewsletterForm-SQYB4BZU.mjs → ManagedNewsletterForm-5RY3TWPQ.mjs} +9 -7
  36. package/dist/ManagedNewsletterForm-5RY3TWPQ.mjs.map +1 -0
  37. package/dist/{ManagedNewsletterForm-3O5L44AZ.js → ManagedNewsletterForm-VX6GMZXJ.js} +10 -8
  38. package/dist/ManagedNewsletterForm-VX6GMZXJ.js.map +1 -0
  39. package/dist/{SignalCore-RFBOBNLQ.js → SignalCore-MWHF2WG4.js} +14 -20
  40. package/dist/SignalCore-MWHF2WG4.js.map +1 -0
  41. package/dist/{SignalCore-M2PKKIGH.mjs → SignalCore-ZT6EQGV3.mjs} +8 -14
  42. package/dist/SignalCore-ZT6EQGV3.mjs.map +1 -0
  43. package/dist/SitemapSync-OG4TQLDB.mjs +9 -0
  44. package/dist/{SitemapSync-4OVMIIGC.mjs.map → SitemapSync-OG4TQLDB.mjs.map} +1 -1
  45. package/dist/SitemapSync-Z62BGZMV.js +18 -0
  46. package/dist/{SitemapSync-RK3SQ4M2.js.map → SitemapSync-Z62BGZMV.js.map} +1 -1
  47. package/dist/analytics/AnalyticsProvider.d.ts.map +1 -1
  48. package/dist/analytics/index.js +10 -9
  49. package/dist/analytics/index.mjs +5 -4
  50. package/dist/api-D745LGGU.mjs +0 -1
  51. package/dist/api-XR5APCH3.js +0 -1
  52. package/dist/blog/BlogLayout.d.ts +3 -1
  53. package/dist/blog/BlogLayout.d.ts.map +1 -1
  54. package/dist/blog/BlogList.d.ts +7 -1
  55. package/dist/blog/BlogList.d.ts.map +1 -1
  56. package/dist/blog/BlogPost.d.ts +20 -1
  57. package/dist/blog/BlogPost.d.ts.map +1 -1
  58. package/dist/blog/BlogSidebar.d.ts +3 -1
  59. package/dist/blog/BlogSidebar.d.ts.map +1 -1
  60. package/dist/blog/BlogViewTracker.d.ts +8 -2
  61. package/dist/blog/BlogViewTracker.d.ts.map +1 -1
  62. package/dist/blog/ClusterLandingPage.d.ts +3 -1
  63. package/dist/blog/ClusterLandingPage.d.ts.map +1 -1
  64. package/dist/blog/ClusterNavigation.d.ts +5 -2
  65. package/dist/blog/ClusterNavigation.d.ts.map +1 -1
  66. package/dist/blog/RelatedPosts.d.ts +3 -1
  67. package/dist/blog/RelatedPosts.d.ts.map +1 -1
  68. package/dist/blog/index.d.ts +1 -1
  69. package/dist/blog/index.d.ts.map +1 -1
  70. package/dist/blog/index.js +40 -31
  71. package/dist/blog/index.js.map +1 -1
  72. package/dist/blog/index.mjs +11 -6
  73. package/dist/blog/index.mjs.map +1 -1
  74. package/dist/blog/processBlogHtml.d.ts +19 -2
  75. package/dist/blog/processBlogHtml.d.ts.map +1 -1
  76. package/dist/blog/public-reads.d.ts +27 -0
  77. package/dist/blog/public-reads.d.ts.map +1 -0
  78. package/dist/blog/server-core.d.ts +76 -10
  79. package/dist/blog/server-core.d.ts.map +1 -1
  80. package/dist/blog/server-ui.js +29 -23
  81. package/dist/blog/server-ui.js.map +1 -1
  82. package/dist/blog/server-ui.mjs +12 -6
  83. package/dist/blog/server-ui.mjs.map +1 -1
  84. package/dist/blog/server.d.ts +76 -10
  85. package/dist/blog/server.d.ts.map +1 -1
  86. package/dist/blog/server.js +54 -47
  87. package/dist/blog/server.mjs +5 -2
  88. package/dist/brand/extract-brand-profile.d.ts +36 -2
  89. package/dist/brand/extract-brand-profile.d.ts.map +1 -1
  90. package/dist/{chunk-MW2M6O7A.mjs → chunk-26EKSVXM.mjs} +4 -4
  91. package/dist/{chunk-MW2M6O7A.mjs.map → chunk-26EKSVXM.mjs.map} +1 -1
  92. package/dist/{chunk-D553G64G.js → chunk-2HPQTRUB.js} +13 -13
  93. package/dist/{chunk-D553G64G.js.map → chunk-2HPQTRUB.js.map} +1 -1
  94. package/dist/{chunk-BFJOZ3MU.mjs → chunk-3EY5E35M.mjs} +36 -71
  95. package/dist/chunk-3EY5E35M.mjs.map +1 -0
  96. package/dist/{chunk-BUJWXSYZ.mjs → chunk-3TQUARVN.mjs} +4 -4
  97. package/dist/{chunk-BUJWXSYZ.mjs.map → chunk-3TQUARVN.mjs.map} +1 -1
  98. package/dist/{chunk-OYOO2OO5.js → chunk-3VRWKKTD.js} +10 -10
  99. package/dist/{chunk-OYOO2OO5.js.map → chunk-3VRWKKTD.js.map} +1 -1
  100. package/dist/{chunk-BFM5PEFV.js → chunk-43I7U5AI.js} +56 -177
  101. package/dist/chunk-43I7U5AI.js.map +1 -0
  102. package/dist/{chunk-ILNCUSXW.mjs → chunk-4L7OHRWB.mjs} +12 -9
  103. package/dist/chunk-4L7OHRWB.mjs.map +1 -0
  104. package/dist/chunk-4LYW6PMU.mjs +72 -0
  105. package/dist/chunk-4LYW6PMU.mjs.map +1 -0
  106. package/dist/chunk-4TLFZ6NR.mjs +16 -0
  107. package/dist/chunk-4TLFZ6NR.mjs.map +1 -0
  108. package/dist/{chunk-JQ7M6CVL.mjs → chunk-4VSDMNQU.mjs} +3 -3
  109. package/dist/{chunk-JQ7M6CVL.mjs.map → chunk-4VSDMNQU.mjs.map} +1 -1
  110. package/dist/{chunk-4B4S56WJ.mjs → chunk-5B4J3IBX.mjs} +75 -21
  111. package/dist/chunk-5B4J3IBX.mjs.map +1 -0
  112. package/dist/{chunk-M5GY2AI3.mjs → chunk-5K6B4LWV.mjs} +4 -10
  113. package/dist/chunk-5K6B4LWV.mjs.map +1 -0
  114. package/dist/chunk-5SANRSX3.mjs +17 -0
  115. package/dist/chunk-5SANRSX3.mjs.map +1 -0
  116. package/dist/chunk-5XFFUP6D.js +100 -0
  117. package/dist/chunk-5XFFUP6D.js.map +1 -0
  118. package/dist/chunk-5YA6SI4Z.mjs +0 -1
  119. package/dist/{chunk-TDJKGN5Q.mjs → chunk-62Y4W4LR.mjs} +216 -103
  120. package/dist/chunk-62Y4W4LR.mjs.map +1 -0
  121. package/dist/{chunk-3CLP35TT.mjs → chunk-6S3JE66D.mjs} +62 -97
  122. package/dist/chunk-6S3JE66D.mjs.map +1 -0
  123. package/dist/{chunk-4A5V73SR.mjs → chunk-6WEZWYRU.mjs} +9 -9
  124. package/dist/{chunk-4A5V73SR.mjs.map → chunk-6WEZWYRU.mjs.map} +1 -1
  125. package/dist/{chunk-JTF4DFUF.mjs → chunk-7AEVA667.mjs} +4 -4
  126. package/dist/{chunk-JTF4DFUF.mjs.map → chunk-7AEVA667.mjs.map} +1 -1
  127. package/dist/{chunk-H65OX263.js → chunk-7DV7Y7BZ.js} +15 -15
  128. package/dist/{chunk-H65OX263.js.map → chunk-7DV7Y7BZ.js.map} +1 -1
  129. package/dist/{chunk-7ZX6TO6C.mjs → chunk-7H4HB4UZ.mjs} +50 -26
  130. package/dist/chunk-7H4HB4UZ.mjs.map +1 -0
  131. package/dist/{chunk-FO4KGPGF.js → chunk-7TC3GRXQ.js} +73 -38
  132. package/dist/chunk-7TC3GRXQ.js.map +1 -0
  133. package/dist/{chunk-UQ5YULFU.mjs → chunk-AUHUEIBB.mjs} +4 -4
  134. package/dist/{chunk-UQ5YULFU.mjs.map → chunk-AUHUEIBB.mjs.map} +1 -1
  135. package/dist/{chunk-BQGEVMIR.mjs → chunk-AWF73RU2.mjs} +5 -5
  136. package/dist/{chunk-BQGEVMIR.mjs.map → chunk-AWF73RU2.mjs.map} +1 -1
  137. package/dist/{chunk-ELQ4SRRR.js → chunk-BHBW2SZF.js} +15 -15
  138. package/dist/{chunk-ELQ4SRRR.js.map → chunk-BHBW2SZF.js.map} +1 -1
  139. package/dist/{chunk-RNAGCAIB.js → chunk-BIGXEYKT.js} +7 -7
  140. package/dist/{chunk-RNAGCAIB.js.map → chunk-BIGXEYKT.js.map} +1 -1
  141. package/dist/chunk-BQP6JIE2.mjs +28 -0
  142. package/dist/chunk-BQP6JIE2.mjs.map +1 -0
  143. package/dist/{chunk-VFGEY6FJ.js → chunk-BY35X57A.js} +223 -110
  144. package/dist/chunk-BY35X57A.js.map +1 -0
  145. package/dist/{chunk-3YQILJKJ.js → chunk-CGCUHIAR.js} +60 -35
  146. package/dist/chunk-CGCUHIAR.js.map +1 -0
  147. package/dist/chunk-CUNZAD46.js +53 -0
  148. package/dist/chunk-CUNZAD46.js.map +1 -0
  149. package/dist/{chunk-FEWWGEQF.js → chunk-CWUYI6LI.js} +4 -4
  150. package/dist/{chunk-FEWWGEQF.js.map → chunk-CWUYI6LI.js.map} +1 -1
  151. package/dist/chunk-CXAXZFFW.js +157 -0
  152. package/dist/chunk-CXAXZFFW.js.map +1 -0
  153. package/dist/{chunk-H4OBGC43.mjs → chunk-DA7IANFG.mjs} +14 -3
  154. package/dist/chunk-DA7IANFG.mjs.map +1 -0
  155. package/dist/{chunk-57AFHENV.mjs → chunk-EHAUNF4V.mjs} +3 -3
  156. package/dist/{chunk-57AFHENV.mjs.map → chunk-EHAUNF4V.mjs.map} +1 -1
  157. package/dist/{chunk-2N27LCZH.js → chunk-FEKPEI2G.js} +9 -9
  158. package/dist/{chunk-2N27LCZH.js.map → chunk-FEKPEI2G.js.map} +1 -1
  159. package/dist/{chunk-LC7AM4J5.js → chunk-FHPW7XVH.js} +77 -20
  160. package/dist/chunk-FHPW7XVH.js.map +1 -0
  161. package/dist/{chunk-JNRHTZL4.js → chunk-FVW6FT6L.js} +73 -29
  162. package/dist/chunk-FVW6FT6L.js.map +1 -0
  163. package/dist/{chunk-YKUEFRZI.js → chunk-FWW4K6QP.js} +14 -14
  164. package/dist/{chunk-YKUEFRZI.js.map → chunk-FWW4K6QP.js.map} +1 -1
  165. package/dist/{chunk-JNAXDFC4.mjs → chunk-GF4LV5LX.mjs} +38 -156
  166. package/dist/chunk-GF4LV5LX.mjs.map +1 -0
  167. package/dist/{chunk-C563AHZZ.mjs → chunk-GKFTJ5AF.mjs} +3 -3
  168. package/dist/{chunk-C563AHZZ.mjs.map → chunk-GKFTJ5AF.mjs.map} +1 -1
  169. package/dist/{chunk-OZ3FU4BT.js → chunk-H5NBFNND.js} +2 -2
  170. package/dist/chunk-H5NBFNND.js.map +1 -0
  171. package/dist/chunk-HCN3IKMW.mjs +106 -0
  172. package/dist/chunk-HCN3IKMW.mjs.map +1 -0
  173. package/dist/{chunk-6FC5Q4KU.mjs → chunk-HOJ4J4X2.mjs} +30 -12
  174. package/dist/chunk-HOJ4J4X2.mjs.map +1 -0
  175. package/dist/{chunk-H6YVT3BL.js → chunk-I3ND4XYW.js} +12 -9
  176. package/dist/chunk-I3ND4XYW.js.map +1 -0
  177. package/dist/chunk-I7AZC5ZQ.js +0 -1
  178. package/dist/{chunk-V5THCFPG.mjs → chunk-JFJ7NHS3.mjs} +4 -4
  179. package/dist/{chunk-V5THCFPG.mjs.map → chunk-JFJ7NHS3.mjs.map} +1 -1
  180. package/dist/{chunk-KXGD4E7G.js → chunk-JI4EUPHB.js} +7 -7
  181. package/dist/{chunk-KXGD4E7G.js.map → chunk-JI4EUPHB.js.map} +1 -1
  182. package/dist/{chunk-GZJE23Y5.mjs → chunk-JLVCWC6A.mjs} +2 -2
  183. package/dist/chunk-JLVCWC6A.mjs.map +1 -0
  184. package/dist/chunk-JOYMIGR2.mjs +0 -1
  185. package/dist/chunk-JS75ORH7.js +0 -1
  186. package/dist/{chunk-Q7347KP6.mjs → chunk-JX5SM2MX.mjs} +6 -12
  187. package/dist/chunk-JX5SM2MX.mjs.map +1 -0
  188. package/dist/chunk-K4TCEAUX.js +52 -0
  189. package/dist/chunk-K4TCEAUX.js.map +1 -0
  190. package/dist/chunk-KV7XXLJV.mjs +30 -0
  191. package/dist/chunk-KV7XXLJV.mjs.map +1 -0
  192. package/dist/{chunk-JTCQJKJE.js → chunk-LIAISQUE.js} +76 -111
  193. package/dist/chunk-LIAISQUE.js.map +1 -0
  194. package/dist/{chunk-CPY74A4F.js → chunk-LMEUYRRR.js} +72 -106
  195. package/dist/chunk-LMEUYRRR.js.map +1 -0
  196. package/dist/{chunk-4WBTM6YE.js → chunk-LOEP76MQ.js} +4 -4
  197. package/dist/{chunk-4WBTM6YE.js.map → chunk-LOEP76MQ.js.map} +1 -1
  198. package/dist/chunk-LVGSOW2F.js +32 -0
  199. package/dist/chunk-LVGSOW2F.js.map +1 -0
  200. package/dist/{chunk-DOB37PV4.js → chunk-M45AL7EA.js} +37 -19
  201. package/dist/chunk-M45AL7EA.js.map +1 -0
  202. package/dist/{chunk-RCSTDJUH.js → chunk-M4UVFUFR.js} +8 -13
  203. package/dist/chunk-M4UVFUFR.js.map +1 -0
  204. package/dist/{chunk-R2SXXFXZ.mjs → chunk-MI2SRBCR.mjs} +3 -3
  205. package/dist/{chunk-R2SXXFXZ.mjs.map → chunk-MI2SRBCR.mjs.map} +1 -1
  206. package/dist/chunk-MLVHVKFT.mjs +148 -0
  207. package/dist/chunk-MLVHVKFT.mjs.map +1 -0
  208. package/dist/{chunk-L7ACQ6PC.js → chunk-MOAYT3KN.js} +4 -4
  209. package/dist/{chunk-L7ACQ6PC.js.map → chunk-MOAYT3KN.js.map} +1 -1
  210. package/dist/chunk-NG2TTI7D.js +8 -0
  211. package/dist/{chunk-5TXXTYXL.js.map → chunk-NG2TTI7D.js.map} +1 -1
  212. package/dist/{chunk-C4PZ2R3B.js → chunk-NLDN6PYM.js} +10 -10
  213. package/dist/{chunk-C4PZ2R3B.js.map → chunk-NLDN6PYM.js.map} +1 -1
  214. package/dist/chunk-NN2YE5WT.js +0 -1
  215. package/dist/chunk-NNZDWY3L.mjs +0 -1
  216. package/dist/chunk-NRBITVDK.js +114 -0
  217. package/dist/chunk-NRBITVDK.js.map +1 -0
  218. package/dist/{chunk-TSZIACRC.js → chunk-OBKYF4TP.js} +6 -12
  219. package/dist/chunk-OBKYF4TP.js.map +1 -0
  220. package/dist/{chunk-TP7H6BSK.mjs → chunk-OE7CTIOU.mjs} +73 -30
  221. package/dist/chunk-OE7CTIOU.mjs.map +1 -0
  222. package/dist/chunk-OESGRWI4.mjs +6 -0
  223. package/dist/{chunk-QRBPT6Z6.mjs.map → chunk-OESGRWI4.mjs.map} +1 -1
  224. package/dist/{chunk-UJ6CHZAI.mjs → chunk-OEW2LFOV.js} +169 -25
  225. package/dist/chunk-OEW2LFOV.js.map +1 -0
  226. package/dist/chunk-P4Y75QSU.js +19 -0
  227. package/dist/chunk-P4Y75QSU.js.map +1 -0
  228. package/dist/{chunk-47XQWV4S.mjs → chunk-PQVQAX67.mjs} +3 -3
  229. package/dist/{chunk-47XQWV4S.mjs.map → chunk-PQVQAX67.mjs.map} +1 -1
  230. package/dist/chunk-QRHVMTHF.mjs +94 -0
  231. package/dist/chunk-QRHVMTHF.mjs.map +1 -0
  232. package/dist/{chunk-FBDHKYNF.mjs → chunk-R4B3DFF4.mjs} +3 -3
  233. package/dist/{chunk-FBDHKYNF.mjs.map → chunk-R4B3DFF4.mjs.map} +1 -1
  234. package/dist/chunk-R7GHP3FY.js +81 -0
  235. package/dist/chunk-R7GHP3FY.js.map +1 -0
  236. package/dist/{chunk-4UVM7E2W.js → chunk-S5VL7AWW.js} +3 -3
  237. package/dist/{chunk-4UVM7E2W.js.map → chunk-S5VL7AWW.js.map} +1 -1
  238. package/dist/{chunk-P4TB4ROG.js → chunk-SEP5D4MI.js} +8 -2
  239. package/dist/chunk-SEP5D4MI.js.map +1 -0
  240. package/dist/{chunk-L4V6TKMJ.mjs → chunk-U2V542EO.mjs} +7 -3
  241. package/dist/chunk-U2V542EO.mjs.map +1 -0
  242. package/dist/{chunk-HBN4A2N4.mjs → chunk-U6H5ZY3B.mjs} +3 -3
  243. package/dist/{chunk-HBN4A2N4.mjs.map → chunk-U6H5ZY3B.mjs.map} +1 -1
  244. package/dist/{chunk-H7274TKR.mjs → chunk-VJV7WUR2.mjs} +12 -4
  245. package/dist/chunk-VJV7WUR2.mjs.map +1 -0
  246. package/dist/{chunk-F3AKYZOH.js → chunk-WED6ZDVS.js} +6 -13
  247. package/dist/chunk-WED6ZDVS.js.map +1 -0
  248. package/dist/{chunk-5B4FABFK.js → chunk-WS7MH3GD.js} +14 -2
  249. package/dist/chunk-WS7MH3GD.js.map +1 -0
  250. package/dist/{chunk-XLPU3TEE.mjs → chunk-X22BGNVL.mjs} +4 -4
  251. package/dist/{chunk-XLPU3TEE.mjs.map → chunk-X22BGNVL.mjs.map} +1 -1
  252. package/dist/{chunk-IPV2TUAT.js → chunk-XA2GJFVM.js} +12 -4
  253. package/dist/chunk-XA2GJFVM.js.map +1 -0
  254. package/dist/chunk-XBX2K3GA.js +33 -0
  255. package/dist/chunk-XBX2K3GA.js.map +1 -0
  256. package/dist/{chunk-ABZGEHTC.mjs → chunk-XSAHJ2BB.mjs} +3 -3
  257. package/dist/{chunk-ABZGEHTC.mjs.map → chunk-XSAHJ2BB.mjs.map} +1 -1
  258. package/dist/{chunk-6CJP7BFM.js → chunk-XZO5I4RS.mjs} +147 -20
  259. package/dist/chunk-XZO5I4RS.mjs.map +1 -0
  260. package/dist/chunk-Y5QZPUL3.mjs +47 -0
  261. package/dist/chunk-Y5QZPUL3.mjs.map +1 -0
  262. package/dist/{chunk-NOU3JQJK.js → chunk-Y6Z2W45H.js} +8 -8
  263. package/dist/{chunk-NOU3JQJK.js.map → chunk-Y6Z2W45H.js.map} +1 -1
  264. package/dist/{chunk-YYDZ2TYR.js → chunk-YCFYQN2Q.js} +3 -3
  265. package/dist/{chunk-YYDZ2TYR.js.map → chunk-YCFYQN2Q.js.map} +1 -1
  266. package/dist/chunk-YN7QHLWF.js +19 -0
  267. package/dist/chunk-YN7QHLWF.js.map +1 -0
  268. package/dist/{chunk-O2VJZOR2.mjs → chunk-YRNDASQY.mjs} +6 -11
  269. package/dist/chunk-YRNDASQY.mjs.map +1 -0
  270. package/dist/chunk-YU7QZ3PP.mjs +45 -0
  271. package/dist/chunk-YU7QZ3PP.mjs.map +1 -0
  272. package/dist/{chunk-3S5JN6KL.js → chunk-ZV6HIQRQ.js} +6 -6
  273. package/dist/{chunk-3S5JN6KL.js.map → chunk-ZV6HIQRQ.js.map} +1 -1
  274. package/dist/{chunk-RVRN5U7W.mjs → chunk-ZVI7MBVF.mjs} +73 -38
  275. package/dist/chunk-ZVI7MBVF.mjs.map +1 -0
  276. package/dist/cli/agent/checks.d.ts +15 -1
  277. package/dist/cli/agent/checks.d.ts.map +1 -1
  278. package/dist/cli/commands/doctor.d.ts.map +1 -1
  279. package/dist/cli/commands/og.d.ts +26 -8
  280. package/dist/cli/commands/og.d.ts.map +1 -1
  281. package/dist/cli/index.js +683 -323
  282. package/dist/cli/index.mjs +604 -244
  283. package/dist/client/index.js +6 -6
  284. package/dist/client/index.mjs +5 -5
  285. package/dist/commerce/CheckoutForm.d.ts.map +1 -1
  286. package/dist/commerce/ProductDetail.d.ts.map +1 -1
  287. package/dist/commerce/api.d.ts +14 -0
  288. package/dist/commerce/api.d.ts.map +1 -1
  289. package/dist/commerce/index.d.ts +1 -1
  290. package/dist/commerce/index.d.ts.map +1 -1
  291. package/dist/commerce/index.js +61 -56
  292. package/dist/commerce/index.mjs +6 -5
  293. package/dist/config/index.js +3 -3
  294. package/dist/config/index.mjs +1 -1
  295. package/dist/discover-CYXYKHZ2.mjs +4 -0
  296. package/dist/{discover-FGTKWOL3.mjs.map → discover-CYXYKHZ2.mjs.map} +1 -1
  297. package/dist/discover-NGEPXZOD.js +21 -0
  298. package/dist/{discover-NJZPWTDL.js.map → discover-NGEPXZOD.js.map} +1 -1
  299. package/dist/engage/index.js +12 -10
  300. package/dist/engage/index.js.map +1 -1
  301. package/dist/engage/index.mjs +9 -7
  302. package/dist/engage/index.mjs.map +1 -1
  303. package/dist/fleet/index.js +8 -8
  304. package/dist/fleet/index.mjs +4 -4
  305. package/dist/forms/FormClient.d.ts.map +1 -1
  306. package/dist/forms/FormField.d.ts +7 -1
  307. package/dist/forms/FormField.d.ts.map +1 -1
  308. package/dist/forms/FormSpotlight.d.ts +1 -1
  309. package/dist/forms/FormSpotlight.d.ts.map +1 -1
  310. package/dist/forms/FormStage.d.ts +1 -1
  311. package/dist/forms/FormStage.d.ts.map +1 -1
  312. package/dist/forms/experience-plan.d.ts +0 -1
  313. package/dist/forms/experience-plan.d.ts.map +1 -1
  314. package/dist/forms/field-interactions.d.ts +63 -0
  315. package/dist/forms/field-interactions.d.ts.map +1 -0
  316. package/dist/forms/field-rules.d.ts +41 -0
  317. package/dist/forms/field-rules.d.ts.map +1 -0
  318. package/dist/forms/index.js +25 -23
  319. package/dist/forms/index.js.map +1 -1
  320. package/dist/forms/index.mjs +13 -11
  321. package/dist/forms/index.mjs.map +1 -1
  322. package/dist/forms/server.js +11 -11
  323. package/dist/forms/server.mjs +9 -9
  324. package/dist/forms/static.js +8 -8
  325. package/dist/forms/static.mjs +7 -7
  326. package/dist/forms/tracking-session.d.ts +48 -3
  327. package/dist/forms/tracking-session.d.ts.map +1 -1
  328. package/dist/forms/types.d.ts +11 -0
  329. package/dist/forms/types.d.ts.map +1 -1
  330. package/dist/forms/useForm.d.ts +8 -0
  331. package/dist/forms/useForm.d.ts.map +1 -1
  332. package/dist/forms/useFormTracking.d.ts +29 -4
  333. package/dist/forms/useFormTracking.d.ts.map +1 -1
  334. package/dist/images/index.js +11 -11
  335. package/dist/images/index.mjs +4 -4
  336. package/dist/index.js +72 -68
  337. package/dist/index.js.map +1 -1
  338. package/dist/index.mjs +14 -10
  339. package/dist/index.mjs.map +1 -1
  340. package/dist/layout/client.js +10 -10
  341. package/dist/layout/client.mjs +9 -9
  342. package/dist/layout/index.js +13 -12
  343. package/dist/layout/index.js.map +1 -1
  344. package/dist/layout/index.mjs +11 -10
  345. package/dist/layout/index.mjs.map +1 -1
  346. package/dist/lib-6HOOMENJ.js +0 -1
  347. package/dist/lib-BGAWCSUH.js +0 -1
  348. package/dist/lib-R7IQ4ZHE.mjs +0 -1
  349. package/dist/lib-RSDMEKDQ.mjs +0 -1
  350. package/dist/llms/aiRobots.d.ts +20 -4
  351. package/dist/llms/aiRobots.d.ts.map +1 -1
  352. package/dist/llms/api.d.ts +8 -3
  353. package/dist/llms/api.d.ts.map +1 -1
  354. package/dist/llms/discovery-headers.d.ts +24 -0
  355. package/dist/llms/discovery-headers.d.ts.map +1 -1
  356. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  357. package/dist/llms/index.d.ts +2 -2
  358. package/dist/llms/index.d.ts.map +1 -1
  359. package/dist/llms/index.js +45 -96
  360. package/dist/llms/index.js.map +1 -1
  361. package/dist/llms/index.mjs +11 -81
  362. package/dist/llms/index.mjs.map +1 -1
  363. package/dist/llms/links.d.ts +26 -0
  364. package/dist/llms/links.d.ts.map +1 -0
  365. package/dist/llms/types.d.ts +15 -0
  366. package/dist/llms/types.d.ts.map +1 -1
  367. package/dist/llms/wiring.d.ts +22 -0
  368. package/dist/llms/wiring.d.ts.map +1 -1
  369. package/dist/llms/writeLLMsTxt.d.ts +9 -0
  370. package/dist/llms/writeLLMsTxt.d.ts.map +1 -1
  371. package/dist/maps/index.js +5 -5
  372. package/dist/maps/index.mjs +3 -3
  373. package/dist/motion/gsap.d.ts +54 -0
  374. package/dist/motion/gsap.d.ts.map +1 -1
  375. package/dist/motion/gsap.js +34 -4
  376. package/dist/motion/gsap.js.map +1 -1
  377. package/dist/motion/gsap.mjs +33 -5
  378. package/dist/motion/gsap.mjs.map +1 -1
  379. package/dist/og/config.d.ts +6 -0
  380. package/dist/og/config.d.ts.map +1 -1
  381. package/dist/og/contrast.d.ts +33 -0
  382. package/dist/og/contrast.d.ts.map +1 -0
  383. package/dist/og/index.d.ts +2 -0
  384. package/dist/og/index.d.ts.map +1 -1
  385. package/dist/og/index.js +26 -8
  386. package/dist/og/index.mjs +3 -1
  387. package/dist/og/pages.d.ts +101 -0
  388. package/dist/og/pages.d.ts.map +1 -1
  389. package/dist/og/route-copy.d.ts +34 -0
  390. package/dist/og/route-copy.d.ts.map +1 -0
  391. package/dist/og/route-fit.d.ts +77 -0
  392. package/dist/og/route-fit.d.ts.map +1 -0
  393. package/dist/og/route.d.ts +80 -20
  394. package/dist/og/route.d.ts.map +1 -1
  395. package/dist/og/route.js +195 -25
  396. package/dist/og/route.js.map +1 -1
  397. package/dist/og/route.mjs +193 -26
  398. package/dist/og/route.mjs.map +1 -1
  399. package/dist/og/template.d.ts.map +1 -1
  400. package/dist/og/wiring.d.ts +43 -3
  401. package/dist/og/wiring.d.ts.map +1 -1
  402. package/dist/proxy/index.d.ts.map +1 -1
  403. package/dist/proxy/index.js +15 -10
  404. package/dist/proxy/index.js.map +1 -1
  405. package/dist/proxy/index.mjs +12 -7
  406. package/dist/proxy/index.mjs.map +1 -1
  407. package/dist/redirects/index.d.ts +24 -0
  408. package/dist/redirects/index.d.ts.map +1 -1
  409. package/dist/redirects/index.js +11 -8
  410. package/dist/redirects/index.mjs +4 -1
  411. package/dist/redirects/not-found.js +8 -5
  412. package/dist/redirects/not-found.js.map +1 -1
  413. package/dist/redirects/not-found.mjs +4 -1
  414. package/dist/redirects/not-found.mjs.map +1 -1
  415. package/dist/robots/index.d.ts +2 -0
  416. package/dist/robots/index.d.ts.map +1 -1
  417. package/dist/robots/index.js +23 -3
  418. package/dist/robots/index.js.map +1 -1
  419. package/dist/robots/index.mjs +2 -2
  420. package/dist/robots/index.mjs.map +1 -1
  421. package/dist/search/index.js +4 -4
  422. package/dist/search/index.mjs +3 -3
  423. package/dist/seo/ManagedContent.d.ts +4 -2
  424. package/dist/seo/ManagedContent.d.ts.map +1 -1
  425. package/dist/seo/ManagedFAQ.d.ts.map +1 -1
  426. package/dist/seo/ManagedInternalLinks.d.ts.map +1 -1
  427. package/dist/seo/ManagedSchema.d.ts.map +1 -1
  428. package/dist/seo/client.js +6 -6
  429. package/dist/seo/client.mjs +5 -5
  430. package/dist/seo/getManagedMetadata.d.ts.map +1 -1
  431. package/dist/seo/index.js +59 -49
  432. package/dist/seo/index.js.map +1 -1
  433. package/dist/seo/index.mjs +29 -19
  434. package/dist/seo/index.mjs.map +1 -1
  435. package/dist/seo/register-sitemap-cli-impl.d.ts +32 -0
  436. package/dist/seo/register-sitemap-cli-impl.d.ts.map +1 -1
  437. package/dist/seo/register-sitemap-cli.d.ts +7 -0
  438. package/dist/seo/register-sitemap-cli.d.ts.map +1 -1
  439. package/dist/seo/register-sitemap-cli.js +273 -57
  440. package/dist/seo/register-sitemap-cli.mjs +269 -53
  441. package/dist/seo/register-sitemap-request.d.ts +36 -0
  442. package/dist/seo/register-sitemap-request.d.ts.map +1 -0
  443. package/dist/seo/routing.d.ts +2 -0
  444. package/dist/seo/routing.d.ts.map +1 -1
  445. package/dist/seo/schema-filter.d.ts +43 -0
  446. package/dist/seo/schema-filter.d.ts.map +1 -0
  447. package/dist/seo/server-api.d.ts +15 -2
  448. package/dist/seo/server-api.d.ts.map +1 -1
  449. package/dist/seo/server.js +23 -18
  450. package/dist/seo/server.mjs +7 -2
  451. package/dist/seo/types.d.ts +30 -0
  452. package/dist/seo/types.d.ts.map +1 -1
  453. package/dist/seo-meta/contract.d.ts +60 -0
  454. package/dist/seo-meta/contract.d.ts.map +1 -0
  455. package/dist/seo-meta/contract.js +41 -0
  456. package/dist/seo-meta/contract.js.map +1 -0
  457. package/dist/seo-meta/contract.mjs +4 -0
  458. package/dist/seo-meta/contract.mjs.map +1 -0
  459. package/dist/server/index.js +4 -3
  460. package/dist/server/index.mjs +3 -2
  461. package/dist/server/mint-site-token.d.ts +2 -32
  462. package/dist/server/mint-site-token.d.ts.map +1 -1
  463. package/dist/{server-api-RG3ZL3DV.mjs → server-api-A2EFCTZX.mjs} +7 -3
  464. package/dist/{server-api-RG3ZL3DV.mjs.map → server-api-A2EFCTZX.mjs.map} +1 -1
  465. package/dist/{server-api-RYJQAUGO.js → server-api-IWTZ7C3O.js} +25 -21
  466. package/dist/{server-api-RYJQAUGO.js.map → server-api-IWTZ7C3O.js.map} +1 -1
  467. package/dist/shared/build-entries.d.ts +2 -0
  468. package/dist/shared/build-entries.d.ts.map +1 -1
  469. package/dist/shared/fresh-fetch.d.ts +64 -0
  470. package/dist/shared/fresh-fetch.d.ts.map +1 -0
  471. package/dist/shared/next-files.d.ts +7 -0
  472. package/dist/shared/next-files.d.ts.map +1 -1
  473. package/dist/shared/page-leave.d.ts +27 -0
  474. package/dist/shared/page-leave.d.ts.map +1 -0
  475. package/dist/shared/source-graph.d.ts +63 -0
  476. package/dist/shared/source-graph.d.ts.map +1 -0
  477. package/dist/shared/version.d.ts +1 -1
  478. package/dist/signal/SignalCore.d.ts.map +1 -1
  479. package/dist/signal/index.js +11 -11
  480. package/dist/signal/index.mjs +2 -2
  481. package/dist/sitemap/index.d.ts +19 -4
  482. package/dist/sitemap/index.d.ts.map +1 -1
  483. package/dist/sitemap/index.js +53 -43
  484. package/dist/sitemap/index.js.map +1 -1
  485. package/dist/sitemap/index.mjs +37 -27
  486. package/dist/sitemap/index.mjs.map +1 -1
  487. package/dist/sitemap/shared.d.ts +65 -0
  488. package/dist/sitemap/shared.d.ts.map +1 -1
  489. package/dist/sites/resolve.d.ts.map +1 -1
  490. package/dist/sites/site-param.d.ts +16 -0
  491. package/dist/sites/site-param.d.ts.map +1 -0
  492. package/dist/sync/index.js +17 -17
  493. package/dist/sync/index.mjs +4 -4
  494. package/dist/writeLLMsTxt-CQ7A4AAL.js +19 -0
  495. package/dist/writeLLMsTxt-NX5MSPYX.mjs +10 -0
  496. package/package.json +9 -4
  497. package/dist/AnalyticsProvider-EWF7JN2X.mjs +0 -11
  498. package/dist/AnalyticsProvider-GJFG7YXA.js +0 -32
  499. package/dist/BlogViewTracker-2D3IJPJK.js.map +0 -1
  500. package/dist/BlogViewTracker-CKYG6MYU.mjs.map +0 -1
  501. package/dist/ChatWidget-AWP6GBVW.js +0 -22
  502. package/dist/ChatWidget-Z5QXDZP3.mjs +0 -13
  503. package/dist/EngageWidget-BKEY5TPO.mjs +0 -12
  504. package/dist/EngageWidget-VT4DYXVO.js +0 -21
  505. package/dist/FormSpotlight-OTFB6QM5.mjs.map +0 -1
  506. package/dist/FormSpotlight-URS4XRS7.js.map +0 -1
  507. package/dist/FormStage-FVKMIV73.js.map +0 -1
  508. package/dist/FormStage-VPGOCMAV.mjs.map +0 -1
  509. package/dist/ManagedForm-CXVDJMHN.mjs +0 -14
  510. package/dist/ManagedForm-FGNTDGED.js +0 -23
  511. package/dist/ManagedNewsletterForm-3O5L44AZ.js.map +0 -1
  512. package/dist/ManagedNewsletterForm-SQYB4BZU.mjs.map +0 -1
  513. package/dist/SignalCore-M2PKKIGH.mjs.map +0 -1
  514. package/dist/SignalCore-RFBOBNLQ.js.map +0 -1
  515. package/dist/SitemapSync-4OVMIIGC.mjs +0 -9
  516. package/dist/SitemapSync-RK3SQ4M2.js +0 -18
  517. package/dist/analytics/send-gate.test.d.ts +0 -20
  518. package/dist/analytics/send-gate.test.d.ts.map +0 -1
  519. package/dist/api-D745LGGU.mjs.map +0 -1
  520. package/dist/api-XR5APCH3.js.map +0 -1
  521. package/dist/blog/artwork-components.test.d.ts +0 -2
  522. package/dist/blog/artwork-components.test.d.ts.map +0 -1
  523. package/dist/blog/artwork.test.d.ts +0 -2
  524. package/dist/blog/artwork.test.d.ts.map +0 -1
  525. package/dist/blog/author-social.test.d.ts +0 -2
  526. package/dist/blog/author-social.test.d.ts.map +0 -1
  527. package/dist/blog/blog-tables.test.d.ts +0 -2
  528. package/dist/blog/blog-tables.test.d.ts.map +0 -1
  529. package/dist/blog/blog-view-tracker.test.d.ts +0 -2
  530. package/dist/blog/blog-view-tracker.test.d.ts.map +0 -1
  531. package/dist/blog/category-metadata.test.d.ts +0 -2
  532. package/dist/blog/category-metadata.test.d.ts.map +0 -1
  533. package/dist/blog/metadata-images.test.d.ts +0 -2
  534. package/dist/blog/metadata-images.test.d.ts.map +0 -1
  535. package/dist/blog/newsletter-widget.test.d.ts +0 -2
  536. package/dist/blog/newsletter-widget.test.d.ts.map +0 -1
  537. package/dist/blog/publication-render.test.d.ts +0 -2
  538. package/dist/blog/publication-render.test.d.ts.map +0 -1
  539. package/dist/blog/publication-routes.test.d.ts +0 -2
  540. package/dist/blog/publication-routes.test.d.ts.map +0 -1
  541. package/dist/blog/reading-time.test.d.ts +0 -2
  542. package/dist/blog/reading-time.test.d.ts.map +0 -1
  543. package/dist/blog/sanitize-excerpt.test.d.ts +0 -2
  544. package/dist/blog/sanitize-excerpt.test.d.ts.map +0 -1
  545. package/dist/blog/server-core-contract.test.d.ts +0 -2
  546. package/dist/blog/server-core-contract.test.d.ts.map +0 -1
  547. package/dist/blog/static-params.test.d.ts +0 -2
  548. package/dist/blog/static-params.test.d.ts.map +0 -1
  549. package/dist/blog/tag-links.test.d.ts +0 -2
  550. package/dist/blog/tag-links.test.d.ts.map +0 -1
  551. package/dist/blog/types-wire-shape.test.d.ts +0 -2
  552. package/dist/blog/types-wire-shape.test.d.ts.map +0 -1
  553. package/dist/brand/status-contrast.test.d.ts +0 -2
  554. package/dist/brand/status-contrast.test.d.ts.map +0 -1
  555. package/dist/chunk-3CLP35TT.mjs.map +0 -1
  556. package/dist/chunk-3UC6JETG.js +0 -32
  557. package/dist/chunk-3UC6JETG.js.map +0 -1
  558. package/dist/chunk-3YQILJKJ.js.map +0 -1
  559. package/dist/chunk-4B4S56WJ.mjs.map +0 -1
  560. package/dist/chunk-5B4FABFK.js.map +0 -1
  561. package/dist/chunk-5TXXTYXL.js +0 -8
  562. package/dist/chunk-5YA6SI4Z.mjs.map +0 -1
  563. package/dist/chunk-6CJP7BFM.js.map +0 -1
  564. package/dist/chunk-6FC5Q4KU.mjs.map +0 -1
  565. package/dist/chunk-7ZX6TO6C.mjs.map +0 -1
  566. package/dist/chunk-AWK57R5S.mjs +0 -29
  567. package/dist/chunk-AWK57R5S.mjs.map +0 -1
  568. package/dist/chunk-BFJOZ3MU.mjs.map +0 -1
  569. package/dist/chunk-BFM5PEFV.js.map +0 -1
  570. package/dist/chunk-CPY74A4F.js.map +0 -1
  571. package/dist/chunk-DOB37PV4.js.map +0 -1
  572. package/dist/chunk-F3AKYZOH.js.map +0 -1
  573. package/dist/chunk-FO4KGPGF.js.map +0 -1
  574. package/dist/chunk-GZJE23Y5.mjs.map +0 -1
  575. package/dist/chunk-H4OBGC43.mjs.map +0 -1
  576. package/dist/chunk-H6YVT3BL.js.map +0 -1
  577. package/dist/chunk-H7274TKR.mjs.map +0 -1
  578. package/dist/chunk-I7AZC5ZQ.js.map +0 -1
  579. package/dist/chunk-ILNCUSXW.mjs.map +0 -1
  580. package/dist/chunk-IPV2TUAT.js.map +0 -1
  581. package/dist/chunk-JEOKDUPQ.js +0 -45
  582. package/dist/chunk-JEOKDUPQ.js.map +0 -1
  583. package/dist/chunk-JNAXDFC4.mjs.map +0 -1
  584. package/dist/chunk-JNRHTZL4.js.map +0 -1
  585. package/dist/chunk-JOYMIGR2.mjs.map +0 -1
  586. package/dist/chunk-JS75ORH7.js.map +0 -1
  587. package/dist/chunk-JTCQJKJE.js.map +0 -1
  588. package/dist/chunk-L4V6TKMJ.mjs.map +0 -1
  589. package/dist/chunk-LC7AM4J5.js.map +0 -1
  590. package/dist/chunk-M5GY2AI3.mjs.map +0 -1
  591. package/dist/chunk-NN2YE5WT.js.map +0 -1
  592. package/dist/chunk-NNZDWY3L.mjs.map +0 -1
  593. package/dist/chunk-O2VJZOR2.mjs.map +0 -1
  594. package/dist/chunk-OZ3FU4BT.js.map +0 -1
  595. package/dist/chunk-P4TB4ROG.js.map +0 -1
  596. package/dist/chunk-Q7347KP6.mjs.map +0 -1
  597. package/dist/chunk-QJU6HBSK.mjs +0 -39
  598. package/dist/chunk-QJU6HBSK.mjs.map +0 -1
  599. package/dist/chunk-QRBPT6Z6.mjs +0 -6
  600. package/dist/chunk-RCSTDJUH.js.map +0 -1
  601. package/dist/chunk-RVRN5U7W.mjs.map +0 -1
  602. package/dist/chunk-TDJKGN5Q.mjs.map +0 -1
  603. package/dist/chunk-TP7H6BSK.mjs.map +0 -1
  604. package/dist/chunk-TSZIACRC.js.map +0 -1
  605. package/dist/chunk-UJ6CHZAI.mjs.map +0 -1
  606. package/dist/chunk-VFGEY6FJ.js.map +0 -1
  607. package/dist/cli/agent/envelope.test.d.ts +0 -2
  608. package/dist/cli/agent/envelope.test.d.ts.map +0 -1
  609. package/dist/cli/agent/ssr-bailout.test.d.ts +0 -2
  610. package/dist/cli/agent/ssr-bailout.test.d.ts.map +0 -1
  611. package/dist/cli/codemod/diff.test.d.ts +0 -2
  612. package/dist/cli/codemod/diff.test.d.ts.map +0 -1
  613. package/dist/cli/codemod/transforms.test.d.ts +0 -2
  614. package/dist/cli/codemod/transforms.test.d.ts.map +0 -1
  615. package/dist/cli/commands/config-regression.test.d.ts +0 -2
  616. package/dist/cli/commands/config-regression.test.d.ts.map +0 -1
  617. package/dist/cli/commands/geo.test.d.ts +0 -2
  618. package/dist/cli/commands/geo.test.d.ts.map +0 -1
  619. package/dist/cli/commands/og.test.d.ts +0 -2
  620. package/dist/cli/commands/og.test.d.ts.map +0 -1
  621. package/dist/cli/config.test.d.ts +0 -2
  622. package/dist/cli/config.test.d.ts.map +0 -1
  623. package/dist/cli/generators/index.test.d.ts +0 -2
  624. package/dist/cli/generators/index.test.d.ts.map +0 -1
  625. package/dist/cli/index.js.map +0 -1
  626. package/dist/cli/index.mjs.map +0 -1
  627. package/dist/cli/state.test.d.ts +0 -2
  628. package/dist/cli/state.test.d.ts.map +0 -1
  629. package/dist/commerce/events-extras.test.d.ts +0 -2
  630. package/dist/commerce/events-extras.test.d.ts.map +0 -1
  631. package/dist/commerce/server-result.test.d.ts +0 -2
  632. package/dist/commerce/server-result.test.d.ts.map +0 -1
  633. package/dist/discover-FGTKWOL3.mjs +0 -4
  634. package/dist/discover-NJZPWTDL.js +0 -21
  635. package/dist/engage/chat-launcher.test.d.ts +0 -2
  636. package/dist/engage/chat-launcher.test.d.ts.map +0 -1
  637. package/dist/engage/dependency-contract.test.d.ts +0 -2
  638. package/dist/engage/dependency-contract.test.d.ts.map +0 -1
  639. package/dist/engage/launcher-placement.test.d.ts +0 -2
  640. package/dist/engage/launcher-placement.test.d.ts.map +0 -1
  641. package/dist/fleet/contract.test.d.ts +0 -2
  642. package/dist/fleet/contract.test.d.ts.map +0 -1
  643. package/dist/fleet/heartbeat.test.d.ts +0 -2
  644. package/dist/fleet/heartbeat.test.d.ts.map +0 -1
  645. package/dist/forms/contract.test.d.ts +0 -2
  646. package/dist/forms/contract.test.d.ts.map +0 -1
  647. package/dist/forms/ga4-identity.test.d.ts +0 -2
  648. package/dist/forms/ga4-identity.test.d.ts.map +0 -1
  649. package/dist/forms/native-fallback.test.d.ts +0 -2
  650. package/dist/forms/native-fallback.test.d.ts.map +0 -1
  651. package/dist/forms/stage.test.d.ts +0 -2
  652. package/dist/forms/stage.test.d.ts.map +0 -1
  653. package/dist/forms/static-form.test.d.ts +0 -2
  654. package/dist/forms/static-form.test.d.ts.map +0 -1
  655. package/dist/forms/tracking-session.test.d.ts +0 -22
  656. package/dist/forms/tracking-session.test.d.ts.map +0 -1
  657. package/dist/landing/contract.test.d.ts +0 -2
  658. package/dist/landing/contract.test.d.ts.map +0 -1
  659. package/dist/landing/server-entry.test.d.ts +0 -2
  660. package/dist/landing/server-entry.test.d.ts.map +0 -1
  661. package/dist/lib-6HOOMENJ.js.map +0 -1
  662. package/dist/lib-BGAWCSUH.js.map +0 -1
  663. package/dist/lib-R7IQ4ZHE.mjs.map +0 -1
  664. package/dist/lib-RSDMEKDQ.mjs.map +0 -1
  665. package/dist/llms/aiRobots.test.d.ts +0 -2
  666. package/dist/llms/aiRobots.test.d.ts.map +0 -1
  667. package/dist/llms/contract.test.d.ts +0 -2
  668. package/dist/llms/contract.test.d.ts.map +0 -1
  669. package/dist/llms/discovery-headers.test.d.ts +0 -2
  670. package/dist/llms/discovery-headers.test.d.ts.map +0 -1
  671. package/dist/llms/generateLLMsTxt.test.d.ts +0 -2
  672. package/dist/llms/generateLLMsTxt.test.d.ts.map +0 -1
  673. package/dist/llms/handlers.test.d.ts +0 -2
  674. package/dist/llms/handlers.test.d.ts.map +0 -1
  675. package/dist/llms/humanize-industry.test.d.ts +0 -2
  676. package/dist/llms/humanize-industry.test.d.ts.map +0 -1
  677. package/dist/llms/sourcedFacts.test.d.ts +0 -2
  678. package/dist/llms/sourcedFacts.test.d.ts.map +0 -1
  679. package/dist/llms/wiring.test.d.ts +0 -2
  680. package/dist/llms/wiring.test.d.ts.map +0 -1
  681. package/dist/llms/writeLLMsTxt.test.d.ts +0 -2
  682. package/dist/llms/writeLLMsTxt.test.d.ts.map +0 -1
  683. package/dist/mcp/protocol.test.d.ts +0 -2
  684. package/dist/mcp/protocol.test.d.ts.map +0 -1
  685. package/dist/motion/motion.test.d.ts +0 -16
  686. package/dist/motion/motion.test.d.ts.map +0 -1
  687. package/dist/og/pages.test.d.ts +0 -2
  688. package/dist/og/pages.test.d.ts.map +0 -1
  689. package/dist/og/template.test.d.ts +0 -2
  690. package/dist/og/template.test.d.ts.map +0 -1
  691. package/dist/og/wiring.test.d.ts +0 -2
  692. package/dist/og/wiring.test.d.ts.map +0 -1
  693. package/dist/portfolio/contract.test.d.ts +0 -2
  694. package/dist/portfolio/contract.test.d.ts.map +0 -1
  695. package/dist/proxy/securityHeaders.test.d.ts +0 -2
  696. package/dist/proxy/securityHeaders.test.d.ts.map +0 -1
  697. package/dist/proxy/segment.test.d.ts +0 -2
  698. package/dist/proxy/segment.test.d.ts.map +0 -1
  699. package/dist/robots/index.test.d.ts +0 -2
  700. package/dist/robots/index.test.d.ts.map +0 -1
  701. package/dist/seo/register-sitemap-cli-impl.test.d.ts +0 -2
  702. package/dist/seo/register-sitemap-cli-impl.test.d.ts.map +0 -1
  703. package/dist/seo/register-sitemap-cli.js.map +0 -1
  704. package/dist/seo/register-sitemap-cli.mjs.map +0 -1
  705. package/dist/seo-pages/contract.test.d.ts +0 -2
  706. package/dist/seo-pages/contract.test.d.ts.map +0 -1
  707. package/dist/server/mint-site-token.test.d.ts +0 -2
  708. package/dist/server/mint-site-token.test.d.ts.map +0 -1
  709. package/dist/server/server-fetch.test.d.ts +0 -2
  710. package/dist/server/server-fetch.test.d.ts.map +0 -1
  711. package/dist/shared/client-entry-boundary.test.d.ts +0 -2
  712. package/dist/shared/client-entry-boundary.test.d.ts.map +0 -1
  713. package/dist/shared/next-files.test.d.ts +0 -2
  714. package/dist/shared/next-files.test.d.ts.map +0 -1
  715. package/dist/shared/no-cjs-require.test.d.ts +0 -2
  716. package/dist/shared/no-cjs-require.test.d.ts.map +0 -1
  717. package/dist/shared/publishCredential.test.d.ts +0 -2
  718. package/dist/shared/publishCredential.test.d.ts.map +0 -1
  719. package/dist/shared/raw-browser-api-guard.test.d.ts +0 -15
  720. package/dist/shared/raw-browser-api-guard.test.d.ts.map +0 -1
  721. package/dist/shared/siteToken.test.d.ts +0 -2
  722. package/dist/shared/siteToken.test.d.ts.map +0 -1
  723. package/dist/shared/sonorFetch.test.d.ts +0 -2
  724. package/dist/shared/sonorFetch.test.d.ts.map +0 -1
  725. package/dist/shared/uuid.test.d.ts +0 -2
  726. package/dist/shared/uuid.test.d.ts.map +0 -1
  727. package/dist/shared/version.test.d.ts +0 -2
  728. package/dist/shared/version.test.d.ts.map +0 -1
  729. package/dist/shared/visual-viewport-gap.test.d.ts +0 -2
  730. package/dist/shared/visual-viewport-gap.test.d.ts.map +0 -1
  731. package/dist/sitemap/discover.test.d.ts +0 -2
  732. package/dist/sitemap/discover.test.d.ts.map +0 -1
  733. package/dist/sitemap/shared.test.d.ts +0 -2
  734. package/dist/sitemap/shared.test.d.ts.map +0 -1
  735. package/dist/sitemap/site-scope.test.d.ts +0 -2
  736. package/dist/sitemap/site-scope.test.d.ts.map +0 -1
  737. package/dist/sites/contract.test.d.ts +0 -2
  738. package/dist/sites/contract.test.d.ts.map +0 -1
  739. package/dist/slots/ManagedSlot.test.d.ts +0 -2
  740. package/dist/slots/ManagedSlot.test.d.ts.map +0 -1
  741. package/dist/slots/contract.test.d.ts +0 -2
  742. package/dist/slots/contract.test.d.ts.map +0 -1
  743. package/dist/slots/revalidate.test.d.ts +0 -2
  744. package/dist/slots/revalidate.test.d.ts.map +0 -1
  745. package/dist/slots/server-api.test.d.ts +0 -2
  746. package/dist/slots/server-api.test.d.ts.map +0 -1
  747. package/dist/sync/add-to-calendar.test.d.ts +0 -2
  748. package/dist/sync/add-to-calendar.test.d.ts.map +0 -1
  749. package/dist/sync/api-errors.test.d.ts +0 -2
  750. package/dist/sync/api-errors.test.d.ts.map +0 -1
  751. package/dist/sync/booking-flow.test.d.ts +0 -2
  752. package/dist/sync/booking-flow.test.d.ts.map +0 -1
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkJEOKDUPQ_js = require('./chunk-JEOKDUPQ.js');
4
+ var chunkR7GHP3FY_js = require('./chunk-R7GHP3FY.js');
5
5
  var chunk5RNAUYWE_js = require('./chunk-5RNAUYWE.js');
6
- var chunkH65OX263_js = require('./chunk-H65OX263.js');
6
+ var chunk7DV7Y7BZ_js = require('./chunk-7DV7Y7BZ.js');
7
7
  var react = require('react');
8
8
 
9
9
  var SYNC_STAMP_KEY = "_sk_sitemap_synced_at";
@@ -47,7 +47,7 @@ function storeSyncedHash(hash) {
47
47
  }
48
48
  async function parseSitemap(sitemapUrl, debug) {
49
49
  try {
50
- const response = await chunkH65OX263_js.sonorFetch(sitemapUrl);
50
+ const response = await chunk7DV7Y7BZ_js.sonorFetch(sitemapUrl);
51
51
  if (!response.ok) {
52
52
  if (debug) console.warn("[SitemapSync] Failed to fetch sitemap:", response.status);
53
53
  return [];
@@ -65,8 +65,8 @@ async function parseSitemap(sitemapUrl, debug) {
65
65
  urls.forEach((url) => {
66
66
  const loc = url.querySelector("loc")?.textContent?.trim();
67
67
  if (!loc) return;
68
- const path = chunkJEOKDUPQ_js.locToPath(loc);
69
- if (chunkJEOKDUPQ_js.isMalformedSitemapPath(path)) {
68
+ const path = chunkR7GHP3FY_js.locToPath(loc);
69
+ if (chunkR7GHP3FY_js.isMalformedSitemapPath(path)) {
70
70
  if (debug) console.warn(`[SitemapSync] Skipping malformed path: ${path}`);
71
71
  return;
72
72
  }
@@ -97,7 +97,7 @@ async function syncToPortal(entries, apiUrl, apiKey, site, debug, mode = "additi
97
97
  try {
98
98
  const target = chunk5RNAUYWE_js.resolveAnalyticsTarget({ ...gate, apiUrl, apiKey });
99
99
  if (!target) return { success: false, created: 0, updated: 0 };
100
- const response = await chunkH65OX263_js.sonorFetch(`${target.apiUrl}/api/public/seo/register-sitemap`, {
100
+ const response = await chunk7DV7Y7BZ_js.sonorFetch(`${target.apiUrl}/api/public/seo/register-sitemap`, {
101
101
  method: "POST",
102
102
  headers: { "Content-Type": "application/json" },
103
103
  body: JSON.stringify({
@@ -105,7 +105,7 @@ async function syncToPortal(entries, apiUrl, apiKey, site, debug, mode = "additi
105
105
  path: e.path,
106
106
  priority: e.priority,
107
107
  changefreq: e.changefreq,
108
- pageType: chunkJEOKDUPQ_js.inferPageType(e.path)
108
+ pageType: chunkR7GHP3FY_js.inferPageType(e.path)
109
109
  })),
110
110
  mode,
111
111
  // Sub-site host — tagged on every seo_pages row so the dashboard
@@ -191,5 +191,5 @@ function SitemapSync({
191
191
  }
192
192
 
193
193
  exports.SitemapSync = SitemapSync;
194
- //# sourceMappingURL=chunk-2N27LCZH.js.map
195
- //# sourceMappingURL=chunk-2N27LCZH.js.map
194
+ //# sourceMappingURL=chunk-FEKPEI2G.js.map
195
+ //# sourceMappingURL=chunk-FEKPEI2G.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/SitemapSync.tsx"],"names":["sonorFetch","locToPath","isMalformedSitemapPath","resolveAnalyticsTarget","inferPageType","useRef","useEffect"],"mappings":"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","file":"chunk-2N27LCZH.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 SiteKitLayout 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'\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from './shared/reporting-gate'\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 extends AnalyticsGateOptions {\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\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 gate: AnalyticsGateOptions = {},\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 target = resolveAnalyticsTarget({ ...gate, apiUrl, apiKey })\n if (!target) return { success: false, created: 0, updated: 0 }\n const response = await sonorFetch(`${target.apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\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: target.apiKey, retries: 2 })\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 apiUrl: propApiUrl,\n apiKey: propApiKey,\n allowInFrame = false,\n allowLocalhost = false,\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 gate = { apiUrl: propApiUrl, apiKey: propApiKey, allowInFrame, allowLocalhost, debug }\n const target = resolveAnalyticsTarget(gate)\n if (!target) return\n const { apiUrl, apiKey } = target\n const site = (window as any).__SITE_KIT_SITE__ || window.location.host || ''\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, gate)\n if (result.success) {\n stampSynced()\n storeSyncedHash(hash)\n }\n }\n }\n\n if (!resolveAnalyticsTarget({ apiUrl: propApiUrl, apiKey: propApiKey, allowInFrame, allowLocalhost, debug })) return\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, propApiUrl, propApiKey, allowInFrame, allowLocalhost])\n\n return null\n}\n"]}
1
+ {"version":3,"sources":["../src/SitemapSync.tsx"],"names":["sonorFetch","locToPath","isMalformedSitemapPath","resolveAnalyticsTarget","inferPageType","useRef","useEffect"],"mappings":"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","file":"chunk-FEKPEI2G.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 SiteKitLayout 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'\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from './shared/reporting-gate'\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 extends AnalyticsGateOptions {\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\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 gate: AnalyticsGateOptions = {},\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 target = resolveAnalyticsTarget({ ...gate, apiUrl, apiKey })\n if (!target) return { success: false, created: 0, updated: 0 }\n const response = await sonorFetch(`${target.apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\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: target.apiKey, retries: 2 })\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 apiUrl: propApiUrl,\n apiKey: propApiKey,\n allowInFrame = false,\n allowLocalhost = false,\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 gate = { apiUrl: propApiUrl, apiKey: propApiKey, allowInFrame, allowLocalhost, debug }\n const target = resolveAnalyticsTarget(gate)\n if (!target) return\n const { apiUrl, apiKey } = target\n const site = (window as any).__SITE_KIT_SITE__ || window.location.host || ''\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, gate)\n if (result.success) {\n stampSynced()\n storeSyncedHash(hash)\n }\n }\n }\n\n if (!resolveAnalyticsTarget({ apiUrl: propApiUrl, apiKey: propApiKey, allowInFrame, allowLocalhost, debug })) return\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, propApiUrl, propApiKey, allowInFrame, allowLocalhost])\n\n return null\n}\n"]}
@@ -1,5 +1,77 @@
1
1
  'use strict';
2
2
 
3
+ var chunkYN7QHLWF_js = require('./chunk-YN7QHLWF.js');
4
+
5
+ // src/blog/public-reads.ts
6
+ async function fetchBlogPostBySlug({ apiUrl, apiKey, site }, slug) {
7
+ try {
8
+ const response = await fetch(chunkYN7QHLWF_js.withSiteParam(`${apiUrl}/public/blog/posts/${slug}`, site), {
9
+ headers: { "x-api-key": apiKey },
10
+ next: { revalidate: 60 }
11
+ });
12
+ if (!response.ok) {
13
+ if (response.status !== 404) console.error("[Blog] Failed to fetch post:", response.statusText);
14
+ return null;
15
+ }
16
+ const data = await response.json();
17
+ return data.post || null;
18
+ } catch (error) {
19
+ console.error("[Blog] Error fetching post:", error);
20
+ return null;
21
+ }
22
+ }
23
+ async function fetchBlogCategories({ apiUrl, apiKey, site }) {
24
+ try {
25
+ const response = await fetch(chunkYN7QHLWF_js.withSiteParam(`${apiUrl}/public/blog/categories`, site), {
26
+ headers: { "x-api-key": apiKey },
27
+ next: { revalidate: 300 }
28
+ });
29
+ if (!response.ok) return [];
30
+ const data = await response.json();
31
+ return data.categories || [];
32
+ } catch (error) {
33
+ console.error("[Blog] Error fetching categories:", error);
34
+ return [];
35
+ }
36
+ }
37
+ async function fetchRelatedBlogPosts({ apiUrl, apiKey, site }, currentPostId, limit, cache = {}) {
38
+ try {
39
+ const response = await fetch(`${apiUrl}/public/blog/related`, {
40
+ method: "POST",
41
+ headers: { "Content-Type": "application/json", "x-api-key": apiKey },
42
+ body: JSON.stringify(chunkYN7QHLWF_js.withSiteBody({ current_post_id: currentPostId, limit }, site)),
43
+ ...cache.revalidate !== void 0 ? { next: { revalidate: cache.revalidate } } : {}
44
+ });
45
+ if (!response.ok) {
46
+ console.error("[Blog] Failed to fetch related posts:", response.statusText);
47
+ return [];
48
+ }
49
+ const data = await response.json();
50
+ return data.posts || [];
51
+ } catch (error) {
52
+ console.error("[Blog] Error fetching related posts:", error);
53
+ return [];
54
+ }
55
+ }
56
+
57
+ // src/blog/artwork.ts
58
+ function resolveBlogArtwork(post, placement = "card") {
59
+ const editorial = placement === "article" && !!post.editorial_image;
60
+ const src = (editorial ? post.editorial_image : post.featured_image) || void 0;
61
+ const alt = editorial ? post.editorial_image_alt ?? "" : post.featured_image_alt ?? post.title ?? "";
62
+ let composed = false;
63
+ if (src) {
64
+ try {
65
+ composed = /\/Blog\/Cards\//i.test(new URL(src, "https://site-kit.invalid").pathname);
66
+ } catch {
67
+ }
68
+ }
69
+ return { src, alt, composed };
70
+ }
71
+ function blogArtworkImageStyle(artwork) {
72
+ return artwork.composed ? { display: "block", height: "auto", maxHeight: "none", objectFit: "contain", transform: "none" } : void 0;
73
+ }
74
+
3
75
  // src/blog/routes.ts
4
76
  function blogCategorySlug(category) {
5
77
  const value = typeof category === "string" ? category : category?.slug || category?.name || "";
@@ -51,24 +123,6 @@ function resolveBlogPostUrl(post, options = {}) {
51
123
  return resolveBlogUrl(createBlogRoutes(options).post(post), options.siteUrl);
52
124
  }
53
125
 
54
- // src/blog/artwork.ts
55
- function resolveBlogArtwork(post, placement = "card") {
56
- const editorial = placement === "article" && !!post.editorial_image;
57
- const src = (editorial ? post.editorial_image : post.featured_image) || void 0;
58
- const alt = editorial ? post.editorial_image_alt ?? "" : post.featured_image_alt ?? post.title ?? "";
59
- let composed = false;
60
- if (src) {
61
- try {
62
- composed = /\/Blog\/Cards\//i.test(new URL(src, "https://site-kit.invalid").pathname);
63
- } catch {
64
- }
65
- }
66
- return { src, alt, composed };
67
- }
68
- function blogArtworkImageStyle(artwork) {
69
- return artwork.composed ? { display: "block", height: "auto", maxHeight: "none", objectFit: "contain", transform: "none" } : void 0;
70
- }
71
-
72
126
  // src/blog/author-schema.ts
73
127
  function generateAuthorSchema(author, options = {}) {
74
128
  const { siteUrl = "", siteName } = options;
@@ -110,9 +164,12 @@ function generateAuthorSchema(author, options = {}) {
110
164
  exports.blogArtworkImageStyle = blogArtworkImageStyle;
111
165
  exports.blogCategorySlug = blogCategorySlug;
112
166
  exports.createBlogRoutes = createBlogRoutes;
167
+ exports.fetchBlogCategories = fetchBlogCategories;
168
+ exports.fetchBlogPostBySlug = fetchBlogPostBySlug;
169
+ exports.fetchRelatedBlogPosts = fetchRelatedBlogPosts;
113
170
  exports.generateAuthorSchema = generateAuthorSchema;
114
171
  exports.resolveBlogArtwork = resolveBlogArtwork;
115
172
  exports.resolveBlogPostUrl = resolveBlogPostUrl;
116
173
  exports.resolveBlogUrl = resolveBlogUrl;
117
- //# sourceMappingURL=chunk-LC7AM4J5.js.map
118
- //# sourceMappingURL=chunk-LC7AM4J5.js.map
174
+ //# sourceMappingURL=chunk-FHPW7XVH.js.map
175
+ //# sourceMappingURL=chunk-FHPW7XVH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/blog/public-reads.ts","../src/blog/artwork.ts","../src/blog/routes.ts","../src/blog/author-schema.ts"],"names":["withSiteParam","withSiteBody"],"mappings":"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","file":"chunk-FHPW7XVH.js","sourcesContent":["/**\n * @sonordev/site-kit/blog — shared public blog reads (leaf module)\n *\n * SINGLE SOURCE OF TRUTH for the three blog reads that both `server-core`\n * (credentials from resolveServerApiConfig) and the server-ui components\n * (credentials from their `apiUrl` / `apiKey` props) make:\n *\n * - post by slug — getBlogPost, <BlogPost>\n * - categories — getBlogCategories, <BlogList>, <BlogSidebar>\n * - related posts — getRelatedInsights, <BlogPost>, <RelatedPosts>\n *\n * Each used to be copied into every caller, which is how one copy of the\n * related read kept a camelCase body and a wrong path long after the others\n * were fixed (see the notes in RelatedPosts). Adding the multi-site `site`\n * dimension would have meant a fourth edit to each copy, so they live here now.\n *\n * A leaf on purpose: it takes credentials as arguments and imports no\n * `server-only` code, because the client-stamped `blog` barrel reaches it\n * through BlogList / BlogPost / BlogSidebar. Callers resolve credentials; this\n * module only talks to the API.\n */\nimport { withSiteBody, withSiteParam } from '../sites/site-param'\nimport type { BlogCategory, BlogPost } from './types'\n\nexport interface BlogReadConfig {\n apiUrl: string\n apiKey: string\n /** Sub-site host override. Omit to resolve from NEXT_PUBLIC_SITE_URL. */\n site?: string\n}\n\n/** GET /public/blog/posts/:slug — null when missing or on any failure. */\nexport async function fetchBlogPostBySlug(\n { apiUrl, apiKey, site }: BlogReadConfig,\n slug: string\n): Promise<BlogPost | null> {\n try {\n const response = await fetch(withSiteParam(`${apiUrl}/public/blog/posts/${slug}`, site), {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 60 },\n })\n if (!response.ok) {\n if (response.status !== 404) console.error('[Blog] Failed to fetch post:', response.statusText)\n return null\n }\n const data = await response.json()\n return data.post || null\n } catch (error) {\n console.error('[Blog] Error fetching post:', error)\n return null\n }\n}\n\n/** GET /public/blog/categories — [] on any failure. */\nexport async function fetchBlogCategories({ apiUrl, apiKey, site }: BlogReadConfig): Promise<BlogCategory[]> {\n try {\n const response = await fetch(withSiteParam(`${apiUrl}/public/blog/categories`, site), {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 },\n })\n if (!response.ok) return []\n const data = await response.json()\n return data.categories || []\n } catch (error) {\n console.error('[Blog] Error fetching categories:', error)\n return []\n }\n}\n\n/**\n * POST /public/blog/related — [] on any failure.\n *\n * `/public/blog/*`, not `/api/public/blog/*`: public-blog.controller is one of\n * only two public controllers whose @Controller() omits the `api/` segment.\n * The body is snake_case `current_post_id` (the controller looks the post up\n * by id — there is no slug path), and `site` rides in the body because this is\n * the one blog read that isn't a GET.\n *\n * `revalidate` is optional so <RelatedPosts>, which never set a fetch cache\n * lifetime, keeps rendering exactly as it did.\n */\nexport async function fetchRelatedBlogPosts(\n { apiUrl, apiKey, site }: BlogReadConfig,\n currentPostId: string,\n limit: number,\n cache: { revalidate?: number } = {}\n): Promise<BlogPost[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/related`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'x-api-key': apiKey },\n body: JSON.stringify(withSiteBody({ current_post_id: currentPostId, limit }, site)),\n ...(cache.revalidate !== undefined ? { next: { revalidate: cache.revalidate } } : {}),\n })\n if (!response.ok) {\n console.error('[Blog] Failed to fetch related posts:', response.statusText)\n return []\n }\n const data = await response.json()\n return data.posts || []\n } catch (error) {\n console.error('[Blog] Error fetching related posts:', error)\n return []\n }\n}\n","import type { CSSProperties } from 'react'\nimport type { BlogPost } from './types'\n\nexport interface BlogArtwork {\n src: string | undefined\n alt: string\n composed: boolean\n}\n\ntype ArtworkSource = Pick<BlogPost, 'title' | 'featured_image' | 'featured_image_alt' | 'editorial_image' | 'editorial_image_alt'>\n\n/** Single source of truth for article artwork versus complete promotional cards. */\nexport function resolveBlogArtwork(post: ArtworkSource, placement: 'article' | 'card' = 'card'): BlogArtwork {\n const editorial = placement === 'article' && !!post.editorial_image\n const src = (editorial ? post.editorial_image : post.featured_image) || undefined\n const alt = editorial\n ? post.editorial_image_alt ?? ''\n : post.featured_image_alt ?? post.title ?? ''\n let composed = false\n if (src) {\n try {\n // Inspect the path, not a query string that happens to mention a card.\n composed = /\\/Blog\\/Cards\\//i.test(new URL(src, 'https://site-kit.invalid').pathname)\n } catch { /* An unrecognized source retains the normal photograph layout. */ }\n }\n return { src, alt, composed }\n}\n\n/** Preserve generated text and graphics across every stock card surface. */\nexport function blogArtworkImageStyle(artwork: BlogArtwork): CSSProperties | undefined {\n return artwork.composed\n ? { display: 'block', height: 'auto', maxHeight: 'none', objectFit: 'contain', transform: 'none' }\n : undefined\n}\n","/** Shared, environment-free publication routes for server helpers and blog UI. */\nexport interface BlogRoutePost {\n slug: string\n category?: string | { slug?: string; name?: string } | null\n canonical_url?: string | null\n}\n\nexport interface BlogRoutingOptions {\n /** Publication root. Defaults to /blog. */\n basePath?: string\n /** Existing metadata option; basePath takes precedence when both are set. */\n blogBasePath?: string\n /** Use /publication/category/post instead of /publication/post. */\n includeCategoryInPath?: boolean\n /** Fallback category for partial cluster records. */\n category?: string\n /** A custom local article path. Receives the post's slug and category. */\n postPath?: (post: BlogRoutePost) => string\n /** A custom category destination, for example /theforge?category=guides. */\n categoryPath?: (slug: string) => string\n}\n\nexport function blogCategorySlug(category: BlogRoutePost['category']): string {\n const value = typeof category === 'string' ? category : category?.slug || category?.name || ''\n return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '')\n}\n\nfunction localPath(path: string): string {\n const value = path.trim()\n if (!value || /^[a-z][a-z\\d+.-]*:/i.test(value) || value.startsWith('//') || value.includes('\\\\')) {\n throw new Error('Blog routes must be local paths, such as /theforge/guides/story.')\n }\n return value.startsWith('/') ? value : `/${value}`\n}\n\n/** Single source of truth for publication paths. Custom routes never change OG artwork. */\nexport function createBlogRoutes(options: BlogRoutingOptions = {}) {\n const raw = (options.basePath ?? options.blogBasePath ?? '/blog').trim() || '/blog'\n const index = localPath(raw).replace(/\\/+$/, '') || '/'\n const prefix = index === '/' ? '' : index\n return {\n index,\n post(post: BlogRoutePost): string {\n if (options.postPath) return localPath(options.postPath(post))\n const category = blogCategorySlug(post.category || options.category)\n return `${prefix}${options.includeCategoryInPath && category ? `/${encodeURIComponent(category)}` : ''}/${encodeURIComponent(post.slug)}`\n },\n category(slug: string): string {\n const normalized = blogCategorySlug(slug)\n return options.categoryPath\n ? localPath(options.categoryPath(normalized))\n : `${prefix}/category/${encodeURIComponent(normalized)}`\n },\n cluster: (slug: string) => `${prefix}/cluster/${encodeURIComponent(slug)}`,\n author: (slug: string) => `${prefix}/author/${encodeURIComponent(slug)}`,\n rss: `${prefix}/rss.xml`,\n atom: `${prefix}/feed.xml`,\n }\n}\n\nexport function resolveBlogUrl(path: string, siteUrl = ''): string {\n return `${siteUrl.replace(/\\/+$/, '')}${localPath(path)}`\n}\n\n/** Metadata, feeds, sitemaps and generated schemas agree on a supplied canonical. */\nexport function resolveBlogPostUrl(post: BlogRoutePost, options: BlogRoutingOptions & { siteUrl?: string } = {}): string {\n const canonical = post.canonical_url?.trim()\n if (canonical) {\n if (/^https?:\\/\\//i.test(canonical)) {\n try { return new URL(canonical).toString() } catch { /* use the local route */ }\n } else if (canonical.startsWith('/') && !canonical.startsWith('//') && !canonical.includes('\\\\')) {\n return resolveBlogUrl(canonical, options.siteUrl)\n }\n }\n return resolveBlogUrl(createBlogRoutes(options).post(post), options.siteUrl)\n}\n","/**\n * @sonordev/site-kit/blog — Author JSON-LD (pure)\n *\n * Split out of `./server-core` on purpose. `generateAuthorSchema` is a pure\n * function — it maps a `BlogAuthor` to a Person schema object and touches no\n * env, no config, and no network. It only ever lived in `server-core` because\n * the other author helpers there (`getAuthorBySlug`, `getAuthorPosts`) do fetch.\n *\n * `AuthorPage` is exported from the client-stamped `@sonordev/site-kit/blog`\n * barrel (see `./index.ts`), so importing this one function from `server-core`\n * dragged that whole server module — its `x-api-key` fetches included — into\n * the browser bundle. Keeping the pure half here means `AuthorPage` can stay in\n * the barrel without pulling a single line of server code with it.\n *\n * Anything added here must stay pure. If it needs an API key or a fetch, it\n * belongs in `./server-core`, not in this file.\n */\n\nimport type { BlogAuthor } from './types'\n\n/**\n * Generate Person JSON-LD schema for an author page\n */\nexport function generateAuthorSchema(\n author: BlogAuthor,\n options: { siteUrl?: string; siteName?: string } = {}\n): object {\n const { siteUrl = '', siteName } = options\n\n const sameAs: string[] = [...(author.same_as || [])]\n if (author.linkedin_url) sameAs.push(author.linkedin_url)\n if (author.twitter_url) sameAs.push(author.twitter_url)\n if (author.website_url) sameAs.push(author.website_url)\n if (author.social_links?.twitter) sameAs.push(`https://twitter.com/${author.social_links.twitter}`)\n if (author.social_links?.linkedin) sameAs.push(author.social_links.linkedin)\n if (author.social_links?.github) sameAs.push(`https://github.com/${author.social_links.github}`)\n\n // Deduplicate\n const uniqueSameAs = [...new Set(sameAs.filter(Boolean))]\n\n const schema: Record<string, any> = {\n '@context': 'https://schema.org',\n '@type': 'Person',\n name: author.name,\n url: author.author_page_url || `${siteUrl}/blog/author/${author.slug}`,\n }\n\n if (author.title) schema.jobTitle = author.title\n if (author.company || siteName) {\n schema.worksFor = {\n '@type': 'Organization',\n name: author.company || siteName,\n ...(siteUrl ? { url: siteUrl } : {}),\n }\n }\n if (author.bio || author.short_bio) schema.description = author.short_bio || author.bio\n if (author.avatar_url) schema.image = author.avatar_url\n if (uniqueSameAs.length > 0) schema.sameAs = uniqueSameAs\n if (author.knows_about && author.knows_about.length > 0) schema.knowsAbout = author.knows_about\n if (author.credentials && author.credentials.length > 0) {\n schema.hasCredential = author.credentials.map((c) => ({\n '@type': 'EducationalOccupationalCredential',\n credentialCategory: c,\n }))\n }\n\n return schema\n}\n"]}
@@ -1,9 +1,62 @@
1
1
  'use strict';
2
2
 
3
+ var chunkYN7QHLWF_js = require('./chunk-YN7QHLWF.js');
3
4
  var chunkO5GHP7UO_js = require('./chunk-O5GHP7UO.js');
5
+ var chunkXBX2K3GA_js = require('./chunk-XBX2K3GA.js');
4
6
  var react = require('react');
5
7
  require('server-only');
6
8
 
9
+ // src/seo/schema-filter.ts
10
+ function typesOf(node) {
11
+ const t = node["@type"];
12
+ return Array.isArray(t) ? t.filter((x) => typeof x === "string") : typeof t === "string" ? [t] : [];
13
+ }
14
+ function isPlainObject(value) {
15
+ return !!value && typeof value === "object" && !Array.isArray(value);
16
+ }
17
+ function isEmptyNode(node) {
18
+ const keys = Object.keys(node).filter((k) => k !== "@context");
19
+ if (!keys.length) return true;
20
+ return keys.length === 1 && keys[0] === "@graph" && Array.isArray(node["@graph"]) && node["@graph"].length === 0;
21
+ }
22
+ function pruneSchemaTypes(value, deny) {
23
+ if (!deny.size) return value;
24
+ if (Array.isArray(value)) {
25
+ const kept = value.map((v) => pruneSchemaTypes(v, deny)).filter((v) => v !== null);
26
+ return kept;
27
+ }
28
+ if (!isPlainObject(value)) return value;
29
+ if (typesOf(value).some((t) => deny.has(t))) return null;
30
+ const out = {};
31
+ for (const [key, child] of Object.entries(value)) {
32
+ const next = pruneSchemaTypes(child, deny);
33
+ if (next === null) continue;
34
+ if (Array.isArray(next) && next.length === 0 && Array.isArray(child) && child.length > 0 && key !== "@graph") {
35
+ continue;
36
+ }
37
+ out[key] = next;
38
+ }
39
+ return isEmptyNode(out) && !isEmptyNode(value) ? null : out;
40
+ }
41
+ function filterSchemaRows(rows, { includeTypes, excludeTypes } = {}) {
42
+ let out = rows;
43
+ if (includeTypes?.length) {
44
+ const allow = new Set(includeTypes);
45
+ out = out.filter((r) => r?.schema_type && allow.has(r.schema_type));
46
+ }
47
+ if (excludeTypes?.length) {
48
+ const deny = new Set(excludeTypes);
49
+ out = out.flatMap((r) => {
50
+ if (r?.schema_type && deny.has(r.schema_type)) return [];
51
+ if (r?.schema_json === void 0) return [r];
52
+ const json = pruneSchemaTypes(r.schema_json, deny);
53
+ return json === null ? [] : [{ ...r, schema_json: json }];
54
+ });
55
+ }
56
+ return out;
57
+ }
58
+
59
+ // src/seo/server-api.ts
7
60
  var SEO_LOG_PREFIX = "@sonordev/seo";
8
61
  function getSecureApiConfig() {
9
62
  return chunkO5GHP7UO_js.requireServerApiConfig(
@@ -43,31 +96,28 @@ var getSEOPageData = react.cache(async (path) => {
43
96
  });
44
97
  var getSchemaMarkups = react.cache(async (path, options) => {
45
98
  const ctx = await loadPageSeoContext(path);
46
- let schemas = ctx?.schemas ?? [];
47
- if (options?.includeTypes?.length) {
48
- const allow = new Set(options.includeTypes);
49
- schemas = schemas.filter((s) => s?.schema_type && allow.has(s.schema_type));
50
- }
51
- if (options?.excludeTypes?.length) {
52
- const deny = new Set(options.excludeTypes);
53
- schemas = schemas.filter((s) => !s?.schema_type || !deny.has(s.schema_type));
54
- }
55
- return schemas;
99
+ return filterSchemaRows(ctx?.schemas ?? [], options);
56
100
  });
57
- var getFAQData = react.cache(async (path) => {
58
- const result = await secureApiPost("/api/public/seo/faq", { path });
101
+ var getFAQData = react.cache(async (path, site) => {
102
+ const result = await secureApiPost("/api/public/seo/faq", chunkYN7QHLWF_js.withSiteBody({ path }, site));
59
103
  return result?.faq || null;
60
104
  });
61
105
  var getInternalLinks = react.cache(async (sourcePath, options) => {
62
- const result = await secureApiPost("/api/public/seo/internal-links", {
63
- sourcePath,
64
- position: options?.position,
65
- limit: options?.limit
66
- });
106
+ const result = await secureApiPost(
107
+ "/api/public/seo/internal-links",
108
+ chunkYN7QHLWF_js.withSiteBody(
109
+ {
110
+ sourcePath,
111
+ position: options?.position,
112
+ limit: options?.limit
113
+ },
114
+ options?.site
115
+ )
116
+ );
67
117
  return result?.links || [];
68
118
  });
69
- var getContentBlock = react.cache(async (path, section) => {
70
- const result = await secureApiPost("/api/public/seo/content", { path, section });
119
+ var getContentBlock = react.cache(async (path, section, site) => {
120
+ const result = await secureApiPost("/api/public/seo/content", chunkYN7QHLWF_js.withSiteBody({ path, section }, site));
71
121
  return result?.content || null;
72
122
  });
73
123
  var getABTest = react.cache(async (path, field) => {
@@ -102,14 +152,7 @@ async function registerSitemap(entries, options) {
102
152
  const { apiUrl, apiKey } = getSecureApiConfig();
103
153
  const mode = options?.mode ?? "full-replace";
104
154
  try {
105
- const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {
106
- method: "POST",
107
- headers: {
108
- "Content-Type": "application/json",
109
- "x-api-key": apiKey
110
- },
111
- body: JSON.stringify({ entries, mode })
112
- });
155
+ const response = await chunkXBX2K3GA_js.postRegisterSitemap({ apiUrl, apiKey, entries, mode, site: chunkXBX2K3GA_js.resolveSyncSite(options?.site) });
113
156
  if (!response.ok) {
114
157
  console.error(`@sonordev/seo: Sitemap registration failed: ${response.statusText}`);
115
158
  return { success: false, created: 0, updated: 0 };
@@ -210,7 +253,8 @@ exports.getSchemaMarkups = getSchemaMarkups;
210
253
  exports.getSitemapEntries = getSitemapEntries;
211
254
  exports.getVisibilityScore = getVisibilityScore;
212
255
  exports.getVisibilitySummary = getVisibilitySummary;
256
+ exports.pruneSchemaTypes = pruneSchemaTypes;
213
257
  exports.recordABImpression = recordABImpression;
214
258
  exports.registerSitemap = registerSitemap;
215
- //# sourceMappingURL=chunk-JNRHTZL4.js.map
216
- //# sourceMappingURL=chunk-JNRHTZL4.js.map
259
+ //# sourceMappingURL=chunk-FVW6FT6L.js.map
260
+ //# sourceMappingURL=chunk-FVW6FT6L.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/seo/schema-filter.ts","../src/seo/server-api.ts"],"names":["requireServerApiConfig","serverApiFetch","cache","withSiteBody","postRegisterSitemap","resolveSyncSite"],"mappings":"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","file":"chunk-FVW6FT6L.js","sourcesContent":["/**\n * @sonordev/site-kit/seo — `includeTypes` / `excludeTypes` for JSON-LD.\n *\n * SINGLE SOURCE OF TRUTH for the ManagedSchema type filter, used for Sonor's\n * schema-markup rows (`getSchemaMarkups`) and for the page's\n * `managed_schema` and entity-graph nodes (`ManagedSchema`).\n *\n * `excludeTypes` used to drop a row only when its `schema_type` matched\n * exactly, so a node of that type nested INSIDE a row got through. Found\n * 2026-09-15 on the MDG Green Bay site: the Georgetown and Westbrooke pages\n * carry a page-level row whose JSON-LD embeds a FAQPage for questions the\n * page doesn't show, and structured data has to describe visible content.\n * `excludeTypes: ['FAQPage']` couldn't touch it; the site template dropped\n * FAQPage nodes by hand and re-added the rows. Now an excluded type goes\n * wherever it sits: a whole row, an `@graph` member, or a nested value\n * (`mainEntity`, `hasPart`). A row left with nothing in it is dropped.\n *\n * `includeTypes` stays a row-level allow list on `schema_type`.\n *\n * Pure: no I/O.\n */\n\ntype Json = unknown\n\n/** A node's `@type`, as a list (`@type` may be a string or an array). */\nfunction typesOf(node: Record<string, unknown>): string[] {\n const t = node['@type']\n return Array.isArray(t) ? t.filter((x): x is string => typeof x === 'string') : typeof t === 'string' ? [t] : []\n}\n\nfunction isPlainObject(value: Json): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\n/** Nothing left worth emitting: no keys but `@context`, and an empty or missing `@graph`. */\nfunction isEmptyNode(node: Record<string, unknown>): boolean {\n const keys = Object.keys(node).filter(k => k !== '@context')\n if (!keys.length) return true\n return keys.length === 1 && keys[0] === '@graph' && Array.isArray(node['@graph']) && node['@graph'].length === 0\n}\n\n/**\n * The same JSON-LD with every node whose `@type` is in `deny` removed, at any\n * depth. Returns null when the value itself is removed or nothing is left.\n * Doesn't mutate its input.\n */\nexport function pruneSchemaTypes(value: Json, deny: ReadonlySet<string>): Json | null {\n if (!deny.size) return value\n if (Array.isArray(value)) {\n const kept = value.map(v => pruneSchemaTypes(v, deny)).filter(v => v !== null)\n return kept\n }\n if (!isPlainObject(value)) return value\n if (typesOf(value).some(t => deny.has(t))) return null\n\n const out: Record<string, unknown> = {}\n for (const [key, child] of Object.entries(value)) {\n const next = pruneSchemaTypes(child, deny)\n if (next === null) continue\n // A property whose every node was excluded goes, rather than shipping [].\n if (Array.isArray(next) && next.length === 0 && Array.isArray(child) && child.length > 0 && key !== '@graph') {\n continue\n }\n out[key] = next\n }\n return isEmptyNode(out) && !isEmptyNode(value) ? null : out\n}\n\nexport interface SchemaTypeFilter {\n includeTypes?: string[]\n excludeTypes?: string[]\n}\n\n/**\n * Apply the filter to Sonor's schema-markup rows: `includeTypes` keeps rows\n * whose `schema_type` it names; `excludeTypes` drops matching rows and prunes\n * matching nodes out of the rest.\n */\nexport function filterSchemaRows<T extends { schema_type?: string; schema_json?: unknown }>(\n rows: T[],\n { includeTypes, excludeTypes }: SchemaTypeFilter = {},\n): T[] {\n let out = rows\n if (includeTypes?.length) {\n const allow = new Set(includeTypes)\n out = out.filter(r => r?.schema_type && allow.has(r.schema_type))\n }\n if (excludeTypes?.length) {\n const deny = new Set(excludeTypes)\n out = out.flatMap(r => {\n if (r?.schema_type && deny.has(r.schema_type)) return []\n if (r?.schema_json === undefined) return [r]\n const json = pruneSchemaTypes(r.schema_json, deny)\n return json === null ? [] : [{ ...r, schema_json: json }]\n })\n }\n return out\n}\n","/**\n * @sonordev/site-kit/seo - Server-Only API Functions\n * \n * SECURITY: These functions use private environment variables\n * and should ONLY be imported in server-side code (RSC, API routes, server actions).\n * \n * DO NOT import this file in client components or it will expose API keys.\n */\n\nimport { cache } from 'react'\nimport 'server-only' // This ensures the module can only be imported server-side\nimport { requireServerApiConfig, serverApiFetch } from '../server/server-fetch'\nimport { withSiteBody } from '../sites/site-param'\nimport { filterSchemaRows } from './schema-filter'\nimport { postRegisterSitemap, resolveSyncSite } from './register-sitemap-request'\n\n// ============================================\n// Server-Only API Config\n// ============================================\n\nconst SEO_LOG_PREFIX = '@sonordev/seo'\n\n/**\n * Config for portal API calls. Project is resolved by the portal from the API key;\n * sites never send or read project ID.\n *\n * Delegates to the shared `requireServerApiConfig` (single source of truth for\n * server API config — see `../server/server-fetch`) with an SEO-specific message.\n */\nfunction getSecureApiConfig() {\n return requireServerApiConfig(\n {},\n '@sonordev/seo: SONOR_API_KEY environment variable is required for server-side SEO functions',\n )\n}\n\n/** Derive project ID from API key for Signal API only (format: sonor_{uuid}_{secret}). Not used for portal. */\nfunction getProjectIdFromKey(apiKey: string): string | null {\n const match = apiKey.match(/^sonor_([0-9a-f-]{36})_/)\n return match ? match[1] : null\n}\n\n/**\n * POST to the Portal public API. Retries transient 429/502/503 with backoff\n * (parallel SSG workers behind one egress IP). 24h default revalidate — SEO data\n * rarely changes; Portal can on-demand revalidate. Throws if no API key is set.\n *\n * Thin wrapper over the shared `serverApiFetch` so the retry/backoff lives in one\n * place (see `../server/server-fetch`).\n */\nfunction secureApiPost<T>(endpoint: string, body: Record<string, any> = {}, revalidate = 86400): Promise<T | null> {\n return serverApiFetch<T>(endpoint, {\n method: 'POST',\n body,\n revalidate,\n requireKey: true,\n retry: true,\n logPrefix: SEO_LOG_PREFIX,\n })\n}\n\n/** GET from the Portal public API (single attempt, 24h revalidate). Throws if no API key is set. */\nfunction secureApiGet<T>(endpoint: string): Promise<T | null> {\n return serverApiFetch<T>(endpoint, {\n method: 'GET',\n revalidate: 86400,\n requireKey: true,\n retry: false,\n logPrefix: SEO_LOG_PREFIX,\n })\n}\n\n// ============================================\n// Secure Cached Data Fetchers\n// ============================================\n\n/** Response shape for POST /api/public/seo/page-context */\nexport type PageSeoContext = {\n page: any | null\n schemas: any[]\n project: {\n id: string\n title?: string | null\n /** Resolved site brand (settings.business_name → title/org name). Grounds the managed-title quality gate. */\n brand?: string | null\n domain?: string | null\n logo_url?: string | null\n site_url?: string | null\n } | null\n}\n\n/**\n * One Portal round-trip per path (page row + schemas + project).\n * React cache() dedupes when getSEOPageData + getSchemaMarkups run in the same render (e.g. metadata + ManagedSchema).\n * @server-only\n */\nconst loadPageSeoContext = cache(async (path: string): Promise<PageSeoContext | null> => {\n const result = await secureApiPost<PageSeoContext>('/api/public/seo/page-context', { path })\n if (!result) return null\n return {\n page: result.page ?? null,\n schemas: Array.isArray(result.schemas) ? result.schemas : [],\n project: result.project ?? null,\n }\n})\n\n/**\n * Fetch SEO page data - cached per request\n * @server-only\n */\nexport const getSEOPageData = cache(async (path: string) => {\n const ctx = await loadPageSeoContext(path)\n return {\n page: ctx?.page ?? null,\n project: ctx?.project ?? null,\n }\n})\n\n/**\n * Fetch schema markups for a page - cached per request (shares loadPageSeoContext with getSEOPageData)\n * @server-only\n */\nexport const getSchemaMarkups = cache(async (\n path: string,\n options?: { includeTypes?: string[]; excludeTypes?: string[] }\n) => {\n const ctx = await loadPageSeoContext(path)\n // Single source of truth for the type filter (also applied to\n // managed_schema in ManagedSchema): an excluded type is pruned wherever it\n // sits in a row, not only when it's the row's schema_type.\n return filterSchemaRows(ctx?.schemas ?? [], options)\n})\n\n// Managed FAQs, internal links and content blocks are site-scoped on\n// multi-site projects: a row with no site applies to every host, a row tagged\n// with a host applies only there. So these three reads send `site` in the body\n// via the shared `withSiteBody` (explicit → NEXT_PUBLIC_SITE_URL host →\n// window.location.host, omitted when nothing resolves). The API treats a\n// request with no site as the project's primary domain.\n\n/**\n * Fetch FAQ data for a page - cached per request\n * @param site Sub-site host override; resolves from NEXT_PUBLIC_SITE_URL when omitted\n * @server-only\n */\nexport const getFAQData = cache(async (path: string, site?: string) => {\n const result = await secureApiPost<{ faq: any }>('/api/public/seo/faq', withSiteBody({ path }, site))\n return result?.faq || null\n})\n\n/**\n * Fetch internal links for a page - cached per request\n * `options.site`: sub-site host override; resolves from NEXT_PUBLIC_SITE_URL when omitted\n * @server-only\n */\nexport const getInternalLinks = cache(async (\n sourcePath: string,\n options?: { position?: string; limit?: number; site?: string }\n) => {\n const result = await secureApiPost<{ links: any[] }>(\n '/api/public/seo/internal-links',\n withSiteBody(\n {\n sourcePath,\n position: options?.position,\n limit: options?.limit,\n },\n options?.site,\n ),\n )\n return result?.links || []\n})\n\n/**\n * Fetch content block - cached per request\n * @param site Sub-site host override; resolves from NEXT_PUBLIC_SITE_URL when omitted\n * @server-only\n */\nexport const getContentBlock = cache(async (path: string, section: string, site?: string) => {\n const result = await secureApiPost<{ content: any }>('/api/public/seo/content', withSiteBody({ path, section }, site))\n return result?.content || null\n})\n\n/**\n * Fetch A/B test and determine variant - cached per request\n * @server-only\n */\nexport const getABTest = cache(async (path: string, field: string) => {\n const result = await secureApiPost<{ test: any }>('/api/public/seo/ab-test', { path, field })\n return result?.test || null\n})\n\n/**\n * Record A/B test impression\n * @server-only\n */\nexport async function recordABImpression(\n testId: string,\n variant: 'a' | 'b',\n sessionId?: string\n): Promise<void> {\n await secureApiPost('/api/public/seo/ab-impression', { testId, variant, sessionId })\n}\n\n/**\n * Fetch redirect for a path - cached per request\n * @server-only\n */\nexport const getRedirectData = cache(async (path: string) => {\n const result = await secureApiPost<{ redirect: any }>('/api/public/seo/redirect', { path })\n return result?.redirect || null\n})\n\n/**\n * Fetch managed scripts - cached per request\n * @server-only\n */\nexport const getManagedScripts = cache(async (position: string, currentPath?: string) => {\n const result = await secureApiPost<{ scripts: any[] }>('/api/public/seo/scripts', {\n position,\n currentPath,\n })\n return result?.scripts || []\n})\n\n/**\n * Fetch robots directive for a page - cached per request\n * @server-only\n */\nexport const getRobotsData = cache(async (path: string) => {\n const { page } = await getSEOPageData(path)\n return page?.managed_robots || null\n})\n\n/**\n * Fetch sitemap entries - cached per request\n * @server-only\n */\nexport const getSitemapEntries = cache(async (options?: { publishedOnly?: boolean }) => {\n const result = await secureApiPost<{ entries: any[] }>('/api/public/seo/sitemap', {\n publishedOnly: options?.publishedOnly,\n })\n return result?.entries || []\n})\n\n/**\n * Register/sync sitemap entries from the client site\n * Call this at build time to populate seo_pages from your sitemap.xml\n * @server-only\n *\n * Defaults to mode 'full-replace', which PRUNES every page missing from\n * `entries`. Pass `{ mode: 'additive' }` unless the list is the whole site.\n *\n * @example\n * ```ts\n * // scripts/register-sitemap.ts (run at build time)\n * import { registerSitemap } from '@sonordev/site-kit/seo/server'\n *\n * await registerSitemap(\n * [\n * { path: '/', priority: 1.0, changefreq: 'daily' },\n * { path: '/about', priority: 0.8, changefreq: 'weekly' },\n * ],\n * { mode: 'additive' },\n * )\n * ```\n */\nexport async function registerSitemap(\n entries: Array<{\n path: string\n title?: string\n priority?: number\n changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n }>,\n options?: {\n /**\n * Sync mode:\n * - 'full-replace': replaces the entire page set (default for build-time sync)\n * - 'additive': adds/updates pages but never deletes existing ones\n */\n mode?: 'additive' | 'full-replace'\n /**\n * Sub-site host these pages belong to, on a multi-site project. Defaults\n * to NEXT_PUBLIC_SITE_URL's host; left off when nothing resolves.\n */\n site?: string\n }\n): Promise<{ success: boolean; created: number; updated: number }> {\n const { apiUrl, apiKey } = getSecureApiConfig()\n const mode = options?.mode ?? 'full-replace'\n\n try {\n const response = await postRegisterSitemap({ apiUrl, apiKey, entries, mode, site: resolveSyncSite(options?.site) })\n \n if (!response.ok) {\n console.error(`@sonordev/seo: Sitemap registration failed: ${response.statusText}`)\n return { success: false, created: 0, updated: 0 }\n }\n \n return await response.json()\n } catch (error) {\n console.error('@sonordev/seo: Sitemap registration error:', error)\n return { success: false, created: 0, updated: 0 }\n }\n}\n\n// ============================================\n// Signal-Powered Metadata Fallback\n// ============================================\n\n/**\n * Ensure metadata exists for a page by triggering Signal AI optimization.\n * If the page has no managed_title or managed_meta_description, Signal will\n * generate them and save to the database via Portal proxy.\n *\n * Idempotent — returns existing metadata if already populated.\n * @server-only\n */\nexport const ensureMetadata = cache(async (path: string): Promise<{\n managed_title?: string\n managed_meta_description?: string\n managed_keywords?: string[]\n managed_schema?: Record<string, unknown>\n} | null> => {\n return secureApiPost('/api/public/seo/ensure-metadata', { path })\n})\n\n// ============================================\n// AI Visibility & Entity Graph API (Signal)\n// ============================================\n\nfunction getSignalApiConfig() {\n const apiUrl = process.env.SONOR_SIGNAL_URL || process.env.SIGNAL_API_URL || process.env.NEXT_PUBLIC_SIGNAL_API_URL || 'https://signal.sonor.io'\n const apiKey = process.env.SONOR_API_KEY || ''\n return { apiUrl, apiKey }\n}\n\nasync function signalApiGet<T>(endpoint: string): Promise<T | null> {\n const { apiUrl, apiKey } = getSignalApiConfig()\n \n if (!apiKey) {\n return null\n }\n \n try {\n const response = await fetch(`${apiUrl}${endpoint}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n next: { revalidate: 300 }, // Cache for 5 minutes\n })\n \n if (!response.ok) {\n return null\n }\n \n const result = await response.json()\n return result?.data || result\n } catch (error) {\n console.error('@sonordev/seo: Signal API error:', error)\n return null\n }\n}\n\n/**\n * Entity types for the knowledge graph\n */\nexport type EntityType = \n | 'organization'\n | 'person'\n | 'service'\n | 'product'\n | 'location'\n | 'concept'\n | 'credential'\n\n/**\n * Entity from the knowledge graph\n */\nexport interface SEOEntity {\n id: string\n project_id: string\n entity_type: EntityType\n name: string\n slug: string\n properties: Record<string, unknown>\n knows_about: string[]\n same_as: string[]\n schema_type?: string\n is_primary: boolean\n}\n\n/**\n * Fetch entities for a project - cached per request\n * Returns the entity graph for enhanced schema markup\n * @server-only\n */\nexport const getEntities = cache(async (\n options?: { type?: EntityType }\n): Promise<SEOEntity[]> => {\n const { apiKey } = getSecureApiConfig()\n const projectId = getProjectIdFromKey(apiKey)\n if (!projectId) return []\n let endpoint = `/skills/seo/entities/${projectId}`\n if (options?.type) {\n endpoint += `?type=${options.type}`\n }\n const result = await signalApiGet<SEOEntity[]>(endpoint)\n return result || []\n})\n\n/**\n * Fetch primary entity (the business) - cached per request\n * @server-only\n */\nexport const getPrimaryEntity = cache(async (): Promise<SEOEntity | null> => {\n const { apiKey } = getSecureApiConfig()\n const projectId = getProjectIdFromKey(apiKey)\n if (!projectId) return null\n return signalApiGet<SEOEntity>(`/skills/seo/entities/${projectId}/primary`)\n})\n\n/**\n * Fetch entity-enhanced schema for a page\n * Returns Organization schema with knowsAbout, areaServed, employee, etc.\n * @server-only\n */\nexport const getEntityEnhancedSchema = cache(async (pagePath: string): Promise<object[]> => {\n const { apiKey } = getSecureApiConfig()\n const projectId = getProjectIdFromKey(apiKey)\n if (!projectId) return []\n const result = await signalApiGet<{ schemas: object[] }>(\n `/skills/seo/schema/${projectId}/entity-enhanced?pagePath=${encodeURIComponent(pagePath)}`\n )\n return result?.schemas || []\n})\n\n/**\n * Get AI visibility score for a page\n * @server-only\n */\nexport const getVisibilityScore = cache(async (\n pagePath: string\n): Promise<{\n overall_score: number\n entity_coverage: number\n answer_density: number\n chunk_readability: number\n authority_signals: number\n schema_completeness: number\n} | null> => {\n const { apiKey } = getSecureApiConfig()\n const projectId = getProjectIdFromKey(apiKey)\n if (!projectId) return null\n const result = await signalApiGet<any[]>(`/skills/seo/visibility/${projectId}`)\n if (!result) return null\n return result.find(s => s.page_path === pagePath) || null\n})\n\n/**\n * Get AI visibility summary for project\n * @server-only\n */\nexport const getVisibilitySummary = cache(async (): Promise<{\n overall_score: number\n total_entities: number\n pages_analyzed: number\n top_recommendations: Array<{ priority: string; type: string; message: string }>\n} | null> => {\n const { apiKey } = getSecureApiConfig()\n const projectId = getProjectIdFromKey(apiKey)\n if (!projectId) return null\n return signalApiGet(`/skills/seo/visibility/${projectId}/summary`)\n})\n"]}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkH65OX263_js = require('./chunk-H65OX263.js');
4
+ var chunk7DV7Y7BZ_js = require('./chunk-7DV7Y7BZ.js');
5
5
  var react = require('react');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
 
@@ -40,7 +40,7 @@ function ManagedImage({
40
40
  }
41
41
  try {
42
42
  const params = new URLSearchParams({ page_path: currentPath });
43
- const res = await chunkH65OX263_js.sonorFetch(
43
+ const res = await chunk7DV7Y7BZ_js.sonorFetch(
44
44
  `${apiUrl}/public/images/slot/${encodeURIComponent(slotId)}?${params}`,
45
45
  { headers: { "Content-Type": "application/json" } },
46
46
  { apiKey }
@@ -214,7 +214,7 @@ function ImagePickerModal({
214
214
  const params = new URLSearchParams();
215
215
  if (currentFolder) params.set("folder", currentFolder);
216
216
  if (search) params.set("search", search);
217
- const res = await chunkH65OX263_js.sonorFetch(
217
+ const res = await chunk7DV7Y7BZ_js.sonorFetch(
218
218
  `${config.apiUrl}/public/images/files?${params}`,
219
219
  { headers: { "Content-Type": "application/json" } },
220
220
  { apiKey: config.apiKey }
@@ -236,7 +236,7 @@ function ImagePickerModal({
236
236
  const handleSelectFile = async (file) => {
237
237
  if (!config?.apiKey || !config?.apiUrl) return;
238
238
  try {
239
- const res = await chunkH65OX263_js.sonorFetch(
239
+ const res = await chunk7DV7Y7BZ_js.sonorFetch(
240
240
  `${config.apiUrl}/public/images/slot/${encodeURIComponent(slotId)}`,
241
241
  {
242
242
  method: "POST",
@@ -267,7 +267,7 @@ function ImagePickerModal({
267
267
  formData.append("page_path", pagePath);
268
268
  formData.append("folder", currentFolder || "Website/Images");
269
269
  if (altText) formData.append("alt_text", altText);
270
- const res = await chunkH65OX263_js.sonorFetch(`${config.apiUrl}/public/images/upload`, {
270
+ const res = await chunk7DV7Y7BZ_js.sonorFetch(`${config.apiUrl}/public/images/upload`, {
271
271
  method: "POST",
272
272
  body: formData
273
273
  }, { apiKey: config.apiKey, retries: 0, timeoutMs: 6e4 });
@@ -284,7 +284,7 @@ function ImagePickerModal({
284
284
  if (!config?.apiKey || !config?.apiUrl) return;
285
285
  try {
286
286
  const params = new URLSearchParams({ page_path: pagePath });
287
- await chunkH65OX263_js.sonorFetch(
287
+ await chunk7DV7Y7BZ_js.sonorFetch(
288
288
  `${config.apiUrl}/public/images/slot/${encodeURIComponent(slotId)}?${params}`,
289
289
  { method: "DELETE" },
290
290
  { apiKey: config.apiKey, retries: 0 }
@@ -428,7 +428,7 @@ function ImagePickerModal({
428
428
  async function fetchManagedImage(config, slotId, pagePath) {
429
429
  const params = new URLSearchParams();
430
430
  if (pagePath) params.set("page_path", pagePath);
431
- const res = await chunkH65OX263_js.sonorFetch(
431
+ const res = await chunk7DV7Y7BZ_js.sonorFetch(
432
432
  `${config.apiUrl}/public/images/slot/${encodeURIComponent(slotId)}?${params}`,
433
433
  { headers: { "Content-Type": "application/json" } },
434
434
  { apiKey: config.apiKey }
@@ -443,7 +443,7 @@ async function fetchManagedImages(config, options) {
443
443
  if (options?.pagePath) params.set("page_path", options.pagePath);
444
444
  if (options?.category) params.set("category", options.category);
445
445
  if (options?.includePlaceholders) params.set("include_placeholders", "true");
446
- const res = await chunkH65OX263_js.sonorFetch(
446
+ const res = await chunk7DV7Y7BZ_js.sonorFetch(
447
447
  `${config.apiUrl}/public/images?${params}`,
448
448
  { headers: { "Content-Type": "application/json" } },
449
449
  { apiKey: config.apiKey }
@@ -457,7 +457,7 @@ async function listImageFiles(config, options) {
457
457
  const params = new URLSearchParams();
458
458
  if (options?.folder) params.set("folder", options.folder);
459
459
  if (options?.search) params.set("search", options.search);
460
- const res = await chunkH65OX263_js.sonorFetch(
460
+ const res = await chunk7DV7Y7BZ_js.sonorFetch(
461
461
  `${config.apiUrl}/public/images/files?${params}`,
462
462
  { headers: { "Content-Type": "application/json" } },
463
463
  { apiKey: config.apiKey }
@@ -474,7 +474,7 @@ async function uploadImage(config, file, options) {
474
474
  if (options?.pagePath) formData.append("page_path", options.pagePath);
475
475
  if (options?.folder) formData.append("folder", options.folder);
476
476
  if (options?.altText) formData.append("alt_text", options.altText);
477
- const res = await chunkH65OX263_js.sonorFetch(`${config.apiUrl}/public/images/upload`, {
477
+ const res = await chunk7DV7Y7BZ_js.sonorFetch(`${config.apiUrl}/public/images/upload`, {
478
478
  method: "POST",
479
479
  body: formData
480
480
  }, { apiKey: config.apiKey, retries: 0, timeoutMs: 6e4 });
@@ -484,7 +484,7 @@ async function uploadImage(config, file, options) {
484
484
  return res.json();
485
485
  }
486
486
  async function assignImageToSlot(config, slotId, options) {
487
- const res = await chunkH65OX263_js.sonorFetch(
487
+ const res = await chunk7DV7Y7BZ_js.sonorFetch(
488
488
  `${config.apiUrl}/public/images/slot/${encodeURIComponent(slotId)}`,
489
489
  {
490
490
  method: "POST",
@@ -511,7 +511,7 @@ async function assignImageToSlot(config, slotId, options) {
511
511
  async function clearImageSlot(config, slotId, pagePath) {
512
512
  const params = new URLSearchParams();
513
513
  if (pagePath) params.set("page_path", pagePath);
514
- const res = await chunkH65OX263_js.sonorFetch(
514
+ const res = await chunk7DV7Y7BZ_js.sonorFetch(
515
515
  `${config.apiUrl}/public/images/slot/${encodeURIComponent(slotId)}?${params}`,
516
516
  { method: "DELETE" },
517
517
  { apiKey: config.apiKey, retries: 0 }
@@ -529,5 +529,5 @@ exports.fetchManagedImage = fetchManagedImage;
529
529
  exports.fetchManagedImages = fetchManagedImages;
530
530
  exports.listImageFiles = listImageFiles;
531
531
  exports.uploadImage = uploadImage;
532
- //# sourceMappingURL=chunk-YKUEFRZI.js.map
533
- //# sourceMappingURL=chunk-YKUEFRZI.js.map
532
+ //# sourceMappingURL=chunk-FWW4K6QP.js.map
533
+ //# sourceMappingURL=chunk-FWW4K6QP.js.map