@sonordev/site-kit 1.2.7 → 1.2.8

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 (247) hide show
  1. package/README.md +5 -3
  2. package/dist/analytics/index.js +6 -6
  3. package/dist/analytics/index.mjs +2 -2
  4. package/dist/{api-CWtoFJCO.d.mts → api-DTKSHh_w.d.mts} +1 -1
  5. package/dist/{api-CWtoFJCO.d.ts → api-DTKSHh_w.d.ts} +1 -1
  6. package/dist/blog/index.js +10 -10
  7. package/dist/blog/index.js.map +1 -1
  8. package/dist/blog/index.mjs +10 -10
  9. package/dist/blog/index.mjs.map +1 -1
  10. package/dist/blog/server.js +2 -2
  11. package/dist/blog/server.js.map +1 -1
  12. package/dist/blog/server.mjs +2 -2
  13. package/dist/blog/server.mjs.map +1 -1
  14. package/dist/{chunk-7RYCHO6D.mjs → chunk-2RHO4KSK.mjs} +9 -9
  15. package/dist/{chunk-7RYCHO6D.mjs.map → chunk-2RHO4KSK.mjs.map} +1 -1
  16. package/dist/{chunk-EEZCR6E6.js → chunk-2XOW276O.js} +5 -5
  17. package/dist/{chunk-EEZCR6E6.js.map → chunk-2XOW276O.js.map} +1 -1
  18. package/dist/{chunk-JTLOJLWQ.mjs → chunk-36Y7OWES.mjs} +4 -4
  19. package/dist/chunk-36Y7OWES.mjs.map +1 -0
  20. package/dist/{chunk-DQYMKR27.mjs → chunk-47Y3YSES.mjs} +10 -10
  21. package/dist/chunk-47Y3YSES.mjs.map +1 -0
  22. package/dist/{chunk-MV3QN7PW.mjs → chunk-5F7FFUPJ.mjs} +3 -3
  23. package/dist/{chunk-MV3QN7PW.mjs.map → chunk-5F7FFUPJ.mjs.map} +1 -1
  24. package/dist/{chunk-AFAO3TGS.mjs → chunk-5YDPPOUU.mjs} +10 -10
  25. package/dist/chunk-5YDPPOUU.mjs.map +1 -0
  26. package/dist/{chunk-D63MUKZ6.mjs → chunk-6YXRLC6W.mjs} +5 -5
  27. package/dist/chunk-6YXRLC6W.mjs.map +1 -0
  28. package/dist/{chunk-7RF6PVHA.mjs → chunk-7FKPJQVS.mjs} +33 -68
  29. package/dist/chunk-7FKPJQVS.mjs.map +1 -0
  30. package/dist/{chunk-BYLIU6XG.js → chunk-7ROZJDXE.js} +10 -10
  31. package/dist/chunk-7ROZJDXE.js.map +1 -0
  32. package/dist/{chunk-UWE5PCYJ.mjs → chunk-APZMXRI3.mjs} +3 -3
  33. package/dist/chunk-APZMXRI3.mjs.map +1 -0
  34. package/dist/{chunk-622GAQP5.js → chunk-BBITDUZQ.js} +6 -6
  35. package/dist/chunk-BBITDUZQ.js.map +1 -0
  36. package/dist/{chunk-DDKW2FNA.js → chunk-BFJDUTXK.js} +8 -8
  37. package/dist/chunk-BFJDUTXK.js.map +1 -0
  38. package/dist/chunk-C3A5HXHX.mjs +78 -0
  39. package/dist/chunk-C3A5HXHX.mjs.map +1 -0
  40. package/dist/{chunk-XZJOZJB6.js → chunk-CFEOOJUT.js} +12 -12
  41. package/dist/{chunk-XZJOZJB6.js.map → chunk-CFEOOJUT.js.map} +1 -1
  42. package/dist/{chunk-M2T6R7BA.mjs → chunk-DOSSLBNW.mjs} +4 -4
  43. package/dist/chunk-DOSSLBNW.mjs.map +1 -0
  44. package/dist/{chunk-OB7E654K.js → chunk-DY4K6X3A.js} +6 -6
  45. package/dist/chunk-DY4K6X3A.js.map +1 -0
  46. package/dist/{chunk-7UKPRW25.mjs → chunk-EISQ7LJG.mjs} +6 -6
  47. package/dist/chunk-EISQ7LJG.mjs.map +1 -0
  48. package/dist/{chunk-7557OTHW.js → chunk-EUNL6GAL.js} +5 -5
  49. package/dist/chunk-EUNL6GAL.js.map +1 -0
  50. package/dist/{chunk-KUGMH4ZF.js → chunk-G6VGUAK2.js} +4 -4
  51. package/dist/chunk-G6VGUAK2.js.map +1 -0
  52. package/dist/{chunk-XQQWI6WB.js → chunk-GVXZWXQ7.js} +10 -10
  53. package/dist/chunk-GVXZWXQ7.js.map +1 -0
  54. package/dist/{chunk-24277A3Q.mjs → chunk-HF2FWDBJ.mjs} +9 -9
  55. package/dist/chunk-HF2FWDBJ.mjs.map +1 -0
  56. package/dist/{chunk-72MQFHYJ.js → chunk-IFAW7JFO.js} +16 -16
  57. package/dist/chunk-IFAW7JFO.js.map +1 -0
  58. package/dist/{chunk-P3UWIUJS.mjs → chunk-IKIJEKU3.mjs} +16 -16
  59. package/dist/chunk-IKIJEKU3.mjs.map +1 -0
  60. package/dist/{chunk-PKN27UMH.mjs → chunk-JIDOXTX2.mjs} +3 -3
  61. package/dist/{chunk-PKN27UMH.mjs.map → chunk-JIDOXTX2.mjs.map} +1 -1
  62. package/dist/{chunk-7FUV73JZ.js → chunk-JM3ZR6LB.js} +9 -9
  63. package/dist/chunk-JM3ZR6LB.js.map +1 -0
  64. package/dist/{chunk-OIIKTGRL.mjs → chunk-JMNSED4O.mjs} +8 -8
  65. package/dist/chunk-JMNSED4O.mjs.map +1 -0
  66. package/dist/chunk-MG23BS36.js +82 -0
  67. package/dist/chunk-MG23BS36.js.map +1 -0
  68. package/dist/{chunk-TFLQX7K7.mjs → chunk-N24BPFF6.mjs} +6 -6
  69. package/dist/chunk-N24BPFF6.mjs.map +1 -0
  70. package/dist/{chunk-LIVWLY2P.js → chunk-PPRAW576.js} +3 -3
  71. package/dist/{chunk-LIVWLY2P.js.map → chunk-PPRAW576.js.map} +1 -1
  72. package/dist/{chunk-W4PALSGM.js → chunk-REMHGWXT.js} +3 -3
  73. package/dist/chunk-REMHGWXT.js.map +1 -0
  74. package/dist/{chunk-DW5UJKHH.js → chunk-RMOL4TZ6.js} +8 -8
  75. package/dist/chunk-RMOL4TZ6.js.map +1 -0
  76. package/dist/{chunk-KKU3K7RG.js → chunk-SLB5V4RT.js} +33 -67
  77. package/dist/chunk-SLB5V4RT.js.map +1 -0
  78. package/dist/{chunk-K23A4G76.mjs → chunk-SQSBAPWA.mjs} +8 -8
  79. package/dist/chunk-SQSBAPWA.mjs.map +1 -0
  80. package/dist/{chunk-WECQ6KOB.js → chunk-TG46LJFB.js} +4 -4
  81. package/dist/chunk-TG46LJFB.js.map +1 -0
  82. package/dist/{chunk-43GBM4SX.js → chunk-TKQLH33E.js} +3 -3
  83. package/dist/chunk-TKQLH33E.js.map +1 -0
  84. package/dist/{chunk-UYFDNX2F.js → chunk-TLHRV3LZ.js} +5 -5
  85. package/dist/chunk-TLHRV3LZ.js.map +1 -0
  86. package/dist/{chunk-6ZCISNAB.mjs → chunk-UPR5FEIO.mjs} +3 -3
  87. package/dist/chunk-UPR5FEIO.mjs.map +1 -0
  88. package/dist/{chunk-GCJXQ4AG.mjs → chunk-VZMDH3R4.mjs} +5 -5
  89. package/dist/chunk-VZMDH3R4.mjs.map +1 -0
  90. package/dist/{chunk-LBVWVP72.js → chunk-X4J33XQD.js} +7 -7
  91. package/dist/chunk-X4J33XQD.js.map +1 -0
  92. package/dist/{chunk-QXV4667R.mjs → chunk-XFOL6JDF.mjs} +5 -5
  93. package/dist/chunk-XFOL6JDF.mjs.map +1 -0
  94. package/dist/cli/index.js +80 -91
  95. package/dist/cli/index.js.map +1 -1
  96. package/dist/cli/index.mjs +76 -87
  97. package/dist/cli/index.mjs.map +1 -1
  98. package/dist/cms/index.d.mts +139 -0
  99. package/dist/cms/index.d.ts +139 -0
  100. package/dist/cms/index.js +409 -0
  101. package/dist/cms/index.js.map +1 -0
  102. package/dist/cms/index.mjs +388 -0
  103. package/dist/cms/index.mjs.map +1 -0
  104. package/dist/cms/server.d.mts +47 -0
  105. package/dist/cms/server.d.ts +47 -0
  106. package/dist/cms/server.js +21 -0
  107. package/dist/{server-api-GJPNRYUP.js.map → cms/server.js.map} +1 -1
  108. package/dist/cms/server.mjs +4 -0
  109. package/dist/{server-api-EWXKOQZA.mjs.map → cms/server.mjs.map} +1 -1
  110. package/dist/commerce/index.js +42 -42
  111. package/dist/commerce/index.mjs +1 -1
  112. package/dist/commerce/server.d.mts +1 -1
  113. package/dist/commerce/server.d.ts +1 -1
  114. package/dist/commerce/server.js.map +1 -1
  115. package/dist/commerce/server.mjs.map +1 -1
  116. package/dist/config/index.js +1 -1
  117. package/dist/config/index.js.map +1 -1
  118. package/dist/config/index.mjs +1 -1
  119. package/dist/config/index.mjs.map +1 -1
  120. package/dist/engage/index.js +4 -4
  121. package/dist/engage/index.mjs +1 -1
  122. package/dist/forms/index.js +5 -5
  123. package/dist/forms/index.js.map +1 -1
  124. package/dist/forms/index.mjs +5 -5
  125. package/dist/forms/index.mjs.map +1 -1
  126. package/dist/generators-DOFWGRXS.js +37 -0
  127. package/dist/{generators-DTMO36DV.js.map → generators-DOFWGRXS.js.map} +1 -1
  128. package/dist/generators-R62APO62.mjs +4 -0
  129. package/dist/{generators-2XKQMPKH.mjs.map → generators-R62APO62.mjs.map} +1 -1
  130. package/dist/images/index.d.mts +1 -1
  131. package/dist/images/index.d.ts +1 -1
  132. package/dist/images/index.js +11 -11
  133. package/dist/images/index.mjs +2 -2
  134. package/dist/images/server.d.mts +3 -3
  135. package/dist/images/server.d.ts +3 -3
  136. package/dist/images/server.js +4 -4
  137. package/dist/images/server.mjs +1 -1
  138. package/dist/index.d.mts +5 -5
  139. package/dist/index.d.ts +5 -5
  140. package/dist/index.js +81 -81
  141. package/dist/index.js.map +1 -1
  142. package/dist/index.mjs +28 -28
  143. package/dist/index.mjs.map +1 -1
  144. package/dist/layout/index.d.mts +2 -2
  145. package/dist/layout/index.d.ts +2 -2
  146. package/dist/layout/index.js +17 -17
  147. package/dist/layout/index.js.map +1 -1
  148. package/dist/layout/index.mjs +10 -10
  149. package/dist/layout/index.mjs.map +1 -1
  150. package/dist/llms/index.js +12 -12
  151. package/dist/llms/index.mjs +2 -2
  152. package/dist/manifest/index.js +4 -4
  153. package/dist/manifest/index.js.map +1 -1
  154. package/dist/manifest/index.mjs +3 -3
  155. package/dist/manifest/index.mjs.map +1 -1
  156. package/dist/middleware/index.js +3 -3
  157. package/dist/middleware/index.mjs +2 -2
  158. package/dist/{migrator-2MQHOFDQ.mjs → migrator-3WQB3KQ2.mjs} +3 -3
  159. package/dist/{migrator-2MQHOFDQ.mjs.map → migrator-3WQB3KQ2.mjs.map} +1 -1
  160. package/dist/migrator-HFVQYK5R.js +37 -0
  161. package/dist/{migrator-THJCF6MZ.js.map → migrator-HFVQYK5R.js.map} +1 -1
  162. package/dist/redirects/index.d.mts +2 -2
  163. package/dist/redirects/index.d.ts +2 -2
  164. package/dist/redirects/index.js +6 -6
  165. package/dist/redirects/index.mjs +2 -2
  166. package/dist/reputation/index.js +4 -4
  167. package/dist/reputation/index.mjs +1 -1
  168. package/dist/robots/index.d.mts +1 -1
  169. package/dist/robots/index.d.ts +1 -1
  170. package/dist/robots/index.js +3 -3
  171. package/dist/robots/index.js.map +1 -1
  172. package/dist/robots/index.mjs +2 -2
  173. package/dist/robots/index.mjs.map +1 -1
  174. package/dist/seo/index.d.mts +1 -1
  175. package/dist/seo/index.d.ts +1 -1
  176. package/dist/seo/index.js +43 -43
  177. package/dist/seo/index.js.map +1 -1
  178. package/dist/seo/index.mjs +6 -6
  179. package/dist/seo/index.mjs.map +1 -1
  180. package/dist/seo/register-sitemap-cli.js +18 -18
  181. package/dist/seo/register-sitemap-cli.js.map +1 -1
  182. package/dist/seo/register-sitemap-cli.mjs +18 -18
  183. package/dist/seo/register-sitemap-cli.mjs.map +1 -1
  184. package/dist/seo/server.d.mts +1 -1
  185. package/dist/seo/server.d.ts +1 -1
  186. package/dist/seo/server.js +10 -10
  187. package/dist/seo/server.js.map +1 -1
  188. package/dist/seo/server.mjs +8 -8
  189. package/dist/seo/server.mjs.map +1 -1
  190. package/dist/{server-api-GJPNRYUP.js → server-api-C5JXIROA.js} +21 -21
  191. package/dist/server-api-C5JXIROA.js.map +1 -0
  192. package/dist/{server-api-EWXKOQZA.mjs → server-api-HTSLBT6F.mjs} +3 -3
  193. package/dist/server-api-HTSLBT6F.mjs.map +1 -0
  194. package/dist/setup/client.js +7 -7
  195. package/dist/setup/client.mjs +2 -2
  196. package/dist/setup/index.js +9 -9
  197. package/dist/setup/index.mjs +3 -3
  198. package/dist/setup/server.js +2 -2
  199. package/dist/setup/server.mjs +1 -1
  200. package/dist/site-config/index.d.mts +1 -1
  201. package/dist/site-config/index.d.ts +1 -1
  202. package/dist/site-config/index.js +3 -3
  203. package/dist/site-config/index.mjs +1 -1
  204. package/dist/sitemap/index.d.mts +2 -2
  205. package/dist/sitemap/index.d.ts +2 -2
  206. package/dist/sitemap/index.js +10 -10
  207. package/dist/sitemap/index.js.map +1 -1
  208. package/dist/sitemap/index.mjs +8 -8
  209. package/dist/sitemap/index.mjs.map +1 -1
  210. package/dist/types-BG-x8yhh.d.mts +106 -0
  211. package/dist/types-BG-x8yhh.d.ts +106 -0
  212. package/package.json +13 -1
  213. package/dist/chunk-24277A3Q.mjs.map +0 -1
  214. package/dist/chunk-43GBM4SX.js.map +0 -1
  215. package/dist/chunk-622GAQP5.js.map +0 -1
  216. package/dist/chunk-6ZCISNAB.mjs.map +0 -1
  217. package/dist/chunk-72MQFHYJ.js.map +0 -1
  218. package/dist/chunk-7557OTHW.js.map +0 -1
  219. package/dist/chunk-7FUV73JZ.js.map +0 -1
  220. package/dist/chunk-7RF6PVHA.mjs.map +0 -1
  221. package/dist/chunk-7UKPRW25.mjs.map +0 -1
  222. package/dist/chunk-AFAO3TGS.mjs.map +0 -1
  223. package/dist/chunk-BYLIU6XG.js.map +0 -1
  224. package/dist/chunk-D63MUKZ6.mjs.map +0 -1
  225. package/dist/chunk-DDKW2FNA.js.map +0 -1
  226. package/dist/chunk-DQYMKR27.mjs.map +0 -1
  227. package/dist/chunk-DW5UJKHH.js.map +0 -1
  228. package/dist/chunk-GCJXQ4AG.mjs.map +0 -1
  229. package/dist/chunk-JTLOJLWQ.mjs.map +0 -1
  230. package/dist/chunk-K23A4G76.mjs.map +0 -1
  231. package/dist/chunk-KKU3K7RG.js.map +0 -1
  232. package/dist/chunk-KUGMH4ZF.js.map +0 -1
  233. package/dist/chunk-LBVWVP72.js.map +0 -1
  234. package/dist/chunk-M2T6R7BA.mjs.map +0 -1
  235. package/dist/chunk-OB7E654K.js.map +0 -1
  236. package/dist/chunk-OIIKTGRL.mjs.map +0 -1
  237. package/dist/chunk-P3UWIUJS.mjs.map +0 -1
  238. package/dist/chunk-QXV4667R.mjs.map +0 -1
  239. package/dist/chunk-TFLQX7K7.mjs.map +0 -1
  240. package/dist/chunk-UWE5PCYJ.mjs.map +0 -1
  241. package/dist/chunk-UYFDNX2F.js.map +0 -1
  242. package/dist/chunk-W4PALSGM.js.map +0 -1
  243. package/dist/chunk-WECQ6KOB.js.map +0 -1
  244. package/dist/chunk-XQQWI6WB.js.map +0 -1
  245. package/dist/generators-2XKQMPKH.mjs +0 -4
  246. package/dist/generators-DTMO36DV.js +0 -33
  247. package/dist/migrator-THJCF6MZ.js +0 -37
