@sonordev/site-kit 1.5.5 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/dist/AnalyticsProvider-J7UMCBCJ.mjs +4 -0
  2. package/dist/{AnalyticsProvider-BBLU4U2T.mjs.map → AnalyticsProvider-J7UMCBCJ.mjs.map} +1 -1
  3. package/dist/AnalyticsProvider-PPDJIGWY.js +25 -0
  4. package/dist/{AnalyticsProvider-EMDIAAWR.js.map → AnalyticsProvider-PPDJIGWY.js.map} +1 -1
  5. package/dist/EngageWidget-IDBEBGQR.js +13 -0
  6. package/dist/{EngageWidget-UHWXXCAX.js.map → EngageWidget-IDBEBGQR.js.map} +1 -1
  7. package/dist/EngageWidget-SRRI4W7U.mjs +4 -0
  8. package/dist/{EngageWidget-CVZMTSB6.mjs.map → EngageWidget-SRRI4W7U.mjs.map} +1 -1
  9. package/dist/SignalBridge-D6W6OLVG.mjs +4 -0
  10. package/dist/{SignalBridge-WGHMEILW.mjs.map → SignalBridge-D6W6OLVG.mjs.map} +1 -1
  11. package/dist/SignalBridge-THATXU2R.js +33 -0
  12. package/dist/{SignalBridge-6UYUZ2CN.js.map → SignalBridge-THATXU2R.js.map} +1 -1
  13. package/dist/analytics/index.js +9 -9
  14. package/dist/analytics/index.mjs +2 -2
  15. package/dist/blog/index.js +75 -75
  16. package/dist/blog/index.js.map +1 -1
  17. package/dist/blog/index.mjs +75 -75
  18. package/dist/blog/index.mjs.map +1 -1
  19. package/dist/blog/server.js +2 -2
  20. package/dist/blog/server.js.map +1 -1
  21. package/dist/blog/server.mjs +2 -2
  22. package/dist/blog/server.mjs.map +1 -1
  23. package/dist/brand.css +87 -0
  24. package/dist/{chunk-ZU6YPEAF.mjs → chunk-2OJCYWSQ.mjs} +85 -73
  25. package/dist/chunk-2OJCYWSQ.mjs.map +1 -0
  26. package/dist/{chunk-PM2KQ6YK.mjs → chunk-3CXAWGUP.mjs} +3 -3
  27. package/dist/{chunk-PM2KQ6YK.mjs.map → chunk-3CXAWGUP.mjs.map} +1 -1
  28. package/dist/{chunk-36Y7OWES.mjs → chunk-3YQCPLGP.mjs} +4 -4
  29. package/dist/chunk-3YQCPLGP.mjs.map +1 -0
  30. package/dist/{chunk-XWWBUC2I.js → chunk-6ZGM7S5O.js} +77 -61
  31. package/dist/chunk-6ZGM7S5O.js.map +1 -0
  32. package/dist/{chunk-XFOL6JDF.mjs → chunk-7LAOWIWE.mjs} +4 -4
  33. package/dist/chunk-7LAOWIWE.mjs.map +1 -0
  34. package/dist/{chunk-YBTYDBWY.js → chunk-7M3FNAS5.js} +6 -8
  35. package/dist/chunk-7M3FNAS5.js.map +1 -0
  36. package/dist/{chunk-ELDJDBQL.js → chunk-A7RCX6OI.js} +7 -7
  37. package/dist/chunk-A7RCX6OI.js.map +1 -0
  38. package/dist/{chunk-4QHHFCAA.mjs → chunk-AOIG5PVY.mjs} +6 -8
  39. package/dist/chunk-AOIG5PVY.mjs.map +1 -0
  40. package/dist/{chunk-VZMDH3R4.mjs → chunk-B22WSN4L.mjs} +4 -4
  41. package/dist/chunk-B22WSN4L.mjs.map +1 -0
  42. package/dist/{chunk-N24BPFF6.mjs → chunk-CU6OGBKK.mjs} +6 -6
  43. package/dist/chunk-CU6OGBKK.mjs.map +1 -0
  44. package/dist/{chunk-KRPFLF62.mjs → chunk-F5NXD7VQ.mjs} +10 -12
  45. package/dist/{chunk-KRPFLF62.mjs.map → chunk-F5NXD7VQ.mjs.map} +1 -1
  46. package/dist/{chunk-DY4K6X3A.js → chunk-GCPPXUAI.js} +6 -6
  47. package/dist/chunk-GCPPXUAI.js.map +1 -0
  48. package/dist/{chunk-G6VGUAK2.js → chunk-IFVMZFNT.js} +4 -4
  49. package/dist/chunk-IFVMZFNT.js.map +1 -0
  50. package/dist/{chunk-GJD4CFHN.js → chunk-ITPVKQB6.js} +78 -8
  51. package/dist/chunk-ITPVKQB6.js.map +1 -0
  52. package/dist/{chunk-NRNK7LXK.mjs → chunk-IYQUFQYM.mjs} +4 -4
  53. package/dist/chunk-IYQUFQYM.mjs.map +1 -0
  54. package/dist/{chunk-EUNL6GAL.js → chunk-JP5WGL75.js} +4 -4
  55. package/dist/chunk-JP5WGL75.js.map +1 -0
  56. package/dist/{chunk-MG23BS36.js → chunk-L3UB4B74.js} +5 -5
  57. package/dist/chunk-L3UB4B74.js.map +1 -0
  58. package/dist/{chunk-M5FLRLHI.mjs → chunk-L7XPPFSS.mjs} +3 -3
  59. package/dist/chunk-L7XPPFSS.mjs.map +1 -0
  60. package/dist/{chunk-FVCQBTNK.mjs → chunk-MSRLAD7F.mjs} +77 -61
  61. package/dist/chunk-MSRLAD7F.mjs.map +1 -0
  62. package/dist/{chunk-4X5TFGKD.mjs → chunk-P3POHQWW.mjs} +422 -426
  63. package/dist/chunk-P3POHQWW.mjs.map +1 -0
  64. package/dist/{chunk-KJN2C6YE.js → chunk-PKUTYMN7.js} +5 -5
  65. package/dist/chunk-PKUTYMN7.js.map +1 -0
  66. package/dist/{chunk-FTSXKDP3.js → chunk-RO6DHV6S.js} +10 -12
  67. package/dist/{chunk-FTSXKDP3.js.map → chunk-RO6DHV6S.js.map} +1 -1
  68. package/dist/{chunk-FMB2RZDH.mjs → chunk-TUFP3FGI.mjs} +5 -5
  69. package/dist/chunk-TUFP3FGI.mjs.map +1 -0
  70. package/dist/{chunk-WW7UM7XY.js → chunk-TZAD7CZD.js} +424 -428
  71. package/dist/chunk-TZAD7CZD.js.map +1 -0
  72. package/dist/{chunk-TXZNP76P.js → chunk-UD5447TC.js} +13 -15
  73. package/dist/chunk-UD5447TC.js.map +1 -0
  74. package/dist/{chunk-TC6TOW2T.js → chunk-UJ757WGI.js} +4 -4
  75. package/dist/{chunk-TC6TOW2T.js.map → chunk-UJ757WGI.js.map} +1 -1
  76. package/dist/{chunk-C3A5HXHX.mjs → chunk-V6V6OXS2.mjs} +5 -5
  77. package/dist/chunk-V6V6OXS2.mjs.map +1 -0
  78. package/dist/{chunk-PTTDKFL7.js → chunk-VU4GL5ZG.js} +5 -5
  79. package/dist/chunk-VU4GL5ZG.js.map +1 -0
  80. package/dist/{chunk-X4J33XQD.js → chunk-W6K7MQCC.js} +6 -6
  81. package/dist/chunk-W6K7MQCC.js.map +1 -0
  82. package/dist/{chunk-IJ2LWZID.js → chunk-WETCVFIK.js} +85 -73
  83. package/dist/chunk-WETCVFIK.js.map +1 -0
  84. package/dist/{chunk-VNAJQKYG.mjs → chunk-WN2PUL6B.mjs} +13 -15
  85. package/dist/chunk-WN2PUL6B.mjs.map +1 -0
  86. package/dist/{chunk-FI2ME55T.mjs → chunk-Z6EHHJWU.mjs} +78 -8
  87. package/dist/chunk-Z6EHHJWU.mjs.map +1 -0
  88. package/dist/cli/index.js +19339 -3461
  89. package/dist/cli/index.js.map +1 -1
  90. package/dist/cli/index.mjs +19331 -3452
  91. package/dist/cli/index.mjs.map +1 -1
  92. package/dist/cms/index.d.mts +1 -1
  93. package/dist/cms/index.d.ts +1 -1
  94. package/dist/cms/index.js +3 -3
  95. package/dist/cms/index.js.map +1 -1
  96. package/dist/cms/index.mjs +2 -2
  97. package/dist/cms/index.mjs.map +1 -1
  98. package/dist/cms/server.js +4 -4
  99. package/dist/cms/server.mjs +1 -1
  100. package/dist/commerce/index.js +47 -47
  101. package/dist/commerce/index.mjs +3 -3
  102. package/dist/engage/index.js +6 -6
  103. package/dist/engage/index.js.map +1 -1
  104. package/dist/engage/index.mjs +3 -3
  105. package/dist/engage/index.mjs.map +1 -1
  106. package/dist/forms/index.js +379 -84
  107. package/dist/forms/index.js.map +1 -1
  108. package/dist/forms/index.mjs +375 -65
  109. package/dist/forms/index.mjs.map +1 -1
  110. package/dist/forms/styles.css +312 -0
  111. package/dist/images/index.js +11 -11
  112. package/dist/images/index.mjs +2 -2
  113. package/dist/images/server.js +4 -4
  114. package/dist/images/server.mjs +1 -1
  115. package/dist/index.d.mts +4 -131
  116. package/dist/index.d.ts +4 -131
  117. package/dist/index.js +85 -1373
  118. package/dist/index.js.map +1 -1
  119. package/dist/index.mjs +13 -1294
  120. package/dist/index.mjs.map +1 -1
  121. package/dist/layout/client.js +2 -2
  122. package/dist/layout/client.mjs +1 -1
  123. package/dist/layout/index.js +21 -11
  124. package/dist/layout/index.js.map +1 -1
  125. package/dist/layout/index.mjs +17 -7
  126. package/dist/layout/index.mjs.map +1 -1
  127. package/dist/llms/index.d.mts +5 -5
  128. package/dist/llms/index.d.ts +5 -5
  129. package/dist/llms/index.js +12 -12
  130. package/dist/llms/index.js.map +1 -1
  131. package/dist/llms/index.mjs +2 -2
  132. package/dist/llms/index.mjs.map +1 -1
  133. package/dist/manifest/index.js +4 -4
  134. package/dist/manifest/index.js.map +1 -1
  135. package/dist/manifest/index.mjs +3 -3
  136. package/dist/manifest/index.mjs.map +1 -1
  137. package/dist/middleware/index.js +3 -3
  138. package/dist/middleware/index.mjs +2 -2
  139. package/dist/redirects/index.js +6 -6
  140. package/dist/redirects/index.mjs +2 -2
  141. package/dist/robots/index.js +3 -3
  142. package/dist/robots/index.js.map +1 -1
  143. package/dist/robots/index.mjs +2 -2
  144. package/dist/robots/index.mjs.map +1 -1
  145. package/dist/{routing-DZYzyDHw.d.ts → routing-DQ_Et-OP.d.mts} +4 -4
  146. package/dist/{routing-B5XS-6_W.d.mts → routing-IYiJNIIX.d.ts} +4 -4
  147. package/dist/seo/index.d.mts +3 -5
  148. package/dist/seo/index.d.ts +3 -5
  149. package/dist/seo/index.js +77 -76
  150. package/dist/seo/index.js.map +1 -1
  151. package/dist/seo/index.mjs +41 -40
  152. package/dist/seo/index.mjs.map +1 -1
  153. package/dist/seo/register-sitemap-cli.js +3 -3
  154. package/dist/seo/register-sitemap-cli.js.map +1 -1
  155. package/dist/seo/register-sitemap-cli.mjs +3 -3
  156. package/dist/seo/register-sitemap-cli.mjs.map +1 -1
  157. package/dist/seo/server.d.mts +3 -3
  158. package/dist/seo/server.d.ts +3 -3
  159. package/dist/seo/server.js +7 -7
  160. package/dist/seo/server.js.map +1 -1
  161. package/dist/seo/server.mjs +5 -5
  162. package/dist/seo/server.mjs.map +1 -1
  163. package/dist/{server-api-COVFLFZ2.mjs → server-api-O7SSHYQS.mjs} +3 -3
  164. package/dist/{server-api-COVFLFZ2.mjs.map → server-api-O7SSHYQS.mjs.map} +1 -1
  165. package/dist/{server-api-XGKRGUMG.js → server-api-W4BXUFCT.js} +21 -21
  166. package/dist/{server-api-XGKRGUMG.js.map → server-api-W4BXUFCT.js.map} +1 -1
  167. package/dist/setup/index.d.mts +2 -5
  168. package/dist/setup/index.d.ts +2 -5
  169. package/dist/setup/index.js +0 -31
  170. package/dist/setup/index.mjs +1 -4
  171. package/dist/site-config/index.js +3 -3
  172. package/dist/site-config/index.mjs +1 -1
  173. package/dist/sitemap/index.d.mts +28 -2
  174. package/dist/sitemap/index.d.ts +28 -2
  175. package/dist/sitemap/index.js +38 -9
  176. package/dist/sitemap/index.js.map +1 -1
  177. package/dist/sitemap/index.mjs +36 -8
  178. package/dist/sitemap/index.mjs.map +1 -1
  179. package/dist/sync/index.js +13 -13
  180. package/dist/sync/index.mjs +1 -1
  181. package/dist/{types-Blb2QNkV.d.mts → types-BxzT7yhf.d.mts} +22 -1
  182. package/dist/{types-Blb2QNkV.d.ts → types-BxzT7yhf.d.ts} +22 -1
  183. package/dist/{types-KZP_VWZp.d.mts → types-CGkyylOa.d.mts} +2 -2
  184. package/dist/{types-KZP_VWZp.d.ts → types-CGkyylOa.d.ts} +2 -2
  185. package/package.json +4 -12
  186. package/dist/AnalyticsProvider-BBLU4U2T.mjs +0 -4
  187. package/dist/AnalyticsProvider-EMDIAAWR.js +0 -25
  188. package/dist/EngageWidget-CVZMTSB6.mjs +0 -4
  189. package/dist/EngageWidget-UHWXXCAX.js +0 -13
  190. package/dist/SetupWizard-Cki06kB0.d.mts +0 -12
  191. package/dist/SetupWizard-Cki06kB0.d.ts +0 -12
  192. package/dist/SignalBridge-6UYUZ2CN.js +0 -33
  193. package/dist/SignalBridge-WGHMEILW.mjs +0 -4
  194. package/dist/chunk-36Y7OWES.mjs.map +0 -1
  195. package/dist/chunk-373TK6TZ.js +0 -321
  196. package/dist/chunk-373TK6TZ.js.map +0 -1
  197. package/dist/chunk-4MOJJSNA.js +0 -14867
  198. package/dist/chunk-4MOJJSNA.js.map +0 -1
  199. package/dist/chunk-4QHHFCAA.mjs.map +0 -1
  200. package/dist/chunk-4X5TFGKD.mjs.map +0 -1
  201. package/dist/chunk-5YDPPOUU.mjs +0 -810
  202. package/dist/chunk-5YDPPOUU.mjs.map +0 -1
  203. package/dist/chunk-7FKPJQVS.mjs +0 -289
  204. package/dist/chunk-7FKPJQVS.mjs.map +0 -1
  205. package/dist/chunk-C3A5HXHX.mjs.map +0 -1
  206. package/dist/chunk-DY4K6X3A.js.map +0 -1
  207. package/dist/chunk-ELDJDBQL.js.map +0 -1
  208. package/dist/chunk-EUNL6GAL.js.map +0 -1
  209. package/dist/chunk-FI2ME55T.mjs.map +0 -1
  210. package/dist/chunk-FMB2RZDH.mjs.map +0 -1
  211. package/dist/chunk-FVCQBTNK.mjs.map +0 -1
  212. package/dist/chunk-G6VGUAK2.js.map +0 -1
  213. package/dist/chunk-GJD4CFHN.js.map +0 -1
  214. package/dist/chunk-GVXZWXQ7.js +0 -814
  215. package/dist/chunk-GVXZWXQ7.js.map +0 -1
  216. package/dist/chunk-HF2FWDBJ.mjs +0 -968
  217. package/dist/chunk-HF2FWDBJ.mjs.map +0 -1
  218. package/dist/chunk-IFAW7JFO.js +0 -1429
  219. package/dist/chunk-IFAW7JFO.js.map +0 -1
  220. package/dist/chunk-IJ2LWZID.js.map +0 -1
  221. package/dist/chunk-IKIJEKU3.mjs +0 -1427
  222. package/dist/chunk-IKIJEKU3.mjs.map +0 -1
  223. package/dist/chunk-JFTGG6HK.mjs +0 -14848
  224. package/dist/chunk-JFTGG6HK.mjs.map +0 -1
  225. package/dist/chunk-JM3ZR6LB.js +0 -981
  226. package/dist/chunk-JM3ZR6LB.js.map +0 -1
  227. package/dist/chunk-KJN2C6YE.js.map +0 -1
  228. package/dist/chunk-M5FLRLHI.mjs.map +0 -1
  229. package/dist/chunk-MCGLYYAR.mjs +0 -341
  230. package/dist/chunk-MCGLYYAR.mjs.map +0 -1
  231. package/dist/chunk-MG23BS36.js.map +0 -1
  232. package/dist/chunk-N24BPFF6.mjs.map +0 -1
  233. package/dist/chunk-NRNK7LXK.mjs.map +0 -1
  234. package/dist/chunk-PTTDKFL7.js.map +0 -1
  235. package/dist/chunk-S7FRYNSU.mjs +0 -315
  236. package/dist/chunk-S7FRYNSU.mjs.map +0 -1
  237. package/dist/chunk-SLB5V4RT.js +0 -302
  238. package/dist/chunk-SLB5V4RT.js.map +0 -1
  239. package/dist/chunk-TXZNP76P.js.map +0 -1
  240. package/dist/chunk-VNAJQKYG.mjs.map +0 -1
  241. package/dist/chunk-VZMDH3R4.mjs.map +0 -1
  242. package/dist/chunk-WW7UM7XY.js.map +0 -1
  243. package/dist/chunk-X4J33XQD.js.map +0 -1
  244. package/dist/chunk-XFOL6JDF.mjs.map +0 -1
  245. package/dist/chunk-XWWBUC2I.js.map +0 -1
  246. package/dist/chunk-YBTYDBWY.js.map +0 -1
  247. package/dist/chunk-ZQO6FZZB.js +0 -343
  248. package/dist/chunk-ZQO6FZZB.js.map +0 -1
  249. package/dist/chunk-ZU6YPEAF.mjs.map +0 -1
  250. package/dist/generators-DOFWGRXS.js +0 -37
  251. package/dist/generators-DOFWGRXS.js.map +0 -1
  252. package/dist/generators-R62APO62.mjs +0 -4
  253. package/dist/generators-R62APO62.mjs.map +0 -1
  254. package/dist/migrator-3WQB3KQ2.mjs +0 -4
  255. package/dist/migrator-3WQB3KQ2.mjs.map +0 -1
  256. package/dist/migrator-HFVQYK5R.js +0 -37
  257. package/dist/migrator-HFVQYK5R.js.map +0 -1
  258. package/dist/scanner-AF7YUCFG.mjs +0 -4
  259. package/dist/scanner-AF7YUCFG.mjs.map +0 -1
  260. package/dist/scanner-DBD5K6F7.js +0 -53
  261. package/dist/scanner-DBD5K6F7.js.map +0 -1
  262. package/dist/setup/client.d.mts +0 -60
  263. package/dist/setup/client.d.ts +0 -60
  264. package/dist/setup/client.js +0 -31
  265. package/dist/setup/client.js.map +0 -1
  266. package/dist/setup/client.mjs +0 -6
  267. package/dist/setup/client.mjs.map +0 -1
  268. package/dist/setup/server.d.mts +0 -14
  269. package/dist/setup/server.d.ts +0 -14
  270. package/dist/setup/server.js +0 -13
  271. package/dist/setup/server.js.map +0 -1
  272. package/dist/setup/server.mjs +0 -4
  273. package/dist/setup/server.mjs.map +0 -1
