@sonordev/site-kit 4.3.0 → 4.3.2

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 (334) hide show
  1. package/README.md +14 -6
  2. package/agent-manifest.json +10 -3
  3. package/dist/AnalyticsProvider-DNMYYBKX.js +31 -0
  4. package/dist/{AnalyticsProvider-WRAJE62B.js.map → AnalyticsProvider-DNMYYBKX.js.map} +1 -1
  5. package/dist/AnalyticsProvider-TWRQHKPZ.mjs +10 -0
  6. package/dist/{AnalyticsProvider-YZAOPVAY.mjs.map → AnalyticsProvider-TWRQHKPZ.mjs.map} +1 -1
  7. package/dist/ChatWidget-MDWEXISQ.js +20 -0
  8. package/dist/{ChatWidget-NMZGPP7A.js.map → ChatWidget-MDWEXISQ.js.map} +1 -1
  9. package/dist/ChatWidget-UQMEJAHY.mjs +11 -0
  10. package/dist/{ChatWidget-ZI34F7JU.mjs.map → ChatWidget-UQMEJAHY.mjs.map} +1 -1
  11. package/dist/EngageWidget-UIIN43ZU.mjs +9 -0
  12. package/dist/{EngageWidget-NI2BN6GO.mjs.map → EngageWidget-UIIN43ZU.mjs.map} +1 -1
  13. package/dist/EngageWidget-VRC7NUG6.js +18 -0
  14. package/dist/{EngageWidget-2U4EN7OP.js.map → EngageWidget-VRC7NUG6.js.map} +1 -1
  15. package/dist/{FileField-I4UICUJF.mjs → FileField-LVF3SCDC.mjs} +5 -5
  16. package/dist/{FileField-I4UICUJF.mjs.map → FileField-LVF3SCDC.mjs.map} +1 -1
  17. package/dist/{FileField-UI6DAB3K.js → FileField-W4VXQ3CM.js} +6 -6
  18. package/dist/{FileField-UI6DAB3K.js.map → FileField-W4VXQ3CM.js.map} +1 -1
  19. package/dist/{FormSpotlight-LO4BU6FY.js → FormSpotlight-CRLFAPNI.js} +15 -15
  20. package/dist/{FormSpotlight-LO4BU6FY.js.map → FormSpotlight-CRLFAPNI.js.map} +1 -1
  21. package/dist/{FormSpotlight-RGFZMYPT.mjs → FormSpotlight-ZPISKGIX.mjs} +3 -3
  22. package/dist/{FormSpotlight-RGFZMYPT.mjs.map → FormSpotlight-ZPISKGIX.mjs.map} +1 -1
  23. package/dist/{FormStage-NT5ZAH5Y.js → FormStage-QMRPAROJ.js} +13 -13
  24. package/dist/{FormStage-NT5ZAH5Y.js.map → FormStage-QMRPAROJ.js.map} +1 -1
  25. package/dist/{FormStage-RBXMNWM3.mjs → FormStage-WQOAP7CR.mjs} +3 -3
  26. package/dist/{FormStage-RBXMNWM3.mjs.map → FormStage-WQOAP7CR.mjs.map} +1 -1
  27. package/dist/ManagedForm-7L2W5BBZ.js +23 -0
  28. package/dist/{ManagedForm-MKV5RM54.js.map → ManagedForm-7L2W5BBZ.js.map} +1 -1
  29. package/dist/ManagedForm-D7CFOIXH.mjs +14 -0
  30. package/dist/{ManagedForm-CJOFGQK6.mjs.map → ManagedForm-D7CFOIXH.mjs.map} +1 -1
  31. package/dist/{SignalCore-IX4L2TYS.js → SignalCore-DNXKQKRO.js} +11 -11
  32. package/dist/{SignalCore-IX4L2TYS.js.map → SignalCore-DNXKQKRO.js.map} +1 -1
  33. package/dist/{SignalCore-B2ZSLEXI.mjs → SignalCore-JQLRWMPJ.mjs} +5 -5
  34. package/dist/{SignalCore-B2ZSLEXI.mjs.map → SignalCore-JQLRWMPJ.mjs.map} +1 -1
  35. package/dist/SitemapSync-RFY6PUG7.mjs +8 -0
  36. package/dist/{SitemapSync-2LLNO24P.mjs.map → SitemapSync-RFY6PUG7.mjs.map} +1 -1
  37. package/dist/SitemapSync-SR6OJRIA.js +17 -0
  38. package/dist/{SitemapSync-B2CY2JYM.js.map → SitemapSync-SR6OJRIA.js.map} +1 -1
  39. package/dist/analytics/index.js +9 -9
  40. package/dist/analytics/index.mjs +4 -4
  41. package/dist/blog/server-ui.js +3 -3
  42. package/dist/blog/server-ui.mjs +2 -2
  43. package/dist/blog/server.js +41 -41
  44. package/dist/blog/server.mjs +2 -2
  45. package/dist/{chunk-3DFYFDGC.mjs → chunk-36E6QKGL.mjs} +3 -3
  46. package/dist/{chunk-3DFYFDGC.mjs.map → chunk-36E6QKGL.mjs.map} +1 -1
  47. package/dist/{chunk-6SN3ABID.mjs → chunk-3BXYZC3V.mjs} +3 -3
  48. package/dist/{chunk-6SN3ABID.mjs.map → chunk-3BXYZC3V.mjs.map} +1 -1
  49. package/dist/{chunk-QCZBXG7G.js → chunk-3TXX5KIN.js} +5 -5
  50. package/dist/{chunk-QCZBXG7G.js.map → chunk-3TXX5KIN.js.map} +1 -1
  51. package/dist/{chunk-5PBJ42NC.mjs → chunk-45VPULF2.mjs} +4 -4
  52. package/dist/{chunk-5PBJ42NC.mjs.map → chunk-45VPULF2.mjs.map} +1 -1
  53. package/dist/{chunk-GC3BC6HQ.js → chunk-46BMNWE6.js} +2 -2
  54. package/dist/chunk-46BMNWE6.js.map +1 -0
  55. package/dist/{chunk-K7QBRZLN.js → chunk-4OSZ2JD3.js} +18 -18
  56. package/dist/{chunk-K7QBRZLN.js.map → chunk-4OSZ2JD3.js.map} +1 -1
  57. package/dist/{chunk-OVIDFJIK.mjs → chunk-5YKMHPJL.mjs} +3 -3
  58. package/dist/chunk-5YKMHPJL.mjs.map +1 -0
  59. package/dist/{chunk-SM27DPML.js → chunk-67MTTPJV.js} +13 -12
  60. package/dist/chunk-67MTTPJV.js.map +1 -0
  61. package/dist/{chunk-UDXWBLBH.js → chunk-6ABCPVJL.js} +4 -4
  62. package/dist/{chunk-UDXWBLBH.js.map → chunk-6ABCPVJL.js.map} +1 -1
  63. package/dist/{chunk-SACGTFCK.js → chunk-6CJP7BFM.js} +2 -2
  64. package/dist/chunk-6CJP7BFM.js.map +1 -0
  65. package/dist/{chunk-PA7ENTUZ.mjs → chunk-6VHVIBLQ.mjs} +3 -3
  66. package/dist/{chunk-PA7ENTUZ.mjs.map → chunk-6VHVIBLQ.mjs.map} +1 -1
  67. package/dist/{chunk-2EA4DC2G.js → chunk-6WJDTGM6.js} +5 -5
  68. package/dist/{chunk-2EA4DC2G.js.map → chunk-6WJDTGM6.js.map} +1 -1
  69. package/dist/{chunk-UDBUK5ZJ.mjs → chunk-6XNEGG5B.mjs} +28 -5
  70. package/dist/chunk-6XNEGG5B.mjs.map +1 -0
  71. package/dist/{chunk-L4FHGCQ2.mjs → chunk-A7OO6OPW.mjs} +3 -3
  72. package/dist/{chunk-L4FHGCQ2.mjs.map → chunk-A7OO6OPW.mjs.map} +1 -1
  73. package/dist/{chunk-KRARQ2ZF.mjs → chunk-AJQI3WTN.mjs} +2 -2
  74. package/dist/chunk-AJQI3WTN.mjs.map +1 -0
  75. package/dist/{chunk-U2CJZ6O5.mjs → chunk-B4BFQSSS.mjs} +4 -4
  76. package/dist/{chunk-U2CJZ6O5.mjs.map → chunk-B4BFQSSS.mjs.map} +1 -1
  77. package/dist/{chunk-XPNOM353.mjs → chunk-BUF6IZUE.mjs} +3 -3
  78. package/dist/{chunk-XPNOM353.mjs.map → chunk-BUF6IZUE.mjs.map} +1 -1
  79. package/dist/{chunk-IDSTSLMM.mjs → chunk-C22WW7G2.mjs} +3 -3
  80. package/dist/{chunk-IDSTSLMM.mjs.map → chunk-C22WW7G2.mjs.map} +1 -1
  81. package/dist/chunk-C3M5E4YI.js +25 -0
  82. package/dist/chunk-C3M5E4YI.js.map +1 -0
  83. package/dist/{chunk-T6YDAJ5F.js → chunk-CQWG5ICB.js} +4 -4
  84. package/dist/{chunk-T6YDAJ5F.js.map → chunk-CQWG5ICB.js.map} +1 -1
  85. package/dist/{chunk-U3X6AKCN.mjs → chunk-D4KHH44S.mjs} +22 -11
  86. package/dist/chunk-D4KHH44S.mjs.map +1 -0
  87. package/dist/{chunk-BGIT5M27.js → chunk-E242GZNE.js} +4 -4
  88. package/dist/{chunk-BGIT5M27.js.map → chunk-E242GZNE.js.map} +1 -1
  89. package/dist/{chunk-ANJBOE46.mjs → chunk-EQZ42LAK.mjs} +4 -4
  90. package/dist/{chunk-ANJBOE46.mjs.map → chunk-EQZ42LAK.mjs.map} +1 -1
  91. package/dist/{chunk-IWV72YOE.js → chunk-EUAOOOIE.js} +14 -14
  92. package/dist/{chunk-IWV72YOE.js.map → chunk-EUAOOOIE.js.map} +1 -1
  93. package/dist/{chunk-TMKLH6MY.js → chunk-FBI6LYTM.js} +14 -14
  94. package/dist/{chunk-TMKLH6MY.js.map → chunk-FBI6LYTM.js.map} +1 -1
  95. package/dist/{chunk-PJZHIISA.js → chunk-FIA3WNEM.js} +3 -3
  96. package/dist/{chunk-PJZHIISA.js.map → chunk-FIA3WNEM.js.map} +1 -1
  97. package/dist/{chunk-TBIWQQVF.js → chunk-FPWPRFTP.js} +15 -15
  98. package/dist/{chunk-TBIWQQVF.js.map → chunk-FPWPRFTP.js.map} +1 -1
  99. package/dist/chunk-GZJE23Y5.mjs +21 -0
  100. package/dist/chunk-GZJE23Y5.mjs.map +1 -0
  101. package/dist/{chunk-3AAFSXFC.js → chunk-H27UCW6K.js} +15 -15
  102. package/dist/{chunk-3AAFSXFC.js.map → chunk-H27UCW6K.js.map} +1 -1
  103. package/dist/{chunk-7X4LKAYJ.js → chunk-H3F4GV2S.js} +14 -14
  104. package/dist/{chunk-7X4LKAYJ.js.map → chunk-H3F4GV2S.js.map} +1 -1
  105. package/dist/{chunk-IW6S62NR.js → chunk-I2IA3JXD.js} +8 -8
  106. package/dist/{chunk-IW6S62NR.js.map → chunk-I2IA3JXD.js.map} +1 -1
  107. package/dist/{chunk-ACL5FDJI.mjs → chunk-I6XKZNFT.mjs} +3 -3
  108. package/dist/{chunk-ACL5FDJI.mjs.map → chunk-I6XKZNFT.mjs.map} +1 -1
  109. package/dist/{chunk-LVMPYAOQ.mjs → chunk-INR6AQ54.mjs} +4 -4
  110. package/dist/{chunk-LVMPYAOQ.mjs.map → chunk-INR6AQ54.mjs.map} +1 -1
  111. package/dist/{chunk-IT76CWZ2.mjs → chunk-JNKQKGYH.mjs} +3 -3
  112. package/dist/{chunk-IT76CWZ2.mjs.map → chunk-JNKQKGYH.mjs.map} +1 -1
  113. package/dist/{chunk-NF3QVKWU.js → chunk-JX3PO2MH.js} +4 -4
  114. package/dist/{chunk-NF3QVKWU.js.map → chunk-JX3PO2MH.js.map} +1 -1
  115. package/dist/{chunk-A624YYDG.js → chunk-L2LJQIM3.js} +11 -11
  116. package/dist/{chunk-A624YYDG.js.map → chunk-L2LJQIM3.js.map} +1 -1
  117. package/dist/{chunk-G5EETWKH.mjs → chunk-LQENHKD3.mjs} +4 -4
  118. package/dist/{chunk-G5EETWKH.mjs.map → chunk-LQENHKD3.mjs.map} +1 -1
  119. package/dist/{chunk-JJTCVH4Q.mjs → chunk-LVM63JSA.mjs} +3 -3
  120. package/dist/{chunk-JJTCVH4Q.mjs.map → chunk-LVM63JSA.mjs.map} +1 -1
  121. package/dist/{chunk-3KVG2PSJ.js → chunk-M52FYLV4.js} +7 -7
  122. package/dist/{chunk-3KVG2PSJ.js.map → chunk-M52FYLV4.js.map} +1 -1
  123. package/dist/{chunk-YSLGMCQH.mjs → chunk-MWKYLWCH.mjs} +9 -8
  124. package/dist/chunk-MWKYLWCH.mjs.map +1 -0
  125. package/dist/{chunk-OBRGUSGB.mjs → chunk-NDS6MXIP.mjs} +3 -3
  126. package/dist/{chunk-OBRGUSGB.mjs.map → chunk-NDS6MXIP.mjs.map} +1 -1
  127. package/dist/{chunk-3ZD2XCLE.mjs → chunk-NJ4YX3CI.mjs} +4 -4
  128. package/dist/{chunk-3ZD2XCLE.mjs.map → chunk-NJ4YX3CI.mjs.map} +1 -1
  129. package/dist/{chunk-QEHPIQYN.mjs → chunk-NQEUFRMX.mjs} +3 -3
  130. package/dist/{chunk-QEHPIQYN.mjs.map → chunk-NQEUFRMX.mjs.map} +1 -1
  131. package/dist/chunk-NQNSATTA.mjs +6 -0
  132. package/dist/{chunk-2X5ZB5D7.mjs.map → chunk-NQNSATTA.mjs.map} +1 -1
  133. package/dist/{chunk-QPIKPWAZ.js → chunk-O5GHP7UO.js} +28 -5
  134. package/dist/chunk-O5GHP7UO.js.map +1 -0
  135. package/dist/{chunk-SABYEM57.js → chunk-OQTP5M5Y.js} +9 -9
  136. package/dist/{chunk-SABYEM57.js.map → chunk-OQTP5M5Y.js.map} +1 -1
  137. package/dist/chunk-OZ3FU4BT.js +23 -0
  138. package/dist/chunk-OZ3FU4BT.js.map +1 -0
  139. package/dist/{chunk-JBX6KV46.mjs → chunk-PSBAUXUH.mjs} +4 -4
  140. package/dist/{chunk-JBX6KV46.mjs.map → chunk-PSBAUXUH.mjs.map} +1 -1
  141. package/dist/{chunk-77CIIDE6.js → chunk-PXAALKTP.js} +3 -3
  142. package/dist/chunk-PXAALKTP.js.map +1 -0
  143. package/dist/{chunk-5S735BSH.mjs → chunk-R6XBPA6C.mjs} +4 -4
  144. package/dist/{chunk-5S735BSH.mjs.map → chunk-R6XBPA6C.mjs.map} +1 -1
  145. package/dist/{chunk-CBUGUKRD.js → chunk-R7V7HNJJ.js} +22 -11
  146. package/dist/chunk-R7V7HNJJ.js.map +1 -0
  147. package/dist/{chunk-NGAKS4WG.js → chunk-RUOEUMAW.js} +3 -3
  148. package/dist/{chunk-NGAKS4WG.js.map → chunk-RUOEUMAW.js.map} +1 -1
  149. package/dist/{chunk-IUZ2RH4V.mjs → chunk-SFMNUVDN.mjs} +3 -3
  150. package/dist/{chunk-IUZ2RH4V.mjs.map → chunk-SFMNUVDN.mjs.map} +1 -1
  151. package/dist/{chunk-IWFQPGA2.mjs → chunk-TY3BPHTE.mjs} +7 -7
  152. package/dist/{chunk-IWFQPGA2.mjs.map → chunk-TY3BPHTE.mjs.map} +1 -1
  153. package/dist/{chunk-SRJSR6YP.mjs → chunk-UJ6CHZAI.mjs} +2 -2
  154. package/dist/chunk-UJ6CHZAI.mjs.map +1 -0
  155. package/dist/{chunk-R2O5VDNJ.js → chunk-ULP6BTN2.js} +12 -12
  156. package/dist/{chunk-R2O5VDNJ.js.map → chunk-ULP6BTN2.js.map} +1 -1
  157. package/dist/{chunk-2CHOHLB7.mjs → chunk-UOTXSWKZ.mjs} +3 -3
  158. package/dist/{chunk-2CHOHLB7.mjs.map → chunk-UOTXSWKZ.mjs.map} +1 -1
  159. package/dist/{chunk-LTALFZX7.js → chunk-UR4HKLHW.js} +6 -6
  160. package/dist/{chunk-LTALFZX7.js.map → chunk-UR4HKLHW.js.map} +1 -1
  161. package/dist/chunk-UXIUJYFK.js +8 -0
  162. package/dist/{chunk-U3P4WF2A.js.map → chunk-UXIUJYFK.js.map} +1 -1
  163. package/dist/{chunk-O4TMBV54.js → chunk-VLHHBJSV.js} +8 -8
  164. package/dist/{chunk-O4TMBV54.js.map → chunk-VLHHBJSV.js.map} +1 -1
  165. package/dist/{chunk-RW76CJBS.mjs → chunk-VU45CH5R.mjs} +3 -3
  166. package/dist/{chunk-RW76CJBS.mjs.map → chunk-VU45CH5R.mjs.map} +1 -1
  167. package/dist/{chunk-IZVV36RT.js → chunk-VYNOQCEK.js} +14 -14
  168. package/dist/{chunk-IZVV36RT.js.map → chunk-VYNOQCEK.js.map} +1 -1
  169. package/dist/{chunk-DYDJ6NCM.mjs → chunk-X2PAODFM.mjs} +3 -3
  170. package/dist/{chunk-DYDJ6NCM.mjs.map → chunk-X2PAODFM.mjs.map} +1 -1
  171. package/dist/{chunk-OOBEJZJ5.js → chunk-YWBXKEAF.js} +3 -3
  172. package/dist/{chunk-OOBEJZJ5.js.map → chunk-YWBXKEAF.js.map} +1 -1
  173. package/dist/chunk-ZWMAQ52D.mjs +23 -0
  174. package/dist/chunk-ZWMAQ52D.mjs.map +1 -0
  175. package/dist/{chunk-FIVPS4Z6.js → chunk-ZXRORNAW.js} +4 -4
  176. package/dist/{chunk-FIVPS4Z6.js.map → chunk-ZXRORNAW.js.map} +1 -1
  177. package/dist/cli/commands/og.d.ts +33 -0
  178. package/dist/cli/commands/og.d.ts.map +1 -1
  179. package/dist/cli/commands/og.test.d.ts +2 -0
  180. package/dist/cli/commands/og.test.d.ts.map +1 -0
  181. package/dist/cli/index.js +61 -25
  182. package/dist/cli/index.js.map +1 -1
  183. package/dist/cli/index.mjs +54 -18
  184. package/dist/cli/index.mjs.map +1 -1
  185. package/dist/client/index.js +5 -4
  186. package/dist/client/index.js.map +1 -1
  187. package/dist/client/index.mjs +4 -3
  188. package/dist/client/index.mjs.map +1 -1
  189. package/dist/cms/index.js +3 -3
  190. package/dist/cms/index.mjs +2 -2
  191. package/dist/cms/server.js +5 -5
  192. package/dist/cms/server.mjs +2 -2
  193. package/dist/commerce/index.js +56 -56
  194. package/dist/commerce/index.mjs +5 -5
  195. package/dist/config/index.d.ts +1 -1
  196. package/dist/config/index.d.ts.map +1 -1
  197. package/dist/config/index.js +2 -2
  198. package/dist/config/index.js.map +1 -1
  199. package/dist/config/index.mjs +1 -1
  200. package/dist/config/index.mjs.map +1 -1
  201. package/dist/engage/index.js +10 -10
  202. package/dist/engage/index.mjs +7 -7
  203. package/dist/fleet/index.js +8 -8
  204. package/dist/fleet/index.mjs +4 -4
  205. package/dist/forms/index.js +16 -16
  206. package/dist/forms/index.mjs +9 -9
  207. package/dist/forms/server.js +12 -12
  208. package/dist/forms/server.mjs +9 -9
  209. package/dist/forms/static.js +7 -7
  210. package/dist/forms/static.mjs +6 -6
  211. package/dist/images/index.js +11 -11
  212. package/dist/images/index.mjs +4 -4
  213. package/dist/index.js +68 -68
  214. package/dist/index.mjs +10 -10
  215. package/dist/layout/client.js +9 -8
  216. package/dist/layout/client.mjs +8 -7
  217. package/dist/layout/index.js +13 -12
  218. package/dist/layout/index.js.map +1 -1
  219. package/dist/layout/index.mjs +10 -9
  220. package/dist/layout/index.mjs.map +1 -1
  221. package/dist/llms/api.d.ts +13 -3
  222. package/dist/llms/api.d.ts.map +1 -1
  223. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  224. package/dist/llms/index.js +14 -12
  225. package/dist/llms/index.js.map +1 -1
  226. package/dist/llms/index.mjs +4 -2
  227. package/dist/llms/index.mjs.map +1 -1
  228. package/dist/llms/types.d.ts +8 -0
  229. package/dist/llms/types.d.ts.map +1 -1
  230. package/dist/llms/writeLLMsTxt.d.ts +9 -0
  231. package/dist/llms/writeLLMsTxt.d.ts.map +1 -1
  232. package/dist/maps/index.js +5 -5
  233. package/dist/maps/index.mjs +3 -3
  234. package/dist/og/config.d.ts +6 -0
  235. package/dist/og/config.d.ts.map +1 -1
  236. package/dist/og/index.js +5 -5
  237. package/dist/og/index.mjs +1 -1
  238. package/dist/og/pages.d.ts +39 -1
  239. package/dist/og/pages.d.ts.map +1 -1
  240. package/dist/{middleware → proxy}/index.d.ts +19 -9
  241. package/dist/proxy/index.d.ts.map +1 -0
  242. package/dist/{middleware → proxy}/index.js +10 -10
  243. package/dist/proxy/index.js.map +1 -0
  244. package/dist/{middleware → proxy}/index.mjs +7 -7
  245. package/dist/proxy/index.mjs.map +1 -0
  246. package/dist/proxy/securityHeaders.d.ts.map +1 -0
  247. package/dist/proxy/securityHeaders.test.d.ts.map +1 -0
  248. package/dist/{middleware → proxy}/segment.d.ts +1 -1
  249. package/dist/proxy/segment.d.ts.map +1 -0
  250. package/dist/proxy/segment.test.d.ts.map +1 -0
  251. package/dist/redirects/index.d.ts +2 -2
  252. package/dist/redirects/index.js +8 -8
  253. package/dist/redirects/index.mjs +1 -1
  254. package/dist/redirects/not-found.js +5 -5
  255. package/dist/redirects/not-found.mjs +1 -1
  256. package/dist/search/index.js +4 -4
  257. package/dist/search/index.mjs +3 -3
  258. package/dist/seo/client.js +5 -5
  259. package/dist/seo/client.mjs +4 -4
  260. package/dist/seo/index.js +43 -43
  261. package/dist/seo/index.mjs +9 -9
  262. package/dist/seo/routing.d.ts +3 -3
  263. package/dist/seo/server.js +19 -19
  264. package/dist/seo/server.mjs +3 -3
  265. package/dist/server/index.js +8 -8
  266. package/dist/server/index.mjs +3 -3
  267. package/dist/server/server-fetch.d.ts +7 -0
  268. package/dist/server/server-fetch.d.ts.map +1 -1
  269. package/dist/server/server-fetch.test.d.ts +2 -0
  270. package/dist/server/server-fetch.test.d.ts.map +1 -0
  271. package/dist/{server-api-GRZ3ZBCC.js → server-api-DB2SIUP4.js} +22 -22
  272. package/dist/{server-api-GRZ3ZBCC.js.map → server-api-DB2SIUP4.js.map} +1 -1
  273. package/dist/{server-api-2RAXJS3T.mjs → server-api-HW4PL2L2.mjs} +4 -4
  274. package/dist/{server-api-2RAXJS3T.mjs.map → server-api-HW4PL2L2.mjs.map} +1 -1
  275. package/dist/shared/build-entries.d.ts +1 -1
  276. package/dist/shared/build-entries.d.ts.map +1 -1
  277. package/dist/shared/publishCredential.d.ts +25 -9
  278. package/dist/shared/publishCredential.d.ts.map +1 -1
  279. package/dist/shared/version.d.ts +1 -1
  280. package/dist/signal/index.js +11 -11
  281. package/dist/signal/index.mjs +2 -2
  282. package/dist/sitemap/index.d.ts +46 -0
  283. package/dist/sitemap/index.d.ts.map +1 -1
  284. package/dist/sitemap/index.js +31 -10
  285. package/dist/sitemap/index.js.map +1 -1
  286. package/dist/sitemap/index.mjs +31 -10
  287. package/dist/sitemap/index.mjs.map +1 -1
  288. package/dist/sitemap/site-scope.test.d.ts +2 -0
  289. package/dist/sitemap/site-scope.test.d.ts.map +1 -0
  290. package/dist/sites/resolve.d.ts +7 -0
  291. package/dist/sites/resolve.d.ts.map +1 -0
  292. package/dist/slots/index.js +2 -2
  293. package/dist/slots/index.mjs +1 -1
  294. package/dist/sync/index.js +16 -16
  295. package/dist/sync/index.mjs +4 -4
  296. package/package.json +10 -5
  297. package/dist/AnalyticsProvider-WRAJE62B.js +0 -31
  298. package/dist/AnalyticsProvider-YZAOPVAY.mjs +0 -10
  299. package/dist/ChatWidget-NMZGPP7A.js +0 -20
  300. package/dist/ChatWidget-ZI34F7JU.mjs +0 -11
  301. package/dist/EngageWidget-2U4EN7OP.js +0 -18
  302. package/dist/EngageWidget-NI2BN6GO.mjs +0 -9
  303. package/dist/ManagedForm-CJOFGQK6.mjs +0 -14
  304. package/dist/ManagedForm-MKV5RM54.js +0 -23
  305. package/dist/SitemapSync-2LLNO24P.mjs +0 -8
  306. package/dist/SitemapSync-B2CY2JYM.js +0 -17
  307. package/dist/chunk-2X5ZB5D7.mjs +0 -6
  308. package/dist/chunk-77CIIDE6.js.map +0 -1
  309. package/dist/chunk-CBUGUKRD.js.map +0 -1
  310. package/dist/chunk-F3MOVBEE.js +0 -40
  311. package/dist/chunk-F3MOVBEE.js.map +0 -1
  312. package/dist/chunk-GC3BC6HQ.js.map +0 -1
  313. package/dist/chunk-KRARQ2ZF.mjs.map +0 -1
  314. package/dist/chunk-OVIDFJIK.mjs.map +0 -1
  315. package/dist/chunk-QPIKPWAZ.js.map +0 -1
  316. package/dist/chunk-SACGTFCK.js.map +0 -1
  317. package/dist/chunk-SM27DPML.js.map +0 -1
  318. package/dist/chunk-SRJSR6YP.mjs.map +0 -1
  319. package/dist/chunk-U3P4WF2A.js +0 -8
  320. package/dist/chunk-U3X6AKCN.mjs.map +0 -1
  321. package/dist/chunk-UDBUK5ZJ.mjs.map +0 -1
  322. package/dist/chunk-UFT7IKDN.mjs +0 -37
  323. package/dist/chunk-UFT7IKDN.mjs.map +0 -1
  324. package/dist/chunk-YSLGMCQH.mjs.map +0 -1
  325. package/dist/middleware/index.d.ts.map +0 -1
  326. package/dist/middleware/index.js.map +0 -1
  327. package/dist/middleware/index.mjs.map +0 -1
  328. package/dist/middleware/securityHeaders.d.ts.map +0 -1
  329. package/dist/middleware/securityHeaders.test.d.ts.map +0 -1
  330. package/dist/middleware/segment.d.ts.map +0 -1
  331. package/dist/middleware/segment.test.d.ts.map +0 -1
  332. /package/dist/{middleware → proxy}/securityHeaders.d.ts +0 -0
  333. /package/dist/{middleware → proxy}/securityHeaders.test.d.ts +0 -0
  334. /package/dist/{middleware → proxy}/segment.test.d.ts +0 -0