@@ -0,0 +1,47 @@
1
+ import { C as CmsPageData, a as CmsSectionData } from '../types-BG-x8yhh.js';
2
+
3
+ /**
4
+ * @sonordev/site-kit/cms - Server-Only API Functions
5
+ *
6
+ * Fetches CMS page/section data from Portal API.
7
+ * Uses the same secure API pattern as seo/server-api.ts.
8
+ */
9
+
10
+ /**
11
+ * Fetch a published CMS page by path — cached per request.
12
+ * Returns the full page with all sections and their Portable Text content.
13
+ * @server-only
14
+ */
15
+ declare const getCmsPage: (path: string) => Promise<CmsPageData | null>;
16
+ /**
17
+ * Fetch a single published CMS section by ID — cached per request.
18
+ * @server-only
19
+ */
20
+ declare const getCmsSection: (sectionId: string) => Promise<CmsSectionData | null>;
21
+ /**
22
+ * Fetch CMS page and return Next.js Metadata object.
23
+ * Use in generateMetadata() for CMS-managed pages.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * import { getCmsPageMetadata } from '@sonordev/site-kit/cms/server'
28
+ *
29
+ * export async function generateMetadata({ params }) {
30
+ * return getCmsPageMetadata(`/${params.slug}`)
31
+ * }
32
+ * ```
33
+ * @server-only
34
+ */
35
+ declare const getCmsPageMetadata: (path: string) => Promise<{
36
+ title?: string;
37
+ description?: string;
38
+ robots?: {
39
+ index: boolean;
40
+ };
41
+ openGraph?: {
42
+ title?: string;
43
+ description?: string;
44
+ };
45
+ } | null>;
46
+
47
+ export { getCmsPage, getCmsPageMetadata, getCmsSection };
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ var chunkMG23BS36_js = require('../chunk-MG23BS36.js');
4
+ require('../chunk-ZSMWDLMK.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "getCmsPage", {
9
+ enumerable: true,
10
+ get: function () { return chunkMG23BS36_js.getCmsPage; }
11
+ });
12
+ Object.defineProperty(exports, "getCmsPageMetadata", {
13
+ enumerable: true,
14
+ get: function () { return chunkMG23BS36_js.getCmsPageMetadata; }
15
+ });
16
+ Object.defineProperty(exports, "getCmsSection", {
17
+ enumerable: true,
18
+ get: function () { return chunkMG23BS36_js.getCmsSection; }
19
+ });
20
+ //# sourceMappingURL=server.js.map
21
+ //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"server-api-GJPNRYUP.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"server.js"}
@@ -0,0 +1,4 @@
1
+ export { getCmsPage, getCmsPageMetadata, getCmsSection } from '../chunk-C3A5HXHX.mjs';
2
+ import '../chunk-4XPGGLVP.mjs';
3
+ //# sourceMappingURL=server.mjs.map
4
+ //# sourceMappingURL=server.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"server-api-EWXKOQZA.mjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"server.mjs"}
@@ -1,174 +1,174 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkUYFDNX2F_js = require('../chunk-UYFDNX2F.js');
4
+ var chunkTLHRV3LZ_js = require('../chunk-TLHRV3LZ.js');
5
5
  require('../chunk-ZSMWDLMK.js');
