@sonordev/site-kit 5.8.2 → 5.8.3

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 (227) hide show
  1. package/agent-manifest.json +6 -1
  2. package/dist/{AnalyticsProvider-4JV3OFCG.js → AnalyticsProvider-DPXR6FSV.js} +10 -10
  3. package/dist/{AnalyticsProvider-4JV3OFCG.js.map → AnalyticsProvider-DPXR6FSV.js.map} +1 -1
  4. package/dist/{AnalyticsProvider-LUEUDZZC.mjs → AnalyticsProvider-IGOD64MY.mjs} +6 -6
  5. package/dist/{AnalyticsProvider-LUEUDZZC.mjs.map → AnalyticsProvider-IGOD64MY.mjs.map} +1 -1
  6. package/dist/{BlogViewTracker-YQMTEGYZ.mjs → BlogViewTracker-Q7Y4MN4B.mjs} +5 -5
  7. package/dist/{BlogViewTracker-YQMTEGYZ.mjs.map → BlogViewTracker-Q7Y4MN4B.mjs.map} +1 -1
  8. package/dist/{BlogViewTracker-32C4SCHA.js → BlogViewTracker-S3CSRBIZ.js} +6 -6
  9. package/dist/{BlogViewTracker-32C4SCHA.js.map → BlogViewTracker-S3CSRBIZ.js.map} +1 -1
  10. package/dist/ChatWidget-76R7NOWD.js +24 -0
  11. package/dist/{ChatWidget-KCXQXNUF.js.map → ChatWidget-76R7NOWD.js.map} +1 -1
  12. package/dist/ChatWidget-G3KOUDX5.mjs +15 -0
  13. package/dist/{ChatWidget-IRTAMRQS.mjs.map → ChatWidget-G3KOUDX5.mjs.map} +1 -1
  14. package/dist/EngageWidget-HD4F2ZVE.js +21 -0
  15. package/dist/{EngageWidget-EUUZHQOU.js.map → EngageWidget-HD4F2ZVE.js.map} +1 -1
  16. package/dist/EngageWidget-UJ47PQFG.mjs +12 -0
  17. package/dist/{EngageWidget-7AIUJRXV.mjs.map → EngageWidget-UJ47PQFG.mjs.map} +1 -1
  18. package/dist/{FileField-SNI5XCHQ.js → FileField-FV6WSZMX.js} +6 -6
  19. package/dist/{FileField-SNI5XCHQ.js.map → FileField-FV6WSZMX.js.map} +1 -1
  20. package/dist/{FileField-XJYJO5HE.mjs → FileField-WNMEA3PK.mjs} +5 -5
  21. package/dist/{FileField-XJYJO5HE.mjs.map → FileField-WNMEA3PK.mjs.map} +1 -1
  22. package/dist/{FormSpotlight-S64G4CMM.js → FormSpotlight-2VRQXEFI.js} +9 -9
  23. package/dist/{FormSpotlight-S64G4CMM.js.map → FormSpotlight-2VRQXEFI.js.map} +1 -1
  24. package/dist/{FormSpotlight-BCXI4A4R.mjs → FormSpotlight-NGWEPGI4.mjs} +3 -3
  25. package/dist/{FormSpotlight-BCXI4A4R.mjs.map → FormSpotlight-NGWEPGI4.mjs.map} +1 -1
  26. package/dist/{FormStage-RHARCSPS.mjs → FormStage-7L4BBOLC.mjs} +3 -3
  27. package/dist/{FormStage-RHARCSPS.mjs.map → FormStage-7L4BBOLC.mjs.map} +1 -1
  28. package/dist/{FormStage-PX5TVY25.js → FormStage-Q3KQVFVW.js} +9 -9
  29. package/dist/{FormStage-PX5TVY25.js.map → FormStage-Q3KQVFVW.js.map} +1 -1
  30. package/dist/ManagedForm-4ZGU4R3G.js +25 -0
  31. package/dist/{ManagedForm-RI2TSUZD.js.map → ManagedForm-4ZGU4R3G.js.map} +1 -1
  32. package/dist/ManagedForm-Z7QE4KYI.mjs +16 -0
  33. package/dist/{ManagedForm-7IDXBQS6.mjs.map → ManagedForm-Z7QE4KYI.mjs.map} +1 -1
  34. package/dist/{ManagedNewsletterForm-IAGIHBNT.js → ManagedNewsletterForm-22EPZB7Z.js} +8 -8
  35. package/dist/{ManagedNewsletterForm-IAGIHBNT.js.map → ManagedNewsletterForm-22EPZB7Z.js.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-UXBJ5OJB.mjs → ManagedNewsletterForm-4TVO2VL4.mjs} +7 -7
  37. package/dist/{ManagedNewsletterForm-UXBJ5OJB.mjs.map → ManagedNewsletterForm-4TVO2VL4.mjs.map} +1 -1
  38. package/dist/{SignalCore-Q2BQMPCJ.js → SignalCore-2N7UZGF3.js} +11 -11
  39. package/dist/{SignalCore-Q2BQMPCJ.js.map → SignalCore-2N7UZGF3.js.map} +1 -1
  40. package/dist/{SignalCore-37WGILFY.mjs → SignalCore-57OK3DHA.mjs} +5 -5
  41. package/dist/{SignalCore-37WGILFY.mjs.map → SignalCore-57OK3DHA.mjs.map} +1 -1
  42. package/dist/SitemapSync-GF4OKN4Z.js +18 -0
  43. package/dist/{SitemapSync-DWEL7HTB.js.map → SitemapSync-GF4OKN4Z.js.map} +1 -1
  44. package/dist/SitemapSync-WIUEYOBS.mjs +9 -0
  45. package/dist/{SitemapSync-YIAI7PMT.mjs.map → SitemapSync-WIUEYOBS.mjs.map} +1 -1
  46. package/dist/analytics/index.js +9 -9
  47. package/dist/analytics/index.mjs +4 -4
  48. package/dist/blog/index.js +18 -18
  49. package/dist/blog/index.mjs +4 -4
  50. package/dist/blog/server-ui.js +14 -14
  51. package/dist/blog/server-ui.mjs +2 -2
  52. package/dist/{chunk-EZ5DX7ED.mjs → chunk-25F2EXOC.mjs} +3 -3
  53. package/dist/{chunk-EZ5DX7ED.mjs.map → chunk-25F2EXOC.mjs.map} +1 -1
  54. package/dist/{chunk-3Y7IKQDD.js → chunk-2TS4ALOA.js} +14 -14
  55. package/dist/{chunk-3Y7IKQDD.js.map → chunk-2TS4ALOA.js.map} +1 -1
  56. package/dist/{chunk-NHX6YJ7G.mjs → chunk-3OO5EDKD.mjs} +8 -8
  57. package/dist/{chunk-NHX6YJ7G.mjs.map → chunk-3OO5EDKD.mjs.map} +1 -1
  58. package/dist/{chunk-3EXBBFXX.mjs → chunk-4C5CZJIN.mjs} +4 -4
  59. package/dist/{chunk-3EXBBFXX.mjs.map → chunk-4C5CZJIN.mjs.map} +1 -1
  60. package/dist/{chunk-7SLYI62M.mjs → chunk-4NVMAYMQ.mjs} +4 -4
  61. package/dist/{chunk-7SLYI62M.mjs.map → chunk-4NVMAYMQ.mjs.map} +1 -1
  62. package/dist/chunk-5FETEH3Y.mjs +6 -0
  63. package/dist/{chunk-TAPCWMBV.mjs.map → chunk-5FETEH3Y.mjs.map} +1 -1
  64. package/dist/{chunk-D7CF3OPZ.js → chunk-5HFD36AN.js} +5 -5
  65. package/dist/{chunk-D7CF3OPZ.js.map → chunk-5HFD36AN.js.map} +1 -1
  66. package/dist/{chunk-PXWYMOZY.js → chunk-6CCS2EGF.js} +11 -11
  67. package/dist/{chunk-PXWYMOZY.js.map → chunk-6CCS2EGF.js.map} +1 -1
  68. package/dist/chunk-7R6H3GQ4.js +8 -0
  69. package/dist/{chunk-TJVZEDE3.js.map → chunk-7R6H3GQ4.js.map} +1 -1
  70. package/dist/{chunk-U6O5NG56.js → chunk-7VZYP4K5.js} +15 -15
  71. package/dist/{chunk-U6O5NG56.js.map → chunk-7VZYP4K5.js.map} +1 -1
  72. package/dist/chunk-AJBOEV4I.mjs +453 -0
  73. package/dist/chunk-AJBOEV4I.mjs.map +1 -0
  74. package/dist/{chunk-3HGHWDCY.js → chunk-CNTDV7HM.js} +4 -4
  75. package/dist/{chunk-3HGHWDCY.js.map → chunk-CNTDV7HM.js.map} +1 -1
  76. package/dist/{chunk-QWXTQC3N.js → chunk-CY2RFEW6.js} +3 -3
  77. package/dist/{chunk-QWXTQC3N.js.map → chunk-CY2RFEW6.js.map} +1 -1
  78. package/dist/{chunk-7BI2RVQD.js → chunk-CZEIHFLW.js} +4 -4
  79. package/dist/{chunk-7BI2RVQD.js.map → chunk-CZEIHFLW.js.map} +1 -1
  80. package/dist/{chunk-NM567VXC.mjs → chunk-F2KW4OJF.mjs} +4 -4
  81. package/dist/{chunk-NM567VXC.mjs.map → chunk-F2KW4OJF.mjs.map} +1 -1
  82. package/dist/{chunk-3Z3TOPND.js → chunk-F3KA6V2Y.js} +3 -3
  83. package/dist/{chunk-3Z3TOPND.js.map → chunk-F3KA6V2Y.js.map} +1 -1
  84. package/dist/{chunk-5BZNVKNK.mjs → chunk-FD72QL42.mjs} +3 -3
  85. package/dist/{chunk-5BZNVKNK.mjs.map → chunk-FD72QL42.mjs.map} +1 -1
  86. package/dist/{chunk-U5WMGUDV.js → chunk-FTB5LAD3.js} +4 -4
  87. package/dist/{chunk-U5WMGUDV.js.map → chunk-FTB5LAD3.js.map} +1 -1
  88. package/dist/{chunk-TCVOGK6U.mjs → chunk-HBHS5VRN.mjs} +3 -3
  89. package/dist/{chunk-TCVOGK6U.mjs.map → chunk-HBHS5VRN.mjs.map} +1 -1
  90. package/dist/{chunk-4PXUMDHL.mjs → chunk-HEOLGDUX.mjs} +3 -3
  91. package/dist/{chunk-4PXUMDHL.mjs.map → chunk-HEOLGDUX.mjs.map} +1 -1
  92. package/dist/{chunk-GDH42JAS.js → chunk-I7HOMMIK.js} +15 -15
  93. package/dist/{chunk-GDH42JAS.js.map → chunk-I7HOMMIK.js.map} +1 -1
  94. package/dist/{chunk-73EBIAF3.js → chunk-IIHIRHSW.js} +18 -18
  95. package/dist/{chunk-73EBIAF3.js.map → chunk-IIHIRHSW.js.map} +1 -1
  96. package/dist/{chunk-M45AL7EA.js → chunk-LB44BNJ2.js} +2 -2
  97. package/dist/{chunk-M45AL7EA.js.map → chunk-LB44BNJ2.js.map} +1 -1
  98. package/dist/{chunk-6FTC6EYD.mjs → chunk-LGOQ65JQ.mjs} +7 -7
  99. package/dist/{chunk-6FTC6EYD.mjs.map → chunk-LGOQ65JQ.mjs.map} +1 -1
  100. package/dist/{chunk-X6NPTILR.mjs → chunk-MQS6AF5K.mjs} +3 -3
  101. package/dist/{chunk-X6NPTILR.mjs.map → chunk-MQS6AF5K.mjs.map} +1 -1
  102. package/dist/{chunk-RA4DCRMR.mjs → chunk-MWKI6ZIS.mjs} +3 -3
  103. package/dist/{chunk-RA4DCRMR.mjs.map → chunk-MWKI6ZIS.mjs.map} +1 -1
  104. package/dist/{chunk-GKVEWOYN.js → chunk-MYMZRHTC.js} +8 -8
  105. package/dist/{chunk-GKVEWOYN.js.map → chunk-MYMZRHTC.js.map} +1 -1
  106. package/dist/{chunk-LUF22UGR.js → chunk-NBT4L2D7.js} +8 -8
  107. package/dist/{chunk-LUF22UGR.js.map → chunk-NBT4L2D7.js.map} +1 -1
  108. package/dist/{chunk-SCVSPTXJ.mjs → chunk-NCDF2RK4.mjs} +3 -3
  109. package/dist/{chunk-SCVSPTXJ.mjs.map → chunk-NCDF2RK4.mjs.map} +1 -1
  110. package/dist/{chunk-ZTY4YS7Q.js → chunk-NMM27UOF.js} +3 -3
  111. package/dist/{chunk-ZTY4YS7Q.js.map → chunk-NMM27UOF.js.map} +1 -1
  112. package/dist/{chunk-ZDXY44FH.js → chunk-NR7YZQRR.js} +4 -4
  113. package/dist/{chunk-ZDXY44FH.js.map → chunk-NR7YZQRR.js.map} +1 -1
  114. package/dist/{chunk-PXK4WNSU.js → chunk-PI3FHABB.js} +10 -10
  115. package/dist/{chunk-PXK4WNSU.js.map → chunk-PI3FHABB.js.map} +1 -1
  116. package/dist/{chunk-DTWR7VRQ.js → chunk-PIEHBSCN.js} +5 -5
  117. package/dist/{chunk-DTWR7VRQ.js.map → chunk-PIEHBSCN.js.map} +1 -1
  118. package/dist/{chunk-OX2GTNMB.mjs → chunk-PIPERXI7.mjs} +3 -3
  119. package/dist/{chunk-OX2GTNMB.mjs.map → chunk-PIPERXI7.mjs.map} +1 -1
  120. package/dist/{chunk-FWFJZV52.mjs → chunk-POJZA67T.mjs} +4 -4
  121. package/dist/{chunk-FWFJZV52.mjs.map → chunk-POJZA67T.mjs.map} +1 -1
  122. package/dist/{chunk-HOJ4J4X2.mjs → chunk-PQYQHZWV.mjs} +2 -2
  123. package/dist/{chunk-HOJ4J4X2.mjs.map → chunk-PQYQHZWV.mjs.map} +1 -1
  124. package/dist/{chunk-YVQNOB3Q.mjs → chunk-QOOLMSBY.mjs} +3 -3
  125. package/dist/{chunk-YVQNOB3Q.mjs.map → chunk-QOOLMSBY.mjs.map} +1 -1
  126. package/dist/{chunk-JR2FT6T5.js → chunk-QQQAW6WY.js} +6 -6
  127. package/dist/{chunk-JR2FT6T5.js.map → chunk-QQQAW6WY.js.map} +1 -1
  128. package/dist/{chunk-SJPI34DL.mjs → chunk-QXMWNIKL.mjs} +3 -3
  129. package/dist/{chunk-SJPI34DL.mjs.map → chunk-QXMWNIKL.mjs.map} +1 -1
  130. package/dist/{chunk-AHKVOYFO.mjs → chunk-R5IPDAMM.mjs} +3 -3
  131. package/dist/{chunk-AHKVOYFO.mjs.map → chunk-R5IPDAMM.mjs.map} +1 -1
  132. package/dist/{chunk-RQOKQC7J.mjs → chunk-RFAAY3BW.mjs} +3 -3
  133. package/dist/{chunk-RQOKQC7J.mjs.map → chunk-RFAAY3BW.mjs.map} +1 -1
  134. package/dist/{chunk-QK54SZPF.mjs → chunk-ROSYCNXG.mjs} +4 -4
  135. package/dist/{chunk-QK54SZPF.mjs.map → chunk-ROSYCNXG.mjs.map} +1 -1
  136. package/dist/{chunk-OBNMSO66.js → chunk-S2Y7LVQ2.js} +14 -14
  137. package/dist/{chunk-OBNMSO66.js.map → chunk-S2Y7LVQ2.js.map} +1 -1
  138. package/dist/{chunk-ALVQOG4M.mjs → chunk-SFC3OWSE.mjs} +3 -3
  139. package/dist/{chunk-ALVQOG4M.mjs.map → chunk-SFC3OWSE.mjs.map} +1 -1
  140. package/dist/{chunk-F2ZFMPW4.js → chunk-TR3F3CLV.js} +7 -7
  141. package/dist/{chunk-F2ZFMPW4.js.map → chunk-TR3F3CLV.js.map} +1 -1
  142. package/dist/{chunk-RI25UGHE.mjs → chunk-UEUWC3PH.mjs} +3 -3
  143. package/dist/{chunk-RI25UGHE.mjs.map → chunk-UEUWC3PH.mjs.map} +1 -1
  144. package/dist/{chunk-YC2CKOX6.js → chunk-UHM3CCCC.js} +12 -12
  145. package/dist/{chunk-YC2CKOX6.js.map → chunk-UHM3CCCC.js.map} +1 -1
  146. package/dist/{chunk-AUTJQGZ2.mjs → chunk-UQY5KC64.mjs} +4 -4
  147. package/dist/{chunk-AUTJQGZ2.mjs.map → chunk-UQY5KC64.mjs.map} +1 -1
  148. package/dist/{chunk-HQ2EPU5R.js → chunk-VVBMWV4O.js} +5 -5
  149. package/dist/{chunk-HQ2EPU5R.js.map → chunk-VVBMWV4O.js.map} +1 -1
  150. package/dist/{chunk-KPWK23G7.js → chunk-W2U5SLMY.js} +3 -3
  151. package/dist/{chunk-KPWK23G7.js.map → chunk-W2U5SLMY.js.map} +1 -1
  152. package/dist/{chunk-FX232N4P.mjs → chunk-WINDP776.mjs} +4 -4
  153. package/dist/{chunk-FX232N4P.mjs.map → chunk-WINDP776.mjs.map} +1 -1
  154. package/dist/chunk-XEB77DQS.js +468 -0
  155. package/dist/chunk-XEB77DQS.js.map +1 -0
  156. package/dist/cli/index.js +3 -3
  157. package/dist/cli/index.mjs +1 -1
  158. package/dist/client/index.js +4 -4
  159. package/dist/client/index.mjs +3 -3
  160. package/dist/commerce/index.js +57 -57
  161. package/dist/commerce/index.mjs +5 -5
  162. package/dist/commerce/server.d.ts +1 -1
  163. package/dist/commerce/server.js +7 -7
  164. package/dist/commerce/server.js.map +1 -1
  165. package/dist/commerce/server.mjs +7 -7
  166. package/dist/commerce/server.mjs.map +1 -1
  167. package/dist/engage/index.js +10 -10
  168. package/dist/engage/index.mjs +7 -7
  169. package/dist/fleet/index.js +8 -8
  170. package/dist/fleet/index.mjs +4 -4
  171. package/dist/forms/index.js +21 -21
  172. package/dist/forms/index.mjs +10 -10
  173. package/dist/forms/server.js +10 -10
  174. package/dist/forms/server.mjs +8 -8
  175. package/dist/forms/static.js +7 -7
  176. package/dist/forms/static.mjs +6 -6
  177. package/dist/images/index.js +11 -11
  178. package/dist/images/index.mjs +4 -4
  179. package/dist/index.js +63 -63
  180. package/dist/index.mjs +9 -9
  181. package/dist/layout/client.js +8 -8
  182. package/dist/layout/client.mjs +7 -7
  183. package/dist/layout/index.js +10 -10
  184. package/dist/layout/index.mjs +8 -8
  185. package/dist/llms/client.d.ts +18 -0
  186. package/dist/llms/client.d.ts.map +1 -0
  187. package/dist/llms/client.js +66 -0
  188. package/dist/llms/client.js.map +1 -0
  189. package/dist/llms/client.mjs +5 -0
  190. package/dist/llms/client.mjs.map +1 -0
  191. package/dist/llms/index.js +58 -462
  192. package/dist/llms/index.js.map +1 -1
  193. package/dist/llms/index.mjs +3 -449
  194. package/dist/llms/index.mjs.map +1 -1
  195. package/dist/maps/index.js +5 -5
  196. package/dist/maps/index.mjs +3 -3
  197. package/dist/search/index.js +4 -4
  198. package/dist/search/index.mjs +3 -3
  199. package/dist/seo/ManagedSchema.d.ts.map +1 -1
  200. package/dist/seo/client.js +5 -5
  201. package/dist/seo/client.mjs +4 -4
  202. package/dist/seo/index.js +25 -17
  203. package/dist/seo/index.js.map +1 -1
  204. package/dist/seo/index.mjs +17 -9
  205. package/dist/seo/index.mjs.map +1 -1
  206. package/dist/seo/server.js +5 -5
  207. package/dist/seo/server.mjs +1 -1
  208. package/dist/server/index.js +3 -3
  209. package/dist/server/index.mjs +2 -2
  210. package/dist/shared/build-entries.d.ts +6 -0
  211. package/dist/shared/build-entries.d.ts.map +1 -1
  212. package/dist/shared/version.d.ts +1 -1
  213. package/dist/signal/index.js +11 -11
  214. package/dist/signal/index.mjs +2 -2
  215. package/dist/sync/index.js +17 -17
  216. package/dist/sync/index.mjs +4 -4
  217. package/package.json +6 -1
  218. package/dist/ChatWidget-IRTAMRQS.mjs +0 -15
  219. package/dist/ChatWidget-KCXQXNUF.js +0 -24
  220. package/dist/EngageWidget-7AIUJRXV.mjs +0 -12
  221. package/dist/EngageWidget-EUUZHQOU.js +0 -21
  222. package/dist/ManagedForm-7IDXBQS6.mjs +0 -16
  223. package/dist/ManagedForm-RI2TSUZD.js +0 -25
  224. package/dist/SitemapSync-DWEL7HTB.js +0 -18
  225. package/dist/SitemapSync-YIAI7PMT.mjs +0 -9
  226. package/dist/chunk-TAPCWMBV.mjs +0 -6
  227. package/dist/chunk-TJVZEDE3.js +0 -8