@@ -1,321 +0,0 @@
1
- 'use strict';
2
-
3
- // src/forms/formsApi.ts
4
- var config = null;
5
- function configureFormsApi(options) {
6
- config = options;
7
- }
8
- function getConfig() {
9
- if (config) return config;
10
- if (typeof window !== "undefined") {
11
- const apiUrl = window.__SITE_KIT_API_URL__;
12
- const apiKey = window.__SITE_KIT_API_KEY__;
13
- if (apiUrl && apiKey) {
14
- return { baseUrl: apiUrl, apiKey };
15
- }
16
- }
17
- throw new Error(
18
- "Forms API not configured. Either wrap your app in SiteKitProvider or call configureFormsApi() first."
19
- );
20
- }
21
- async function apiRequest(method, path, body) {
22
- const { baseUrl, apiKey, getAuthToken } = getConfig();
23
- const headers = {
24
- "Content-Type": "application/json"
25
- };
26
- if (apiKey) {
27
- headers["x-api-key"] = apiKey;
28
- } else if (getAuthToken) {
29
- const token = await getAuthToken();
30
- headers["Authorization"] = `Bearer ${token}`;
31
- }
32
- const response = await fetch(`${baseUrl}${path}`, {
33
- method,
34
- headers,
35
- body: body ? JSON.stringify(body) : void 0
36
- });
37
- if (!response.ok) {
38
- const error = await response.json().catch(() => ({ message: response.statusText }));
39
- throw new Error(error.message || `API error: ${response.status}`);
40
- }
41
- if (response.status === 204) {
42
- return void 0;
43
- }
44
- return response.json();
45
- }
46
- var formsApi = {
47
- /**
48
- * List all forms for a project
49
- */
50
- async list(options = {}) {
51
- const params = new URLSearchParams();
52
- if (options.projectId) params.set("projectId", options.projectId);
53
- if (options.formType) params.set("formType", options.formType);
54
- if (options.isActive !== void 0) params.set("isActive", String(options.isActive));
55
- if (options.search) params.set("search", options.search);
56
- const query = params.toString();
57
- const result = await apiRequest("GET", `/forms${query ? `?${query}` : ""}`);
58
- return result.data;
59
- },
60
- /**
61
- * Get a single form by ID or slug
62
- */
63
- async get(idOrSlug) {
64
- return apiRequest("GET", `/forms/${idOrSlug}`);
65
- },
66
- /**
67
- * Create a new form
68
- */
69
- async create(input) {
70
- return apiRequest("POST", "/forms", input);
71
- },
72
- /**
73
- * Update an existing form
74
- */
75
- async update(id, input) {
76
- return apiRequest("PUT", `/forms/${id}`, input);
77
- },
78
- /**
79
- * Delete a form
80
- */
81
- async delete(id) {
82
- return apiRequest("DELETE", `/forms/${id}`);
83
- },
84
- /**
85
- * Add a field to an existing form
86
- */
87
- async addField(formId, field2) {
88
- const form = await formsApi.get(formId);
89
- const maxSortOrder = Math.max(0, ...(form.fields || []).map((f) => f.sortOrder || 0));
90
- return formsApi.update(formId, {
91
- fields: [
92
- ...form.fields || [],
93
- { ...field2, sortOrder: field2.sortOrder ?? maxSortOrder + 1 }
94
- ]
95
- });
96
- },
97
- /**
98
- * Update a field in an existing form
99
- */
100
- async updateField(formId, fieldSlug, updates) {
101
- const form = await formsApi.get(formId);
102
- return formsApi.update(formId, {
103
- fields: (form.fields || []).map(
104
- (f) => f.slug === fieldSlug ? { ...f, ...updates } : f
105
- )
106
- });
107
- },
108
- /**
109
- * Remove a field from a form
110
- */
111
- async removeField(formId, fieldSlug) {
112
- const form = await formsApi.get(formId);
113
- return formsApi.update(formId, {
114
- fields: (form.fields || []).filter((f) => f.slug !== fieldSlug)
115
- });
116
- },
117
- /**
118
- * Reorder fields in a form
119
- */
120
- async reorderFields(formId, fieldSlugs) {
121
- const form = await formsApi.get(formId);
122
- const fieldsMap = new Map((form.fields || []).map((f) => [f.slug, f]));
123
- const orderedFields = fieldSlugs.map((slug, index) => {
124
- const field2 = fieldsMap.get(slug);
125
- if (!field2) throw new Error(`Field not found: ${slug}`);
126
- return { ...field2, sortOrder: index };
127
- });
128
- return formsApi.update(formId, { fields: orderedFields });
129
- },
130
- /**
131
- * Clone a form
132
- */
133
- async clone(formId, newSlug, newName) {
134
- const form = await formsApi.get(formId);
135
- return formsApi.create({
136
- projectId: form.projectId,
137
- slug: newSlug,
138
- name: newName || `${form.name} (Copy)`,
139
- description: form.description,
140
- formType: form.formType,
141
- successMessage: form.successMessage,
142
- redirectUrl: form.redirectUrl,
143
- notificationEmails: form.notificationEmails,
144
- submitButtonText: form.submitButtonText,
145
- layout: form.layout,
146
- showProgress: form.showProgress,
147
- enableSaveDraft: form.enableSaveDraft,
148
- isActive: false,
149
- // Clone as inactive
150
- fields: (form.fields || []).map(({ id, ...field2 }) => field2),
151
- // Remove IDs
152
- steps: (form.steps || []).map(({ id, ...step }) => step)
153
- // Remove IDs
154
- });
155
- },
156
- /**
157
- * Activate or deactivate a form
158
- */
159
- async setActive(formId, isActive) {
160
- return formsApi.update(formId, { isActive });
161
- },
162
- /**
163
- * Sync a form definition to the backend
164
- * Creates the form if it doesn't exist, updates if it does
165
- * Perfect for defining forms in code during development
166
- *
167
- * @example
168
- * ```tsx
169
- * // In your app initialization or form component
170
- * await formsApi.sync({
171
- * slug: 'contact',
172
- * name: 'Contact Form',
173
- * formType: 'prospect',
174
- * fields: [
175
- * field.text('name', 'Your Name', { isRequired: true }),
176
- * field.email('email', 'Email Address'),
177
- * field.phone('phone', 'Phone Number'),
178
- * field.textarea('message', 'Message'),
179
- * ]
180
- * })
181
- * ```
182
- */
183
- async sync(input) {
184
- return apiRequest(
185
- "POST",
186
- "/api/public/forms/sync",
187
- input
188
- );
189
- },
190
- /**
191
- * Sync multiple forms at once
192
- * Useful for initializing all forms in your app
193
- */
194
- async syncAll(forms) {
195
- return Promise.all(forms.map((form) => formsApi.sync(form)));
196
- }
197
- };
198
- var field = {
199
- text: (slug, label, options) => ({
200
- slug,
201
- label,
202
- fieldType: "text",
203
- ...options
204
- }),
205
- email: (slug, label, options) => ({
206
- slug,
207
- label,
208
- fieldType: "email",
209
- isRequired: true,
210
- ...options
211
- }),
212
- phone: (slug, label, options) => ({
213
- slug,
214
- label,
215
- fieldType: "phone",
216
- ...options
217
- }),
218
- textarea: (slug, label, options) => ({
219
- slug,
220
- label,
221
- fieldType: "textarea",
222
- ...options
223
- }),
224
- select: (slug, label, choices, options) => ({
225
- slug,
226
- label,
227
- fieldType: "select",
228
- options: choices,
229
- ...options
230
- }),
231
- radio: (slug, label, choices, options) => ({
232
- slug,
233
- label,
234
- fieldType: "radio",
235
- options: choices,
236
- ...options
237
- }),
238
- checkbox: (slug, label, options) => ({
239
- slug,
240
- label,
241
- fieldType: "checkbox",
242
- ...options
243
- }),
244
- date: (slug, label, options) => ({
245
- slug,
246
- label,
247
- fieldType: "date",
248
- ...options
249
- }),
250
- number: (slug, label, options) => ({
251
- slug,
252
- label,
253
- fieldType: "number",
254
- ...options
255
- }),
256
- rating: (slug, label, options) => ({
257
- slug,
258
- label,
259
- fieldType: "rating",
260
- ...options
261
- }),
262
- file: (slug, label, options) => ({
263
- slug,
264
- label,
265
- fieldType: "file",
266
- ...options
267
- }),
268
- hidden: (slug, defaultValue) => ({
269
- slug,
270
- label: "",
271
- fieldType: "hidden",
272
- defaultValue
273
- }),
274
- heading: (slug, label) => ({
275
- slug,
276
- label,
277
- fieldType: "heading"
278
- }),
279
- paragraph: (slug, label) => ({
280
- slug,
281
- label,
282
- fieldType: "paragraph"
283
- })
284
- };
285
- function defineForm(definition) {
286
- const fieldsWithOrder = definition.fields.map((f, index) => ({
287
- ...f,
288
- sortOrder: f.sortOrder ?? index
289
- }));
290
- return {
291
- ...definition,
292
- fields: fieldsWithOrder,
293
- formType: definition.formType || "contact",
294
- successMessage: definition.successMessage || "Thank you for your submission!",
295
- submitButtonText: definition.submitButtonText || "Submit",
296
- layout: definition.layout || "stacked",
297
- isActive: definition.isActive ?? true
298
- };
299
- }
300
- async function initializeForms(forms) {
301
- if (typeof window === "undefined") {
302
- console.log(`[Site-Kit] ${forms.length} form(s) ready to sync: ${forms.map((f) => f.slug).join(", ")}`);
303
- return;
304
- }
305
- try {
306
- const results = await formsApi.syncAll(forms);
307
- const created = results.filter((r) => r.created).length;
308
- const updated = results.filter((r) => r.updated).length;
309
- console.log(`[Site-Kit] Forms synced: ${created} created, ${updated} updated`);
310
- } catch (error) {
311
- console.error("[Site-Kit] Failed to sync forms:", error);
312
- }
313
- }
314
-
315
- exports.configureFormsApi = configureFormsApi;
316
- exports.defineForm = defineForm;
317
- exports.field = field;
318
- exports.formsApi = formsApi;
319
- exports.initializeForms = initializeForms;
320
- //# sourceMappingURL=chunk-373TK6TZ.js.map
321
- //# sourceMappingURL=chunk-373TK6TZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/forms/formsApi.ts"],"names":["field"],"mappings":"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","file":"chunk-373TK6TZ.js","sourcesContent":["/**\n * @sonordev/site-kit/forms - Forms API Client\n * \n * Full API client for form management. Allows developers to create, update,\n * and delete forms programmatically. Changes sync to Portal automatically.\n * \n * @example\n * ```tsx\n * import { formsApi } from '@sonordev/site-kit/forms'\n * \n * // Create a new form\n * const form = await formsApi.create({\n * projectId: 'xxx',\n * slug: 'contact-us',\n * name: 'Contact Form',\n * formType: 'prospect',\n * fields: [\n * { slug: 'name', label: 'Name', fieldType: 'text', isRequired: true },\n * { slug: 'email', label: 'Email', fieldType: 'email', isRequired: true },\n * { slug: 'message', label: 'Message', fieldType: 'textarea' },\n * ]\n * })\n * \n * // Update fields\n * await formsApi.update(form.id, {\n * fields: [...form.fields, { slug: 'phone', label: 'Phone', fieldType: 'phone' }]\n * })\n * ```\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport type FormType = \n | 'prospect' // → CRM leads\n | 'contact' // → Contact form\n | 'support' // → Support tickets\n | 'feedback' // → Feedback entries\n | 'newsletter' // → Email subscribers\n | 'custom' // → Custom webhook\n\nexport type FieldType =\n | 'text'\n | 'email'\n | 'phone'\n | 'number'\n | 'textarea'\n | 'select'\n | 'multi_select'\n | 'radio'\n | 'checkbox'\n | 'date'\n | 'time'\n | 'datetime'\n | 'url'\n | 'file'\n | 'rating'\n | 'slider'\n | 'hidden'\n | 'heading'\n | 'paragraph'\n\nexport type FieldWidth = 'full' | 'half' | 'third' | 'quarter'\n\nexport interface FieldOption {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface FieldValidation {\n min?: number\n max?: number\n minLength?: number\n maxLength?: number\n pattern?: string\n patternMessage?: string\n}\n\nexport interface FieldConditional {\n field: string\n operator: 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'is_empty' | 'not_empty' | 'greater_than' | 'less_than'\n value?: string | number | boolean\n}\n\nexport interface FormField {\n id?: string\n slug: string\n label: string\n fieldType: FieldType\n placeholder?: string\n helpText?: string\n defaultValue?: string\n isRequired?: boolean\n validation?: FieldValidation\n options?: FieldOption[]\n conditional?: FieldConditional\n width?: FieldWidth\n sortOrder?: number\n destinationField?: string\n stepId?: string\n}\n\nexport interface FormStep {\n id?: string\n stepNumber: number\n title?: string\n description?: string\n condition?: FieldConditional\n}\n\nexport interface Form {\n id: string\n projectId: string\n slug: string\n name: string\n description?: string\n formType: FormType\n successMessage: string\n redirectUrl?: string\n notificationEmails?: string[]\n submitButtonText: string\n layout: 'stacked' | 'inline' | 'grid'\n showProgress: boolean\n enableSaveDraft: boolean\n isActive: boolean\n createdAt: string\n updatedAt: string\n fields?: FormField[]\n steps?: FormStep[]\n}\n\nexport interface CreateFormInput {\n projectId: string\n slug: string\n name: string\n description?: string\n formType?: FormType\n successMessage?: string\n redirectUrl?: string\n notificationEmails?: string[]\n submitButtonText?: string\n layout?: 'stacked' | 'inline' | 'grid'\n showProgress?: boolean\n enableSaveDraft?: boolean\n isActive?: boolean\n fields?: FormField[]\n steps?: FormStep[]\n}\n\nexport interface UpdateFormInput {\n slug?: string\n name?: string\n description?: string\n formType?: FormType\n successMessage?: string\n redirectUrl?: string\n notificationEmails?: string[]\n submitButtonText?: string\n layout?: 'stacked' | 'inline' | 'grid'\n showProgress?: boolean\n enableSaveDraft?: boolean\n isActive?: boolean\n fields?: FormField[]\n steps?: FormStep[]\n}\n\nexport interface FormsListOptions {\n projectId?: string\n formType?: FormType\n isActive?: boolean\n search?: string\n}\n\n// ============================================\n// API Client Configuration\n// ============================================\n\ninterface FormsApiConfig {\n baseUrl: string\n apiKey?: string\n getAuthToken?: () => Promise<string> | string\n}\n\nlet config: FormsApiConfig | null = null\n\n/**\n * Configure the forms API client\n */\nexport function configureFormsApi(options: FormsApiConfig) {\n config = options\n}\n\n/**\n * Get API config, falling back to SiteKitProvider globals\n */\nfunction getConfig(): FormsApiConfig {\n if (config) return config\n \n // Try to get from window globals (set by SiteKitProvider)\n if (typeof window !== 'undefined') {\n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (apiUrl && apiKey) {\n return { baseUrl: apiUrl, apiKey }\n }\n }\n \n throw new Error(\n 'Forms API not configured. Either wrap your app in SiteKitProvider or call configureFormsApi() first.'\n )\n}\n\n// ============================================\n// HTTP Helpers\n// ============================================\n\nasync function apiRequest<T>(\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n path: string,\n body?: any\n): Promise<T> {\n const { baseUrl, apiKey, getAuthToken } = getConfig()\n \n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n \n // Use API key for public endpoints, auth token for admin endpoints\n if (apiKey) {\n headers['x-api-key'] = apiKey\n } else if (getAuthToken) {\n const token = await getAuthToken()\n headers['Authorization'] = `Bearer ${token}`\n }\n \n const response = await fetch(`${baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n })\n \n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: response.statusText }))\n throw new Error(error.message || `API error: ${response.status}`)\n }\n \n if (response.status === 204) {\n return undefined as T\n }\n \n return response.json()\n}\n\n// ============================================\n// Forms API\n// ============================================\n\nexport const formsApi = {\n /**\n * List all forms for a project\n */\n async list(options: FormsListOptions = {}): Promise<Form[]> {\n const params = new URLSearchParams()\n if (options.projectId) params.set('projectId', options.projectId)\n if (options.formType) params.set('formType', options.formType)\n if (options.isActive !== undefined) params.set('isActive', String(options.isActive))\n if (options.search) params.set('search', options.search)\n \n const query = params.toString()\n const result = await apiRequest<{ data: Form[] }>('GET', `/forms${query ? `?${query}` : ''}`)\n return result.data\n },\n \n /**\n * Get a single form by ID or slug\n */\n async get(idOrSlug: string): Promise<Form> {\n return apiRequest<Form>('GET', `/forms/${idOrSlug}`)\n },\n \n /**\n * Create a new form\n */\n async create(input: CreateFormInput): Promise<Form> {\n return apiRequest<Form>('POST', '/forms', input)\n },\n \n /**\n * Update an existing form\n */\n async update(id: string, input: UpdateFormInput): Promise<Form> {\n return apiRequest<Form>('PUT', `/forms/${id}`, input)\n },\n \n /**\n * Delete a form\n */\n async delete(id: string): Promise<void> {\n return apiRequest<void>('DELETE', `/forms/${id}`)\n },\n \n /**\n * Add a field to an existing form\n */\n async addField(formId: string, field: FormField): Promise<Form> {\n const form = await formsApi.get(formId)\n const maxSortOrder = Math.max(0, ...(form.fields || []).map(f => f.sortOrder || 0))\n \n return formsApi.update(formId, {\n fields: [\n ...(form.fields || []),\n { ...field, sortOrder: field.sortOrder ?? maxSortOrder + 1 }\n ]\n })\n },\n \n /**\n * Update a field in an existing form\n */\n async updateField(formId: string, fieldSlug: string, updates: Partial<FormField>): Promise<Form> {\n const form = await formsApi.get(formId)\n \n return formsApi.update(formId, {\n fields: (form.fields || []).map(f => \n f.slug === fieldSlug ? { ...f, ...updates } : f\n )\n })\n },\n \n /**\n * Remove a field from a form\n */\n async removeField(formId: string, fieldSlug: string): Promise<Form> {\n const form = await formsApi.get(formId)\n \n return formsApi.update(formId, {\n fields: (form.fields || []).filter(f => f.slug !== fieldSlug)\n })\n },\n \n /**\n * Reorder fields in a form\n */\n async reorderFields(formId: string, fieldSlugs: string[]): Promise<Form> {\n const form = await formsApi.get(formId)\n const fieldsMap = new Map((form.fields || []).map(f => [f.slug, f]))\n \n const orderedFields = fieldSlugs.map((slug, index) => {\n const field = fieldsMap.get(slug)\n if (!field) throw new Error(`Field not found: ${slug}`)\n return { ...field, sortOrder: index }\n })\n \n return formsApi.update(formId, { fields: orderedFields })\n },\n \n /**\n * Clone a form\n */\n async clone(formId: string, newSlug: string, newName?: string): Promise<Form> {\n const form = await formsApi.get(formId)\n \n return formsApi.create({\n projectId: form.projectId,\n slug: newSlug,\n name: newName || `${form.name} (Copy)`,\n description: form.description,\n formType: form.formType,\n successMessage: form.successMessage,\n redirectUrl: form.redirectUrl,\n notificationEmails: form.notificationEmails,\n submitButtonText: form.submitButtonText,\n layout: form.layout,\n showProgress: form.showProgress,\n enableSaveDraft: form.enableSaveDraft,\n isActive: false, // Clone as inactive\n fields: (form.fields || []).map(({ id, ...field }) => field), // Remove IDs\n steps: (form.steps || []).map(({ id, ...step }) => step), // Remove IDs\n })\n },\n \n /**\n * Activate or deactivate a form\n */\n async setActive(formId: string, isActive: boolean): Promise<Form> {\n return formsApi.update(formId, { isActive })\n },\n\n /**\n * Sync a form definition to the backend\n * Creates the form if it doesn't exist, updates if it does\n * Perfect for defining forms in code during development\n * \n * @example\n * ```tsx\n * // In your app initialization or form component\n * await formsApi.sync({\n * slug: 'contact',\n * name: 'Contact Form',\n * formType: 'prospect',\n * fields: [\n * field.text('name', 'Your Name', { isRequired: true }),\n * field.email('email', 'Email Address'),\n * field.phone('phone', 'Phone Number'),\n * field.textarea('message', 'Message'),\n * ]\n * })\n * ```\n */\n async sync(input: Omit<CreateFormInput, 'projectId'>): Promise<Form & { synced: boolean; created: boolean; updated: boolean }> {\n return apiRequest<Form & { synced: boolean; created: boolean; updated: boolean }>(\n 'POST',\n '/api/public/forms/sync',\n input\n )\n },\n\n /**\n * Sync multiple forms at once\n * Useful for initializing all forms in your app\n */\n async syncAll(forms: Array<Omit<CreateFormInput, 'projectId'>>): Promise<Array<Form & { synced: boolean; created: boolean; updated: boolean }>> {\n return Promise.all(forms.map(form => formsApi.sync(form)))\n },\n}\n\n// ============================================\n// Field Builder Helpers\n// ============================================\n\n/**\n * Helper functions to build field definitions\n */\nexport const field = {\n text: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'text',\n ...options,\n }),\n \n email: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'email',\n isRequired: true,\n ...options,\n }),\n \n phone: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'phone',\n ...options,\n }),\n \n textarea: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'textarea',\n ...options,\n }),\n \n select: (slug: string, label: string, choices: Array<{ value: string; label: string }>, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'select',\n options: choices,\n ...options,\n }),\n \n radio: (slug: string, label: string, choices: Array<{ value: string; label: string }>, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'radio',\n options: choices,\n ...options,\n }),\n \n checkbox: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'checkbox',\n ...options,\n }),\n \n date: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'date',\n ...options,\n }),\n \n number: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'number',\n ...options,\n }),\n \n rating: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'rating',\n ...options,\n }),\n \n file: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'file',\n ...options,\n }),\n \n hidden: (slug: string, defaultValue: string): FormField => ({\n slug,\n label: '',\n fieldType: 'hidden',\n defaultValue,\n }),\n \n heading: (slug: string, label: string): FormField => ({\n slug,\n label,\n fieldType: 'heading',\n }),\n \n paragraph: (slug: string, label: string): FormField => ({\n slug,\n label,\n fieldType: 'paragraph',\n }),\n}\n\n// ============================================\n// Form Definition Helper\n// ============================================\n\nexport interface FormDefinition extends Omit<CreateFormInput, 'projectId'> {\n slug: string\n name: string\n fields: FormField[]\n}\n\n/**\n * Define a form declaratively\n * Returns a form definition that can be synced to the backend\n * \n * @example\n * ```tsx\n * // forms/contact.ts\n * import { defineForm, field } from '@sonordev/site-kit/forms'\n * \n * export const contactForm = defineForm({\n * slug: 'contact',\n * name: 'Contact Us',\n * formType: 'prospect',\n * successMessage: 'Thanks! We\\'ll be in touch soon.',\n * fields: [\n * field.text('name', 'Your Name', { isRequired: true }),\n * field.email('email', 'Email Address'),\n * field.phone('phone', 'Phone Number'),\n * field.select('service', 'Service Needed', [\n * { value: 'consultation', label: 'Free Consultation' },\n * { value: 'representation', label: 'Legal Representation' },\n * ]),\n * field.textarea('message', 'Tell us about your case'),\n * ]\n * })\n * \n * // Then in your app:\n * await formsApi.sync(contactForm)\n * ```\n */\nexport function defineForm(definition: FormDefinition): FormDefinition {\n // Ensure fields have sort order\n const fieldsWithOrder = definition.fields.map((f, index) => ({\n ...f,\n sortOrder: f.sortOrder ?? index,\n }))\n \n return {\n ...definition,\n fields: fieldsWithOrder,\n formType: definition.formType || 'contact',\n successMessage: definition.successMessage || 'Thank you for your submission!',\n submitButtonText: definition.submitButtonText || 'Submit',\n layout: definition.layout || 'stacked',\n isActive: definition.isActive ?? true,\n }\n}\n\n/**\n * Initialize multiple forms and sync them to the backend\n * Call this once during app initialization (e.g., in layout.tsx or _app.tsx)\n * \n * @example\n * ```tsx\n * // app/layout.tsx\n * import { initializeForms } from '@sonordev/site-kit/forms'\n * import { contactForm } from './forms/contact'\n * import { consultationForm } from './forms/consultation'\n * \n * // Initialize forms (runs once per build/server start in dev)\n * if (process.env.NODE_ENV === 'development') {\n * initializeForms([contactForm, consultationForm])\n * }\n * ```\n */\nexport async function initializeForms(forms: FormDefinition[]): Promise<void> {\n if (typeof window === 'undefined') {\n // Server-side: log that forms need to be synced\n console.log(`[Site-Kit] ${forms.length} form(s) ready to sync: ${forms.map(f => f.slug).join(', ')}`)\n return\n }\n \n try {\n const results = await formsApi.syncAll(forms)\n const created = results.filter(r => r.created).length\n const updated = results.filter(r => r.updated).length\n console.log(`[Site-Kit] Forms synced: ${created} created, ${updated} updated`)\n } catch (error) {\n console.error('[Site-Kit] Failed to sync forms:', error)\n }\n}\n"]}