6
6
 
7
7
 
8
8
 
9
9
  Object.defineProperty(exports, "CalendarView", {
10
10
  enumerable: true,
11
- get: function () { return chunkUYFDNX2F_js.CalendarView; }
11
+ get: function () { return chunkTLHRV3LZ_js.CalendarView; }
12
12
  });
13
13
  Object.defineProperty(exports, "CheckoutForm", {
14
14
  enumerable: true,
15
- get: function () { return chunkUYFDNX2F_js.CheckoutForm; }
15
+ get: function () { return chunkTLHRV3LZ_js.CheckoutForm; }
16
16
  });
17
17
  Object.defineProperty(exports, "EventCalendar", {
18
18
  enumerable: true,
19
- get: function () { return chunkUYFDNX2F_js.EventCalendar; }
19
+ get: function () { return chunkTLHRV3LZ_js.EventCalendar; }
20
20
  });
21
21
  Object.defineProperty(exports, "EventEmbed", {
22
22
  enumerable: true,
23
- get: function () { return chunkUYFDNX2F_js.EventEmbed; }
23
+ get: function () { return chunkTLHRV3LZ_js.EventEmbed; }
24
24
  });
25
25
  Object.defineProperty(exports, "EventModal", {
26
26
  enumerable: true,
27
- get: function () { return chunkUYFDNX2F_js.EventModal; }
27
+ get: function () { return chunkTLHRV3LZ_js.EventModal; }
28
28
  });
29
29
  Object.defineProperty(exports, "EventTile", {
30
30
  enumerable: true,
31
- get: function () { return chunkUYFDNX2F_js.EventTile; }
31
+ get: function () { return chunkTLHRV3LZ_js.EventTile; }
32
32
  });
33
33
  Object.defineProperty(exports, "EventsWidget", {
34
34
  enumerable: true,
35
- get: function () { return chunkUYFDNX2F_js.EventsWidget; }
35
+ get: function () { return chunkTLHRV3LZ_js.EventsWidget; }
36
36
  });
37
37
  Object.defineProperty(exports, "OfferingCard", {
38
38
  enumerable: true,
39
- get: function () { return chunkUYFDNX2F_js.OfferingCard; }
39
+ get: function () { return chunkTLHRV3LZ_js.OfferingCard; }
40
40
  });
41
41
  Object.defineProperty(exports, "OfferingList", {
42
42
  enumerable: true,
43
- get: function () { return chunkUYFDNX2F_js.OfferingList; }
43
+ get: function () { return chunkTLHRV3LZ_js.OfferingList; }
44
44
  });
45
45
  Object.defineProperty(exports, "ProductDetail", {
46
46
  enumerable: true,
47
- get: function () { return chunkUYFDNX2F_js.ProductDetail; }
47
+ get: function () { return chunkTLHRV3LZ_js.ProductDetail; }
48
48
  });
49
49
  Object.defineProperty(exports, "ProductEmbed", {
50
50
  enumerable: true,
51
- get: function () { return chunkUYFDNX2F_js.ProductEmbed; }
51
+ get: function () { return chunkTLHRV3LZ_js.ProductEmbed; }
52
52
  });