@@ -6,7 +6,7 @@ import { TITLE_MAX_PX, OG_REPORT_ATTR } from '../chunk-YU7QZ3PP.mjs';
6
6
  import { require_main } from '../chunk-NNZDWY3L.mjs';
7
7
  import { findAppDirForDiscovery, NEXT_PROXY_FILES, NEXT_MIDDLEWARE_FILES, findConventionFile, NEXT_APP_DIRS, findSitemapRoute, findProxyFiles, findNextConfig, findRootLayout, discoverNextJsRoutes, hasPageFile, NEXT_SOURCE_EXTENSIONS } from '../chunk-U2V542EO.mjs';
8
8
  import { applyTrailingSlash } from '../chunk-4LYW6PMU.mjs';
9
- import { SITE_KIT_VERSION } from '../chunk-TAPCWMBV.mjs';
9
+ import { SITE_KIT_VERSION } from '../chunk-5FETEH3Y.mjs';
10
10
  import { __commonJS, __require, __toESM, __export, __privateAdd, __publicField, __privateGet, __privateMethod, __privateSet, __privateWrapper } from '../chunk-BEXTDHO4.mjs';
11
11
  import { EventEmitter } from 'events';
12
12
  import childProcess, { execFile as execFile$1, execSync, spawnSync, spawn } from 'child_process';
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkHQ2EPU5R_js = require('../chunk-HQ2EPU5R.js');
4
+ var chunkVVBMWV4O_js = require('../chunk-VVBMWV4O.js');
5
5
  var chunkHGNSJXWT_js = require('../chunk-HGNSJXWT.js');