@@ -1,7 +1,8 @@
1
1
  /**
2
- * @sonordev/site-kit/middleware
2
+ * @sonordev/site-kit/proxy
3
3
  *
4
- * Composable Next.js proxy/middleware factory. Handles:
4
+ * Composable Next.js Proxy factory (Next 16's replacement for middleware).
5
+ * Also served on the deprecated `/middleware` subpath. Handles:
5
6
  * - Security headers (CSP frame-ancestors, nosniff, referrer/permissions
6
7
  * policy — deliberately NO X-Frame-Options; see securityHeaders.ts)
7
8
  * - Portal-managed redirects (legacy hot-path mode; prefer the 404-boundary
@@ -11,8 +12,8 @@
11
12
  *
12
13
  * @example
13
14
  * ```ts
14
- * // proxy.ts — entire file (Next 16 name for middleware.ts)
15
- * import { createProxy } from '@sonordev/site-kit/middleware'
15
+ * // proxy.ts — entire file
16
+ * import { createProxy } from '@sonordev/site-kit/proxy'
16
17
  *
17
18
  * export default createProxy()
18
19
  *
@@ -62,7 +63,7 @@ export interface LlmsDiscoveryConfig {
62
63
  /** Path to llms.txt (default `/llms.txt`) */
63
64
  llmsPath?: string;