53
53
  Object.defineProperty(exports, "ProductGrid", {
54
54
  enumerable: true,
55
- get: function () { return chunkUYFDNX2F_js.ProductGrid; }
55
+ get: function () { return chunkTLHRV3LZ_js.ProductGrid; }
56
56
  });
57
57
  Object.defineProperty(exports, "ProductPage", {
58
58
  enumerable: true,
59
- get: function () { return chunkUYFDNX2F_js.ProductPage; }
59
+ get: function () { return chunkTLHRV3LZ_js.ProductPage; }
60
60
  });
61
61
  Object.defineProperty(exports, "RegistrationForm", {
62
62
  enumerable: true,
63
- get: function () { return chunkUYFDNX2F_js.RegistrationForm; }
63
+ get: function () { return chunkTLHRV3LZ_js.RegistrationForm; }
64
64
  });
65
65
  Object.defineProperty(exports, "UpcomingEvents", {
66
66
  enumerable: true,
67
- get: function () { return chunkUYFDNX2F_js.UpcomingEvents; }
67
+ get: function () { return chunkTLHRV3LZ_js.UpcomingEvents; }
68
68
  });
69
69
  Object.defineProperty(exports, "createCheckoutSession", {
70
70
  enumerable: true,
71
- get: function () { return chunkUYFDNX2F_js.createCheckoutSession; }
71
+ get: function () { return chunkTLHRV3LZ_js.createCheckoutSession; }
72
72
  });
73
73
  Object.defineProperty(exports, "fetchActiveProcessor", {
74
74
  enumerable: true,
75
- get: function () { return chunkUYFDNX2F_js.fetchActiveProcessor; }
75
+ get: function () { return chunkTLHRV3LZ_js.fetchActiveProcessor; }
76
76
  });
77
77
  Object.defineProperty(exports, "fetchCategories", {
78
78
  enumerable: true,
79
- get: function () { return chunkUYFDNX2F_js.fetchCategories; }
79
+ get: function () { return chunkTLHRV3LZ_js.fetchCategories; }
80
80
  });
81
81
  Object.defineProperty(exports, "fetchLatestOffering", {
82
82
  enumerable: true,
83
- get: function () { return chunkUYFDNX2F_js.fetchLatestOffering; }
83
+ get: function () { return chunkTLHRV3LZ_js.fetchLatestOffering; }
84
84
  });
85
85
  Object.defineProperty(exports, "fetchNextEvent", {
86
86
  enumerable: true,
87
- get: function () { return chunkUYFDNX2F_js.fetchNextEvent; }
87
+ get: function () { return chunkTLHRV3LZ_js.fetchNextEvent; }
88
88
  });
89
89
  Object.defineProperty(exports, "fetchOffering", {
90
90
  enumerable: true,
91
- get: function () { return chunkUYFDNX2F_js.fetchOffering; }
91
+ get: function () { return chunkTLHRV3LZ_js.fetchOffering; }
92
92
  });
93
93
  Object.defineProperty(exports, "fetchOfferings", {
94
94
  enumerable: true,
95
- get: function () { return chunkUYFDNX2F_js.fetchOfferings; }
95
+ get: function () { return chunkTLHRV3LZ_js.fetchOfferings; }
96
96
  });
97
97
  Object.defineProperty(exports, "fetchProcessorConfig", {
98
98
  enumerable: true,
99
- get: function () { return chunkUYFDNX2F_js.fetchProcessorConfig; }
99
+ get: function () { return chunkTLHRV3LZ_js.fetchProcessorConfig; }
100
100
  });
101
101
  Object.defineProperty(exports, "fetchProductBySlug", {
102
102
  enumerable: true,
103
- get: function () { return chunkUYFDNX2F_js.fetchProductBySlug; }
103
+ get: function () { return chunkTLHRV3LZ_js.fetchProductBySlug; }
104
104
  });
105
105
  Object.defineProperty(exports, "fetchProducts", {
106
106
  enumerable: true,
107
- get: function () { return chunkUYFDNX2F_js.fetchProducts; }
107
+ get: function () { return chunkTLHRV3LZ_js.fetchProducts; }
108
108
  });
109
109
  Object.defineProperty(exports, "fetchProductsPublic", {
110
110
  enumerable: true,
111
- get: function () { return chunkUYFDNX2F_js.fetchProductsPublic; }
111
+ get: function () { return chunkTLHRV3LZ_js.fetchProductsPublic; }
112
112
  });
113
113
  Object.defineProperty(exports, "fetchServices", {
114
114
  enumerable: true,
115
- get: function () { return chunkUYFDNX2F_js.fetchServices; }
115
+ get: function () { return chunkTLHRV3LZ_js.fetchServices; }
116
116
  });
117
117
  Object.defineProperty(exports, "fetchShippingRates", {
118
118
  enumerable: true,
119
- get: function () { return chunkUYFDNX2F_js.fetchShippingRates; }
119
+ get: function () { return chunkTLHRV3LZ_js.fetchShippingRates; }
120
120
  });
121
121
  Object.defineProperty(exports, "fetchUpcomingEvents", {
122
122
  enumerable: true,
123
- get: function () { return chunkUYFDNX2F_js.fetchUpcomingEvents; }
123
+ get: function () { return chunkTLHRV3LZ_js.fetchUpcomingEvents; }
124
124
  });
125
125
  Object.defineProperty(exports, "formatDate", {
126
126
  enumerable: true,
127
- get: function () { return chunkUYFDNX2F_js.formatDate; }
127
+ get: function () { return chunkTLHRV3LZ_js.formatDate; }
128
128
  });
129
129
  Object.defineProperty(exports, "formatDateRange", {
130
130
  enumerable: true,
131
- get: function () { return chunkUYFDNX2F_js.formatDateRange; }
131
+ get: function () { return chunkTLHRV3LZ_js.formatDateRange; }
132
132
  });
133
133
  Object.defineProperty(exports, "formatDateTime", {
134
134
  enumerable: true,
135
- get: function () { return chunkUYFDNX2F_js.formatDateTime; }
135
+ get: function () { return chunkTLHRV3LZ_js.formatDateTime; }
136
136
  });
137
137
  Object.defineProperty(exports, "formatPrice", {
138
138
  enumerable: true,
139
- get: function () { return chunkUYFDNX2F_js.formatPrice; }
139
+ get: function () { return chunkTLHRV3LZ_js.formatPrice; }
140
140
  });
141
141
  Object.defineProperty(exports, "formatTime", {
142
142
  enumerable: true,
143
- get: function () { return chunkUYFDNX2F_js.formatTime; }
143
+ get: function () { return chunkTLHRV3LZ_js.formatTime; }
144
144
  });
145
145
  Object.defineProperty(exports, "getOfferingUrl", {
146
146
  enumerable: true,
147
- get: function () { return chunkUYFDNX2F_js.getOfferingUrl; }
147
+ get: function () { return chunkTLHRV3LZ_js.getOfferingUrl; }
148
148
  });
149
149
  Object.defineProperty(exports, "getRelativeTimeUntil", {
150
150
  enumerable: true,
151
- get: function () { return chunkUYFDNX2F_js.getRelativeTimeUntil; }
151
+ get: function () { return chunkTLHRV3LZ_js.getRelativeTimeUntil; }
152
152
  });
153
153
  Object.defineProperty(exports, "getSpotsRemaining", {
154
154
  enumerable: true,
155
- get: function () { return chunkUYFDNX2F_js.getSpotsRemaining; }
155
+ get: function () { return chunkTLHRV3LZ_js.getSpotsRemaining; }
156
156
  });
157
157
  Object.defineProperty(exports, "isEventSoldOut", {
158
158
  enumerable: true,
159
- get: function () { return chunkUYFDNX2F_js.isEventSoldOut; }
159
+ get: function () { return chunkTLHRV3LZ_js.isEventSoldOut; }
160
160
  });
161
161
  Object.defineProperty(exports, "registerForEvent", {
162
162
  enumerable: true,
163
- get: function () { return chunkUYFDNX2F_js.registerForEvent; }
163
+ get: function () { return chunkTLHRV3LZ_js.registerForEvent; }
164
164
  });