6
6
  require('../chunk-H5NBFNND.js');
7
7
  require('../chunk-SWIKKSKL.js');
@@ -9,8 +9,8 @@ var chunk3DWIYCQX_js = require('../chunk-3DWIYCQX.js');
9
9
  var chunkG6WF4G3E_js = require('../chunk-G6WF4G3E.js');
10
10
  var chunkRC4WWQXR_js = require('../chunk-RC4WWQXR.js');
11
11
  require('../chunk-VJMPIRSD.js');
12
- require('../chunk-7BI2RVQD.js');
13
- require('../chunk-TJVZEDE3.js');
12
+ require('../chunk-CZEIHFLW.js');
13
+ require('../chunk-7R6H3GQ4.js');
14
14
  require('../chunk-SNAQBZPT.js');
15
15
 
16
16
  // src/client/SiteKitCredential.tsx
@@ -20,7 +20,7 @@ function SiteKitCredential({
20
20
  site,
21
21
  debug
22
22
  }) {
23
- chunkHQ2EPU5R_js.publishSiteCredential({ apiKey, apiUrl, site, debug });
23
+ chunkVVBMWV4O_js.publishSiteCredential({ apiKey, apiUrl, site, debug });
24
24
  return null;
25
25
  }
26
26
 
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { publishSiteCredential } from '../chunk-ALVQOG4M.mjs';
2
+ import { publishSiteCredential } from '../chunk-SFC3OWSE.mjs';
3
3
  export { useDeferredActivation } from '../chunk-ZVBLXXNJ.mjs';
4
4
  import '../chunk-JLVCWC6A.mjs';
5
5
  import '../chunk-ZN4HBK5C.mjs';
@@ -7,8 +7,8 @@ export { trackConversion, trackEvent } from '../chunk-SHLWA6JY.mjs';
7
7
  export { VISUAL_VIEWPORT_GAP_PROPERTY, VisualViewportGap, useVisualViewportGap } from '../chunk-NSWO43XW.mjs';
8
8
  export { getOrCreateSessionId, getOrCreateVisitorId, useSiteKitIdentity } from '../chunk-ZZQAGCSI.mjs';
9
9
  import '../chunk-6EDVCUAG.mjs';
10
- import '../chunk-SCVSPTXJ.mjs';
11
- import '../chunk-TAPCWMBV.mjs';
10
+ import '../chunk-NCDF2RK4.mjs';
11
+ import '../chunk-5FETEH3Y.mjs';
12
12
  import '../chunk-BEXTDHO4.mjs';
13
13
 
14
14
  // src/client/SiteKitCredential.tsx
@@ -1,228 +1,228 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkOBNMSO66_js = require('../chunk-OBNMSO66.js');
4
+ var chunkS2Y7LVQ2_js = require('../chunk-S2Y7LVQ2.js');
5
5
  require('../chunk-3SDMJMN2.js');
6
- require('../chunk-D7CF3OPZ.js');
6
+ require('../chunk-5HFD36AN.js');
7
7
  require('../chunk-3DWIYCQX.js');
8
8
  require('../chunk-RC4WWQXR.js');
9
9
  require('../chunk-P4Y75QSU.js');
10
10
  require('../chunk-VJMPIRSD.js');
11
11
  require('../chunk-5RNAUYWE.js');
12
- require('../chunk-GDH42JAS.js');
13
- require('../chunk-7BI2RVQD.js');
14
- require('../chunk-TJVZEDE3.js');
12
+ require('../chunk-I7HOMMIK.js');
13
+ require('../chunk-CZEIHFLW.js');
14
+ require('../chunk-7R6H3GQ4.js');
15
15
  require('../chunk-SNAQBZPT.js');
16
16
 
17
17
 
18
18
 
19
19
  Object.defineProperty(exports, "CalendarView", {
20
20
  enumerable: true,
21
- get: function () { return chunkOBNMSO66_js.CalendarView; }
21
+ get: function () { return chunkS2Y7LVQ2_js.CalendarView; }
22
22
  });
23
23
  Object.defineProperty(exports, "CapacityBadge", {
24
24
  enumerable: true,
25
- get: function () { return chunkOBNMSO66_js.CapacityBadge; }
25
+ get: function () { return chunkS2Y7LVQ2_js.CapacityBadge; }
26
26
  });
27
27
  Object.defineProperty(exports, "CheckoutForm", {
28
28
  enumerable: true,
29
- get: function () { return chunkOBNMSO66_js.CheckoutForm; }
29
+ get: function () { return chunkS2Y7LVQ2_js.CheckoutForm; }
30
30
  });
31
31
  Object.defineProperty(exports, "EventCalendar", {
32
32
  enumerable: true,
33
- get: function () { return chunkOBNMSO66_js.EventCalendar; }
33
+ get: function () { return chunkS2Y7LVQ2_js.EventCalendar; }
34
34
  });
35
35
  Object.defineProperty(exports, "EventCheckout", {
36
36
  enumerable: true,
37
- get: function () { return chunkOBNMSO66_js.EventCheckout; }
37
+ get: function () { return chunkS2Y7LVQ2_js.EventCheckout; }
38
38
  });
39
39
  Object.defineProperty(exports, "EventEmbed", {
40
40
  enumerable: true,
41
- get: function () { return chunkOBNMSO66_js.EventEmbed; }
41
+ get: function () { return chunkS2Y7LVQ2_js.EventEmbed; }
42
42
  });
43
43
  Object.defineProperty(exports, "EventJsonLd", {
44
44
  enumerable: true,
45
- get: function () { return chunkOBNMSO66_js.EventJsonLd; }
45
+ get: function () { return chunkS2Y7LVQ2_js.EventJsonLd; }
46
46
  });
47
47
  Object.defineProperty(exports, "EventModal", {
48
48
  enumerable: true,
49
- get: function () { return chunkOBNMSO66_js.EventModal; }
49
+ get: function () { return chunkS2Y7LVQ2_js.EventModal; }
50
50
  });
51
51
  Object.defineProperty(exports, "EventTile", {
52
52
  enumerable: true,
53
- get: function () { return chunkOBNMSO66_js.EventTile; }
53
+ get: function () { return chunkS2Y7LVQ2_js.EventTile; }
54
54
  });
55
55
  Object.defineProperty(exports, "EventsAgenda", {
56
56
  enumerable: true,
57
- get: function () { return chunkOBNMSO66_js.EventsAgenda; }
57
+ get: function () { return chunkS2Y7LVQ2_js.EventsAgenda; }
58
58
  });
59
59
  Object.defineProperty(exports, "EventsWidget", {
60
60
  enumerable: true,
61
- get: function () { return chunkOBNMSO66_js.EventsWidget; }
61
+ get: function () { return chunkS2Y7LVQ2_js.EventsWidget; }
62
62
  });
63
63
  Object.defineProperty(exports, "OfferingCard", {
64
64
  enumerable: true,
65
- get: function () { return chunkOBNMSO66_js.OfferingCard; }
65
+ get: function () { return chunkS2Y7LVQ2_js.OfferingCard; }
66
66
  });
67
67
  Object.defineProperty(exports, "OfferingList", {
68
68
  enumerable: true,
69
- get: function () { return chunkOBNMSO66_js.OfferingList; }
69
+ get: function () { return chunkS2Y7LVQ2_js.OfferingList; }
70
70
  });
71
71
  Object.defineProperty(exports, "ProductDetail", {
72
72
  enumerable: true,
73
- get: function () { return chunkOBNMSO66_js.ProductDetail; }
73
+ get: function () { return chunkS2Y7LVQ2_js.ProductDetail; }
74
74
  });
75
75
  Object.defineProperty(exports, "ProductEmbed", {
76
76
  enumerable: true,
77
- get: function () { return chunkOBNMSO66_js.ProductEmbed; }
77
+ get: function () { return chunkS2Y7LVQ2_js.ProductEmbed; }
78
78
  });
79
79
  Object.defineProperty(exports, "ProductGrid", {
80
80
  enumerable: true,
81
- get: function () { return chunkOBNMSO66_js.ProductGrid; }
81
+ get: function () { return chunkS2Y7LVQ2_js.ProductGrid; }
82
82
  });
83
83
  Object.defineProperty(exports, "ProductPage", {
84
84
  enumerable: true,
85
- get: function () { return chunkOBNMSO66_js.ProductPage; }
85
+ get: function () { return chunkS2Y7LVQ2_js.ProductPage; }
86
86
  });
87
87
  Object.defineProperty(exports, "RegistrationForm", {
88
88
  enumerable: true,
89
- get: function () { return chunkOBNMSO66_js.RegistrationForm; }
89
+ get: function () { return chunkS2Y7LVQ2_js.RegistrationForm; }
90
90
  });
91
91
  Object.defineProperty(exports, "SizeChart", {
92
92
  enumerable: true,
93
- get: function () { return chunkOBNMSO66_js.SizeChart; }
93
+ get: function () { return chunkS2Y7LVQ2_js.SizeChart; }
94
94
  });
95
95
  Object.defineProperty(exports, "UpcomingEvents", {
96
96
  enumerable: true,
97
- get: function () { return chunkOBNMSO66_js.UpcomingEvents; }
97
+ get: function () { return chunkS2Y7LVQ2_js.UpcomingEvents; }
98
98
  });
99
99
  Object.defineProperty(exports, "createCheckoutSession", {
100
100
  enumerable: true,
101
- get: function () { return chunkOBNMSO66_js.createCheckoutSession; }
101
+ get: function () { return chunkS2Y7LVQ2_js.createCheckoutSession; }
102
102
  });
103
103
  Object.defineProperty(exports, "createPaymentIntent", {
104
104
  enumerable: true,
105
- get: function () { return chunkOBNMSO66_js.createPaymentIntent; }
105
+ get: function () { return chunkS2Y7LVQ2_js.createPaymentIntent; }
106
106
  });
107
107
  Object.defineProperty(exports, "fetchActiveProcessor", {
108
108
  enumerable: true,
109
- get: function () { return chunkOBNMSO66_js.fetchActiveProcessor; }
109
+ get: function () { return chunkS2Y7LVQ2_js.fetchActiveProcessor; }
110
110
  });
111
111
  Object.defineProperty(exports, "fetchCategories", {
112
112
  enumerable: true,
113
- get: function () { return chunkOBNMSO66_js.fetchCategories; }
113
+ get: function () { return chunkS2Y7LVQ2_js.fetchCategories; }
114
114
  });
115
115
  Object.defineProperty(exports, "fetchLatestOffering", {
116
116
  enumerable: true,
117
- get: function () { return chunkOBNMSO66_js.fetchLatestOffering; }
117
+ get: function () { return chunkS2Y7LVQ2_js.fetchLatestOffering; }
118
118
  });
119
119
  Object.defineProperty(exports, "fetchNextEvent", {
120
120
  enumerable: true,
121
- get: function () { return chunkOBNMSO66_js.fetchNextEvent; }
121
+ get: function () { return chunkS2Y7LVQ2_js.fetchNextEvent; }
122
122
  });
123
123
  Object.defineProperty(exports, "fetchOffering", {
124
124
  enumerable: true,
125
- get: function () { return chunkOBNMSO66_js.fetchOffering; }
125
+ get: function () { return chunkS2Y7LVQ2_js.fetchOffering; }
126
126
  });
127
127
  Object.defineProperty(exports, "fetchOfferings", {
128
128
  enumerable: true,
129
- get: function () { return chunkOBNMSO66_js.fetchOfferings; }
129
+ get: function () { return chunkS2Y7LVQ2_js.fetchOfferings; }
130
130
  });
131
131
  Object.defineProperty(exports, "fetchProcessorConfig", {
132
132
  enumerable: true,
133
- get: function () { return chunkOBNMSO66_js.fetchProcessorConfig; }
133
+ get: function () { return chunkS2Y7LVQ2_js.fetchProcessorConfig; }
134
134
  });