64
65
  }
65
- export interface SiteKitMiddlewareConfig {
66
+ export interface SiteKitProxyConfig {
66
67
  /**
67
68
  * Portal-managed redirects on the proxy hot path. Default: true (legacy).
68
69
  *
@@ -108,11 +109,12 @@ export interface SiteKitMiddlewareConfig {
108
109
  after?: (request: NextRequest, response: NextResponse) => NextResponse | Promise<NextResponse>;
109
110
  }
110
111
  /**
111
- * Create a fully-featured Next.js middleware function.
112
+ * Create a fully-featured Next.js Proxy function.
112
113
  *
113
114
  * With zero config this handles redirects + security headers automatically.
115
+ * Export it from `proxy.ts` at the project root (or `src/`).
114
116
  */
115
- export declare function createMiddleware(config?: SiteKitMiddlewareConfig): (request: NextRequest) => Promise<NextResponse>;
117
+ export declare function createProxy(config?: SiteKitProxyConfig): (request: NextRequest) => Promise<NextResponse>;
116
118
  /**
117
119
  * REFERENCE VALUE ONLY — copy the array into your proxy.ts, do not export it.
118
120
  *
@@ -124,6 +126,14 @@ export declare function createMiddleware(config?: SiteKitMiddlewareConfig): (req
124
126
  export declare const siteKitMatcher: {
125
127
  matcher: string[];
126
128
  };
127
- /** Next.js 16+ alias — same as createMiddleware, named for the proxy convention. */
128
- export declare const createProxy: typeof createMiddleware;
129
+ /**
130
+ * @deprecated Use `createProxy`. Next 16 renamed the `middleware` file
131
+ * convention to `proxy` (`npx @next/codemod@canary middleware-to-proxy .`);
132
+ * the old name still builds but warns, and the factory is named for the file
133
+ * it is exported from. Kept indefinitely — 100+ fleet sites import it — but
134
+ * new code should say `createProxy` from `@sonordev/site-kit/proxy`.
135
+ */
136
+ export declare const createMiddleware: typeof createProxy;
137
+ /** @deprecated Use `SiteKitProxyConfig`. */
138
+ export type SiteKitMiddlewareConfig = SiteKitProxyConfig;
129
139
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,cAAc,CAAA;AACrB,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAA;AAO1B,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,WAAW,CAAA;AAElB,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAA;IACf,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,cAAc,CAAA;IACpC,6CAA6C;IAC7C,eAAe,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAA;IACjD;;;;OAIG;IACH,aAAa,CAAC,EAAE,mBAAmB,GAAG,KAAK,CAAA;IAC3C;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,cAAc,CAAA;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,CACP,OAAO,EAAE,WAAW,KACjB,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAA;IACjE;;;OAGG;IACH,KAAK,CAAC,EAAE,CACN,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,KACnB,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CAC1C;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,kBAAkB,aAe1C,WAAW,KACnB,OAAO,CAAC,YAAY,CAAC,CAwFzB;AAWD;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc;IACzB,OAAO;CAGR,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,oBAAc,CAAA;AAE3C,4CAA4C;AAC5C,MAAM,MAAM,uBAAuB,GAAG,kBAAkB,CAAA"}
@@ -1,14 +1,14 @@
1
1
  'use strict';
2
2
 
3
- var chunk77CIIDE6_js = require('../chunk-77CIIDE6.js');
3
+ var chunkPXAALKTP_js = require('../chunk-PXAALKTP.js');
4
4
  var chunk5B4FABFK_js = require('../chunk-5B4FABFK.js');
5
- var chunkGC3BC6HQ_js = require('../chunk-GC3BC6HQ.js');
5
+ var chunk46BMNWE6_js = require('../chunk-46BMNWE6.js');
6
6
  require('../chunk-JP5WGL75.js');
7
7
  var chunkVJMPIRSD_js = require('../chunk-VJMPIRSD.js');
8
8
  require('../chunk-SNAQBZPT.js');
9
9
  var server = require('next/server');
10
10
 
11
- // src/middleware/segment.ts
11
+ // src/proxy/segment.ts
12
12
  var PAID_MEDIUMS = ["cpc", "ppc", "paid", "paidsearch", "paid-search", "display", "cpm", "banner"];
13
13
  var SOCIAL_MEDIUMS = ["social", "social-media", "social_media", "sm"];
14
14
  var SOCIAL_HOSTS = [
@@ -77,9 +77,9 @@ function decodeSegment(value) {
77
77
  };
78
78
  }
79
79
 
80
- // src/middleware/index.ts
81
- function createMiddleware(config) {
82
- const securityHeaders = chunk77CIIDE6_js.buildSecurityHeaders(
80
+ // src/proxy/index.ts
81
+ function createProxy(config) {
82
+ const securityHeaders = chunkPXAALKTP_js.buildSecurityHeaders(
83
83
  config?.securityHeaders
84
84
  );
85
85
  const discoveryHeaders = config?.llmsDiscovery ? chunk5B4FABFK_js.buildAiDiscoveryHeaders({
@@ -96,7 +96,7 @@ function createMiddleware(config) {
96
96
  }
97
97
  if (config?.redirects !== false) {
98
98
  const redirectConfig = typeof config?.redirects === "object" ? config.redirects : {};
99
- const redirect = await chunkGC3BC6HQ_js.handleManagedRedirects(
99
+ const redirect = await chunk46BMNWE6_js.handleManagedRedirects(
100
100
  request,
101
101
  redirectConfig
102
102
  );
@@ -107,7 +107,7 @@ function createMiddleware(config) {
107
107
  }
108
108
  const requestHeaders = new Headers(request.headers);
109
109
  requestHeaders.set(
110
- chunkGC3BC6HQ_js.SK_PATH_HEADER,
110
+ chunk46BMNWE6_js.SK_PATH_HEADER,
111
111
  request.nextUrl.pathname + request.nextUrl.search
112
112
  );
113
113
  let response = server.NextResponse.next({ request: { headers: requestHeaders } });
@@ -159,11 +159,11 @@ var siteKitMatcher = {
159
159
  "/((?!_next/static|_next/image|favicon\\.ico|.*\\.(?:ico|png|jpg|jpeg|gif|webp|svg|woff2?)$).*)"
160
160
  ]
161
161
  };
162
- var createProxy = createMiddleware;
162
+ var createMiddleware = createProxy;
163
163
 
164
164
  Object.defineProperty(exports, "DEFAULT_FRAME_ANCESTORS", {
165
165
  enumerable: true,
166
- get: function () { return chunk77CIIDE6_js.DEFAULT_FRAME_ANCESTORS; }
166
+ get: function () { return chunkPXAALKTP_js.DEFAULT_FRAME_ANCESTORS; }
167
167
  });
168
168
  exports.createMiddleware = createMiddleware;
169
169
  exports.createProxy = createProxy;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/proxy/segment.ts","../../src/proxy/index.ts"],"names":["buildSecurityHeaders","buildAiDiscoveryHeaders","handleManagedRedirects","SK_PATH_HEADER","NextResponse","uuid"],"mappings":";;;;;;;;;;;AAyBA,IAAM,YAAA,GAAe,CAAC,KAAA,EAAO,KAAA,EAAO,QAAQ,YAAA,EAAc,aAAA,EAAe,SAAA,EAAW,KAAA,EAAO,QAAQ,CAAA;AACnG,IAAM,cAAA,GAAiB,CAAC,QAAA,EAAU,cAAA,EAAgB,gBAAgB,IAAI,CAAA;AACtE,IAAM,YAAA,GAAe;AAAA,EACnB,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA;AACA,IAAM,YAAA,GAAe,CAAC,SAAA,EAAW,OAAA,EAAS,eAAe,QAAA,EAAU,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,SAAS,CAAA;AAMpG,SAAS,qBAAA,CACd,SACA,IAAA,EACgB;AAChB,EAAA,MAAM,MAAA,GAAS,QAAQ,OAAA,CAAQ,YAAA;AAC/B,EAAA,MAAM,MAAA,GAAA,CAAU,OAAO,GAAA,CAAI,YAAY,KAAK,EAAA,EAAI,WAAA,GAAc,IAAA,EAAK;AACnE,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,cAAc,CAAA;AAE1C,EAAA,IAAI,MAAA,GAAwB,QAAA;AAE5B,EAAA,IAAI,YAAA,CAAa,QAAA,CAAS,MAAM,CAAA,EAAG;AACjC,IAAA,MAAA,GAAS,MAAA;AAAA,EACX,CAAA,MAAA,IAAW,cAAA,CAAe,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1C,IAAA,MAAA,GAAS,QAAA;AAAA,EACX,CAAA,MAAA,IAAW,WAAW,SAAA,EAAW;AAC/B,IAAA,MAAA,GAAS,SAAA;AAAA,EACX,CAAA,MAAA,IAAW,WAAW,UAAA,EAAY;AAChC,IAAA,MAAA,GAAS,UAAA;AAAA,EACX,CAAA,MAAA,IAAW,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA,IAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,IAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA,EAAG;AAElF,IAAA,IAAI,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,EAAG,MAAA,GAAS,MAAA;AAAA,SAAA,IACzB,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA,EAAG,MAAA,GAAS,QAAA;AAAA,SACnC,MAAA,GAAS,UAAA;AAAA,EAChB,CAAA,MAAO;AAEL,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,IAAK,EAAA;AAC9C,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,KAAK,WAAA,EAAY;AAC3C,QAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAY;AAClD,QAAA,IAAI,IAAA,IAAQ,SAAS,QAAA,EAAU;AAC7B,UAAA,IAAI,YAAA,CAAa,KAAK,CAAC,CAAA,KAAM,KAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,MAAA,GAAS,SAAA;AAAA,eAAA,IAChD,YAAA,CAAa,KAAK,CAAC,CAAA,KAAM,KAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,MAAA,GAAS,QAAA;AAAA,eACzD,MAAA,GAAS,UAAA;AAAA,QAChB;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,IAAA,CAAK,gBAAA,GAAmB,WAAA,GAAc,KAAA;AAAA,IACnD,MAAA;AAAA,IACA,UAAU,QAAA,IAAY;AAAA,GACxB;AACF;AAOO,SAAS,cAAc,GAAA,EAA6B;AACzD,EAAA,MAAM,QAAA,GAAA,CAAY,GAAA,CAAI,QAAA,IAAY,EAAA,EAAI,OAAA,CAAQ,mBAAmB,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAChF,EAAA,OAAO,GAAG,GAAA,CAAI,WAAW,IAAI,GAAA,CAAI,MAAM,IAAI,QAAQ,CAAA,CAAA;AACrD;AAGO,SAAS,cAAc,KAAA,EAAyD;AACrF,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,CAAC,WAAA,EAAa,MAAA,EAAQ,QAAQ,CAAA,GAAI,KAAA,CAAM,MAAM,GAAG,CAAA;AACvD,EAAA,IAAI,WAAA,KAAgB,KAAA,IAAS,WAAA,KAAgB,WAAA,EAAa,OAAO,IAAA;AACjE,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,MAAA,EAAS,CAAC,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,QAAQ,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS,QAAA;AAAA,IACzF,UAAU,QAAA,IAAY;AAAA,GACxB;AACF;;;ACgCO,SAAS,YAAY,MAAA,EAA6B;AACvD,EAAA,MAAM,eAAA,GAAkBA,qCAAA;AAAA,IACtB,MAAA,EAAQ;AAAA,GACV;AAGA,EAAA,MAAM,gBAAA,GACJ,MAAA,EAAQ,aAAA,GACJC,wCAAA,CAAwB;AAAA,IACtB,OAAA,EAAS,OAAO,aAAA,CAAc,OAAA;AAAA,IAC9B,QAAA,EAAU,OAAO,aAAA,CAAc;AAAA,GAChC,IACD,EAAC;AAEP,EAAA,OAAO,eAAe,MACpB,OAAA,EACuB;AAEvB,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AACjD,MAAA,IAAI,aAAA,EAAe;AAEjB,QAAA,YAAA,CAAa,eAAe,eAAe,CAAA;AAC3C,QAAA,OAAO,aAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,EAAQ,cAAc,KAAA,EAAO;AAC/B,MAAA,MAAM,iBACJ,OAAO,MAAA,EAAQ,cAAc,QAAA,GACzB,MAAA,CAAO,YACP,EAAC;AAEP,MAAA,MAAM,WAAW,MAAMC,uCAAA;AAAA,QACrB,OAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,YAAA,CAAa,UAAU,eAAe,CAAA;AACtC,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AAMA,IAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAClD,IAAA,cAAA,CAAe,GAAA;AAAA,MACbC,+BAAA;AAAA,MACA,OAAA,CAAQ,OAAA,CAAQ,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ;AAAA,KAC7C;AACA,IAAA,IAAI,QAAA,GAAWC,oBAAa,IAAA,CAAK,EAAE,SAAS,EAAE,OAAA,EAAS,cAAA,EAAe,EAAG,CAAA;AAGzE,IAAA,YAAA,CAAa,UAAU,eAAe,CAAA;AAGtC,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,CAAE,SAAS,CAAA,EAAG;AAC5C,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,IAAK,EAAA;AAChD,MAAA,IAAI,OAAO,QAAA,CAAS,WAAW,KAAK,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC1D,QAAA,YAAA,CAAa,UAAU,gBAAgB,CAAA;AAAA,MACzC;AAAA,IACF;AAKA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,QACJ,OAAO,MAAA,CAAO,aAAa,QAAA,GAAW,MAAA,CAAO,WAAW,EAAC;AAC3D,MAAA,MAAM,mBAAmB,CAAC,CAAC,QAAQ,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG,KAAA;AAC3D,MAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,QAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,IAAoB,GAAA;AAC7C,QAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAWC,qBAAA,EAAK,EAAG;AAAA,UACtC,MAAA,EAAQ,UAAA,GAAa,EAAA,GAAK,EAAA,GAAK,EAAA;AAAA,UAC/B,IAAA,EAAM,GAAA;AAAA,UACN,QAAA,EAAU,KAAA;AAAA,UACV,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AACA,MAAA,IAAI,KAAA,CAAM,YAAY,KAAA,EAAO;AAC3B,QAAA,MAAM,OAAA,GAAU,aAAA;AAAA,UACd,qBAAA,CAAsB,OAAA,EAAS,EAAE,gBAAA,EAAkB;AAAA,SACrD;AACA,QAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,OAAA,EAAS;AAAA;AAAA,UAEvC,QAAQ,EAAA,GAAK,EAAA;AAAA,UACb,IAAA,EAAM,GAAA;AAAA,UACN,QAAA,EAAU,KAAA;AAAA,UACV,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,QAAA,GAAW,MAAM,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,QAAQ,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO,QAAA;AAAA,EACT,CAAA;AACF;AAEA,SAAS,YAAA,CACP,UACA,OAAA,EACM;AACN,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EACjC;AACF;AAUO,IAAM,cAAA,GAAiB;AAAA,EAC5B,OAAA,EAAS;AAAA,IACP;AAAA;AAEJ;AASO,IAAM,gBAAA,GAAmB","file":"index.js","sourcesContent":["/**\n * @sonordev/site-kit/proxy — visitor segment resolution (the \"one edge pass\").\n *\n * Pure, edge-runtime-safe helpers that classify a request into a coarse visitor\n * segment (new-vs-returning + marketing source + campaign) from the URL's UTM\n * params and the referrer. The middleware writes the result to the `_sk_seg`\n * cookie so server-rendered slots / personalization can vary by segment WITHOUT\n * each one re-parsing the request. Resolved once, at the edge.\n *\n * Kept side-effect-free (no NextResponse, no cookie writes) so it is trivially\n * unit-testable and reusable.\n */\nimport type { NextRequest } from 'next/server'\n\nexport type SegmentSource = 'paid' | 'organic' | 'social' | 'referral' | 'direct'\n\nexport interface VisitorSegment {\n /** `new` on the first visit (no prior `_sk_vid` cookie), else `returning`. */\n visitorType: 'new' | 'returning'\n /** Marketing source bucket derived from UTM medium/source, then referrer. */\n source: SegmentSource\n /** `utm_campaign`, if present (sanitized when encoded). */\n campaign: string | null\n}\n\nconst PAID_MEDIUMS = ['cpc', 'ppc', 'paid', 'paidsearch', 'paid-search', 'display', 'cpm', 'banner']\nconst SOCIAL_MEDIUMS = ['social', 'social-media', 'social_media', 'sm']\nconst SOCIAL_HOSTS = [\n 'facebook.',\n 'instagram.',\n 'linkedin.',\n 't.co',\n 'twitter.',\n 'x.com',\n 'pinterest.',\n 'tiktok.',\n 'youtube.',\n 'reddit.',\n]\nconst SEARCH_HOSTS = ['google.', 'bing.', 'duckduckgo.', 'yahoo.', 'ecosia.', 'brave.', 'baidu.', 'yandex.']\n\n/**\n * Classify `request` into a {@link VisitorSegment}. UTM params win over the\n * referrer; a same-host referrer is ignored (internal navigation, not a source).\n */\nexport function resolveVisitorSegment(\n request: NextRequest,\n opts: { hadVisitorCookie: boolean },\n): VisitorSegment {\n const params = request.nextUrl.searchParams\n const medium = (params.get('utm_medium') || '').toLowerCase().trim()\n const campaign = params.get('utm_campaign')\n\n let source: SegmentSource = 'direct'\n\n if (PAID_MEDIUMS.includes(medium)) {\n source = 'paid'\n } else if (SOCIAL_MEDIUMS.includes(medium)) {\n source = 'social'\n } else if (medium === 'organic') {\n source = 'organic'\n } else if (medium === 'referral') {\n source = 'referral'\n } else if (params.get('utm_source') || params.get('gclid') || params.get('fbclid')) {\n // A tagged link with a non-standard medium: gclid => paid Google, fbclid => social.\n if (params.get('gclid')) source = 'paid'\n else if (params.get('fbclid')) source = 'social'\n else source = 'referral'\n } else {\n // No campaign tagging — fall back to the referrer host.\n const ref = request.headers.get('referer') || ''\n if (ref) {\n try {\n const host = new URL(ref).host.toLowerCase()\n const selfHost = request.nextUrl.host.toLowerCase()\n if (host && host !== selfHost) {\n if (SEARCH_HOSTS.some((h) => host.includes(h))) source = 'organic'\n else if (SOCIAL_HOSTS.some((h) => host.includes(h))) source = 'social'\n else source = 'referral'\n }\n } catch {\n /* malformed referer — stays 'direct' */\n }\n }\n }\n\n return {\n visitorType: opts.hadVisitorCookie ? 'returning' : 'new',\n source,\n campaign: campaign || null,\n }\n}\n\n/**\n * Compact, cookie-safe encoding: `\"<visitorType>|<source>|<campaign>\"`, e.g.\n * `\"new|paid|spring_sale\"`. Campaign is sanitized to `[A-Za-z0-9_-]` and capped.\n * Decode with {@link decodeSegment}.\n */\nexport function encodeSegment(seg: VisitorSegment): string {\n const campaign = (seg.campaign || '').replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 40)\n return `${seg.visitorType}|${seg.source}|${campaign}`\n}\n\n/** Parse a `_sk_seg` cookie value produced by {@link encodeSegment}. */\nexport function decodeSegment(value: string | undefined | null): VisitorSegment | null {\n if (!value) return null\n const [visitorType, source, campaign] = value.split('|')\n if (visitorType !== 'new' && visitorType !== 'returning') return null\n return {\n visitorType,\n source: (['paid', 'organic', 'social', 'referral', 'direct'].includes(source) ? source : 'direct') as SegmentSource,\n campaign: campaign || null,\n }\n}\n","/**\n * @sonordev/site-kit/proxy\n *\n * Composable Next.js Proxy factory (Next 16's replacement for middleware).\n * Also served on the deprecated `/middleware` subpath. Handles:\n * - Security headers (CSP frame-ancestors, nosniff, referrer/permissions\n * policy — deliberately NO X-Frame-Options; see securityHeaders.ts)\n * - Portal-managed redirects (legacy hot-path mode; prefer the 404-boundary\n * resolver — see the `redirects` option below)\n * - Stamps `x-sk-path` on the request so app/not-found.tsx can know the URL\n * - Optional before/after hooks for custom logic\n *\n * @example\n * ```ts\n * // proxy.ts — entire file\n * import { createProxy } from '@sonordev/site-kit/proxy'\n *\n * export default createProxy()\n *\n * // Inlined on purpose: Next statically parses `config.matcher` at build\n * // time and REJECTS an imported value (Turbopack build error). Keep in\n * // sync with siteKitMatcher below.\n * export const config = {\n * matcher: [\n * '/((?!_next/static|_next/image|favicon\\\\.ico|.*\\\\.(?:ico|png|jpg|jpeg|gif|webp|svg|woff2?)$).*)',\n * ],\n * }\n * ```\n *\n * Next 16 notes: `middleware.ts` is deprecated (codemod:\n * `npx @next/codemod@canary middleware-to-proxy .`), Proxy defaults to the\n * Node.js runtime, and the `runtime` config option is unavailable in proxy\n * files — setting it throws at build time.\n *\n * @example With custom hooks:\n * ```ts\n * export default createProxy({\n * before: (req) => {\n * // Custom auth check, etc.\n * },\n * })\n * ```\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\nimport {\n handleManagedRedirects,\n SK_PATH_HEADER,\n type RedirectConfig,\n} from '../redirects'\nimport {\n buildSecurityHeaders,\n type SecurityHeadersConfig,\n} from './securityHeaders'\nimport { buildAiDiscoveryHeaders } from '../llms/discovery-headers'\nimport { resolveVisitorSegment, encodeSegment } from './segment'\n// Single source of truth for v4 UUIDs — Web Crypto in the edge runtime, with a\n// non-throwing fallback everywhere else. Do NOT re-fork ID generation here.\nimport { uuid } from '../shared/uuid'\n\nexport type { SecurityHeadersConfig } from './securityHeaders'\nexport { DEFAULT_FRAME_ANCESTORS } from './securityHeaders'\nexport {\n resolveVisitorSegment,\n encodeSegment,\n decodeSegment,\n type VisitorSegment,\n type SegmentSource,\n} from './segment'\n\nexport interface IdentityConfig {\n /**\n * Also resolve + persist a coarse visitor segment (new-vs-returning + source\n * + campaign) into the `_sk_seg` cookie, for segment-aware slots /\n * personalization. Default: true (when identity is enabled).\n */\n segment?: boolean\n /** Days the `_sk_vid` visitor cookie persists. Default: 730 (~2 years). */\n cookieMaxAgeDays?: number\n}\n\nexport interface LlmsDiscoveryConfig {\n /** Canonical site origin, e.g. `https://example.com` */\n siteUrl: string\n /** Path to llms.txt (default `/llms.txt`) */\n llmsPath?: string\n}\n\nexport interface SiteKitProxyConfig {\n /**\n * Portal-managed redirects on the proxy hot path. Default: true (legacy).\n *\n * LEGACY MODE: this checks rules before EVERY page render — a network\n * fetch (now bounded at 300ms, 30s failure cooldown) paid by 100% of\n * requests to serve the <1% that would 404. Prefer `redirects: false`\n * plus `resolveManagedRedirect()` from\n * `@sonordev/site-kit/redirects/not-found` in app/not-found.tsx: same\n * instant dashboard behavior, zero cost on successful loads. The proxy\n * always stamps `x-sk-path` for it, regardless of this flag.\n */\n redirects?: boolean | RedirectConfig\n /** Enable security headers. Default: true */\n securityHeaders?: boolean | SecurityHeadersConfig\n /**\n * Opt-in: inject `Link: <...>; rel=\"describedby\"` header on HTML responses\n * pointing to /llms.txt for AI crawler discovery (RFC 8288).\n * Preferred over visible footer links.\n */\n llmsDiscovery?: LlmsDiscoveryConfig | false\n /**\n * Opt-in EDGE IDENTITY pass. When enabled, the middleware ensures a\n * first-party `_sk_vid` visitor cookie exists (server-authoritative id) and\n * resolves the visitor segment into `_sk_seg`, so server-rendered slots and\n * personalization can read identity + segment without re-parsing the request.\n * Purely additive — it only writes cookies, never changes the rendered HTML,\n * so it is LCP/static-safe. Default: OFF (sites opt in for 3.0 personalization).\n *\n * NOTE: to make these the SAME id the client uses, the shared identity helper\n * must read `_sk_vid` cookie-first (a follow-on change validated with a live\n * preview); until then the cookie is the server-side mirror.\n */\n identity?: boolean | IdentityConfig\n /**\n * Hook that runs BEFORE redirect check.\n * Return a NextResponse to short-circuit, or undefined to continue.\n */\n before?: (\n request: NextRequest,\n ) => NextResponse | undefined | Promise<NextResponse | undefined>\n /**\n * Hook that runs AFTER all processing.\n * Receives the response that will be sent — mutate headers, etc.\n */\n after?: (\n request: NextRequest,\n response: NextResponse,\n ) => NextResponse | Promise<NextResponse>\n}\n\n/**\n * Create a fully-featured Next.js Proxy function.\n *\n * With zero config this handles redirects + security headers automatically.\n * Export it from `proxy.ts` at the project root (or `src/`).\n */\nexport function createProxy(config?: SiteKitProxyConfig) {\n const securityHeaders = buildSecurityHeaders(\n config?.securityHeaders,\n )\n\n // Pre-compute discovery headers (static per middleware instance)\n const discoveryHeaders: Record<string, string> =\n config?.llmsDiscovery\n ? buildAiDiscoveryHeaders({\n siteUrl: config.llmsDiscovery.siteUrl,\n llmsPath: config.llmsDiscovery.llmsPath,\n })\n : {}\n\n return async function proxy(\n request: NextRequest,\n ): Promise<NextResponse> {\n // 1. Run user's 'before' hook\n if (config?.before) {\n const earlyResponse = await config.before(request)\n if (earlyResponse) {\n // Apply security headers even to early responses\n applyHeaders(earlyResponse, securityHeaders)\n return earlyResponse\n }\n }\n\n // 2. Check Portal-managed redirects (unless disabled)\n if (config?.redirects !== false) {\n const redirectConfig: RedirectConfig =\n typeof config?.redirects === 'object'\n ? config.redirects\n : {}\n\n const redirect = await handleManagedRedirects(\n request,\n redirectConfig,\n )\n if (redirect) {\n // Redirects get security headers too\n applyHeaders(redirect, securityHeaders)\n return redirect\n }\n }\n\n // 3. Build the pass-through response. Always stamp the requested\n // pathname+search onto the REQUEST so app/not-found.tsx (which Next\n // gives no URL) can resolve managed redirects at the 404 boundary.\n // Pure header write — no fetch, static-safe.\n const requestHeaders = new Headers(request.headers)\n requestHeaders.set(\n SK_PATH_HEADER,\n request.nextUrl.pathname + request.nextUrl.search,\n )\n let response = NextResponse.next({ request: { headers: requestHeaders } })\n\n // 4. Apply security headers\n applyHeaders(response, securityHeaders)\n\n // 5. Apply AI discovery Link header (only on HTML-like requests, not static assets)\n if (Object.keys(discoveryHeaders).length > 0) {\n const accept = request.headers.get('accept') || ''\n if (accept.includes('text/html') || accept.includes('*/*')) {\n applyHeaders(response, discoveryHeaders)\n }\n }\n\n // 5b. Edge identity pass (opt-in). Ensure a first-party `_sk_vid` visitor\n // cookie exists and resolve the visitor segment into `_sk_seg`. Additive:\n // only writes cookies, never changes the rendered HTML (LCP/static-safe).\n if (config?.identity) {\n const idCfg: IdentityConfig =\n typeof config.identity === 'object' ? config.identity : {}\n const hadVisitorCookie = !!request.cookies.get('_sk_vid')?.value\n if (!hadVisitorCookie) {\n const maxAgeDays = idCfg.cookieMaxAgeDays ?? 730\n response.cookies.set('_sk_vid', uuid(), {\n maxAge: maxAgeDays * 24 * 60 * 60,\n path: '/',\n sameSite: 'lax',\n secure: true,\n })\n }\n if (idCfg.segment !== false) {\n const segment = encodeSegment(\n resolveVisitorSegment(request, { hadVisitorCookie }),\n )\n response.cookies.set('_sk_seg', segment, {\n // Session-ish: a fresh campaign / source on a later visit re-segments.\n maxAge: 30 * 60,\n path: '/',\n sameSite: 'lax',\n secure: true,\n })\n }\n }\n\n // 6. Run user's 'after' hook\n if (config?.after) {\n response = await config.after(request, response)\n }\n\n return response\n }\n}\n\nfunction applyHeaders(\n response: NextResponse,\n headers: Record<string, string>,\n): void {\n for (const [key, value] of Object.entries(headers)) {\n response.headers.set(key, value)\n }\n}\n\n/**\n * REFERENCE VALUE ONLY — copy the array into your proxy.ts, do not export it.\n *\n * `export const config = siteKitMatcher` is a BUILD ERROR on Next 16:\n * `config.matcher` must be statically analyzable and Turbopack rejects any\n * imported value. This constant exists so the canonical pattern lives in one\n * place (the scaffold, docs, and tests read it) — inline its contents.\n */\nexport const siteKitMatcher = {\n matcher: [\n '/((?!_next/static|_next/image|favicon\\\\.ico|.*\\\\.(?:ico|png|jpg|jpeg|gif|webp|svg|woff2?)$).*)',\n ],\n}\n\n/**\n * @deprecated Use `createProxy`. Next 16 renamed the `middleware` file\n * convention to `proxy` (`npx @next/codemod@canary middleware-to-proxy .`);\n * the old name still builds but warns, and the factory is named for the file\n * it is exported from. Kept indefinitely — 100+ fleet sites import it — but\n * new code should say `createProxy` from `@sonordev/site-kit/proxy`.\n */\nexport const createMiddleware = createProxy\n\n/** @deprecated Use `SiteKitProxyConfig`. */\nexport type SiteKitMiddlewareConfig = SiteKitProxyConfig\n"]}
@@ -1,13 +1,13 @@
1
- import { buildSecurityHeaders } from '../chunk-OVIDFJIK.mjs';
2
- export { DEFAULT_FRAME_ANCESTORS } from '../chunk-OVIDFJIK.mjs';
1
+ import { buildSecurityHeaders } from '../chunk-5YKMHPJL.mjs';
2
+ export { DEFAULT_FRAME_ANCESTORS } from '../chunk-5YKMHPJL.mjs';
3
3
  import { buildAiDiscoveryHeaders } from '../chunk-H4OBGC43.mjs';
4
- import { handleManagedRedirects, SK_PATH_HEADER } from '../chunk-KRARQ2ZF.mjs';
4
+ import { handleManagedRedirects, SK_PATH_HEADER } from '../chunk-AJQI3WTN.mjs';
5
5
  import '../chunk-B22WSN4L.mjs';
6
6
  import { uuid } from '../chunk-6EDVCUAG.mjs';
7
7
  import '../chunk-BEXTDHO4.mjs';
8
8
  import { NextResponse } from 'next/server';
9
9
 
10
- // src/middleware/segment.ts
10
+ // src/proxy/segment.ts
11
11
  var PAID_MEDIUMS = ["cpc", "ppc", "paid", "paidsearch", "paid-search", "display", "cpm", "banner"];
12
12
  var SOCIAL_MEDIUMS = ["social", "social-media", "social_media", "sm"];
13
13
  var SOCIAL_HOSTS = [
@@ -76,8 +76,8 @@ function decodeSegment(value) {
76
76
  };
77
77
  }
78
78
 
79
- // src/middleware/index.ts
80
- function createMiddleware(config) {
79
+ // src/proxy/index.ts
80
+ function createProxy(config) {
81
81
  const securityHeaders = buildSecurityHeaders(
82
82
  config?.securityHeaders
83
83
  );
@@ -158,7 +158,7 @@ var siteKitMatcher = {
158
158
  "/((?!_next/static|_next/image|favicon\\.ico|.*\\.(?:ico|png|jpg|jpeg|gif|webp|svg|woff2?)$).*)"
159
159
  ]
160
160
  };
161
- var createProxy = createMiddleware;
161
+ var createMiddleware = createProxy;
162
162
 
163
163
  export { createMiddleware, createProxy, decodeSegment, encodeSegment, resolveVisitorSegment, siteKitMatcher };
164
164
  //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/proxy/segment.ts","../../src/proxy/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit/proxy — visitor segment resolution (the \"one edge pass\").\n *\n * Pure, edge-runtime-safe helpers that classify a request into a coarse visitor\n * segment (new-vs-returning + marketing source + campaign) from the URL's UTM\n * params and the referrer. The middleware writes the result to the `_sk_seg`\n * cookie so server-rendered slots / personalization can vary by segment WITHOUT\n * each one re-parsing the request. Resolved once, at the edge.\n *\n * Kept side-effect-free (no NextResponse, no cookie writes) so it is trivially\n * unit-testable and reusable.\n */\nimport type { NextRequest } from 'next/server'\n\nexport type SegmentSource = 'paid' | 'organic' | 'social' | 'referral' | 'direct'\n\nexport interface VisitorSegment {\n /** `new` on the first visit (no prior `_sk_vid` cookie), else `returning`. */\n visitorType: 'new' | 'returning'\n /** Marketing source bucket derived from UTM medium/source, then referrer. */\n source: SegmentSource\n /** `utm_campaign`, if present (sanitized when encoded). */\n campaign: string | null\n}\n\nconst PAID_MEDIUMS = ['cpc', 'ppc', 'paid', 'paidsearch', 'paid-search', 'display', 'cpm', 'banner']\nconst SOCIAL_MEDIUMS = ['social', 'social-media', 'social_media', 'sm']\nconst SOCIAL_HOSTS = [\n 'facebook.',\n 'instagram.',\n 'linkedin.',\n 't.co',\n 'twitter.',\n 'x.com',\n 'pinterest.',\n 'tiktok.',\n 'youtube.',\n 'reddit.',\n]\nconst SEARCH_HOSTS = ['google.', 'bing.', 'duckduckgo.', 'yahoo.', 'ecosia.', 'brave.', 'baidu.', 'yandex.']\n\n/**\n * Classify `request` into a {@link VisitorSegment}. UTM params win over the\n * referrer; a same-host referrer is ignored (internal navigation, not a source).\n */\nexport function resolveVisitorSegment(\n request: NextRequest,\n opts: { hadVisitorCookie: boolean },\n): VisitorSegment {\n const params = request.nextUrl.searchParams\n const medium = (params.get('utm_medium') || '').toLowerCase().trim()\n const campaign = params.get('utm_campaign')\n\n let source: SegmentSource = 'direct'\n\n if (PAID_MEDIUMS.includes(medium)) {\n source = 'paid'\n } else if (SOCIAL_MEDIUMS.includes(medium)) {\n source = 'social'\n } else if (medium === 'organic') {\n source = 'organic'\n } else if (medium === 'referral') {\n source = 'referral'\n } else if (params.get('utm_source') || params.get('gclid') || params.get('fbclid')) {\n // A tagged link with a non-standard medium: gclid => paid Google, fbclid => social.\n if (params.get('gclid')) source = 'paid'\n else if (params.get('fbclid')) source = 'social'\n else source = 'referral'\n } else {\n // No campaign tagging — fall back to the referrer host.\n const ref = request.headers.get('referer') || ''\n if (ref) {\n try {\n const host = new URL(ref).host.toLowerCase()\n const selfHost = request.nextUrl.host.toLowerCase()\n if (host && host !== selfHost) {\n if (SEARCH_HOSTS.some((h) => host.includes(h))) source = 'organic'\n else if (SOCIAL_HOSTS.some((h) => host.includes(h))) source = 'social'\n else source = 'referral'\n }\n } catch {\n /* malformed referer — stays 'direct' */\n }\n }\n }\n\n return {\n visitorType: opts.hadVisitorCookie ? 'returning' : 'new',\n source,\n campaign: campaign || null,\n }\n}\n\n/**\n * Compact, cookie-safe encoding: `\"<visitorType>|<source>|<campaign>\"`, e.g.\n * `\"new|paid|spring_sale\"`. Campaign is sanitized to `[A-Za-z0-9_-]` and capped.\n * Decode with {@link decodeSegment}.\n */\nexport function encodeSegment(seg: VisitorSegment): string {\n const campaign = (seg.campaign || '').replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 40)\n return `${seg.visitorType}|${seg.source}|${campaign}`\n}\n\n/** Parse a `_sk_seg` cookie value produced by {@link encodeSegment}. */\nexport function decodeSegment(value: string | undefined | null): VisitorSegment | null {\n if (!value) return null\n const [visitorType, source, campaign] = value.split('|')\n if (visitorType !== 'new' && visitorType !== 'returning') return null\n return {\n visitorType,\n source: (['paid', 'organic', 'social', 'referral', 'direct'].includes(source) ? source : 'direct') as SegmentSource,\n campaign: campaign || null,\n }\n}\n","/**\n * @sonordev/site-kit/proxy\n *\n * Composable Next.js Proxy factory (Next 16's replacement for middleware).\n * Also served on the deprecated `/middleware` subpath. Handles:\n * - Security headers (CSP frame-ancestors, nosniff, referrer/permissions\n * policy — deliberately NO X-Frame-Options; see securityHeaders.ts)\n * - Portal-managed redirects (legacy hot-path mode; prefer the 404-boundary\n * resolver — see the `redirects` option below)\n * - Stamps `x-sk-path` on the request so app/not-found.tsx can know the URL\n * - Optional before/after hooks for custom logic\n *\n * @example\n * ```ts\n * // proxy.ts — entire file\n * import { createProxy } from '@sonordev/site-kit/proxy'\n *\n * export default createProxy()\n *\n * // Inlined on purpose: Next statically parses `config.matcher` at build\n * // time and REJECTS an imported value (Turbopack build error). Keep in\n * // sync with siteKitMatcher below.\n * export const config = {\n * matcher: [\n * '/((?!_next/static|_next/image|favicon\\\\.ico|.*\\\\.(?:ico|png|jpg|jpeg|gif|webp|svg|woff2?)$).*)',\n * ],\n * }\n * ```\n *\n * Next 16 notes: `middleware.ts` is deprecated (codemod:\n * `npx @next/codemod@canary middleware-to-proxy .`), Proxy defaults to the\n * Node.js runtime, and the `runtime` config option is unavailable in proxy\n * files — setting it throws at build time.\n *\n * @example With custom hooks:\n * ```ts\n * export default createProxy({\n * before: (req) => {\n * // Custom auth check, etc.\n * },\n * })\n * ```\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\nimport {\n handleManagedRedirects,\n SK_PATH_HEADER,\n type RedirectConfig,\n} from '../redirects'\nimport {\n buildSecurityHeaders,\n type SecurityHeadersConfig,\n} from './securityHeaders'\nimport { buildAiDiscoveryHeaders } from '../llms/discovery-headers'\nimport { resolveVisitorSegment, encodeSegment } from './segment'\n// Single source of truth for v4 UUIDs — Web Crypto in the edge runtime, with a\n// non-throwing fallback everywhere else. Do NOT re-fork ID generation here.\nimport { uuid } from '../shared/uuid'\n\nexport type { SecurityHeadersConfig } from './securityHeaders'\nexport { DEFAULT_FRAME_ANCESTORS } from './securityHeaders'\nexport {\n resolveVisitorSegment,\n encodeSegment,\n decodeSegment,\n type VisitorSegment,\n type SegmentSource,\n} from './segment'\n\nexport interface IdentityConfig {\n /**\n * Also resolve + persist a coarse visitor segment (new-vs-returning + source\n * + campaign) into the `_sk_seg` cookie, for segment-aware slots /\n * personalization. Default: true (when identity is enabled).\n */\n segment?: boolean\n /** Days the `_sk_vid` visitor cookie persists. Default: 730 (~2 years). */\n cookieMaxAgeDays?: number\n}\n\nexport interface LlmsDiscoveryConfig {\n /** Canonical site origin, e.g. `https://example.com` */\n siteUrl: string\n /** Path to llms.txt (default `/llms.txt`) */\n llmsPath?: string\n}\n\nexport interface SiteKitProxyConfig {\n /**\n * Portal-managed redirects on the proxy hot path. Default: true (legacy).\n *\n * LEGACY MODE: this checks rules before EVERY page render — a network\n * fetch (now bounded at 300ms, 30s failure cooldown) paid by 100% of\n * requests to serve the <1% that would 404. Prefer `redirects: false`\n * plus `resolveManagedRedirect()` from\n * `@sonordev/site-kit/redirects/not-found` in app/not-found.tsx: same\n * instant dashboard behavior, zero cost on successful loads. The proxy\n * always stamps `x-sk-path` for it, regardless of this flag.\n */\n redirects?: boolean | RedirectConfig\n /** Enable security headers. Default: true */\n securityHeaders?: boolean | SecurityHeadersConfig\n /**\n * Opt-in: inject `Link: <...>; rel=\"describedby\"` header on HTML responses\n * pointing to /llms.txt for AI crawler discovery (RFC 8288).\n * Preferred over visible footer links.\n */\n llmsDiscovery?: LlmsDiscoveryConfig | false\n /**\n * Opt-in EDGE IDENTITY pass. When enabled, the middleware ensures a\n * first-party `_sk_vid` visitor cookie exists (server-authoritative id) and\n * resolves the visitor segment into `_sk_seg`, so server-rendered slots and\n * personalization can read identity + segment without re-parsing the request.\n * Purely additive — it only writes cookies, never changes the rendered HTML,\n * so it is LCP/static-safe. Default: OFF (sites opt in for 3.0 personalization).\n *\n * NOTE: to make these the SAME id the client uses, the shared identity helper\n * must read `_sk_vid` cookie-first (a follow-on change validated with a live\n * preview); until then the cookie is the server-side mirror.\n */\n identity?: boolean | IdentityConfig\n /**\n * Hook that runs BEFORE redirect check.\n * Return a NextResponse to short-circuit, or undefined to continue.\n */\n before?: (\n request: NextRequest,\n ) => NextResponse | undefined | Promise<NextResponse | undefined>\n /**\n * Hook that runs AFTER all processing.\n * Receives the response that will be sent — mutate headers, etc.\n */\n after?: (\n request: NextRequest,\n response: NextResponse,\n ) => NextResponse | Promise<NextResponse>\n}\n\n/**\n * Create a fully-featured Next.js Proxy function.\n *\n * With zero config this handles redirects + security headers automatically.\n * Export it from `proxy.ts` at the project root (or `src/`).\n */\nexport function createProxy(config?: SiteKitProxyConfig) {\n const securityHeaders = buildSecurityHeaders(\n config?.securityHeaders,\n )\n\n // Pre-compute discovery headers (static per middleware instance)\n const discoveryHeaders: Record<string, string> =\n config?.llmsDiscovery\n ? buildAiDiscoveryHeaders({\n siteUrl: config.llmsDiscovery.siteUrl,\n llmsPath: config.llmsDiscovery.llmsPath,\n })\n : {}\n\n return async function proxy(\n request: NextRequest,\n ): Promise<NextResponse> {\n // 1. Run user's 'before' hook\n if (config?.before) {\n const earlyResponse = await config.before(request)\n if (earlyResponse) {\n // Apply security headers even to early responses\n applyHeaders(earlyResponse, securityHeaders)\n return earlyResponse\n }\n }\n\n // 2. Check Portal-managed redirects (unless disabled)\n if (config?.redirects !== false) {\n const redirectConfig: RedirectConfig =\n typeof config?.redirects === 'object'\n ? config.redirects\n : {}\n\n const redirect = await handleManagedRedirects(\n request,\n redirectConfig,\n )\n if (redirect) {\n // Redirects get security headers too\n applyHeaders(redirect, securityHeaders)\n return redirect\n }\n }\n\n // 3. Build the pass-through response. Always stamp the requested\n // pathname+search onto the REQUEST so app/not-found.tsx (which Next\n // gives no URL) can resolve managed redirects at the 404 boundary.\n // Pure header write — no fetch, static-safe.\n const requestHeaders = new Headers(request.headers)\n requestHeaders.set(\n SK_PATH_HEADER,\n request.nextUrl.pathname + request.nextUrl.search,\n )\n let response = NextResponse.next({ request: { headers: requestHeaders } })\n\n // 4. Apply security headers\n applyHeaders(response, securityHeaders)\n\n // 5. Apply AI discovery Link header (only on HTML-like requests, not static assets)\n if (Object.keys(discoveryHeaders).length > 0) {\n const accept = request.headers.get('accept') || ''\n if (accept.includes('text/html') || accept.includes('*/*')) {\n applyHeaders(response, discoveryHeaders)\n }\n }\n\n // 5b. Edge identity pass (opt-in). Ensure a first-party `_sk_vid` visitor\n // cookie exists and resolve the visitor segment into `_sk_seg`. Additive:\n // only writes cookies, never changes the rendered HTML (LCP/static-safe).\n if (config?.identity) {\n const idCfg: IdentityConfig =\n typeof config.identity === 'object' ? config.identity : {}\n const hadVisitorCookie = !!request.cookies.get('_sk_vid')?.value\n if (!hadVisitorCookie) {\n const maxAgeDays = idCfg.cookieMaxAgeDays ?? 730\n response.cookies.set('_sk_vid', uuid(), {\n maxAge: maxAgeDays * 24 * 60 * 60,\n path: '/',\n sameSite: 'lax',\n secure: true,\n })\n }\n if (idCfg.segment !== false) {\n const segment = encodeSegment(\n resolveVisitorSegment(request, { hadVisitorCookie }),\n )\n response.cookies.set('_sk_seg', segment, {\n // Session-ish: a fresh campaign / source on a later visit re-segments.\n maxAge: 30 * 60,\n path: '/',\n sameSite: 'lax',\n secure: true,\n })\n }\n }\n\n // 6. Run user's 'after' hook\n if (config?.after) {\n response = await config.after(request, response)\n }\n\n return response\n }\n}\n\nfunction applyHeaders(\n response: NextResponse,\n headers: Record<string, string>,\n): void {\n for (const [key, value] of Object.entries(headers)) {\n response.headers.set(key, value)\n }\n}\n\n/**\n * REFERENCE VALUE ONLY — copy the array into your proxy.ts, do not export it.\n *\n * `export const config = siteKitMatcher` is a BUILD ERROR on Next 16:\n * `config.matcher` must be statically analyzable and Turbopack rejects any\n * imported value. This constant exists so the canonical pattern lives in one\n * place (the scaffold, docs, and tests read it) — inline its contents.\n */\nexport const siteKitMatcher = {\n matcher: [\n '/((?!_next/static|_next/image|favicon\\\\.ico|.*\\\\.(?:ico|png|jpg|jpeg|gif|webp|svg|woff2?)$).*)',\n ],\n}\n\n/**\n * @deprecated Use `createProxy`. Next 16 renamed the `middleware` file\n * convention to `proxy` (`npx @next/codemod@canary middleware-to-proxy .`);\n * the old name still builds but warns, and the factory is named for the file\n * it is exported from. Kept indefinitely — 100+ fleet sites import it — but\n * new code should say `createProxy` from `@sonordev/site-kit/proxy`.\n */\nexport const createMiddleware = createProxy\n\n/** @deprecated Use `SiteKitProxyConfig`. */\nexport type SiteKitMiddlewareConfig = SiteKitProxyConfig\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"securityHeaders.d.ts","sourceRoot":"","sources":["../../src/proxy/securityHeaders.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,uBAAuB,UAInC,CAAA;AAED,MAAM,WAAW,qBAAqB;IACpC;0EACsE;IACtE,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,KAAK,CAAA;IAC5C;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IACjC,qDAAqD;IACrD,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,6CAA6C;IAC7C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,gCAAgC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACvC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,CAAC,EAAE,qBAAqB,GAAG,OAAO,GACvC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA+DxB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"securityHeaders.test.d.ts","sourceRoot":"","sources":["../../src/proxy/securityHeaders.test.ts"],"names":[],"mappings":""}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @sonordev/site-kit/middleware — visitor segment resolution (the "one edge pass").
2
+ * @sonordev/site-kit/proxy — visitor segment resolution (the "one edge pass").
3
3
  *
4
4
  * Pure, edge-runtime-safe helpers that classify a request into a coarse visitor
5
5
  * segment (new-vs-returning + marketing source + campaign) from the URL's UTM
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segment.d.ts","sourceRoot":"","sources":["../../src/proxy/segment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAA;AAEjF,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,WAAW,EAAE,KAAK,GAAG,WAAW,CAAA;IAChC,6EAA6E;IAC7E,MAAM,EAAE,aAAa,CAAA;IACrB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAkBD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE;IAAE,gBAAgB,EAAE,OAAO,CAAA;CAAE,GAClC,cAAc,CA2ChB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAGzD;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,cAAc,GAAG,IAAI,CASrF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segment.test.d.ts","sourceRoot":"","sources":["../../src/proxy/segment.test.ts"],"names":[],"mappings":""}
@@ -4,11 +4,11 @@
4
4
  * Fetches redirect rules from Portal and applies them.
5
5
  * Supports API key only (domain resolved from Portal) or domain-based lookup.
6
6
  *
7
- * Usage in middleware.ts (API key only):
7
+ * Usage in proxy.ts (API key only):
8
8
  *
9
9
  * import { handleManagedRedirects } from '@sonordev/site-kit/redirects'
10
10
  *
11
- * export async function middleware(request: NextRequest) {
11
+ * export default async function proxy(request: NextRequest) {
12
12
  * const redirect = await handleManagedRedirects(request, {
13
13
  * apiKey: process.env.SONOR_API_KEY,
14
14
  * portalApiUrl: process.env.SONOR_API_URL,
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkGC3BC6HQ_js = require('../chunk-GC3BC6HQ.js');
3
+ var chunk46BMNWE6_js = require('../chunk-46BMNWE6.js');
4
4
  require('../chunk-JP5WGL75.js');
5
5
  require('../chunk-SNAQBZPT.js');
6
6
 
@@ -8,31 +8,31 @@ require('../chunk-SNAQBZPT.js');
8
8
 
9
9
  Object.defineProperty(exports, "SK_PATH_HEADER", {
10
10
  enumerable: true,
11
- get: function () { return chunkGC3BC6HQ_js.SK_PATH_HEADER; }
11
+ get: function () { return chunk46BMNWE6_js.SK_PATH_HEADER; }
12
12
  });
13
13
  Object.defineProperty(exports, "clearRedirectCache", {
14
14
  enumerable: true,
15
- get: function () { return chunkGC3BC6HQ_js.clearRedirectCache; }
15
+ get: function () { return chunk46BMNWE6_js.clearRedirectCache; }
16
16
  });
17
17
  Object.defineProperty(exports, "fetchRedirectRules", {
18
18
  enumerable: true,
19
- get: function () { return chunkGC3BC6HQ_js.fetchRedirectRules; }
19
+ get: function () { return chunk46BMNWE6_js.fetchRedirectRules; }
20
20
  });
21
21
  Object.defineProperty(exports, "findRedirectMatch", {
22
22
  enumerable: true,
23
- get: function () { return chunkGC3BC6HQ_js.findRedirectMatch; }
23
+ get: function () { return chunk46BMNWE6_js.findRedirectMatch; }
24
24
  });
25
25
  Object.defineProperty(exports, "generateNextRedirects", {
26
26
  enumerable: true,
27
- get: function () { return chunkGC3BC6HQ_js.generateNextRedirects; }
27
+ get: function () { return chunk46BMNWE6_js.generateNextRedirects; }
28
28
  });
29
29
  Object.defineProperty(exports, "handleManagedRedirects", {
30
30
  enumerable: true,
31
- get: function () { return chunkGC3BC6HQ_js.handleManagedRedirects; }
31
+ get: function () { return chunk46BMNWE6_js.handleManagedRedirects; }
32
32
  });
33
33
  Object.defineProperty(exports, "trackRedirectHit", {
34
34
  enumerable: true,
35
- get: function () { return chunkGC3BC6HQ_js.trackRedirectHit; }
35
+ get: function () { return chunk46BMNWE6_js.trackRedirectHit; }
36
36
  });
37
37
  //# sourceMappingURL=index.js.map
38
38
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- export { SK_PATH_HEADER, clearRedirectCache, fetchRedirectRules, findRedirectMatch, generateNextRedirects, handleManagedRedirects, trackRedirectHit } from '../chunk-KRARQ2ZF.mjs';
1
+ export { SK_PATH_HEADER, clearRedirectCache, fetchRedirectRules, findRedirectMatch, generateNextRedirects, handleManagedRedirects, trackRedirectHit } from '../chunk-AJQI3WTN.mjs';
2
2
  import '../chunk-B22WSN4L.mjs';
3
3
  import '../chunk-BEXTDHO4.mjs';
4
4
  //# sourceMappingURL=index.mjs.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkGC3BC6HQ_js = require('../chunk-GC3BC6HQ.js');
3
+ var chunk46BMNWE6_js = require('../chunk-46BMNWE6.js');
4
4
  require('../chunk-JP5WGL75.js');
5
5
  require('../chunk-SNAQBZPT.js');
6
6
  var headers = require('next/headers');
@@ -9,7 +9,7 @@ async function resolveManagedRedirect(config = {}) {
9
9
  let raw;
10
10
  try {
11
11
  const h = await headers.headers();
12
- raw = h.get(chunkGC3BC6HQ_js.SK_PATH_HEADER);
12
+ raw = h.get(chunk46BMNWE6_js.SK_PATH_HEADER);
13
13
  } catch {
14
14
  return null;
15
15
  }
@@ -20,10 +20,10 @@ async function resolveManagedRedirect(config = {}) {
20
20
  if (pathname.startsWith("/_next") || pathname.startsWith("/api") || pathname.includes(".")) {
21
21
  return null;
22
22
  }
23
- const rules = await chunkGC3BC6HQ_js.fetchRedirectRules(config);
24
- const match = chunkGC3BC6HQ_js.findRedirectMatch(pathname, rules);
23
+ const rules = await chunk46BMNWE6_js.fetchRedirectRules(config);
24
+ const match = chunk46BMNWE6_js.findRedirectMatch(pathname, rules);
25
25
  if (!match) return null;
26
- chunkGC3BC6HQ_js.trackRedirectHit(config, match.from_path, config.domain).catch(() => {
26
+ chunk46BMNWE6_js.trackRedirectHit(config, match.from_path, config.domain).catch(() => {
27
27
  });
28
28
  const destination = search ? `${match.to_path}${match.to_path.includes("?") ? "&" : "?"}${search}` : match.to_path;
29
29
  return {
@@ -1,4 +1,4 @@
1
- import { SK_PATH_HEADER, fetchRedirectRules, findRedirectMatch, trackRedirectHit } from '../chunk-KRARQ2ZF.mjs';
1
+ import { SK_PATH_HEADER, fetchRedirectRules, findRedirectMatch, trackRedirectHit } from '../chunk-AJQI3WTN.mjs';
2
2
  import '../chunk-B22WSN4L.mjs';
3
3
  import '../chunk-BEXTDHO4.mjs';
4
4
  import { headers } from 'next/headers';
@@ -2,9 +2,9 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkG2WC3CXW_js = require('../chunk-G2WC3CXW.js');
5
- var chunkTBIWQQVF_js = require('../chunk-TBIWQQVF.js');
6
- require('../chunk-FIVPS4Z6.js');
7
- require('../chunk-U3P4WF2A.js');
5
+ var chunkFPWPRFTP_js = require('../chunk-FPWPRFTP.js');
6
+ require('../chunk-ZXRORNAW.js');
7
+ require('../chunk-UXIUJYFK.js');
8
8
  require('../chunk-SNAQBZPT.js');
9
9
  var react = require('react');
10
10
  var jsxRuntime = require('react/jsx-runtime');
@@ -39,7 +39,7 @@ function useSiteSearch(options = {}) {
39
39
  const apiUrl = typeof window !== "undefined" ? window.__SITE_KIT_API_URL__ || "https://api.sonor.io" : "https://api.sonor.io";
40
40
  const apiKey = typeof window !== "undefined" ? window.__SITE_KIT_API_KEY__ : void 0;
41
41
  const resolvedSite = site ?? (typeof window !== "undefined" ? window.__SITE_KIT_SITE__ : void 0);
42
- const res = await chunkTBIWQQVF_js.sonorFetch(
42
+ const res = await chunkFPWPRFTP_js.sonorFetch(
43
43
  `${apiUrl}${chunkG2WC3CXW_js.SEARCH_ENDPOINT}`,
44
44
  {
45
45
  method: "POST",
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  import { SEARCH_ENDPOINT } from '../chunk-75A4KY4X.mjs';
3
3
  export { SEARCH_ENDPOINT } from '../chunk-75A4KY4X.mjs';
4
- import { sonorFetch } from '../chunk-5PBJ42NC.mjs';
5
- import '../chunk-OBRGUSGB.mjs';
6
- import '../chunk-2X5ZB5D7.mjs';
4
+ import { sonorFetch } from '../chunk-45VPULF2.mjs';
5
+ import '../chunk-NDS6MXIP.mjs';
6
+ import '../chunk-NQNSATTA.mjs';
7
7
  import '../chunk-BEXTDHO4.mjs';
8
8
  import { useState, useRef, useCallback, useEffect } from 'react';
9
9
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,18 +1,18 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunk2EA4DC2G_js = require('../chunk-2EA4DC2G.js');
4
+ var chunk6WJDTGM6_js = require('../chunk-6WJDTGM6.js');
5
5
  require('../chunk-JEOKDUPQ.js');
6
- require('../chunk-TBIWQQVF.js');
7
- require('../chunk-FIVPS4Z6.js');
8
- require('../chunk-U3P4WF2A.js');
6
+ require('../chunk-FPWPRFTP.js');
7
+ require('../chunk-ZXRORNAW.js');
8
+ require('../chunk-UXIUJYFK.js');
9
9
  require('../chunk-SNAQBZPT.js');
10
10
 
11
11
 
12
12
 
13
13
  Object.defineProperty(exports, "SitemapSync", {
14
14
  enumerable: true,
15
- get: function () { return chunk2EA4DC2G_js.SitemapSync; }
15
+ get: function () { return chunk6WJDTGM6_js.SitemapSync; }
16
16
  });
17
17
  //# sourceMappingURL=client.js.map
18
18
  //# sourceMappingURL=client.js.map
@@ -1,9 +1,9 @@
1
1
  'use client';
2
- export { SitemapSync } from '../chunk-QEHPIQYN.mjs';
2
+ export { SitemapSync } from '../chunk-NQEUFRMX.mjs';
3
3
  import '../chunk-QJU6HBSK.mjs';
4
- import '../chunk-5PBJ42NC.mjs';
5
- import '../chunk-OBRGUSGB.mjs';
6
- import '../chunk-2X5ZB5D7.mjs';
4
+ import '../chunk-45VPULF2.mjs';
5
+ import '../chunk-NDS6MXIP.mjs';
6
+ import '../chunk-NQNSATTA.mjs';
7
7
  import '../chunk-BEXTDHO4.mjs';
8
8
  //# sourceMappingURL=client.mjs.map
9
9
  //# sourceMappingURL=client.mjs.map