165
165
  Object.defineProperty(exports, "useEventModal", {
166
166
  enumerable: true,
167
- get: function () { return chunkUYFDNX2F_js.useEventModal; }
167
+ get: function () { return chunkTLHRV3LZ_js.useEventModal; }
168
168
  });
169
169
  Object.defineProperty(exports, "validateAddress", {
170
170
  enumerable: true,
171
- get: function () { return chunkUYFDNX2F_js.validateAddress; }
171
+ get: function () { return chunkTLHRV3LZ_js.validateAddress; }
172
172
  });
173
173
  //# sourceMappingURL=index.js.map
174
174
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- export { CalendarView, CheckoutForm, EventCalendar, EventEmbed, EventModal, EventTile, EventsWidget, OfferingCard, OfferingList, ProductDetail, ProductEmbed, ProductGrid, ProductPage, RegistrationForm, UpcomingEvents, createCheckoutSession, fetchActiveProcessor, fetchCategories, fetchLatestOffering, fetchNextEvent, fetchOffering, fetchOfferings, fetchProcessorConfig, fetchProductBySlug, fetchProducts, fetchProductsPublic, fetchServices, fetchShippingRates, fetchUpcomingEvents, formatDate, formatDateRange, formatDateTime, formatPrice, formatTime, getOfferingUrl, getRelativeTimeUntil, getSpotsRemaining, isEventSoldOut, registerForEvent, useEventModal, validateAddress } from '../chunk-D63MUKZ6.mjs';
2
+ export { CalendarView, CheckoutForm, EventCalendar, EventEmbed, EventModal, EventTile, EventsWidget, OfferingCard, OfferingList, ProductDetail, ProductEmbed, ProductGrid, ProductPage, RegistrationForm, UpcomingEvents, createCheckoutSession, fetchActiveProcessor, fetchCategories, fetchLatestOffering, fetchNextEvent, fetchOffering, fetchOfferings, fetchProcessorConfig, fetchProductBySlug, fetchProducts, fetchProductsPublic, fetchServices, fetchShippingRates, fetchUpcomingEvents, formatDate, formatDateRange, formatDateTime, formatPrice, formatTime, getOfferingUrl, getRelativeTimeUntil, getSpotsRemaining, isEventSoldOut, registerForEvent, useEventModal, validateAddress } from '../chunk-6YXRLC6W.mjs';
3
3
  import '../chunk-4XPGGLVP.mjs';
4
4
  //# sourceMappingURL=index.mjs.map
5
5
  //# sourceMappingURL=index.mjs.map