135
135
  Object.defineProperty(exports, "fetchProductBySlug", {
136
136
  enumerable: true,
137
- get: function () { return chunkOBNMSO66_js.fetchProductBySlug; }
137
+ get: function () { return chunkS2Y7LVQ2_js.fetchProductBySlug; }
138
138
  });
139
139
  Object.defineProperty(exports, "fetchProducts", {
140
140
  enumerable: true,
141
- get: function () { return chunkOBNMSO66_js.fetchProducts; }
141
+ get: function () { return chunkS2Y7LVQ2_js.fetchProducts; }
142
142
  });
143
143
  Object.defineProperty(exports, "fetchProductsPublic", {
144
144
  enumerable: true,
145
- get: function () { return chunkOBNMSO66_js.fetchProductsPublic; }
145
+ get: function () { return chunkS2Y7LVQ2_js.fetchProductsPublic; }
146
146
  });
147
147
  Object.defineProperty(exports, "fetchServices", {
148
148
  enumerable: true,
149
- get: function () { return chunkOBNMSO66_js.fetchServices; }
149
+ get: function () { return chunkS2Y7LVQ2_js.fetchServices; }
150
150
  });
151
151
  Object.defineProperty(exports, "fetchShippingRates", {
152
152
  enumerable: true,
153
- get: function () { return chunkOBNMSO66_js.fetchShippingRates; }
153
+ get: function () { return chunkS2Y7LVQ2_js.fetchShippingRates; }
154
154
  });
155
155
  Object.defineProperty(exports, "fetchUpcomingEvents", {
156
156
  enumerable: true,
157
- get: function () { return chunkOBNMSO66_js.fetchUpcomingEvents; }
157
+ get: function () { return chunkS2Y7LVQ2_js.fetchUpcomingEvents; }
158
158
  });
159
159
  Object.defineProperty(exports, "formatDate", {
160
160
  enumerable: true,
161
- get: function () { return chunkOBNMSO66_js.formatDate; }
161
+ get: function () { return chunkS2Y7LVQ2_js.formatDate; }
162
162
  });
163
163
  Object.defineProperty(exports, "formatDateRange", {
164
164
  enumerable: true,
165
- get: function () { return chunkOBNMSO66_js.formatDateRange; }
165
+ get: function () { return chunkS2Y7LVQ2_js.formatDateRange; }
166
166
  });
167
167
  Object.defineProperty(exports, "formatDateTime", {
168
168
  enumerable: true,
169
- get: function () { return chunkOBNMSO66_js.formatDateTime; }
169
+ get: function () { return chunkS2Y7LVQ2_js.formatDateTime; }
170
170
  });
171
171
  Object.defineProperty(exports, "formatPrice", {
172
172
  enumerable: true,
173
- get: function () { return chunkOBNMSO66_js.formatPrice; }
173
+ get: function () { return chunkS2Y7LVQ2_js.formatPrice; }
174
174
  });
175
175
  Object.defineProperty(exports, "formatTime", {
176
176
  enumerable: true,
177
- get: function () { return chunkOBNMSO66_js.formatTime; }
177
+ get: function () { return chunkS2Y7LVQ2_js.formatTime; }
178
178
  });
179
179
  Object.defineProperty(exports, "getOfferingUrl", {
180
180
  enumerable: true,
181
- get: function () { return chunkOBNMSO66_js.getOfferingUrl; }
181
+ get: function () { return chunkS2Y7LVQ2_js.getOfferingUrl; }
182
182
  });
183
183
  Object.defineProperty(exports, "getRelativeTimeUntil", {
184
184
  enumerable: true,
185
- get: function () { return chunkOBNMSO66_js.getRelativeTimeUntil; }
185
+ get: function () { return chunkS2Y7LVQ2_js.getRelativeTimeUntil; }
186
186
  });
187
187
  Object.defineProperty(exports, "getSpotsRemaining", {
188
188
  enumerable: true,
189
- get: function () { return chunkOBNMSO66_js.getSpotsRemaining; }
189
+ get: function () { return chunkS2Y7LVQ2_js.getSpotsRemaining; }
190
190
  });
191
191
  Object.defineProperty(exports, "googleCalendarUrl", {
192
192
  enumerable: true,
193
- get: function () { return chunkOBNMSO66_js.googleCalendarUrl; }
193
+ get: function () { return chunkS2Y7LVQ2_js.googleCalendarUrl; }
194
194
  });
195
195
  Object.defineProperty(exports, "icsForEvent", {
196
196
  enumerable: true,
197
- get: function () { return chunkOBNMSO66_js.icsForEvent; }
197
+ get: function () { return chunkS2Y7LVQ2_js.icsForEvent; }
198
198
  });
199
199
  Object.defineProperty(exports, "icsResponse", {
200
200
  enumerable: true,
201
- get: function () { return chunkOBNMSO66_js.icsResponse; }
201
+ get: function () { return chunkS2Y7LVQ2_js.icsResponse; }
202
202
  });
203
203
  Object.defineProperty(exports, "isEventSoldOut", {
204
204
  enumerable: true,
205
- get: function () { return chunkOBNMSO66_js.isEventSoldOut; }
205
+ get: function () { return chunkS2Y7LVQ2_js.isEventSoldOut; }
206
206
  });
207
207
  Object.defineProperty(exports, "registerForEvent", {
208
208
  enumerable: true,
209
- get: function () { return chunkOBNMSO66_js.registerForEvent; }
209
+ get: function () { return chunkS2Y7LVQ2_js.registerForEvent; }
210
210
  });
211
211
  Object.defineProperty(exports, "shippingSelection", {
212
212
  enumerable: true,
213
- get: function () { return chunkOBNMSO66_js.shippingSelection; }
213
+ get: function () { return chunkS2Y7LVQ2_js.shippingSelection; }
214
214
  });
215
215
  Object.defineProperty(exports, "useEventModal", {
216
216
  enumerable: true,
217
- get: function () { return chunkOBNMSO66_js.useEventModal; }
217
+ get: function () { return chunkS2Y7LVQ2_js.useEventModal; }
218
218
  });
219
219
  Object.defineProperty(exports, "validateAddress", {
220
220
  enumerable: true,
221
- get: function () { return chunkOBNMSO66_js.validateAddress; }
221
+ get: function () { return chunkS2Y7LVQ2_js.validateAddress; }
222
222
  });
223
223
  Object.defineProperty(exports, "validateDiscountCode", {
224
224
  enumerable: true,
225
- get: function () { return chunkOBNMSO66_js.validateDiscountCode; }
225
+ get: function () { return chunkS2Y7LVQ2_js.validateDiscountCode; }
226
226
  });
227
227
  //# sourceMappingURL=index.js.map
228
228
  //# sourceMappingURL=index.js.map
@@ -1,15 +1,15 @@
1
1
  'use client';
2
- export { CalendarView, CapacityBadge, CheckoutForm, EventCalendar, EventCheckout, EventEmbed, EventJsonLd, EventModal, EventTile, EventsAgenda, EventsWidget, OfferingCard, OfferingList, ProductDetail, ProductEmbed, ProductGrid, ProductPage, RegistrationForm, SizeChart, UpcomingEvents, createCheckoutSession, createPaymentIntent, fetchActiveProcessor, fetchCategories, fetchLatestOffering, fetchNextEvent, fetchOffering, fetchOfferings, fetchProcessorConfig, fetchProductBySlug, fetchProducts, fetchProductsPublic, fetchServices, fetchShippingRates, fetchUpcomingEvents, formatDate, formatDateRange, formatDateTime, formatPrice, formatTime, getOfferingUrl, getRelativeTimeUntil, getSpotsRemaining, googleCalendarUrl, icsForEvent, icsResponse, isEventSoldOut, registerForEvent, shippingSelection, useEventModal, validateAddress, validateDiscountCode } from '../chunk-FWFJZV52.mjs';
2
+ export { CalendarView, CapacityBadge, CheckoutForm, EventCalendar, EventCheckout, EventEmbed, EventJsonLd, EventModal, EventTile, EventsAgenda, EventsWidget, OfferingCard, OfferingList, ProductDetail, ProductEmbed, ProductGrid, ProductPage, RegistrationForm, SizeChart, UpcomingEvents, createCheckoutSession, createPaymentIntent, fetchActiveProcessor, fetchCategories, fetchLatestOffering, fetchNextEvent, fetchOffering, fetchOfferings, fetchProcessorConfig, fetchProductBySlug, fetchProducts, fetchProductsPublic, fetchServices, fetchShippingRates, fetchUpcomingEvents, formatDate, formatDateRange, formatDateTime, formatPrice, formatTime, getOfferingUrl, getRelativeTimeUntil, getSpotsRemaining, googleCalendarUrl, icsForEvent, icsResponse, isEventSoldOut, registerForEvent, shippingSelection, useEventModal, validateAddress, validateDiscountCode } from '../chunk-POJZA67T.mjs';
3
3
  import '../chunk-64BOVMXG.mjs';
4
- import '../chunk-X6NPTILR.mjs';
4
+ import '../chunk-MQS6AF5K.mjs';
5
5
  import '../chunk-SHLWA6JY.mjs';
6
6
  import '../chunk-ZZQAGCSI.mjs';
7
7
  import '../chunk-5SANRSX3.mjs';
8
8
  import '../chunk-6EDVCUAG.mjs';
9
9
  import '../chunk-A6UYV475.mjs';
10
- import '../chunk-3EXBBFXX.mjs';
11
- import '../chunk-SCVSPTXJ.mjs';
12
- import '../chunk-TAPCWMBV.mjs';
10
+ import '../chunk-4C5CZJIN.mjs';
11
+ import '../chunk-NCDF2RK4.mjs';
12
+ import '../chunk-5FETEH3Y.mjs';
13
13
  import '../chunk-BEXTDHO4.mjs';
14
14
  //# sourceMappingURL=index.mjs.map
15
15
  //# sourceMappingURL=index.mjs.map
@@ -99,7 +99,7 @@ export declare function getOfferingsResult(config: ServerConfig, options?: {
99
99
  /**
100
100
  * Fetch upcoming events (server-side), WITH schedules and category embedded.
101
101
  *
102
- * Uses POST /public/commerce/events — the same endpoint the client fetcher
102
+ * Uses POST /api/public/commerce/events — the same endpoint the client fetcher
103
103
  * uses — because the GET offerings list does NOT embed commerce_schedules,
104
104
  * which made this helper return events with empty `schedules[]` and forced
105
105
  * sites to hand-roll their own fetcher for any calendar UI (the Ludlow PTO
@@ -94,7 +94,7 @@ function transformOffering(data) {
94
94
  async function getProductPaths(config) {
95
95
  const { ok, data } = await apiFetch(
96
96
  config,
97
- `/public/commerce/offerings?type=product&status=active&fields=slug`
97
+ `/api/public/commerce/offerings?type=product&status=active&fields=slug`
98
98
  );
99
99
  if (!ok) console.error("[site-kit/commerce] getProductPaths failed \u2014 0 product pages will be prerendered");
100
100
  if (!data?.offerings) return [];
@@ -103,7 +103,7 @@ async function getProductPaths(config) {
103
103
  async function getEventPaths(config) {
104
104
  const { ok, data } = await apiFetch(
105
105
  config,
106
- `/public/commerce/offerings?type=event&status=active&fields=slug`
106
+ `/api/public/commerce/offerings?type=event&status=active&fields=slug`
107
107
  );
108
108
  if (!ok) console.error("[site-kit/commerce] getEventPaths failed \u2014 0 event pages will be prerendered");
109
109
  if (!data?.offerings) return [];
@@ -120,7 +120,7 @@ async function getOfferingPaths(config, type) {
120
120
  }
121
121
  const { ok, data } = await apiFetch(
122
122
  config,
123
- `/public/commerce/offerings?status=active&fields=slug${typeParam}`
123
+ `/api/public/commerce/offerings?status=active&fields=slug${typeParam}`
124
124
  );
125
125
  if (!ok) console.error("[site-kit/commerce] getOfferingPaths failed \u2014 0 pages will be prerendered");
126
126
  if (!data?.offerings) return [];
@@ -132,7 +132,7 @@ async function getOfferingBySlug(config, slug) {
132
132
  async function getOfferingBySlugResult(config, slug) {
133
133
  const { ok, data } = await apiFetch(
134
134
  config,
135
- `/public/commerce/offerings/${slug}`
135
+ `/api/public/commerce/offerings/${slug}`
136
136
  );
137
137
  if (!data?.offering) return { ok, data: null };
138
138
  return { ok: true, data: transformOffering(data.offering) };
@@ -158,7 +158,7 @@ async function getOfferingsResult(config, options = {}) {
158
158
  }
159
159
  const { ok, data } = await apiFetch(
160
160
  config,
161
- `/public/commerce/offerings?${params.toString()}`
161
+ `/api/public/commerce/offerings?${params.toString()}`
162
162
  );
163
163
  if (!data?.offerings) return { ok, data: [] };
164
164
  return { ok: true, data: data.offerings.map(transformOffering) };
@@ -169,7 +169,7 @@ async function getUpcomingEvents(config, options = {}) {
169
169
  async function getUpcomingEventsResult(config, options = {}) {
170
170
  const primary = await apiPost(
171
171
  config,
172
- "/public/commerce/events",
172
+ "/api/public/commerce/events",
173
173
  {
174
174
  type: "event",
175
175
  category: options.category,
@@ -192,7 +192,7 @@ async function getUpcomingEventsResult(config, options = {}) {
192
192
  }
193
193
  const legacy = await apiFetch(
194
194
  config,
195
- `/public/commerce/offerings?${params.toString()}`
195
+ `/api/public/commerce/offerings?${params.toString()}`
196
196
  );
197
197
  if (legacy.ok && legacy.data?.offerings) {
198
198
  return { ok: true, data: legacy.data.offerings.map(transformOffering) };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commerce/server.ts"],"names":[],"mappings":"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","file":"server.js","sourcesContent":["/**\n * @sonordev/site-kit/commerce - Server-side utilities\n * \n * Helpers for server-side rendering and dynamic routes.\n * Use in Next.js getStaticPaths, getStaticProps, or App Router.\n * \n * All data fetching goes through the Portal API.\n */\n\nimport type { CommerceOffering, OfferingType } from './types'\n\ninterface ServerConfig {\n apiUrl: string\n apiKey: string\n projectId: string\n}\n\ninterface SlugItem {\n slug: string\n}\n\n/**\n * Outcome of a server-side fetch.\n *\n * `ok` is the entire point. A helper that returns an empty array on failure lets\n * the calling page state a business fact it does not know: \"no upcoming events\",\n * \"no products available\" — when the truth is only that the API was unreachable.\n * QCR's /public-cruises told customers the business had no cruises during a\n * transient failure while three were on sale (2026-08-27).\n *\n * Branch on `ok` in new code. The legacy helpers returning a bare array or null\n * are kept for compatibility, but they cannot express this difference — an empty\n * result from them is indistinguishable from an outage.\n */\nexport interface ServerResult<T> {\n /** false = the request failed. `ok: true` with empty data means genuinely empty. */\n ok: boolean\n data: T\n}\n\n/**\n * Next throws to signal control flow, not failure — a DynamicServerError during\n * the static pass means \"this route can't be prerendered\", and redirect()/\n * notFound() throw too. Catching those and returning a failure logs a fake fetch\n * error on every build and makes a real API outage look identical to the\n * framework doing its job. Always rethrow.\n */\nfunction isFrameworkSignal(err: unknown): boolean {\n const digest = (err as { digest?: unknown } | null)?.digest\n return (\n typeof digest === 'string' &&\n (digest === 'DYNAMIC_SERVER_USAGE' || digest.startsWith('NEXT_'))\n )\n}\n\nasync function apiFetch<T>(\n config: ServerConfig,\n endpoint: string,\n): Promise<ServerResult<T | null>> {\n try {\n const response = await fetch(`${config.apiUrl}${endpoint}`, {\n headers: {\n 'X-API-Key': config.apiKey,\n 'X-Project-ID': config.projectId,\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n console.error(`[site-kit/commerce] GET ${endpoint} failed: ${response.status}`)\n return { ok: false, data: null }\n }\n return { ok: true, data: (await response.json()) as T }\n } catch (error) {\n if (isFrameworkSignal(error)) throw error\n console.error(`[site-kit/commerce] GET ${endpoint} failed:`, error)\n return { ok: false, data: null }\n }\n}\n\nasync function apiPost<T>(\n config: ServerConfig,\n endpoint: string,\n body: Record<string, unknown>,\n): Promise<ServerResult<T | null>> {\n try {\n const response = await fetch(`${config.apiUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'X-API-Key': config.apiKey,\n 'X-Project-ID': config.projectId,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n console.error(`[site-kit/commerce] POST ${endpoint} failed: ${response.status}`)\n return { ok: false, data: null }\n }\n return { ok: true, data: (await response.json()) as T }\n } catch (error) {\n if (isFrameworkSignal(error)) throw error\n console.error(`[site-kit/commerce] POST ${endpoint} failed:`, error)\n return { ok: false, data: null }\n }\n}\n\nfunction transformOffering(data: Record<string, unknown>): CommerceOffering {\n return {\n id: data.id as string,\n project_id: data.project_id as string,\n type: data.type as OfferingType,\n status: data.status as 'draft' | 'active' | 'archived' | 'sold_out',\n name: data.name as string,\n slug: data.slug as string,\n description: data.description as string | undefined,\n short_description: data.short_description as string | undefined,\n long_description: data.long_description as string | undefined,\n featured_image_url: data.featured_image_url as string | undefined,\n gallery_images: (data.gallery_image_urls as string[]) || [],\n price_type: (data.price_type as 'fixed' | 'variable' | 'quote' | 'free') || 'fixed',\n price: data.price as number | undefined,\n compare_at_price: data.compare_at_price as number | undefined,\n currency: (data.currency as string) || 'USD',\n price_is_public: (data.price_is_public as boolean) ?? true,\n billing_period: data.billing_period as 'weekly' | 'monthly' | 'quarterly' | 'yearly' | undefined,\n track_inventory: data.track_inventory as boolean | undefined,\n inventory_count: data.inventory_count as number | undefined,\n allow_backorder: data.allow_backorder as boolean | undefined,\n duration_minutes: data.duration_minutes as number | undefined,\n capacity: data.capacity as number | undefined,\n location: data.location as string | undefined,\n is_virtual: data.is_virtual as boolean | undefined,\n virtual_meeting_url: data.virtual_meeting_url as string | undefined,\n requires_booking: data.requires_booking as boolean | undefined,\n booking_lead_time_hours: data.booking_lead_time_hours as number | undefined,\n category: data.category as CommerceOffering['category'],\n category_id: data.category_id as string | undefined,\n tags: (data.tags as string[]) || [],\n seo_title: data.seo_title as string | undefined,\n seo_description: data.seo_description as string | undefined,\n features: (data.features as string[]) || [],\n specifications: (data.specifications as Record<string, string>) || {},\n schedules: (data.schedules as CommerceOffering['schedules']) || [],\n variants: (data.variants as CommerceOffering['variants']) || [],\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n }\n}\n\n// ============================================\n// Static Path Generators\n// ============================================\n\n/**\n * Get all product slugs for static generation\n * \n * @example Next.js Pages Router\n * export async function getStaticPaths() {\n * const paths = await getProductPaths(config)\n * return { paths, fallback: 'blocking' }\n * }\n */\nexport async function getProductPaths(config: ServerConfig): Promise<{ params: { slug: string } }[]> {\n const { ok, data } = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/public/commerce/offerings?type=product&status=active&fields=slug`\n )\n\n // A failed path fetch prerenders ZERO product pages and looks like a healthy\n // build. Say so loudly rather than shipping a site with its catalogue missing.\n if (!ok) console.error('[site-kit/commerce] getProductPaths failed — 0 product pages will be prerendered')\n if (!data?.offerings) return []\n\n return data.offerings.map((item: SlugItem) => ({ params: { slug: item.slug } }))\n}\n\n/**\n * Get all event slugs for static generation\n */\nexport async function getEventPaths(config: ServerConfig): Promise<{ params: { slug: string } }[]> {\n const { ok, data } = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/public/commerce/offerings?type=event&status=active&fields=slug`\n )\n\n if (!ok) console.error('[site-kit/commerce] getEventPaths failed — 0 event pages will be prerendered')\n if (!data?.offerings) return []\n\n return data.offerings.map((item: SlugItem) => ({ params: { slug: item.slug } }))\n}\n\n/**\n * Get all offering slugs for static generation (any type)\n */\nexport async function getOfferingPaths(\n config: ServerConfig,\n type?: OfferingType | OfferingType[]\n): Promise<{ params: { slug: string } }[]> {\n let typeParam = ''\n if (type) {\n if (Array.isArray(type)) {\n typeParam = `&type=${type.join(',')}`\n } else {\n typeParam = `&type=${type}`\n }\n }\n \n const { ok, data } = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/public/commerce/offerings?status=active&fields=slug${typeParam}`\n )\n\n if (!ok) console.error('[site-kit/commerce] getOfferingPaths failed — 0 pages will be prerendered')\n if (!data?.offerings) return []\n\n return data.offerings.map((item: SlugItem) => ({ params: { slug: item.slug } }))\n}\n\n// ============================================\n// Data Fetchers\n// ============================================\n\n/**\n * Fetch a single offering by slug (server-side)\n * \n * @example Next.js Pages Router\n * export async function getStaticProps({ params }) {\n * const product = await getOfferingBySlug(config, params.slug)\n * if (!product) return { notFound: true }\n * return { props: { product }, revalidate: 60 }\n * }\n */\nexport async function getOfferingBySlug(\n config: ServerConfig,\n slug: string\n): Promise<CommerceOffering | null> {\n return (await getOfferingBySlugResult(config, slug)).data\n}\n\n/**\n * As getOfferingBySlug, but distinguishes \"no such offering\" (ok: true, null)\n * from \"could not reach the API\" (ok: false, null). Use this before rendering a\n * 404 — a notFound() on a transient failure de-indexes a page that exists.\n */\nexport async function getOfferingBySlugResult(\n config: ServerConfig,\n slug: string\n): Promise<ServerResult<CommerceOffering | null>> {\n const { ok, data } = await apiFetch<{ offering: Record<string, unknown> }>(\n config,\n `/public/commerce/offerings/${slug}`\n )\n\n if (!data?.offering) return { ok, data: null }\n\n return { ok: true, data: transformOffering(data.offering) }\n}\n\n/**\n * Fetch all offerings of a type (server-side)\n */\nexport async function getOfferings(\n config: ServerConfig,\n options: {\n type?: OfferingType | OfferingType[]\n category?: string\n limit?: number\n status?: string\n } = {}\n): Promise<CommerceOffering[]> {\n return (await getOfferingsResult(config, options)).data\n}\n\n/**\n * As getOfferings, but distinguishes an empty catalogue from a failed request.\n * Branch on `ok` before rendering \"nothing available\" copy.\n */\nexport async function getOfferingsResult(\n config: ServerConfig,\n options: {\n type?: OfferingType | OfferingType[]\n category?: string\n limit?: number\n status?: string\n } = {}\n): Promise<ServerResult<CommerceOffering[]>> {\n const params = new URLSearchParams()\n params.set('status', options.status || 'active')\n \n if (options.type) {\n if (Array.isArray(options.type)) {\n params.set('type', options.type.join(','))\n } else {\n params.set('type', options.type)\n }\n }\n \n if (options.category) {\n params.set('category', options.category)\n }\n \n if (options.limit) {\n params.set('limit', options.limit.toString())\n }\n \n const { ok, data } = await apiFetch<{ offerings: Record<string, unknown>[] }>(\n config,\n `/public/commerce/offerings?${params.toString()}`\n )\n\n if (!data?.offerings) return { ok, data: [] }\n\n return { ok: true, data: data.offerings.map(transformOffering) }\n}\n\n/**\n * Fetch upcoming events (server-side), WITH schedules and category embedded.\n *\n * Uses POST /public/commerce/events — the same endpoint the client fetcher\n * uses — because the GET offerings list does NOT embed commerce_schedules,\n * which made this helper return events with empty `schedules[]` and forced\n * sites to hand-roll their own fetcher for any calendar UI (the Ludlow PTO\n * lesson). Falls back to the legacy offerings query if the events endpoint\n * is unavailable (older self-hosted API).\n */\nexport async function getUpcomingEvents(\n config: ServerConfig,\n options: { limit?: number; category?: string } = {}\n): Promise<CommerceOffering[]> {\n return (await getUpcomingEventsResult(config, options)).data\n}\n\n/**\n * As getUpcomingEvents, but tells you whether the list is empty because there is\n * nothing scheduled or because the API could not be reached.\n *\n * ALWAYS prefer this when the UI renders copy like \"no upcoming events\". Doing\n * otherwise is what put \"No public cruises currently on the schedule\" in front\n * of QCR's customers while three cruises were on sale — and, because the page\n * was statically revalidated, cached that claim for the whole revalidate window.\n */\nexport async function getUpcomingEventsResult(\n config: ServerConfig,\n options: { limit?: number; category?: string } = {}\n): Promise<ServerResult<CommerceOffering[]>> {\n const primary = await apiPost<{ events: Record<string, unknown>[] }>(\n config,\n '/public/commerce/events',\n {\n type: 'event',\n category: options.category,\n limit: options.limit,\n includePast: false,\n },\n )\n\n if (primary.ok && primary.data?.events) {\n return { ok: true, data: primary.data.events.map(transformOffering) }\n }\n\n // Legacy fallback: offerings list (no schedules embedded).\n const params = new URLSearchParams()\n params.set('type', 'event')\n params.set('status', 'active')\n params.set('upcoming', 'true')\n\n if (options.category) {\n params.set('category', options.category)\n }\n\n if (options.limit) {\n params.set('limit', options.limit.toString())\n }\n\n const legacy = await apiFetch<{ offerings: Record<string, unknown>[] }>(\n config,\n `/public/commerce/offerings?${params.toString()}`\n )\n\n if (legacy.ok && legacy.data?.offerings) {\n return { ok: true, data: legacy.data.offerings.map(transformOffering) }\n }\n\n // Nothing usable came back. It is only honestly \"empty\" if at least one call\n // actually reached the API; if both failed the caller must not claim empty.\n return { ok: primary.ok || legacy.ok, data: [] }\n}\n\n/**\n * Get next upcoming event (server-side)\n */\nexport async function getNextEvent(\n config: ServerConfig,\n category?: string\n): Promise<CommerceOffering | null> {\n return (await getNextEventResult(config, category)).data\n}\n\n/**\n * As getNextEvent, but distinguishes \"nothing scheduled\" from \"fetch failed\".\n */\nexport async function getNextEventResult(\n config: ServerConfig,\n category?: string\n): Promise<ServerResult<CommerceOffering | null>> {\n const { ok, data } = await getUpcomingEventsResult(config, { limit: 1, category })\n return { ok, data: data[0] || null }\n}\n\n// ============================================\n// Metadata Helpers\n// ============================================\n\n/**\n * Generate page metadata for an offering\n * \n * @example Next.js App Router\n * export async function generateMetadata({ params }) {\n * const product = await getOfferingBySlug(config, params.slug)\n * return generateOfferingMetadata(product, 'https://example.com')\n * }\n */\nexport function generateOfferingMetadata(\n offering: CommerceOffering | null,\n siteUrl: string\n): {\n title: string\n description: string\n openGraph: {\n title: string\n description: string\n images: string[]\n type: string\n url: string\n }\n} | null {\n if (!offering) return null\n \n const title = offering.seo_title || offering.name\n const description = offering.seo_description || offering.short_description || offering.description || ''\n const images = offering.featured_image_url ? [offering.featured_image_url] : []\n \n const typeMap: Record<OfferingType, string> = {\n product: 'product',\n service: 'website',\n event: 'website',\n class: 'website',\n subscription: 'product',\n }\n \n return {\n title,\n description,\n openGraph: {\n title,\n description,\n images,\n type: typeMap[offering.type] || 'website',\n url: `${siteUrl}/${offering.type}s/${offering.slug}`,\n },\n }\n}\n\n// ============================================\n// Export config builder\n// ============================================\n\n/**\n * Create a server config for API calls\n * \n * @param apiUrl - Portal API URL (e.g., 'https://api.sonor.io')\n * @param apiKey - Project API key\n * @param projectId - Project ID\n */\nexport function createServerConfig(\n apiUrl: string,\n apiKey: string,\n projectId: string\n): ServerConfig {\n return { apiUrl, apiKey, projectId }\n}\n"]}
1
+ {"version":3,"sources":["../../src/commerce/server.ts"],"names":[],"mappings":";;;;;AA+CA,SAAS,kBAAkB,GAAA,EAAuB;AAChD,EAAA,MAAM,SAAU,GAAA,EAAqC,MAAA;AACrD,EAAA,OACE,OAAO,MAAA,KAAW,QAAA,KACjB,WAAW,sBAAA,IAA0B,MAAA,CAAO,WAAW,OAAO,CAAA,CAAA;AAEnE;AAEA,eAAe,QAAA,CACb,QACA,QAAA,EACiC;AACjC,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,MAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,MAC1D,OAAA,EAAS;AAAA,QACP,aAAa,MAAA,CAAO,MAAA;AAAA,QACpB,gBAAgB,MAAA,CAAO,SAAA;AAAA,QACvB,cAAA,EAAgB;AAAA;AAClB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,OAAA,CAAQ,MAAM,CAAA,wBAAA,EAA2B,QAAQ,CAAA,SAAA,EAAY,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAC9E,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK;AAAA,IACjC;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAO,MAAM,QAAA,CAAS,MAAK,EAAQ;AAAA,EACxD,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG,MAAM,KAAA;AACpC,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wBAAA,EAA2B,QAAQ,CAAA,QAAA,CAAA,EAAY,KAAK,CAAA;AAClE,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK;AAAA,EACjC;AACF;AAEA,eAAe,OAAA,CACb,MAAA,EACA,QAAA,EACA,IAAA,EACiC;AACjC,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,MAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,MAC1D,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,MAAA,CAAO,MAAA;AAAA,QACpB,gBAAgB,MAAA,CAAO,SAAA;AAAA,QACvB,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,OAAA,CAAQ,MAAM,CAAA,yBAAA,EAA4B,QAAQ,CAAA,SAAA,EAAY,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAC/E,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK;AAAA,IACjC;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAO,MAAM,QAAA,CAAS,MAAK,EAAQ;AAAA,EACxD,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG,MAAM,KAAA;AACpC,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,yBAAA,EAA4B,QAAQ,CAAA,QAAA,CAAA,EAAY,KAAK,CAAA;AACnE,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK;AAAA,EACjC;AACF;AAEA,SAAS,kBAAkB,IAAA,EAAiD;AAC1E,EAAA,OAAO;AAAA,IACL,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,mBAAmB,IAAA,CAAK,iBAAA;AAAA,IACxB,kBAAkB,IAAA,CAAK,gBAAA;AAAA,IACvB,oBAAoB,IAAA,CAAK,kBAAA;AAAA,IACzB,cAAA,EAAiB,IAAA,CAAK,kBAAA,IAAmC,EAAC;AAAA,IAC1D,UAAA,EAAa,KAAK,UAAA,IAA0D,OAAA;AAAA,IAC5E,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,kBAAkB,IAAA,CAAK,gBAAA;AAAA,IACvB,QAAA,EAAW,KAAK,QAAA,IAAuB,KAAA;AAAA,IACvC,eAAA,EAAkB,KAAK,eAAA,IAA+B,IAAA;AAAA,IACtD,gBAAgB,IAAA,CAAK,cAAA;AAAA,IACrB,iBAAiB,IAAA,CAAK,eAAA;AAAA,IACtB,iBAAiB,IAAA,CAAK,eAAA;AAAA,IACtB,iBAAiB,IAAA,CAAK,eAAA;AAAA,IACtB,kBAAkB,IAAA,CAAK,gBAAA;AAAA,IACvB,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,qBAAqB,IAAA,CAAK,mBAAA;AAAA,IAC1B,kBAAkB,IAAA,CAAK,gBAAA;AAAA,IACvB,yBAAyB,IAAA,CAAK,uBAAA;AAAA,IAC9B,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,IAAA,EAAO,IAAA,CAAK,IAAA,IAAqB,EAAC;AAAA,IAClC,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,iBAAiB,IAAA,CAAK,eAAA;AAAA,IACtB,QAAA,EAAW,IAAA,CAAK,QAAA,IAAyB,EAAC;AAAA,IAC1C,cAAA,EAAiB,IAAA,CAAK,cAAA,IAA6C,EAAC;AAAA,IACpE,SAAA,EAAY,IAAA,CAAK,SAAA,IAA+C,EAAC;AAAA,IACjE,QAAA,EAAW,IAAA,CAAK,QAAA,IAA6C,EAAC;AAAA,IAC9D,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,YAAY,IAAA,CAAK;AAAA,GACnB;AACF;AAeA,eAAsB,gBAAgB,MAAA,EAA+D;AACnG,EAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAK,GAAI,MAAM,QAAA;AAAA,IACzB,MAAA;AAAA,IACA,CAAA,qEAAA;AAAA,GACF;AAIA,EAAA,IAAI,CAAC,EAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,uFAAkF,CAAA;AACzG,EAAA,IAAI,CAAC,IAAA,EAAM,SAAA,EAAW,OAAO,EAAC;AAE9B,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,MAAoB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,EAAE,CAAE,CAAA;AACjF;AAKA,eAAsB,cAAc,MAAA,EAA+D;AACjG,EAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAK,GAAI,MAAM,QAAA;AAAA,IACzB,MAAA;AAAA,IACA,CAAA,mEAAA;AAAA,GACF;AAEA,EAAA,IAAI,CAAC,EAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,mFAA8E,CAAA;AACrG,EAAA,IAAI,CAAC,IAAA,EAAM,SAAA,EAAW,OAAO,EAAC;AAE9B,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,MAAoB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,EAAE,CAAE,CAAA;AACjF;AAKA,eAAsB,gBAAA,CACpB,QACA,IAAA,EACyC;AACzC,EAAA,IAAI,SAAA,GAAY,EAAA;AAChB,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,MAAA,SAAA,GAAY,CAAA,MAAA,EAAS,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,SAAA,GAAY,SAAS,IAAI,CAAA,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAK,GAAI,MAAM,QAAA;AAAA,IACzB,MAAA;AAAA,IACA,2DAA2D,SAAS,CAAA;AAAA,GACtE;AAEA,EAAA,IAAI,CAAC,EAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,gFAA2E,CAAA;AAClG,EAAA,IAAI,CAAC,IAAA,EAAM,SAAA,EAAW,OAAO,EAAC;AAE9B,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,MAAoB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,EAAE,CAAE,CAAA;AACjF;AAgBA,eAAsB,iBAAA,CACpB,QACA,IAAA,EACkC;AAClC,EAAA,OAAA,CAAQ,MAAM,uBAAA,CAAwB,MAAA,EAAQ,IAAI,CAAA,EAAG,IAAA;AACvD;AAOA,eAAsB,uBAAA,CACpB,QACA,IAAA,EACgD;AAChD,EAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAK,GAAI,MAAM,QAAA;AAAA,IACzB,MAAA;AAAA,IACA,kCAAkC,IAAI,CAAA;AAAA,GACxC;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM,QAAA,SAAiB,EAAE,EAAA,EAAI,MAAM,IAAA,EAAK;AAE7C,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAM,iBAAA,CAAkB,IAAA,CAAK,QAAQ,CAAA,EAAE;AAC5D;AAKA,eAAsB,YAAA,CACpB,MAAA,EACA,OAAA,GAKI,EAAC,EACwB;AAC7B,EAAA,OAAA,CAAQ,MAAM,kBAAA,CAAmB,MAAA,EAAQ,OAAO,CAAA,EAAG,IAAA;AACrD;AAMA,eAAsB,kBAAA,CACpB,MAAA,EACA,OAAA,GAKI,EAAC,EACsC;AAC3C,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,OAAA,CAAQ,MAAA,IAAU,QAAQ,CAAA;AAE/C,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/B,MAAA,MAAA,CAAO,IAAI,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,IAC3C,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzC;AAEA,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAK,GAAI,MAAM,QAAA;AAAA,IACzB,MAAA;AAAA,IACA,CAAA,+BAAA,EAAkC,MAAA,CAAO,QAAA,EAAU,CAAA;AAAA,GACrD;AAEA,EAAA,IAAI,CAAC,MAAM,SAAA,EAAW,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,EAAC,EAAE;AAE5C,EAAA,OAAO,EAAE,IAAI,IAAA,EAAM,IAAA,EAAM,KAAK,SAAA,CAAU,GAAA,CAAI,iBAAiB,CAAA,EAAE;AACjE;AAYA,eAAsB,iBAAA,CACpB,MAAA,EACA,OAAA,GAAiD,EAAC,EACrB;AAC7B,EAAA,OAAA,CAAQ,MAAM,uBAAA,CAAwB,MAAA,EAAQ,OAAO,CAAA,EAAG,IAAA;AAC1D;AAWA,eAAsB,uBAAA,CACpB,MAAA,EACA,OAAA,GAAiD,EAAC,EACP;AAC3C,EAAA,MAAM,UAAU,MAAM,OAAA;AAAA,IACpB,MAAA;AAAA,IACA,6BAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,WAAA,EAAa;AAAA;AACf,GACF;AAEA,EAAA,IAAI,OAAA,CAAQ,EAAA,IAAM,OAAA,CAAQ,IAAA,EAAM,MAAA,EAAQ;AACtC,IAAA,OAAO,EAAE,IAAI,IAAA,EAAM,IAAA,EAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,iBAAiB,CAAA,EAAE;AAAA,EACtE;AAGA,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,MAAA,CAAO,GAAA,CAAI,QAAQ,OAAO,CAAA;AAC1B,EAAA,MAAA,CAAO,GAAA,CAAI,UAAU,QAAQ,CAAA;AAC7B,EAAA,MAAA,CAAO,GAAA,CAAI,YAAY,MAAM,CAAA;AAE7B,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzC;AAEA,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,SAAS,MAAM,QAAA;AAAA,IACnB,MAAA;AAAA,IACA,CAAA,+BAAA,EAAkC,MAAA,CAAO,QAAA,EAAU,CAAA;AAAA,GACrD;AAEA,EAAA,IAAI,MAAA,CAAO,EAAA,IAAM,MAAA,CAAO,IAAA,EAAM,SAAA,EAAW;AACvC,IAAA,OAAO,EAAE,IAAI,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,iBAAiB,CAAA,EAAE;AAAA,EACxE;AAIA,EAAA,OAAO,EAAE,IAAI,OAAA,CAAQ,EAAA,IAAM,OAAO,EAAA,EAAI,IAAA,EAAM,EAAC,EAAE;AACjD;AAKA,eAAsB,YAAA,CACpB,QACA,QAAA,EACkC;AAClC,EAAA,OAAA,CAAQ,MAAM,kBAAA,CAAmB,MAAA,EAAQ,QAAQ,CAAA,EAAG,IAAA;AACtD;AAKA,eAAsB,kBAAA,CACpB,QACA,QAAA,EACgD;AAChD,EAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAK,GAAI,MAAM,uBAAA,CAAwB,MAAA,EAAQ,EAAE,KAAA,EAAO,CAAA,EAAG,QAAA,EAAU,CAAA;AACjF,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,CAAK,CAAC,KAAK,IAAA,EAAK;AACrC;AAeO,SAAS,wBAAA,CACd,UACA,OAAA,EAWO;AACP,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,IAAA;AAC7C,EAAA,MAAM,cAAc,QAAA,CAAS,eAAA,IAAmB,QAAA,CAAS,iBAAA,IAAqB,SAAS,WAAA,IAAe,EAAA;AACtG,EAAA,MAAM,SAAS,QAAA,CAAS,kBAAA,GAAqB,CAAC,QAAA,CAAS,kBAAkB,IAAI,EAAC;AAE9E,EAAA,MAAM,OAAA,GAAwC;AAAA,IAC5C,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,YAAA,EAAc;AAAA,GAChB;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,EAAW;AAAA,MACT,KAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA,EAAM,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,IAAK,SAAA;AAAA,MAChC,GAAA,EAAK,GAAG,OAAO,CAAA,CAAA,EAAI,SAAS,IAAI,CAAA,EAAA,EAAK,SAAS,IAAI,CAAA;AAAA;AACpD,GACF;AACF;AAaO,SAAS,kBAAA,CACd,MAAA,EACA,MAAA,EACA,SAAA,EACc;AACd,EAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAU;AACrC","file":"server.js","sourcesContent":["/**\n * @sonordev/site-kit/commerce - Server-side utilities\n * \n * Helpers for server-side rendering and dynamic routes.\n * Use in Next.js getStaticPaths, getStaticProps, or App Router.\n * \n * All data fetching goes through the Portal API.\n */\n\nimport type { CommerceOffering, OfferingType } from './types'\n\ninterface ServerConfig {\n apiUrl: string\n apiKey: string\n projectId: string\n}\n\ninterface SlugItem {\n slug: string\n}\n\n/**\n * Outcome of a server-side fetch.\n *\n * `ok` is the entire point. A helper that returns an empty array on failure lets\n * the calling page state a business fact it does not know: \"no upcoming events\",\n * \"no products available\" — when the truth is only that the API was unreachable.\n * QCR's /public-cruises told customers the business had no cruises during a\n * transient failure while three were on sale (2026-08-27).\n *\n * Branch on `ok` in new code. The legacy helpers returning a bare array or null\n * are kept for compatibility, but they cannot express this difference — an empty\n * result from them is indistinguishable from an outage.\n */\nexport interface ServerResult<T> {\n /** false = the request failed. `ok: true` with empty data means genuinely empty. */\n ok: boolean\n data: T\n}\n\n/**\n * Next throws to signal control flow, not failure — a DynamicServerError during\n * the static pass means \"this route can't be prerendered\", and redirect()/\n * notFound() throw too. Catching those and returning a failure logs a fake fetch\n * error on every build and makes a real API outage look identical to the\n * framework doing its job. Always rethrow.\n */\nfunction isFrameworkSignal(err: unknown): boolean {\n const digest = (err as { digest?: unknown } | null)?.digest\n return (\n typeof digest === 'string' &&\n (digest === 'DYNAMIC_SERVER_USAGE' || digest.startsWith('NEXT_'))\n )\n}\n\nasync function apiFetch<T>(\n config: ServerConfig,\n endpoint: string,\n): Promise<ServerResult<T | null>> {\n try {\n const response = await fetch(`${config.apiUrl}${endpoint}`, {\n headers: {\n 'X-API-Key': config.apiKey,\n 'X-Project-ID': config.projectId,\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n console.error(`[site-kit/commerce] GET ${endpoint} failed: ${response.status}`)\n return { ok: false, data: null }\n }\n return { ok: true, data: (await response.json()) as T }\n } catch (error) {\n if (isFrameworkSignal(error)) throw error\n console.error(`[site-kit/commerce] GET ${endpoint} failed:`, error)\n return { ok: false, data: null }\n }\n}\n\nasync function apiPost<T>(\n config: ServerConfig,\n endpoint: string,\n body: Record<string, unknown>,\n): Promise<ServerResult<T | null>> {\n try {\n const response = await fetch(`${config.apiUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'X-API-Key': config.apiKey,\n 'X-Project-ID': config.projectId,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n console.error(`[site-kit/commerce] POST ${endpoint} failed: ${response.status}`)\n return { ok: false, data: null }\n }\n return { ok: true, data: (await response.json()) as T }\n } catch (error) {\n if (isFrameworkSignal(error)) throw error\n console.error(`[site-kit/commerce] POST ${endpoint} failed:`, error)\n return { ok: false, data: null }\n }\n}\n\nfunction transformOffering(data: Record<string, unknown>): CommerceOffering {\n return {\n id: data.id as string,\n project_id: data.project_id as string,\n type: data.type as OfferingType,\n status: data.status as 'draft' | 'active' | 'archived' | 'sold_out',\n name: data.name as string,\n slug: data.slug as string,\n description: data.description as string | undefined,\n short_description: data.short_description as string | undefined,\n long_description: data.long_description as string | undefined,\n featured_image_url: data.featured_image_url as string | undefined,\n gallery_images: (data.gallery_image_urls as string[]) || [],\n price_type: (data.price_type as 'fixed' | 'variable' | 'quote' | 'free') || 'fixed',\n price: data.price as number | undefined,\n compare_at_price: data.compare_at_price as number | undefined,\n currency: (data.currency as string) || 'USD',\n price_is_public: (data.price_is_public as boolean) ?? true,\n billing_period: data.billing_period as 'weekly' | 'monthly' | 'quarterly' | 'yearly' | undefined,\n track_inventory: data.track_inventory as boolean | undefined,\n inventory_count: data.inventory_count as number | undefined,\n allow_backorder: data.allow_backorder as boolean | undefined,\n duration_minutes: data.duration_minutes as number | undefined,\n capacity: data.capacity as number | undefined,\n location: data.location as string | undefined,\n is_virtual: data.is_virtual as boolean | undefined,\n virtual_meeting_url: data.virtual_meeting_url as string | undefined,\n requires_booking: data.requires_booking as boolean | undefined,\n booking_lead_time_hours: data.booking_lead_time_hours as number | undefined,\n category: data.category as CommerceOffering['category'],\n category_id: data.category_id as string | undefined,\n tags: (data.tags as string[]) || [],\n seo_title: data.seo_title as string | undefined,\n seo_description: data.seo_description as string | undefined,\n features: (data.features as string[]) || [],\n specifications: (data.specifications as Record<string, string>) || {},\n schedules: (data.schedules as CommerceOffering['schedules']) || [],\n variants: (data.variants as CommerceOffering['variants']) || [],\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n }\n}\n\n// ============================================\n// Static Path Generators\n// ============================================\n\n/**\n * Get all product slugs for static generation\n * \n * @example Next.js Pages Router\n * export async function getStaticPaths() {\n * const paths = await getProductPaths(config)\n * return { paths, fallback: 'blocking' }\n * }\n */\nexport async function getProductPaths(config: ServerConfig): Promise<{ params: { slug: string } }[]> {\n const { ok, data } = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/api/public/commerce/offerings?type=product&status=active&fields=slug`\n )\n\n // A failed path fetch prerenders ZERO product pages and looks like a healthy\n // build. Say so loudly rather than shipping a site with its catalogue missing.\n if (!ok) console.error('[site-kit/commerce] getProductPaths failed — 0 product pages will be prerendered')\n if (!data?.offerings) return []\n\n return data.offerings.map((item: SlugItem) => ({ params: { slug: item.slug } }))\n}\n\n/**\n * Get all event slugs for static generation\n */\nexport async function getEventPaths(config: ServerConfig): Promise<{ params: { slug: string } }[]> {\n const { ok, data } = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/api/public/commerce/offerings?type=event&status=active&fields=slug`\n )\n\n if (!ok) console.error('[site-kit/commerce] getEventPaths failed — 0 event pages will be prerendered')\n if (!data?.offerings) return []\n\n return data.offerings.map((item: SlugItem) => ({ params: { slug: item.slug } }))\n}\n\n/**\n * Get all offering slugs for static generation (any type)\n */\nexport async function getOfferingPaths(\n config: ServerConfig,\n type?: OfferingType | OfferingType[]\n): Promise<{ params: { slug: string } }[]> {\n let typeParam = ''\n if (type) {\n if (Array.isArray(type)) {\n typeParam = `&type=${type.join(',')}`\n } else {\n typeParam = `&type=${type}`\n }\n }\n \n const { ok, data } = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/api/public/commerce/offerings?status=active&fields=slug${typeParam}`\n )\n\n if (!ok) console.error('[site-kit/commerce] getOfferingPaths failed — 0 pages will be prerendered')\n if (!data?.offerings) return []\n\n return data.offerings.map((item: SlugItem) => ({ params: { slug: item.slug } }))\n}\n\n// ============================================\n// Data Fetchers\n// ============================================\n\n/**\n * Fetch a single offering by slug (server-side)\n * \n * @example Next.js Pages Router\n * export async function getStaticProps({ params }) {\n * const product = await getOfferingBySlug(config, params.slug)\n * if (!product) return { notFound: true }\n * return { props: { product }, revalidate: 60 }\n * }\n */\nexport async function getOfferingBySlug(\n config: ServerConfig,\n slug: string\n): Promise<CommerceOffering | null> {\n return (await getOfferingBySlugResult(config, slug)).data\n}\n\n/**\n * As getOfferingBySlug, but distinguishes \"no such offering\" (ok: true, null)\n * from \"could not reach the API\" (ok: false, null). Use this before rendering a\n * 404 — a notFound() on a transient failure de-indexes a page that exists.\n */\nexport async function getOfferingBySlugResult(\n config: ServerConfig,\n slug: string\n): Promise<ServerResult<CommerceOffering | null>> {\n const { ok, data } = await apiFetch<{ offering: Record<string, unknown> }>(\n config,\n `/api/public/commerce/offerings/${slug}`\n )\n\n if (!data?.offering) return { ok, data: null }\n\n return { ok: true, data: transformOffering(data.offering) }\n}\n\n/**\n * Fetch all offerings of a type (server-side)\n */\nexport async function getOfferings(\n config: ServerConfig,\n options: {\n type?: OfferingType | OfferingType[]\n category?: string\n limit?: number\n status?: string\n } = {}\n): Promise<CommerceOffering[]> {\n return (await getOfferingsResult(config, options)).data\n}\n\n/**\n * As getOfferings, but distinguishes an empty catalogue from a failed request.\n * Branch on `ok` before rendering \"nothing available\" copy.\n */\nexport async function getOfferingsResult(\n config: ServerConfig,\n options: {\n type?: OfferingType | OfferingType[]\n category?: string\n limit?: number\n status?: string\n } = {}\n): Promise<ServerResult<CommerceOffering[]>> {\n const params = new URLSearchParams()\n params.set('status', options.status || 'active')\n \n if (options.type) {\n if (Array.isArray(options.type)) {\n params.set('type', options.type.join(','))\n } else {\n params.set('type', options.type)\n }\n }\n \n if (options.category) {\n params.set('category', options.category)\n }\n \n if (options.limit) {\n params.set('limit', options.limit.toString())\n }\n \n const { ok, data } = await apiFetch<{ offerings: Record<string, unknown>[] }>(\n config,\n `/api/public/commerce/offerings?${params.toString()}`\n )\n\n if (!data?.offerings) return { ok, data: [] }\n\n return { ok: true, data: data.offerings.map(transformOffering) }\n}\n\n/**\n * Fetch upcoming events (server-side), WITH schedules and category embedded.\n *\n * Uses POST /api/public/commerce/events — the same endpoint the client fetcher\n * uses — because the GET offerings list does NOT embed commerce_schedules,\n * which made this helper return events with empty `schedules[]` and forced\n * sites to hand-roll their own fetcher for any calendar UI (the Ludlow PTO\n * lesson). Falls back to the legacy offerings query if the events endpoint\n * is unavailable (older self-hosted API).\n */\nexport async function getUpcomingEvents(\n config: ServerConfig,\n options: { limit?: number; category?: string } = {}\n): Promise<CommerceOffering[]> {\n return (await getUpcomingEventsResult(config, options)).data\n}\n\n/**\n * As getUpcomingEvents, but tells you whether the list is empty because there is\n * nothing scheduled or because the API could not be reached.\n *\n * ALWAYS prefer this when the UI renders copy like \"no upcoming events\". Doing\n * otherwise is what put \"No public cruises currently on the schedule\" in front\n * of QCR's customers while three cruises were on sale — and, because the page\n * was statically revalidated, cached that claim for the whole revalidate window.\n */\nexport async function getUpcomingEventsResult(\n config: ServerConfig,\n options: { limit?: number; category?: string } = {}\n): Promise<ServerResult<CommerceOffering[]>> {\n const primary = await apiPost<{ events: Record<string, unknown>[] }>(\n config,\n '/api/public/commerce/events',\n {\n type: 'event',\n category: options.category,\n limit: options.limit,\n includePast: false,\n },\n )\n\n if (primary.ok && primary.data?.events) {\n return { ok: true, data: primary.data.events.map(transformOffering) }\n }\n\n // Legacy fallback: offerings list (no schedules embedded).\n const params = new URLSearchParams()\n params.set('type', 'event')\n params.set('status', 'active')\n params.set('upcoming', 'true')\n\n if (options.category) {\n params.set('category', options.category)\n }\n\n if (options.limit) {\n params.set('limit', options.limit.toString())\n }\n\n const legacy = await apiFetch<{ offerings: Record<string, unknown>[] }>(\n config,\n `/api/public/commerce/offerings?${params.toString()}`\n )\n\n if (legacy.ok && legacy.data?.offerings) {\n return { ok: true, data: legacy.data.offerings.map(transformOffering) }\n }\n\n // Nothing usable came back. It is only honestly \"empty\" if at least one call\n // actually reached the API; if both failed the caller must not claim empty.\n return { ok: primary.ok || legacy.ok, data: [] }\n}\n\n/**\n * Get next upcoming event (server-side)\n */\nexport async function getNextEvent(\n config: ServerConfig,\n category?: string\n): Promise<CommerceOffering | null> {\n return (await getNextEventResult(config, category)).data\n}\n\n/**\n * As getNextEvent, but distinguishes \"nothing scheduled\" from \"fetch failed\".\n */\nexport async function getNextEventResult(\n config: ServerConfig,\n category?: string\n): Promise<ServerResult<CommerceOffering | null>> {\n const { ok, data } = await getUpcomingEventsResult(config, { limit: 1, category })\n return { ok, data: data[0] || null }\n}\n\n// ============================================\n// Metadata Helpers\n// ============================================\n\n/**\n * Generate page metadata for an offering\n * \n * @example Next.js App Router\n * export async function generateMetadata({ params }) {\n * const product = await getOfferingBySlug(config, params.slug)\n * return generateOfferingMetadata(product, 'https://example.com')\n * }\n */\nexport function generateOfferingMetadata(\n offering: CommerceOffering | null,\n siteUrl: string\n): {\n title: string\n description: string\n openGraph: {\n title: string\n description: string\n images: string[]\n type: string\n url: string\n }\n} | null {\n if (!offering) return null\n \n const title = offering.seo_title || offering.name\n const description = offering.seo_description || offering.short_description || offering.description || ''\n const images = offering.featured_image_url ? [offering.featured_image_url] : []\n \n const typeMap: Record<OfferingType, string> = {\n product: 'product',\n service: 'website',\n event: 'website',\n class: 'website',\n subscription: 'product',\n }\n \n return {\n title,\n description,\n openGraph: {\n title,\n description,\n images,\n type: typeMap[offering.type] || 'website',\n url: `${siteUrl}/${offering.type}s/${offering.slug}`,\n },\n }\n}\n\n// ============================================\n// Export config builder\n// ============================================\n\n/**\n * Create a server config for API calls\n * \n * @param apiUrl - Portal API URL (e.g., 'https://api.sonor.io')\n * @param apiKey - Project API key\n * @param projectId - Project ID\n */\nexport function createServerConfig(\n apiUrl: string,\n apiKey: string,\n projectId: string\n): ServerConfig {\n return { apiUrl, apiKey, projectId }\n}\n"]}
@@ -92,7 +92,7 @@ function transformOffering(data) {
92
92
  async function getProductPaths(config) {
93
93
  const { ok, data } = await apiFetch(
94
94
  config,
95
- `/public/commerce/offerings?type=product&status=active&fields=slug`
95
+ `/api/public/commerce/offerings?type=product&status=active&fields=slug`
96
96
  );
97
97
  if (!ok) console.error("[site-kit/commerce] getProductPaths failed \u2014 0 product pages will be prerendered");
98
98
  if (!data?.offerings) return [];
@@ -101,7 +101,7 @@ async function getProductPaths(config) {
101
101
  async function getEventPaths(config) {
102
102
  const { ok, data } = await apiFetch(
103
103
  config,
104
- `/public/commerce/offerings?type=event&status=active&fields=slug`
104
+ `/api/public/commerce/offerings?type=event&status=active&fields=slug`
105
105
  );
106
106
  if (!ok) console.error("[site-kit/commerce] getEventPaths failed \u2014 0 event pages will be prerendered");
107
107
  if (!data?.offerings) return [];
@@ -118,7 +118,7 @@ async function getOfferingPaths(config, type) {
118
118
  }
119
119
  const { ok, data } = await apiFetch(
120
120
  config,
121
- `/public/commerce/offerings?status=active&fields=slug${typeParam}`
121
+ `/api/public/commerce/offerings?status=active&fields=slug${typeParam}`
122
122
  );
123
123
  if (!ok) console.error("[site-kit/commerce] getOfferingPaths failed \u2014 0 pages will be prerendered");
124
124
  if (!data?.offerings) return [];
@@ -130,7 +130,7 @@ async function getOfferingBySlug(config, slug) {
130
130
  async function getOfferingBySlugResult(config, slug) {
131
131
  const { ok, data } = await apiFetch(
132
132
  config,
133
- `/public/commerce/offerings/${slug}`
133
+ `/api/public/commerce/offerings/${slug}`
134
134
  );
135
135
  if (!data?.offering) return { ok, data: null };
136
136
  return { ok: true, data: transformOffering(data.offering) };
@@ -156,7 +156,7 @@ async function getOfferingsResult(config, options = {}) {
156
156
  }
157
157
  const { ok, data } = await apiFetch(
158
158
  config,
159
- `/public/commerce/offerings?${params.toString()}`
159
+ `/api/public/commerce/offerings?${params.toString()}`
160
160
  );
161
161
  if (!data?.offerings) return { ok, data: [] };
162
162
  return { ok: true, data: data.offerings.map(transformOffering) };
@@ -167,7 +167,7 @@ async function getUpcomingEvents(config, options = {}) {
167
167
  async function getUpcomingEventsResult(config, options = {}) {
168
168
  const primary = await apiPost(
169
169
  config,
170
- "/public/commerce/events",
170
+ "/api/public/commerce/events",
171
171
  {
172
172
  type: "event",
173
173
  category: options.category,
@@ -190,7 +190,7 @@ async function getUpcomingEventsResult(config, options = {}) {
190
190
  }
191
191
  const legacy = await apiFetch(
192
192
  config,
193
- `/public/commerce/offerings?${params.toString()}`
193
+ `/api/public/commerce/offerings?${params.toString()}`
194
194
  );
195
195
  if (legacy.ok && legacy.data?.offerings) {
196
196
  return { ok: true, data: legacy.data.offerings.map(transformOffering) };