@@ -98,7 +98,7 @@ declare function generateOfferingMetadata(offering: CommerceOffering | null, sit
98
98
  /**
99
99
  * Create a server config for API calls
100
100
  *
101
- * @param apiUrl - Portal API URL (e.g., 'https://api.uptrademedia.com')
101
+ * @param apiUrl - Portal API URL (e.g., 'https://api.sonor.io')
102
102
  * @param apiKey - Project API key
103
103
  * @param projectId - Project ID
104
104
  */
@@ -98,7 +98,7 @@ declare function generateOfferingMetadata(offering: CommerceOffering | null, sit
98
98
  /**
99
99
  * Create a server config for API calls
100
100
  *
101
- * @param apiUrl - Portal API URL (e.g., 'https://api.uptrademedia.com')
101
+ * @param apiUrl - Portal API URL (e.g., 'https://api.sonor.io')
102
102
  * @param apiKey - Project API key
103
103
  * @param projectId - Project ID
104
104
  */
@@ -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\nasync function apiFetch<T>(config: ServerConfig, endpoint: string): Promise<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) return null\n return response.json()\n } catch (error) {\n console.error('API fetch error:', error)\n return 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 data = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/public/commerce/offerings?type=product&status=active&fields=slug`\n )\n \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 data = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/public/commerce/offerings?type=event&status=active&fields=slug`\n )\n \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 data = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/public/commerce/offerings?status=active&fields=slug${typeParam}`\n )\n \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 const data = await apiFetch<{ offering: Record<string, unknown> }>(\n config,\n `/public/commerce/offerings/${slug}`\n )\n \n if (!data?.offering) return null\n \n return 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 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 data = await apiFetch<{ offerings: Record<string, unknown>[] }>(\n config,\n `/public/commerce/offerings?${params.toString()}`\n )\n \n if (!data?.offerings) return []\n \n return data.offerings.map(transformOffering)\n}\n\n/**\n * Fetch upcoming events (server-side)\n */\nexport async function getUpcomingEvents(\n config: ServerConfig,\n options: { limit?: number; category?: string } = {}\n): Promise<CommerceOffering[]> {\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 data = await apiFetch<{ offerings: Record<string, unknown>[] }>(\n config,\n `/public/commerce/offerings?${params.toString()}`\n )\n \n if (!data?.offerings) return []\n \n return data.offerings.map(transformOffering)\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 const events = await getUpcomingEvents(config, { limit: 1, category })\n return events[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.uptrademedia.com')\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":"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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\nasync function apiFetch<T>(config: ServerConfig, endpoint: string): Promise<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) return null\n return response.json()\n } catch (error) {\n console.error('API fetch error:', error)\n return 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 data = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/public/commerce/offerings?type=product&status=active&fields=slug`\n )\n \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 data = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/public/commerce/offerings?type=event&status=active&fields=slug`\n )\n \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 data = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/public/commerce/offerings?status=active&fields=slug${typeParam}`\n )\n \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 const data = await apiFetch<{ offering: Record<string, unknown> }>(\n config,\n `/public/commerce/offerings/${slug}`\n )\n \n if (!data?.offering) return null\n \n return 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 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 data = await apiFetch<{ offerings: Record<string, unknown>[] }>(\n config,\n `/public/commerce/offerings?${params.toString()}`\n )\n \n if (!data?.offerings) return []\n \n return data.offerings.map(transformOffering)\n}\n\n/**\n * Fetch upcoming events (server-side)\n */\nexport async function getUpcomingEvents(\n config: ServerConfig,\n options: { limit?: number; category?: string } = {}\n): Promise<CommerceOffering[]> {\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 data = await apiFetch<{ offerings: Record<string, unknown>[] }>(\n config,\n `/public/commerce/offerings?${params.toString()}`\n )\n \n if (!data?.offerings) return []\n \n return data.offerings.map(transformOffering)\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 const events = await getUpcomingEvents(config, { limit: 1, category })\n return events[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 +1 @@
1
- {"version":3,"sources":["../../src/commerce/server.ts"],"names":[],"mappings":"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","file":"server.mjs","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\nasync function apiFetch<T>(config: ServerConfig, endpoint: string): Promise<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) return null\n return response.json()\n } catch (error) {\n console.error('API fetch error:', error)\n return 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 data = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/public/commerce/offerings?type=product&status=active&fields=slug`\n )\n \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 data = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/public/commerce/offerings?type=event&status=active&fields=slug`\n )\n \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 data = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/public/commerce/offerings?status=active&fields=slug${typeParam}`\n )\n \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 const data = await apiFetch<{ offering: Record<string, unknown> }>(\n config,\n `/public/commerce/offerings/${slug}`\n )\n \n if (!data?.offering) return null\n \n return 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 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 data = await apiFetch<{ offerings: Record<string, unknown>[] }>(\n config,\n `/public/commerce/offerings?${params.toString()}`\n )\n \n if (!data?.offerings) return []\n \n return data.offerings.map(transformOffering)\n}\n\n/**\n * Fetch upcoming events (server-side)\n */\nexport async function getUpcomingEvents(\n config: ServerConfig,\n options: { limit?: number; category?: string } = {}\n): Promise<CommerceOffering[]> {\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 data = await apiFetch<{ offerings: Record<string, unknown>[] }>(\n config,\n `/public/commerce/offerings?${params.toString()}`\n )\n \n if (!data?.offerings) return []\n \n return data.offerings.map(transformOffering)\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 const events = await getUpcomingEvents(config, { limit: 1, category })\n return events[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.uptrademedia.com')\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":"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","file":"server.mjs","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\nasync function apiFetch<T>(config: ServerConfig, endpoint: string): Promise<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) return null\n return response.json()\n } catch (error) {\n console.error('API fetch error:', error)\n return 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 data = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/public/commerce/offerings?type=product&status=active&fields=slug`\n )\n \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 data = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/public/commerce/offerings?type=event&status=active&fields=slug`\n )\n \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 data = await apiFetch<{ offerings: SlugItem[] }>(\n config,\n `/public/commerce/offerings?status=active&fields=slug${typeParam}`\n )\n \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 const data = await apiFetch<{ offering: Record<string, unknown> }>(\n config,\n `/public/commerce/offerings/${slug}`\n )\n \n if (!data?.offering) return null\n \n return 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 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 data = await apiFetch<{ offerings: Record<string, unknown>[] }>(\n config,\n `/public/commerce/offerings?${params.toString()}`\n )\n \n if (!data?.offerings) return []\n \n return data.offerings.map(transformOffering)\n}\n\n/**\n * Fetch upcoming events (server-side)\n */\nexport async function getUpcomingEvents(\n config: ServerConfig,\n options: { limit?: number; category?: string } = {}\n): Promise<CommerceOffering[]> {\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 data = await apiFetch<{ offerings: Record<string, unknown>[] }>(\n config,\n `/public/commerce/offerings?${params.toString()}`\n )\n \n if (!data?.offerings) return []\n \n return data.offerings.map(transformOffering)\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 const events = await getUpcomingEvents(config, { limit: 1, category })\n return events[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"]}
@@ -23,7 +23,7 @@ function withSiteKitConfig(config) {
23
23
  },
24
24
  {
25
25
  protocol: "https",
26
- hostname: "api.uptrademedia.com",
26
+ hostname: "api.sonor.io",
27
27
  pathname: "/**"
28
28
  },
29
29
  ...config?.additionalImageDomains?.map((d) => ({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/index.ts"],"names":["buildSecurityHeaders"],"mappings":";;;;;;AA6CO,SAAS,kBACd,MAAA,EACY;AACZ,EAAA,MAAM,eAAA,GAAkBA,qCAAA;AAAA,IACtB,MAAA,EAAQ;AAAA,GACV;AACA,EAAA,MAAM,sBAAA,GACJ,QAAQ,eAAA,KAAoB,KAAA;AAC9B,EAAA,MAAM,oBAAA,GAAuB,QAAQ,aAAA,KAAkB,KAAA;AAEvD,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,eAAA,EAAiB,IAAA;AAAA,IACjB,eAAA,EAAiB,KAAA;AAAA,IACjB,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,CAAC,YAAA,EAAc,YAAY,CAAA;AAAA,MACpC,cAAA,EAAgB;AAAA,QACd;AAAA,UACE,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU,eAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACZ;AAAA,QACA;AAAA,UACE,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU,sBAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,GAAI,MAAA,EAAQ,sBAAA,EAAwB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC9C,QAAA,EAAW,EAAE,QAAA,IAAY,OAAA;AAAA,UACzB,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,QAAA,EAAU,EAAE,QAAA,IAAY;AAAA,SAC1B,CAAE,KAAK;AAAC;AACV,KACF;AAAA,IACA,MAAM,OAAA,GAAU;AACd,MAAA,MAAM,eAGD,EAAC;AAGN,MAAA,IAAI,sBAAA,EAAwB;AAC1B,QAAA,YAAA,CAAa,IAAA,CAAK;AAAA,UAChB,MAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,CAAE,GAAA;AAAA,YACvC,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO,EAAE,KAAK,KAAA,EAAM;AAAA;AAClC,SACD,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,YAAA,CAAa,IAAA,CAAK;AAAA,UAChB,MAAA,EACE,4DAAA;AAAA,UACF,OAAA,EAAS;AAAA,YACP;AAAA,cACE,GAAA,EAAK,eAAA;AAAA,cACL,KAAA,EACE;AAAA;AACJ;AACF,SACD,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,YAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAG,MAAA,EAAQ;AAAA,GACb;AAEA,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["/**\n * @sonordev/site-kit/config\n *\n * Next.js configuration helper. Provides a sensible default next.config\n * with security headers, image optimization, and static caching.\n *\n * @example\n * ```ts\n * // next.config.ts — entire file\n * import { withSiteKitConfig } from '@sonordev/site-kit/config'\n * export default withSiteKitConfig()\n * ```\n *\n * @example With custom image domains:\n * ```ts\n * export default withSiteKitConfig({\n * additionalImageDomains: [\n * { hostname: 'images.unsplash.com' },\n * ],\n * })\n * ```\n */\n\nimport { buildSecurityHeaders } from '../middleware/securityHeaders'\nimport type { SecurityHeadersConfig } from '../middleware/securityHeaders'\n\n// We can't import NextConfig at compile-time since next is a peer dep.\n// Use a compatible shape instead.\ntype NextConfig = Record<string, unknown>\n\nexport interface SiteKitNextConfig {\n /** Additional image domains for next/image optimization */\n additionalImageDomains?: Array<{\n hostname: string\n protocol?: 'https' | 'http'\n pathname?: string\n }>\n /** Security headers via next.config headers(). Default: true */\n securityHeaders?: boolean | SecurityHeadersConfig\n /** Cache headers for static assets. Default: true */\n staticCaching?: boolean\n /** Any raw next.config overrides — deep merged last */\n nextConfig?: NextConfig\n}\n\nexport function withSiteKitConfig(\n config?: SiteKitNextConfig,\n): NextConfig {\n const securityHeaders = buildSecurityHeaders(\n config?.securityHeaders,\n )\n const includeSecurityHeaders =\n config?.securityHeaders !== false\n const includeStaticCaching = config?.staticCaching !== false\n\n const result: NextConfig = {\n reactStrictMode: true,\n poweredByHeader: false,\n images: {\n formats: ['image/webp', 'image/avif'],\n remotePatterns: [\n {\n protocol: 'https',\n hostname: '*.supabase.co',\n pathname: '/**',\n },\n {\n protocol: 'https',\n hostname: 'api.uptrademedia.com',\n pathname: '/**',\n },\n ...(config?.additionalImageDomains?.map((d) => ({\n protocol: (d.protocol || 'https') as 'https' | 'http',\n hostname: d.hostname,\n pathname: d.pathname || '/**',\n })) || []),\n ],\n },\n async headers() {\n const headerGroups: Array<{\n source: string\n headers: Array<{ key: string; value: string }>\n }> = []\n\n // Security headers on all routes\n if (includeSecurityHeaders) {\n headerGroups.push({\n source: '/(.*)',\n headers: Object.entries(securityHeaders).map(\n ([key, value]) => ({ key, value }),\n ),\n })\n }\n\n // Static asset caching\n if (includeStaticCaching) {\n headerGroups.push({\n source:\n '/:path*.(ico|png|jpg|jpeg|gif|webp|svg|woff|woff2|ttf|eot)',\n headers: [\n {\n key: 'Cache-Control',\n value:\n 'public, max-age=31536000, immutable',\n },\n ],\n })\n }\n\n return headerGroups\n },\n ...config?.nextConfig,\n }\n\n return result\n}\n"]}
1
+ {"version":3,"sources":["../../src/config/index.ts"],"names":["buildSecurityHeaders"],"mappings":";;;;;;AA6CO,SAAS,kBACd,MAAA,EACY;AACZ,EAAA,MAAM,eAAA,GAAkBA,qCAAA;AAAA,IACtB,MAAA,EAAQ;AAAA,GACV;AACA,EAAA,MAAM,sBAAA,GACJ,QAAQ,eAAA,KAAoB,KAAA;AAC9B,EAAA,MAAM,oBAAA,GAAuB,QAAQ,aAAA,KAAkB,KAAA;AAEvD,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,eAAA,EAAiB,IAAA;AAAA,IACjB,eAAA,EAAiB,KAAA;AAAA,IACjB,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,CAAC,YAAA,EAAc,YAAY,CAAA;AAAA,MACpC,cAAA,EAAgB;AAAA,QACd;AAAA,UACE,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU,eAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACZ;AAAA,QACA;AAAA,UACE,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU,cAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,GAAI,MAAA,EAAQ,sBAAA,EAAwB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC9C,QAAA,EAAW,EAAE,QAAA,IAAY,OAAA;AAAA,UACzB,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,QAAA,EAAU,EAAE,QAAA,IAAY;AAAA,SAC1B,CAAE,KAAK;AAAC;AACV,KACF;AAAA,IACA,MAAM,OAAA,GAAU;AACd,MAAA,MAAM,eAGD,EAAC;AAGN,MAAA,IAAI,sBAAA,EAAwB;AAC1B,QAAA,YAAA,CAAa,IAAA,CAAK;AAAA,UAChB,MAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,CAAE,GAAA;AAAA,YACvC,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO,EAAE,KAAK,KAAA,EAAM;AAAA;AAClC,SACD,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,YAAA,CAAa,IAAA,CAAK;AAAA,UAChB,MAAA,EACE,4DAAA;AAAA,UACF,OAAA,EAAS;AAAA,YACP;AAAA,cACE,GAAA,EAAK,eAAA;AAAA,cACL,KAAA,EACE;AAAA;AACJ;AACF,SACD,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,YAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAG,MAAA,EAAQ;AAAA,GACb;AAEA,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["/**\n * @sonordev/site-kit/config\n *\n * Next.js configuration helper. Provides a sensible default next.config\n * with security headers, image optimization, and static caching.\n *\n * @example\n * ```ts\n * // next.config.ts — entire file\n * import { withSiteKitConfig } from '@sonordev/site-kit/config'\n * export default withSiteKitConfig()\n * ```\n *\n * @example With custom image domains:\n * ```ts\n * export default withSiteKitConfig({\n * additionalImageDomains: [\n * { hostname: 'images.unsplash.com' },\n * ],\n * })\n * ```\n */\n\nimport { buildSecurityHeaders } from '../middleware/securityHeaders'\nimport type { SecurityHeadersConfig } from '../middleware/securityHeaders'\n\n// We can't import NextConfig at compile-time since next is a peer dep.\n// Use a compatible shape instead.\ntype NextConfig = Record<string, unknown>\n\nexport interface SiteKitNextConfig {\n /** Additional image domains for next/image optimization */\n additionalImageDomains?: Array<{\n hostname: string\n protocol?: 'https' | 'http'\n pathname?: string\n }>\n /** Security headers via next.config headers(). Default: true */\n securityHeaders?: boolean | SecurityHeadersConfig\n /** Cache headers for static assets. Default: true */\n staticCaching?: boolean\n /** Any raw next.config overrides — deep merged last */\n nextConfig?: NextConfig\n}\n\nexport function withSiteKitConfig(\n config?: SiteKitNextConfig,\n): NextConfig {\n const securityHeaders = buildSecurityHeaders(\n config?.securityHeaders,\n )\n const includeSecurityHeaders =\n config?.securityHeaders !== false\n const includeStaticCaching = config?.staticCaching !== false\n\n const result: NextConfig = {\n reactStrictMode: true,\n poweredByHeader: false,\n images: {\n formats: ['image/webp', 'image/avif'],\n remotePatterns: [\n {\n protocol: 'https',\n hostname: '*.supabase.co',\n pathname: '/**',\n },\n {\n protocol: 'https',\n hostname: 'api.sonor.io',\n pathname: '/**',\n },\n ...(config?.additionalImageDomains?.map((d) => ({\n protocol: (d.protocol || 'https') as 'https' | 'http',\n hostname: d.hostname,\n pathname: d.pathname || '/**',\n })) || []),\n ],\n },\n async headers() {\n const headerGroups: Array<{\n source: string\n headers: Array<{ key: string; value: string }>\n }> = []\n\n // Security headers on all routes\n if (includeSecurityHeaders) {\n headerGroups.push({\n source: '/(.*)',\n headers: Object.entries(securityHeaders).map(\n ([key, value]) => ({ key, value }),\n ),\n })\n }\n\n // Static asset caching\n if (includeStaticCaching) {\n headerGroups.push({\n source:\n '/:path*.(ico|png|jpg|jpeg|gif|webp|svg|woff|woff2|ttf|eot)',\n headers: [\n {\n key: 'Cache-Control',\n value:\n 'public, max-age=31536000, immutable',\n },\n ],\n })\n }\n\n return headerGroups\n },\n ...config?.nextConfig,\n }\n\n return result\n}\n"]}
@@ -21,7 +21,7 @@ function withSiteKitConfig(config) {
21
21
  },
22
22
  {
23
23
  protocol: "https",
24
- hostname: "api.uptrademedia.com",
24
+ hostname: "api.sonor.io",
25
25
  pathname: "/**"
26
26
  },
27
27
  ...config?.additionalImageDomains?.map((d) => ({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/index.ts"],"names":[],"mappings":";;;;AA6CO,SAAS,kBACd,MAAA,EACY;AACZ,EAAA,MAAM,eAAA,GAAkB,oBAAA;AAAA,IACtB,MAAA,EAAQ;AAAA,GACV;AACA,EAAA,MAAM,sBAAA,GACJ,QAAQ,eAAA,KAAoB,KAAA;AAC9B,EAAA,MAAM,oBAAA,GAAuB,QAAQ,aAAA,KAAkB,KAAA;AAEvD,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,eAAA,EAAiB,IAAA;AAAA,IACjB,eAAA,EAAiB,KAAA;AAAA,IACjB,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,CAAC,YAAA,EAAc,YAAY,CAAA;AAAA,MACpC,cAAA,EAAgB;AAAA,QACd;AAAA,UACE,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU,eAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACZ;AAAA,QACA;AAAA,UACE,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU,sBAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,GAAI,MAAA,EAAQ,sBAAA,EAAwB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC9C,QAAA,EAAW,EAAE,QAAA,IAAY,OAAA;AAAA,UACzB,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,QAAA,EAAU,EAAE,QAAA,IAAY;AAAA,SAC1B,CAAE,KAAK;AAAC;AACV,KACF;AAAA,IACA,MAAM,OAAA,GAAU;AACd,MAAA,MAAM,eAGD,EAAC;AAGN,MAAA,IAAI,sBAAA,EAAwB;AAC1B,QAAA,YAAA,CAAa,IAAA,CAAK;AAAA,UAChB,MAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,CAAE,GAAA;AAAA,YACvC,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO,EAAE,KAAK,KAAA,EAAM;AAAA;AAClC,SACD,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,YAAA,CAAa,IAAA,CAAK;AAAA,UAChB,MAAA,EACE,4DAAA;AAAA,UACF,OAAA,EAAS;AAAA,YACP;AAAA,cACE,GAAA,EAAK,eAAA;AAAA,cACL,KAAA,EACE;AAAA;AACJ;AACF,SACD,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,YAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAG,MAAA,EAAQ;AAAA,GACb;AAEA,EAAA,OAAO,MAAA;AACT","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit/config\n *\n * Next.js configuration helper. Provides a sensible default next.config\n * with security headers, image optimization, and static caching.\n *\n * @example\n * ```ts\n * // next.config.ts — entire file\n * import { withSiteKitConfig } from '@sonordev/site-kit/config'\n * export default withSiteKitConfig()\n * ```\n *\n * @example With custom image domains:\n * ```ts\n * export default withSiteKitConfig({\n * additionalImageDomains: [\n * { hostname: 'images.unsplash.com' },\n * ],\n * })\n * ```\n */\n\nimport { buildSecurityHeaders } from '../middleware/securityHeaders'\nimport type { SecurityHeadersConfig } from '../middleware/securityHeaders'\n\n// We can't import NextConfig at compile-time since next is a peer dep.\n// Use a compatible shape instead.\ntype NextConfig = Record<string, unknown>\n\nexport interface SiteKitNextConfig {\n /** Additional image domains for next/image optimization */\n additionalImageDomains?: Array<{\n hostname: string\n protocol?: 'https' | 'http'\n pathname?: string\n }>\n /** Security headers via next.config headers(). Default: true */\n securityHeaders?: boolean | SecurityHeadersConfig\n /** Cache headers for static assets. Default: true */\n staticCaching?: boolean\n /** Any raw next.config overrides — deep merged last */\n nextConfig?: NextConfig\n}\n\nexport function withSiteKitConfig(\n config?: SiteKitNextConfig,\n): NextConfig {\n const securityHeaders = buildSecurityHeaders(\n config?.securityHeaders,\n )\n const includeSecurityHeaders =\n config?.securityHeaders !== false\n const includeStaticCaching = config?.staticCaching !== false\n\n const result: NextConfig = {\n reactStrictMode: true,\n poweredByHeader: false,\n images: {\n formats: ['image/webp', 'image/avif'],\n remotePatterns: [\n {\n protocol: 'https',\n hostname: '*.supabase.co',\n pathname: '/**',\n },\n {\n protocol: 'https',\n hostname: 'api.uptrademedia.com',\n pathname: '/**',\n },\n ...(config?.additionalImageDomains?.map((d) => ({\n protocol: (d.protocol || 'https') as 'https' | 'http',\n hostname: d.hostname,\n pathname: d.pathname || '/**',\n })) || []),\n ],\n },\n async headers() {\n const headerGroups: Array<{\n source: string\n headers: Array<{ key: string; value: string }>\n }> = []\n\n // Security headers on all routes\n if (includeSecurityHeaders) {\n headerGroups.push({\n source: '/(.*)',\n headers: Object.entries(securityHeaders).map(\n ([key, value]) => ({ key, value }),\n ),\n })\n }\n\n // Static asset caching\n if (includeStaticCaching) {\n headerGroups.push({\n source:\n '/:path*.(ico|png|jpg|jpeg|gif|webp|svg|woff|woff2|ttf|eot)',\n headers: [\n {\n key: 'Cache-Control',\n value:\n 'public, max-age=31536000, immutable',\n },\n ],\n })\n }\n\n return headerGroups\n },\n ...config?.nextConfig,\n }\n\n return result\n}\n"]}
1
+ {"version":3,"sources":["../../src/config/index.ts"],"names":[],"mappings":";;;;AA6CO,SAAS,kBACd,MAAA,EACY;AACZ,EAAA,MAAM,eAAA,GAAkB,oBAAA;AAAA,IACtB,MAAA,EAAQ;AAAA,GACV;AACA,EAAA,MAAM,sBAAA,GACJ,QAAQ,eAAA,KAAoB,KAAA;AAC9B,EAAA,MAAM,oBAAA,GAAuB,QAAQ,aAAA,KAAkB,KAAA;AAEvD,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,eAAA,EAAiB,IAAA;AAAA,IACjB,eAAA,EAAiB,KAAA;AAAA,IACjB,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,CAAC,YAAA,EAAc,YAAY,CAAA;AAAA,MACpC,cAAA,EAAgB;AAAA,QACd;AAAA,UACE,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU,eAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACZ;AAAA,QACA;AAAA,UACE,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU,cAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,GAAI,MAAA,EAAQ,sBAAA,EAAwB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC9C,QAAA,EAAW,EAAE,QAAA,IAAY,OAAA;AAAA,UACzB,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,QAAA,EAAU,EAAE,QAAA,IAAY;AAAA,SAC1B,CAAE,KAAK;AAAC;AACV,KACF;AAAA,IACA,MAAM,OAAA,GAAU;AACd,MAAA,MAAM,eAGD,EAAC;AAGN,MAAA,IAAI,sBAAA,EAAwB;AAC1B,QAAA,YAAA,CAAa,IAAA,CAAK;AAAA,UAChB,MAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,CAAE,GAAA;AAAA,YACvC,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO,EAAE,KAAK,KAAA,EAAM;AAAA;AAClC,SACD,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,YAAA,CAAa,IAAA,CAAK;AAAA,UAChB,MAAA,EACE,4DAAA;AAAA,UACF,OAAA,EAAS;AAAA,YACP;AAAA,cACE,GAAA,EAAK,eAAA;AAAA,cACL,KAAA,EACE;AAAA;AACJ;AACF,SACD,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,YAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAG,MAAA,EAAQ;AAAA,GACb;AAEA,EAAA,OAAO,MAAA;AACT","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit/config\n *\n * Next.js configuration helper. Provides a sensible default next.config\n * with security headers, image optimization, and static caching.\n *\n * @example\n * ```ts\n * // next.config.ts — entire file\n * import { withSiteKitConfig } from '@sonordev/site-kit/config'\n * export default withSiteKitConfig()\n * ```\n *\n * @example With custom image domains:\n * ```ts\n * export default withSiteKitConfig({\n * additionalImageDomains: [\n * { hostname: 'images.unsplash.com' },\n * ],\n * })\n * ```\n */\n\nimport { buildSecurityHeaders } from '../middleware/securityHeaders'\nimport type { SecurityHeadersConfig } from '../middleware/securityHeaders'\n\n// We can't import NextConfig at compile-time since next is a peer dep.\n// Use a compatible shape instead.\ntype NextConfig = Record<string, unknown>\n\nexport interface SiteKitNextConfig {\n /** Additional image domains for next/image optimization */\n additionalImageDomains?: Array<{\n hostname: string\n protocol?: 'https' | 'http'\n pathname?: string\n }>\n /** Security headers via next.config headers(). Default: true */\n securityHeaders?: boolean | SecurityHeadersConfig\n /** Cache headers for static assets. Default: true */\n staticCaching?: boolean\n /** Any raw next.config overrides — deep merged last */\n nextConfig?: NextConfig\n}\n\nexport function withSiteKitConfig(\n config?: SiteKitNextConfig,\n): NextConfig {\n const securityHeaders = buildSecurityHeaders(\n config?.securityHeaders,\n )\n const includeSecurityHeaders =\n config?.securityHeaders !== false\n const includeStaticCaching = config?.staticCaching !== false\n\n const result: NextConfig = {\n reactStrictMode: true,\n poweredByHeader: false,\n images: {\n formats: ['image/webp', 'image/avif'],\n remotePatterns: [\n {\n protocol: 'https',\n hostname: '*.supabase.co',\n pathname: '/**',\n },\n {\n protocol: 'https',\n hostname: 'api.sonor.io',\n pathname: '/**',\n },\n ...(config?.additionalImageDomains?.map((d) => ({\n protocol: (d.protocol || 'https') as 'https' | 'http',\n hostname: d.hostname,\n pathname: d.pathname || '/**',\n })) || []),\n ],\n },\n async headers() {\n const headerGroups: Array<{\n source: string\n headers: Array<{ key: string; value: string }>\n }> = []\n\n // Security headers on all routes\n if (includeSecurityHeaders) {\n headerGroups.push({\n source: '/(.*)',\n headers: Object.entries(securityHeaders).map(\n ([key, value]) => ({ key, value }),\n ),\n })\n }\n\n // Static asset caching\n if (includeStaticCaching) {\n headerGroups.push({\n source:\n '/:path*.(ico|png|jpg|jpeg|gif|webp|svg|woff|woff2|ttf|eot)',\n headers: [\n {\n key: 'Cache-Control',\n value:\n 'public, max-age=31536000, immutable',\n },\n ],\n })\n }\n\n return headerGroups\n },\n ...config?.nextConfig,\n }\n\n return result\n}\n"]}
@@ -1,22 +1,22 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunk622GAQP5_js = require('../chunk-622GAQP5.js');
4
+ var chunkBBITDUZQ_js = require('../chunk-BBITDUZQ.js');
5
5
  require('../chunk-ZSMWDLMK.js');
6
6
 
7
7
 
8
8
 
9
9
  Object.defineProperty(exports, "ChatWidget", {
10
10
  enumerable: true,
11
- get: function () { return chunk622GAQP5_js.ChatWidget; }
11
+ get: function () { return chunkBBITDUZQ_js.ChatWidget; }
12
12
  });
13
13
  Object.defineProperty(exports, "DesignRenderer", {
14
14
  enumerable: true,
15
- get: function () { return chunk622GAQP5_js.DesignRenderer; }
15
+ get: function () { return chunkBBITDUZQ_js.DesignRenderer; }
16
16
  });
17
17
  Object.defineProperty(exports, "EngageWidget", {
18
18
  enumerable: true,
19
- get: function () { return chunk622GAQP5_js.EngageWidget; }
19
+ get: function () { return chunkBBITDUZQ_js.EngageWidget; }
20
20
  });
21
21
  //# sourceMappingURL=index.js.map
22
22
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- export { ChatWidget, DesignRenderer, EngageWidget } from '../chunk-7UKPRW25.mjs';
2
+ export { ChatWidget, DesignRenderer, EngageWidget } from '../chunk-EISQ7LJG.mjs';
3
3
  import '../chunk-4XPGGLVP.mjs';
4
4
  //# sourceMappingURL=index.mjs.map
5
5
  //# sourceMappingURL=index.mjs.map