@sonordev/site-kit 1.2.7 → 1.2.9

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 (259) 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-QETK4P5G.mjs +142 -0
  73. package/dist/chunk-QETK4P5G.mjs.map +1 -0
  74. package/dist/{chunk-W4PALSGM.js → chunk-REMHGWXT.js} +3 -3
  75. package/dist/chunk-REMHGWXT.js.map +1 -0
  76. package/dist/{chunk-DW5UJKHH.js → chunk-RMOL4TZ6.js} +8 -8
  77. package/dist/chunk-RMOL4TZ6.js.map +1 -0
  78. package/dist/{chunk-KKU3K7RG.js → chunk-SLB5V4RT.js} +33 -67
  79. package/dist/chunk-SLB5V4RT.js.map +1 -0
  80. package/dist/{chunk-K23A4G76.mjs → chunk-SQSBAPWA.mjs} +8 -8
  81. package/dist/chunk-SQSBAPWA.mjs.map +1 -0
  82. package/dist/{chunk-WECQ6KOB.js → chunk-TG46LJFB.js} +4 -4
  83. package/dist/chunk-TG46LJFB.js.map +1 -0
  84. package/dist/{chunk-43GBM4SX.js → chunk-TKQLH33E.js} +3 -3
  85. package/dist/chunk-TKQLH33E.js.map +1 -0
  86. package/dist/{chunk-UYFDNX2F.js → chunk-TLHRV3LZ.js} +5 -5
  87. package/dist/chunk-TLHRV3LZ.js.map +1 -0
  88. package/dist/{chunk-6ZCISNAB.mjs → chunk-UPR5FEIO.mjs} +3 -3
  89. package/dist/chunk-UPR5FEIO.mjs.map +1 -0
  90. package/dist/chunk-VTECURKB.js +144 -0
  91. package/dist/chunk-VTECURKB.js.map +1 -0
  92. package/dist/{chunk-GCJXQ4AG.mjs → chunk-VZMDH3R4.mjs} +5 -5
  93. package/dist/chunk-VZMDH3R4.mjs.map +1 -0
  94. package/dist/{chunk-LBVWVP72.js → chunk-X4J33XQD.js} +7 -7
  95. package/dist/chunk-X4J33XQD.js.map +1 -0
  96. package/dist/{chunk-QXV4667R.mjs → chunk-XFOL6JDF.mjs} +5 -5
  97. package/dist/chunk-XFOL6JDF.mjs.map +1 -0
  98. package/dist/cli/index.js +80 -91
  99. package/dist/cli/index.js.map +1 -1
  100. package/dist/cli/index.mjs +76 -87
  101. package/dist/cli/index.mjs.map +1 -1
  102. package/dist/cms/index.d.mts +139 -0
  103. package/dist/cms/index.d.ts +139 -0
  104. package/dist/cms/index.js +409 -0
  105. package/dist/cms/index.js.map +1 -0
  106. package/dist/cms/index.mjs +388 -0
  107. package/dist/cms/index.mjs.map +1 -0
  108. package/dist/cms/server.d.mts +47 -0
  109. package/dist/cms/server.d.ts +47 -0
  110. package/dist/cms/server.js +21 -0
  111. package/dist/{server-api-GJPNRYUP.js.map → cms/server.js.map} +1 -1
  112. package/dist/cms/server.mjs +4 -0
  113. package/dist/{server-api-EWXKOQZA.mjs.map → cms/server.mjs.map} +1 -1
  114. package/dist/commerce/index.js +42 -42
  115. package/dist/commerce/index.mjs +1 -1
  116. package/dist/commerce/server.d.mts +1 -1
  117. package/dist/commerce/server.d.ts +1 -1
  118. package/dist/commerce/server.js.map +1 -1
  119. package/dist/commerce/server.mjs.map +1 -1
  120. package/dist/config/index.js +1 -1
  121. package/dist/config/index.js.map +1 -1
  122. package/dist/config/index.mjs +1 -1
  123. package/dist/config/index.mjs.map +1 -1
  124. package/dist/engage/index.js +4 -4
  125. package/dist/engage/index.mjs +1 -1
  126. package/dist/forms/index.js +5 -5
  127. package/dist/forms/index.js.map +1 -1
  128. package/dist/forms/index.mjs +5 -5
  129. package/dist/forms/index.mjs.map +1 -1
  130. package/dist/generators-DOFWGRXS.js +37 -0
  131. package/dist/{generators-DTMO36DV.js.map → generators-DOFWGRXS.js.map} +1 -1
  132. package/dist/generators-R62APO62.mjs +4 -0
  133. package/dist/{generators-2XKQMPKH.mjs.map → generators-R62APO62.mjs.map} +1 -1
  134. package/dist/images/index.d.mts +1 -1
  135. package/dist/images/index.d.ts +1 -1
  136. package/dist/images/index.js +11 -11
  137. package/dist/images/index.mjs +2 -2
  138. package/dist/images/server.d.mts +3 -3
  139. package/dist/images/server.d.ts +3 -3
  140. package/dist/images/server.js +4 -4
  141. package/dist/images/server.mjs +1 -1
  142. package/dist/index.d.mts +5 -5
  143. package/dist/index.d.ts +5 -5
  144. package/dist/index.js +81 -81
  145. package/dist/index.js.map +1 -1
  146. package/dist/index.mjs +28 -28
  147. package/dist/index.mjs.map +1 -1
  148. package/dist/layout/client.d.mts +18 -0
  149. package/dist/layout/client.d.ts +18 -0
  150. package/dist/layout/client.js +18 -0
  151. package/dist/layout/client.js.map +1 -0
  152. package/dist/layout/client.mjs +9 -0
  153. package/dist/layout/client.mjs.map +1 -0
  154. package/dist/layout/index.d.mts +4 -27
  155. package/dist/layout/index.d.ts +4 -27
  156. package/dist/layout/index.js +15 -145
  157. package/dist/layout/index.js.map +1 -1
  158. package/dist/layout/index.mjs +11 -141
  159. package/dist/layout/index.mjs.map +1 -1
  160. package/dist/llms/index.js +12 -12
  161. package/dist/llms/index.mjs +2 -2
  162. package/dist/manifest/index.js +4 -4
  163. package/dist/manifest/index.js.map +1 -1
  164. package/dist/manifest/index.mjs +3 -3
  165. package/dist/manifest/index.mjs.map +1 -1
  166. package/dist/middleware/index.js +3 -3
  167. package/dist/middleware/index.mjs +2 -2
  168. package/dist/{migrator-2MQHOFDQ.mjs → migrator-3WQB3KQ2.mjs} +3 -3
  169. package/dist/{migrator-2MQHOFDQ.mjs.map → migrator-3WQB3KQ2.mjs.map} +1 -1
  170. package/dist/migrator-HFVQYK5R.js +37 -0
  171. package/dist/{migrator-THJCF6MZ.js.map → migrator-HFVQYK5R.js.map} +1 -1
  172. package/dist/redirects/index.d.mts +2 -2
  173. package/dist/redirects/index.d.ts +2 -2
  174. package/dist/redirects/index.js +6 -6
  175. package/dist/redirects/index.mjs +2 -2
  176. package/dist/reputation/index.js +4 -4
  177. package/dist/reputation/index.mjs +1 -1
  178. package/dist/robots/index.d.mts +1 -1
  179. package/dist/robots/index.d.ts +1 -1
  180. package/dist/robots/index.js +3 -3
  181. package/dist/robots/index.js.map +1 -1
  182. package/dist/robots/index.mjs +2 -2
  183. package/dist/robots/index.mjs.map +1 -1
  184. package/dist/seo/index.d.mts +1 -1
  185. package/dist/seo/index.d.ts +1 -1
  186. package/dist/seo/index.js +43 -43
  187. package/dist/seo/index.js.map +1 -1
  188. package/dist/seo/index.mjs +6 -6
  189. package/dist/seo/index.mjs.map +1 -1
  190. package/dist/seo/register-sitemap-cli.js +18 -18
  191. package/dist/seo/register-sitemap-cli.js.map +1 -1
  192. package/dist/seo/register-sitemap-cli.mjs +18 -18
  193. package/dist/seo/register-sitemap-cli.mjs.map +1 -1
  194. package/dist/seo/server.d.mts +1 -1
  195. package/dist/seo/server.d.ts +1 -1
  196. package/dist/seo/server.js +10 -10
  197. package/dist/seo/server.js.map +1 -1
  198. package/dist/seo/server.mjs +8 -8
  199. package/dist/seo/server.mjs.map +1 -1
  200. package/dist/{server-api-GJPNRYUP.js → server-api-C5JXIROA.js} +21 -21
  201. package/dist/server-api-C5JXIROA.js.map +1 -0
  202. package/dist/{server-api-EWXKOQZA.mjs → server-api-HTSLBT6F.mjs} +3 -3
  203. package/dist/server-api-HTSLBT6F.mjs.map +1 -0
  204. package/dist/setup/client.js +7 -7
  205. package/dist/setup/client.mjs +2 -2
  206. package/dist/setup/index.js +9 -9
  207. package/dist/setup/index.mjs +3 -3
  208. package/dist/setup/server.js +2 -2
  209. package/dist/setup/server.mjs +1 -1
  210. package/dist/site-config/index.d.mts +1 -1
  211. package/dist/site-config/index.d.ts +1 -1
  212. package/dist/site-config/index.js +3 -3
  213. package/dist/site-config/index.mjs +1 -1
  214. package/dist/sitemap/index.d.mts +2 -2
  215. package/dist/sitemap/index.d.ts +2 -2
  216. package/dist/sitemap/index.js +10 -10
  217. package/dist/sitemap/index.js.map +1 -1
  218. package/dist/sitemap/index.mjs +8 -8
  219. package/dist/sitemap/index.mjs.map +1 -1
  220. package/dist/types-5RCOK10v.d.mts +25 -0
  221. package/dist/types-5RCOK10v.d.ts +25 -0
  222. package/dist/types-BG-x8yhh.d.mts +106 -0
  223. package/dist/types-BG-x8yhh.d.ts +106 -0
  224. package/package.json +13 -1
  225. package/dist/chunk-24277A3Q.mjs.map +0 -1
  226. package/dist/chunk-43GBM4SX.js.map +0 -1
  227. package/dist/chunk-622GAQP5.js.map +0 -1
  228. package/dist/chunk-6ZCISNAB.mjs.map +0 -1
  229. package/dist/chunk-72MQFHYJ.js.map +0 -1
  230. package/dist/chunk-7557OTHW.js.map +0 -1
  231. package/dist/chunk-7FUV73JZ.js.map +0 -1
  232. package/dist/chunk-7RF6PVHA.mjs.map +0 -1
  233. package/dist/chunk-7UKPRW25.mjs.map +0 -1
  234. package/dist/chunk-AFAO3TGS.mjs.map +0 -1
  235. package/dist/chunk-BYLIU6XG.js.map +0 -1
  236. package/dist/chunk-D63MUKZ6.mjs.map +0 -1
  237. package/dist/chunk-DDKW2FNA.js.map +0 -1
  238. package/dist/chunk-DQYMKR27.mjs.map +0 -1
  239. package/dist/chunk-DW5UJKHH.js.map +0 -1
  240. package/dist/chunk-GCJXQ4AG.mjs.map +0 -1
  241. package/dist/chunk-JTLOJLWQ.mjs.map +0 -1
  242. package/dist/chunk-K23A4G76.mjs.map +0 -1
  243. package/dist/chunk-KKU3K7RG.js.map +0 -1
  244. package/dist/chunk-KUGMH4ZF.js.map +0 -1
  245. package/dist/chunk-LBVWVP72.js.map +0 -1
  246. package/dist/chunk-M2T6R7BA.mjs.map +0 -1
  247. package/dist/chunk-OB7E654K.js.map +0 -1
  248. package/dist/chunk-OIIKTGRL.mjs.map +0 -1
  249. package/dist/chunk-P3UWIUJS.mjs.map +0 -1
  250. package/dist/chunk-QXV4667R.mjs.map +0 -1
  251. package/dist/chunk-TFLQX7K7.mjs.map +0 -1
  252. package/dist/chunk-UWE5PCYJ.mjs.map +0 -1
  253. package/dist/chunk-UYFDNX2F.js.map +0 -1
  254. package/dist/chunk-W4PALSGM.js.map +0 -1
  255. package/dist/chunk-WECQ6KOB.js.map +0 -1
  256. package/dist/chunk-XQQWI6WB.js.map +0 -1
  257. package/dist/generators-2XKQMPKH.mjs +0 -4
  258. package/dist/generators-DTMO36DV.js +0 -33
  259. package/dist/migrator-THJCF6MZ.js +0 -37
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/images/ManagedImage.tsx","../src/images/api.ts"],"names":["useState","useCallback","useEffect","jsx","jsxs"],"mappings":"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","file":"chunk-G6VGUAK2.js","sourcesContent":["/**\n * ManagedImage - Portal-managed image component\n * \n * Features:\n * - Fetches images from Portal API via API key (never direct Supabase)\n * - Dev mode: Click to open image picker modal\n * - Supports responsive variants\n * - Automatic focal point handling\n * - Placeholder state for empty slots\n * \n * @example\n * ```tsx\n * <ManagedImage \n * slotId=\"hero-background\"\n * alt=\"Hero background image\"\n * className=\"w-full h-96 object-cover\"\n * />\n * ```\n */\n\n'use client'\n\nimport React, { useState, useEffect, useCallback } from 'react'\n\nexport interface ManagedImageData {\n id: string\n slot_id: string\n page_path: string | null\n file_id: string | null\n external_url: string | null\n alt_text: string | null\n title: string | null\n caption: string | null\n focal_point_x: number\n focal_point_y: number\n aspect_ratio: string | null\n public_url?: string\n is_placeholder: boolean\n}\n\nexport interface ImageFile {\n id: string\n filename: string\n storage_path: string\n mime_type: string\n file_size: number\n folder_path: string | null\n public_url?: string\n}\n\nexport interface ManagedImageProps {\n /** API key for Portal API */\n apiKey?: string\n /** API URL (defaults to https://api.sonor.io) */\n apiUrl?: string\n /** Unique slot identifier (e.g., 'hero-background', 'about-team-1') */\n slotId: string\n /** Page path for page-specific slots (defaults to current path) */\n pagePath?: string\n /** Fallback alt text if not set in Portal */\n alt?: string\n /** CSS class names */\n className?: string\n /** Image width */\n width?: number | string\n /** Image height */\n height?: number | string\n /** CSS object-fit property */\n objectFit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down'\n /** Fallback image URL when no image assigned */\n fallback?: string\n /** Custom placeholder component */\n placeholder?: React.ReactNode\n /** Called when image loads */\n onLoad?: () => void\n /** Called on error */\n onError?: (error: Error) => void\n /** Priority loading (Next.js Image optimization) */\n priority?: boolean\n /** Additional styles */\n style?: React.CSSProperties\n /** Enable dev picker even outside dev mode */\n forceDevMode?: boolean\n}\n\n// Check if we're in dev mode\nconst isDevMode = (): boolean => {\n if (typeof window === 'undefined') return false\n return (\n process.env.NODE_ENV === 'development' ||\n window.location.hostname === 'localhost' ||\n window.location.hostname === '127.0.0.1' ||\n window.location.search.includes('uptrade_dev=true')\n )\n}\n\nexport function ManagedImage({\n apiKey = process.env.SONOR_API_KEY || process.env.UPTRADE_API_KEY || process.env.NEXT_PUBLIC_UPTRADE_API_KEY,\n apiUrl = process.env.SONOR_API_URL || process.env.UPTRADE_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.sonor.io',\n slotId,\n pagePath,\n alt,\n className = '',\n width,\n height,\n objectFit = 'cover',\n fallback,\n placeholder,\n onLoad,\n onError,\n priority,\n style,\n forceDevMode,\n}: ManagedImageProps) {\n const [imageData, setImageData] = useState<ManagedImageData | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n const [showPicker, setShowPicker] = useState(false)\n const [devMode] = useState(() => forceDevMode || isDevMode())\n\n // Get current page path if not provided\n const currentPath = pagePath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\n\n // Fetch image data from Portal API\n const fetchImage = useCallback(async () => {\n if (!apiKey || !apiUrl) {\n setLoading(false)\n return\n }\n\n try {\n const params = new URLSearchParams({ page_path: currentPath })\n const res = await fetch(\n `${apiUrl}/public/images/slot/${encodeURIComponent(slotId)}?${params}`,\n {\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n }\n )\n\n if (!res.ok) {\n throw new Error(`Failed to fetch image: ${res.status}`)\n }\n\n const data = await res.json()\n setImageData(data.image)\n setError(null)\n } catch (err) {\n console.error('[ManagedImage] Fetch error:', err)\n setError(err instanceof Error ? err : new Error(String(err)))\n onError?.(err instanceof Error ? err : new Error(String(err)))\n } finally {\n setLoading(false)\n }\n }, [apiKey, apiUrl, slotId, currentPath, onError])\n\n useEffect(() => {\n fetchImage()\n }, [fetchImage])\n\n // Calculate object-position from focal point\n const objectPosition = imageData\n ? `${imageData.focal_point_x}% ${imageData.focal_point_y}%`\n : '50% 50%'\n\n // Get the image URL\n const imageUrl = imageData?.public_url || imageData?.external_url || fallback\n\n // Handle click in dev mode\n const handleClick = (e: React.MouseEvent) => {\n if (devMode) {\n e.preventDefault()\n e.stopPropagation()\n setShowPicker(true)\n }\n }\n\n // Render placeholder state\n if (loading) {\n return (\n <div\n className={`bg-gray-200 animate-pulse ${className}`}\n style={{\n width: width ?? '100%',\n height: height ?? 200,\n ...style,\n }}\n />\n )\n }\n\n // No image assigned - show placeholder or dev picker hint\n if (!imageUrl) {\n if (placeholder) {\n return <>{placeholder}</>\n }\n\n return (\n <div\n onClick={handleClick}\n className={`\n bg-gray-100 border-2 border-dashed border-gray-300 \n flex items-center justify-center text-gray-400\n ${devMode ? 'cursor-pointer hover:border-blue-400 hover:text-blue-500 hover:bg-blue-50' : ''}\n ${className}\n `}\n style={{\n width: width ?? '100%',\n height: height ?? 200,\n ...style,\n }}\n title={devMode ? `Click to add image for slot: ${slotId}` : undefined}\n >\n <div className=\"text-center p-4\">\n <svg\n className=\"w-12 h-12 mx-auto mb-2\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n {devMode && (\n <p className=\"text-sm font-medium\">Click to add image</p>\n )}\n <p className=\"text-xs mt-1\">{slotId}</p>\n </div>\n\n {showPicker && (\n <ImagePickerModal\n slotId={slotId}\n pagePath={currentPath}\n config={{ apiKey, apiUrl }}\n onClose={() => setShowPicker(false)}\n onSelect={() => {\n setShowPicker(false)\n fetchImage()\n }}\n />\n )}\n </div>\n )\n }\n\n // Render the image\n return (\n <div className=\"relative\" style={{ width, height }}>\n <img\n src={imageUrl}\n alt={imageData?.alt_text || alt || ''}\n title={imageData?.title || undefined}\n data-managed-image=\"true\"\n data-slot-id={slotId}\n data-page-path={currentPath}\n className={className}\n style={{\n objectFit,\n objectPosition,\n width: width ?? '100%',\n height: height ?? 'auto',\n ...style,\n }}\n onLoad={onLoad}\n onError={() => onError?.(new Error('Image failed to load'))}\n loading={priority ? 'eager' : 'lazy'}\n onClick={handleClick}\n />\n\n {/* Dev mode overlay */}\n {devMode && (\n <div\n className=\"absolute inset-0 bg-black/0 hover:bg-black/30 transition-colors cursor-pointer flex items-center justify-center opacity-0 hover:opacity-100\"\n onClick={handleClick}\n >\n <div className=\"bg-white/90 px-3 py-1.5 rounded-lg shadow-lg text-sm font-medium text-gray-700\">\n Edit Image\n </div>\n </div>\n )}\n\n {showPicker && (\n <ImagePickerModal\n slotId={slotId}\n pagePath={currentPath}\n config={{ apiKey, apiUrl }}\n currentImage={imageData}\n onClose={() => setShowPicker(false)}\n onSelect={() => {\n setShowPicker(false)\n fetchImage()\n }}\n />\n )}\n </div>\n )\n}\n\n// ============================================================================\n// IMAGE PICKER MODAL\n// ============================================================================\n\ninterface ImagePickerModalProps {\n slotId: string\n pagePath: string\n config: any\n currentImage?: ManagedImageData | null\n onClose: () => void\n onSelect: () => void\n}\n\nfunction ImagePickerModal({\n slotId,\n pagePath,\n config,\n currentImage,\n onClose,\n onSelect,\n}: ImagePickerModalProps) {\n const [files, setFiles] = useState<ImageFile[]>([])\n const [folders, setFolders] = useState<string[]>([])\n const [currentFolder, setCurrentFolder] = useState<string>('')\n const [search, setSearch] = useState('')\n const [loading, setLoading] = useState(true)\n const [uploading, setUploading] = useState(false)\n const [altText, setAltText] = useState(currentImage?.alt_text || '')\n\n // Fetch available files\n const fetchFiles = useCallback(async () => {\n if (!config?.apiKey || !config?.apiUrl) return\n\n setLoading(true)\n try {\n const params = new URLSearchParams()\n if (currentFolder) params.set('folder', currentFolder)\n if (search) params.set('search', search)\n\n const res = await fetch(\n `${config.apiUrl}/public/images/files?${params}`,\n {\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': config.apiKey,\n },\n }\n )\n\n if (res.ok) {\n const data = await res.json()\n setFiles(data.files || [])\n setFolders(data.folders || [])\n }\n } catch (err) {\n console.error('[ImagePicker] Fetch error:', err)\n } finally {\n setLoading(false)\n }\n }, [config?.apiKey, config?.apiUrl, currentFolder, search])\n\n useEffect(() => {\n fetchFiles()\n }, [fetchFiles])\n\n // Select an existing file\n const handleSelectFile = async (file: ImageFile) => {\n if (!config?.apiKey || !config?.apiUrl) return\n\n try {\n const res = await fetch(\n `${config.apiUrl}/public/images/slot/${encodeURIComponent(slotId)}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': config.apiKey,\n },\n body: JSON.stringify({\n page_path: pagePath,\n file_id: file.id,\n alt_text: altText || file.filename,\n }),\n }\n )\n\n if (res.ok) {\n onSelect()\n }\n } catch (err) {\n console.error('[ImagePicker] Select error:', err)\n }\n }\n\n // Upload new file\n const handleUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (!file || !config?.apiKey || !config?.apiUrl) return\n\n setUploading(true)\n try {\n const formData = new FormData()\n formData.append('file', file)\n formData.append('slot_id', slotId)\n formData.append('page_path', pagePath)\n formData.append('folder', currentFolder || 'Website/Images')\n if (altText) formData.append('alt_text', altText)\n\n const res = await fetch(`${config.apiUrl}/public/images/upload`, {\n method: 'POST',\n headers: {\n 'x-api-key': config.apiKey,\n },\n body: formData,\n })\n\n if (res.ok) {\n onSelect()\n }\n } catch (err) {\n console.error('[ImagePicker] Upload error:', err)\n } finally {\n setUploading(false)\n }\n }\n\n // Clear the slot\n const handleClear = async () => {\n if (!config?.apiKey || !config?.apiUrl) return\n\n try {\n const params = new URLSearchParams({ page_path: pagePath })\n await fetch(\n `${config.apiUrl}/public/images/slot/${encodeURIComponent(slotId)}?${params}`,\n {\n method: 'DELETE',\n headers: {\n 'x-api-key': config.apiKey,\n },\n }\n )\n onSelect()\n } catch (err) {\n console.error('[ImagePicker] Clear error:', err)\n }\n }\n\n return (\n <div\n className=\"fixed inset-0 z-[99999] bg-black/50 flex items-center justify-center p-4\"\n onClick={onClose}\n >\n <div\n className=\"bg-white rounded-xl shadow-2xl max-w-4xl w-full max-h-[90vh] overflow-hidden\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 border-b\">\n <div>\n <h2 className=\"text-lg font-semibold\">Select Image</h2>\n <p className=\"text-sm text-gray-500\">Slot: {slotId}</p>\n </div>\n <button\n onClick={onClose}\n className=\"text-gray-400 hover:text-gray-600 p-2\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Body */}\n <div className=\"p-4 overflow-y-auto\" style={{ maxHeight: 'calc(90vh - 180px)' }}>\n {/* Upload & Search */}\n <div className=\"flex gap-4 mb-4\">\n <div className=\"flex-1\">\n <input\n type=\"text\"\n placeholder=\"Search images...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-full px-3 py-2 border rounded-lg text-sm\"\n />\n </div>\n <label className=\"px-4 py-2 bg-blue-600 text-white rounded-lg cursor-pointer hover:bg-blue-700 text-sm font-medium flex items-center gap-2\">\n {uploading ? 'Uploading...' : 'Upload New'}\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={handleUpload}\n disabled={uploading}\n className=\"hidden\"\n />\n </label>\n {currentImage?.file_id && (\n <button\n onClick={handleClear}\n className=\"px-4 py-2 border border-red-200 text-red-600 rounded-lg hover:bg-red-50 text-sm\"\n >\n Remove\n </button>\n )}\n </div>\n\n {/* Alt text input */}\n <div className=\"mb-4\">\n <input\n type=\"text\"\n placeholder=\"Alt text for image...\"\n value={altText}\n onChange={(e) => setAltText(e.target.value)}\n className=\"w-full px-3 py-2 border rounded-lg text-sm\"\n />\n </div>\n\n {/* Folder navigation */}\n {folders.length > 0 && (\n <div className=\"flex gap-2 mb-4 flex-wrap\">\n <button\n onClick={() => setCurrentFolder('')}\n className={`px-3 py-1 text-sm rounded-full ${\n !currentFolder ? 'bg-blue-100 text-blue-700' : 'bg-gray-100 hover:bg-gray-200'\n }`}\n >\n All\n </button>\n {folders.map((folder) => (\n <button\n key={folder}\n onClick={() => setCurrentFolder(folder)}\n className={`px-3 py-1 text-sm rounded-full ${\n currentFolder === folder ? 'bg-blue-100 text-blue-700' : 'bg-gray-100 hover:bg-gray-200'\n }`}\n >\n {folder}\n </button>\n ))}\n </div>\n )}\n\n {/* File grid */}\n {loading ? (\n <div className=\"grid grid-cols-4 gap-4\">\n {[...Array(8)].map((_, i) => (\n <div key={i} className=\"aspect-square bg-gray-200 rounded-lg animate-pulse\" />\n ))}\n </div>\n ) : files.length === 0 ? (\n <div className=\"text-center py-12 text-gray-500\">\n <p>No images found</p>\n <p className=\"text-sm mt-1\">Upload a new image to get started</p>\n </div>\n ) : (\n <div className=\"grid grid-cols-4 gap-4\">\n {files.map((file) => (\n <button\n key={file.id}\n onClick={() => handleSelectFile(file)}\n className={`\n aspect-square rounded-lg overflow-hidden border-2 transition-all\n hover:border-blue-400 hover:shadow-lg\n ${currentImage?.file_id === file.id ? 'border-blue-500 ring-2 ring-blue-200' : 'border-gray-200'}\n `}\n >\n <img\n src={file.public_url}\n alt={file.filename}\n className=\"w-full h-full object-cover\"\n />\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"p-4 border-t bg-gray-50 flex justify-end\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-gray-700 hover:bg-gray-100 rounded-lg text-sm\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nexport default ManagedImage\n","/**\n * Images API functions\n * \n * All functions use Portal API with API key authentication.\n * Never makes direct Supabase calls.\n */\n\nimport type { ManagedImageData, ImageFile } from './ManagedImage'\n\nexport interface ImageApiConfig {\n apiUrl: string\n apiKey: string\n}\n\n/**\n * Fetch a managed image for a specific slot\n */\nexport async function fetchManagedImage(\n config: ImageApiConfig,\n slotId: string,\n pagePath?: string,\n): Promise<{ image: ManagedImageData | null; is_placeholder: boolean }> {\n const params = new URLSearchParams()\n if (pagePath) params.set('page_path', pagePath)\n\n const res = await fetch(\n `${config.apiUrl}/public/images/slot/${encodeURIComponent(slotId)}?${params}`,\n {\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': config.apiKey,\n },\n }\n )\n\n if (!res.ok) {\n throw new Error(`Failed to fetch image: ${res.status}`)\n }\n\n return res.json()\n}\n\n/**\n * Fetch all managed images for the project\n */\nexport async function fetchManagedImages(\n config: ImageApiConfig,\n options?: {\n pagePath?: string\n category?: string\n includePlaceholders?: boolean\n },\n): Promise<{ images: ManagedImageData[] }> {\n const params = new URLSearchParams()\n if (options?.pagePath) params.set('page_path', options.pagePath)\n if (options?.category) params.set('category', options.category)\n if (options?.includePlaceholders) params.set('include_placeholders', 'true')\n\n const res = await fetch(\n `${config.apiUrl}/public/images?${params}`,\n {\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': config.apiKey,\n },\n }\n )\n\n if (!res.ok) {\n throw new Error(`Failed to fetch images: ${res.status}`)\n }\n\n return res.json()\n}\n\n/**\n * List available image files in the project\n */\nexport async function listImageFiles(\n config: ImageApiConfig,\n options?: {\n folder?: string\n search?: string\n },\n): Promise<{ files: ImageFile[]; folders: string[] }> {\n const params = new URLSearchParams()\n if (options?.folder) params.set('folder', options.folder)\n if (options?.search) params.set('search', options.search)\n\n const res = await fetch(\n `${config.apiUrl}/public/images/files?${params}`,\n {\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': config.apiKey,\n },\n }\n )\n\n if (!res.ok) {\n throw new Error(`Failed to list files: ${res.status}`)\n }\n\n return res.json()\n}\n\n/**\n * Upload a new image\n */\nexport async function uploadImage(\n config: ImageApiConfig,\n file: File,\n options?: {\n slotId?: string\n pagePath?: string\n folder?: string\n altText?: string\n },\n): Promise<{ file: ImageFile; image?: ManagedImageData }> {\n const formData = new FormData()\n formData.append('file', file)\n if (options?.slotId) formData.append('slot_id', options.slotId)\n if (options?.pagePath) formData.append('page_path', options.pagePath)\n if (options?.folder) formData.append('folder', options.folder)\n if (options?.altText) formData.append('alt_text', options.altText)\n\n const res = await fetch(`${config.apiUrl}/public/images/upload`, {\n method: 'POST',\n headers: {\n 'x-api-key': config.apiKey,\n },\n body: formData,\n })\n\n if (!res.ok) {\n throw new Error(`Failed to upload image: ${res.status}`)\n }\n\n return res.json()\n}\n\n/**\n * Assign an existing file to an image slot\n */\nexport async function assignImageToSlot(\n config: ImageApiConfig,\n slotId: string,\n options: {\n fileId?: string\n externalUrl?: string\n pagePath?: string\n altText?: string\n title?: string\n caption?: string\n focalPointX?: number\n focalPointY?: number\n aspectRatio?: string\n },\n): Promise<{ image: ManagedImageData }> {\n const res = await fetch(\n `${config.apiUrl}/public/images/slot/${encodeURIComponent(slotId)}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': config.apiKey,\n },\n body: JSON.stringify({\n page_path: options.pagePath,\n file_id: options.fileId,\n external_url: options.externalUrl,\n alt_text: options.altText,\n title: options.title,\n caption: options.caption,\n focal_point_x: options.focalPointX,\n focal_point_y: options.focalPointY,\n aspect_ratio: options.aspectRatio,\n }),\n }\n )\n\n if (!res.ok) {\n throw new Error(`Failed to assign image: ${res.status}`)\n }\n\n return res.json()\n}\n\n/**\n * Clear an image from a slot (keeps the file)\n */\nexport async function clearImageSlot(\n config: ImageApiConfig,\n slotId: string,\n pagePath?: string,\n): Promise<{ success: boolean }> {\n const params = new URLSearchParams()\n if (pagePath) params.set('page_path', pagePath)\n\n const res = await fetch(\n `${config.apiUrl}/public/images/slot/${encodeURIComponent(slotId)}?${params}`,\n {\n method: 'DELETE',\n headers: {\n 'x-api-key': config.apiKey,\n },\n }\n )\n\n if (!res.ok) {\n throw new Error(`Failed to clear slot: ${res.status}`)\n }\n\n return res.json()\n}\n"]}
@@ -7,7 +7,7 @@ var jsxRuntime = require('react/jsx-runtime');
7
7
  // src/setup/integration-generator.ts
8
8
  function generateIntegrationCode(context) {
9
9
  const snippets = [];
10
- const apiUrl = context.apiUrl || "https://api.uptrademedia.com";
10
+ const apiUrl = context.apiUrl || "https://api.sonor.io";
11
11
  let order = 0;
12
12
  snippets.push(...generateProviderSnippets(context, apiUrl, order));
13
13
  order += 10;
@@ -61,7 +61,7 @@ function generateProviderSnippets(ctx, apiUrl, startOrder) {
61
61
  module: "provider",
62
62
  snippetType: "install",
63
63
  title: "Install @sonordev/site-kit",
64
- description: "Install the Uptrade Site Kit package",
64
+ description: "Install the Sonor Site Kit package",
65
65
  code: `pnpm add @sonordev/site-kit`,
66
66
  language: "bash",
67
67
  order: startOrder,
@@ -73,10 +73,10 @@ function generateProviderSnippets(ctx, apiUrl, startOrder) {
73
73
  title: "Environment Variables",
74
74
  description: "Add these to your .env.local file",
75
75
  filePath: ".env.local",
76
- code: `# Uptrade Integration
77
- NEXT_PUBLIC_UPTRADE_API_URL=${apiUrl}
78
- NEXT_PUBLIC_UPTRADE_PROJECT_ID=${ctx.projectId}
79
- UPTRADE_API_KEY=your-api-key-here`,
76
+ code: `# Sonor Integration
77
+ SONOR_API_KEY=your-api-key-here
78
+ SONOR_API_URL=${apiUrl}
79
+ NEXT_PUBLIC_UPTRADE_PROJECT_ID=${ctx.projectId}`,
80
80
  language: "env",
81
81
  order: startOrder + 1,
82
82
  required: true
@@ -254,12 +254,12 @@ export async function POST(
254
254
  const body = await request.json()
255
255
 
256
256
  const response = await fetch(
257
- \`\${process.env.NEXT_PUBLIC_UPTRADE_API_URL}/forms/\${params.formId}/submit\`,
257
+ \`\${process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL}/forms/\${params.formId}/submit\`,
258
258
  {
259
259
  method: 'POST',
260
260
  headers: {
261
261
  'Content-Type': 'application/json',
262
- 'X-API-Key': process.env.UPTRADE_API_KEY!,
262
+ 'X-API-Key': process.env.SONOR_API_KEY!,
263
263
  },
264
264
  body: JSON.stringify(body),
265
265
  }
@@ -810,5 +810,5 @@ ${s.filePath ? `// File: ${s.filePath}
810
810
  exports.IntegrationCodeView = IntegrationCodeView;
811
811
  exports.generateIntegrationCode = generateIntegrationCode;
812
812
  exports.getSnippetsByModule = getSnippetsByModule;
813
- //# sourceMappingURL=chunk-XQQWI6WB.js.map
814
- //# sourceMappingURL=chunk-XQQWI6WB.js.map
813
+ //# sourceMappingURL=chunk-GVXZWXQ7.js.map
814
+ //# sourceMappingURL=chunk-GVXZWXQ7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/setup/integration-generator.ts","../src/setup/IntegrationCodeView.tsx"],"names":["jsxs","jsx","useState","useMemo"],"mappings":"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","file":"chunk-GVXZWXQ7.js","sourcesContent":["/**\n * Integration Code Generator\n * \n * Generates site-kit integration code snippets based on enabled modules.\n * Used by SetupWizard and can be called standalone.\n */\n\nexport interface IntegrationSnippet {\n module: string\n snippetType: 'install' | 'layout' | 'component' | 'page' | 'api-route' | 'env'\n title: string\n description?: string\n filePath?: string\n code: string\n language: 'typescript' | 'tsx' | 'bash' | 'env'\n order: number\n required: boolean\n}\n\nexport interface GeneratorContext {\n projectId: string\n projectName?: string\n apiUrl?: string\n enabledModules: string[]\n brand?: {\n primaryColor?: string\n secondaryColor?: string\n businessName?: string\n }\n}\n\n/**\n * Generate all integration code snippets for enabled modules\n */\nexport function generateIntegrationCode(context: GeneratorContext): IntegrationSnippet[] {\n const snippets: IntegrationSnippet[] = []\n const apiUrl = context.apiUrl || 'https://api.sonor.io'\n let order = 0\n\n // Always add provider setup first\n snippets.push(...generateProviderSnippets(context, apiUrl, order))\n order += 10\n\n // Add module-specific snippets\n for (const module of context.enabledModules) {\n switch (module) {\n case 'analytics':\n snippets.push(...generateAnalyticsSnippets(context, order))\n order += 10\n break\n case 'engage':\n snippets.push(...generateEngageSnippets(context, order))\n order += 10\n break\n case 'forms':\n snippets.push(...generateFormsSnippets(context, order))\n order += 10\n break\n case 'commerce':\n snippets.push(...generateCommerceSnippets(context, order))\n order += 10\n break\n case 'seo':\n snippets.push(...generateSEOSnippets(context, order))\n order += 10\n break\n case 'blog':\n snippets.push(...generateBlogSnippets(context, order))\n order += 10\n break\n }\n }\n\n return snippets\n}\n\n/**\n * Get snippets grouped by module\n */\nexport function getSnippetsByModule(snippets: IntegrationSnippet[]): Record<string, IntegrationSnippet[]> {\n return snippets.reduce((acc, snippet) => {\n if (!acc[snippet.module]) {\n acc[snippet.module] = []\n }\n acc[snippet.module].push(snippet)\n return acc\n }, {} as Record<string, IntegrationSnippet[]>)\n}\n\n// ============================================\n// Provider Snippets (always required)\n// ============================================\n\nfunction generateProviderSnippets(ctx: GeneratorContext, apiUrl: string, startOrder: number): IntegrationSnippet[] {\n const enabledModulesConfig = ctx.enabledModules\n .map(m => {\n if (m === 'analytics') return ' analytics={{ enabled: true }}'\n if (m === 'engage') return ' engage={{ enabled: true }}'\n return null\n })\n .filter(Boolean)\n .join('\\n')\n\n return [\n {\n module: 'provider',\n snippetType: 'install',\n title: 'Install @sonordev/site-kit',\n description: 'Install the Sonor Site Kit package',\n code: `pnpm add @sonordev/site-kit`,\n language: 'bash',\n order: startOrder,\n required: true,\n },\n {\n module: 'provider',\n snippetType: 'env',\n title: 'Environment Variables',\n description: 'Add these to your .env.local file',\n filePath: '.env.local',\n code: `# Sonor Integration\nSONOR_API_KEY=your-api-key-here\nSONOR_API_URL=${apiUrl}\nNEXT_PUBLIC_UPTRADE_PROJECT_ID=${ctx.projectId}`,\n language: 'env',\n order: startOrder + 1,\n required: true,\n },\n {\n module: 'provider',\n snippetType: 'layout',\n title: 'Root Layout Provider',\n description: 'Wrap your app with SiteKitProvider in app/layout.tsx',\n filePath: 'app/layout.tsx',\n code: `import { SiteKitProvider } from '@sonordev/site-kit'\nimport { ManagedFavicon } from '@sonordev/site-kit/images'\n\nexport default function RootLayout({\n children,\n}: {\n children: React.ReactNode\n}) {\n return (\n <html lang=\"en\">\n <head>\n <ManagedFavicon />\n </head>\n <body>\n <SiteKitProvider\n apiUrl={process.env.NEXT_PUBLIC_UPTRADE_API_URL!}\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n${enabledModulesConfig}\n >\n {children}\n </SiteKitProvider>\n </body>\n </html>\n )\n}`,\n language: 'tsx',\n order: startOrder + 2,\n required: true,\n },\n ]\n}\n\n// ============================================\n// Analytics Snippets\n// ============================================\n\nfunction generateAnalyticsSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n return [\n {\n module: 'analytics',\n snippetType: 'component',\n title: 'Custom Event Tracking',\n description: 'Track custom events throughout your app',\n filePath: 'components/TrackableButton.tsx',\n code: `'use client'\n\nimport { useSiteKit } from '@sonordev/site-kit'\n\ninterface TrackableButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n eventName: string\n eventData?: Record<string, unknown>\n children: React.ReactNode\n}\n\nexport function TrackableButton({ \n children, \n eventName,\n eventData,\n ...props \n}: TrackableButtonProps) {\n const { analytics } = useSiteKit()\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n analytics?.trackEvent(eventName, eventData)\n props.onClick?.(e)\n }\n\n return (\n <button {...props} onClick={handleClick}>\n {children}\n </button>\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: false,\n },\n ]\n}\n\n// ============================================\n// Engage Snippets (Chat Widget)\n// ============================================\n\nfunction generateEngageSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n const primaryColor = ctx.brand?.primaryColor || '#0066cc'\n \n return [\n {\n module: 'engage',\n snippetType: 'component',\n title: 'Chat Widget',\n description: 'Add the AI chat widget to your site. This is unstyled - customize to match your brand.',\n filePath: 'components/ChatWidget.tsx',\n code: `'use client'\n\nimport { ChatWidget } from '@sonordev/site-kit/engage'\n\nexport function SiteChat() {\n return (\n <ChatWidget\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n config={{\n position: 'bottom-right',\n buttonColor: '${primaryColor}',\n greeting: 'Hi! How can I help you today?',\n placeholder: 'Type your message...',\n }}\n />\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: true,\n },\n {\n module: 'engage',\n snippetType: 'layout',\n title: 'Add Chat to Layout',\n description: 'Add the ChatWidget component to your root layout',\n filePath: 'app/layout.tsx',\n code: `// Add import at top:\nimport { SiteChat } from '@/components/ChatWidget'\n\n// Add inside your layout body, after SiteKitProvider children:\n<SiteChat />`,\n language: 'tsx',\n order: startOrder + 1,\n required: true,\n },\n ]\n}\n\n// ============================================\n// Forms Snippets\n// ============================================\n\nfunction generateFormsSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n return [\n {\n module: 'forms',\n snippetType: 'component',\n title: 'Managed Form Component',\n description: 'Embed a managed form from the Portal. Form slug must match one created in Forms module.',\n filePath: 'components/ContactForm.tsx',\n code: `import { ManagedForm } from '@sonordev/site-kit/forms'\n\ninterface ContactFormProps {\n formSlug?: string\n className?: string\n}\n\nexport async function ContactForm({ \n formSlug = 'contact',\n className \n}: ContactFormProps) {\n return (\n <ManagedForm\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n formSlug={formSlug}\n className={className}\n />\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: false,\n },\n {\n module: 'forms',\n snippetType: 'api-route',\n title: 'Form Submission Handler',\n description: 'API route to proxy form submissions to Portal API',\n filePath: 'app/api/forms/[formId]/submit/route.ts',\n code: `import { NextRequest, NextResponse } from 'next/server'\n\nexport async function POST(\n request: NextRequest,\n { params }: { params: { formId: string } }\n) {\n const body = await request.json()\n\n const response = await fetch(\n \\`\\${process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL}/forms/\\${params.formId}/submit\\`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': process.env.SONOR_API_KEY!,\n },\n body: JSON.stringify(body),\n }\n )\n\n const data = await response.json()\n return NextResponse.json(data, { status: response.status })\n}`,\n language: 'typescript',\n order: startOrder + 1,\n required: true,\n },\n ]\n}\n\n// ============================================\n// Commerce Snippets\n// ============================================\n\nfunction generateCommerceSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n return [\n {\n module: 'commerce',\n snippetType: 'component',\n title: 'Product Grid',\n description: 'Display products from your commerce catalog',\n filePath: 'components/Products.tsx',\n code: `import { ProductGrid } from '@sonordev/site-kit/commerce'\n\ninterface ProductsSectionProps {\n category?: string\n limit?: number\n}\n\nexport async function ProductsSection({ \n category = 'featured',\n limit = 8 \n}: ProductsSectionProps) {\n return (\n <section className=\"py-12\">\n <h2 className=\"text-2xl font-bold mb-6\">Our Products</h2>\n <ProductGrid\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n category={category}\n limit={limit}\n />\n </section>\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: false,\n },\n {\n module: 'commerce',\n snippetType: 'component',\n title: 'Upcoming Events',\n description: 'Display upcoming events and classes',\n filePath: 'components/Events.tsx',\n code: `import { UpcomingEvents, EventCalendar } from '@sonordev/site-kit/commerce'\n\nexport async function EventsSection({ limit = 6 }: { limit?: number }) {\n return (\n <section className=\"py-12\">\n <h2 className=\"text-2xl font-bold mb-6\">Upcoming Events</h2>\n <UpcomingEvents\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n limit={limit}\n />\n </section>\n )\n}\n\nexport async function FullCalendar() {\n return (\n <EventCalendar\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n />\n )\n}`,\n language: 'tsx',\n order: startOrder + 1,\n required: false,\n },\n ]\n}\n\n// ============================================\n// SEO Snippets (Managed FAQs, Schema)\n// ============================================\n\nfunction generateSEOSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n return [\n {\n module: 'seo',\n snippetType: 'component',\n title: 'Managed FAQ Section',\n description: 'Render FAQs with automatic JSON-LD schema markup. FAQs are managed in Portal SEO module.',\n filePath: 'components/FAQSection.tsx',\n code: `import { ManagedFAQ } from '@sonordev/site-kit/seo'\n\ninterface FAQSectionProps {\n path: string // Page path to fetch FAQs for (e.g., '/services/plumbing')\n className?: string\n}\n\nexport async function FAQSection({ path, className }: FAQSectionProps) {\n return (\n <section className={className}>\n <ManagedFAQ\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n path={path}\n showTitle\n includeSchema\n />\n </section>\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: true,\n },\n {\n module: 'seo',\n snippetType: 'page',\n title: 'Page with Managed Metadata + FAQs',\n description: 'Example dynamic page using managed metadata and FAQ sections',\n filePath: 'app/services/[slug]/page.tsx',\n code: `import { getManagedMetadata, ManagedFAQ } from '@sonordev/site-kit/seo'\nimport type { Metadata } from 'next'\n\ninterface Props {\n params: { slug: string }\n}\n\nexport async function generateMetadata({ params }: Props): Promise<Metadata> {\n const path = \\`/services/\\${params.slug}\\`\n return getManagedMetadata({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,\n path,\n })\n}\n\nexport default async function ServicePage({ params }: Props) {\n const path = \\`/services/\\${params.slug}\\`\n\n return (\n <main>\n <h1 className=\"text-3xl font-bold\">Service: {params.slug}</h1>\n \n {/* Your page content here */}\n \n {/* FAQs section with JSON-LD schema */}\n <section className=\"mt-12\">\n <ManagedFAQ\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n path={path}\n showTitle\n includeSchema\n />\n </section>\n </main>\n )\n}`,\n language: 'tsx',\n order: startOrder + 1,\n required: false,\n },\n ]\n}\n\n// ============================================\n// Blog Snippets\n// ============================================\n\nfunction generateBlogSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n return [\n {\n module: 'blog',\n snippetType: 'page',\n title: 'Blog List Page',\n description: 'Display all blog posts from Portal',\n filePath: 'app/blog/page.tsx',\n code: `import { getBlogPosts } from '@sonordev/site-kit/blog'\nimport Link from 'next/link'\n\nexport default async function BlogPage() {\n const posts = await getBlogPosts({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,\n limit: 10,\n })\n\n return (\n <main className=\"py-12\">\n <h1 className=\"text-3xl font-bold mb-8\">Blog</h1>\n <div className=\"grid gap-6 md:grid-cols-2 lg:grid-cols-3\">\n {posts.map((post) => (\n <article key={post.id} className=\"border rounded-lg p-4\">\n {post.featured_image && (\n <img\n src={post.featured_image}\n alt={post.title}\n className=\"w-full h-48 object-cover rounded mb-4\"\n />\n )}\n <h2 className=\"text-xl font-semibold mb-2\">\n <Link href={\\`/blog/\\${post.slug}\\`}>{post.title}</Link>\n </h2>\n <p className=\"text-gray-600\">{post.excerpt}</p>\n </article>\n ))}\n </div>\n </main>\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: false,\n },\n {\n module: 'blog',\n snippetType: 'page',\n title: 'Blog Post Page',\n description: 'Individual blog post page with SEO metadata',\n filePath: 'app/blog/[slug]/page.tsx',\n code: `import { getBlogPost, getBlogPosts } from '@sonordev/site-kit/blog'\nimport type { Metadata } from 'next'\nimport { notFound } from 'next/navigation'\n\ninterface Props {\n params: { slug: string }\n}\n\nexport async function generateStaticParams() {\n const posts = await getBlogPosts({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,\n })\n return posts.map((post) => ({ slug: post.slug }))\n}\n\nexport async function generateMetadata({ params }: Props): Promise<Metadata> {\n const post = await getBlogPost({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,\n slug: params.slug,\n })\n \n if (!post) return {}\n \n return {\n title: post.title,\n description: post.excerpt,\n openGraph: {\n title: post.title,\n description: post.excerpt,\n images: post.featured_image ? [post.featured_image] : [],\n },\n }\n}\n\nexport default async function BlogPostPage({ params }: Props) {\n const post = await getBlogPost({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,\n slug: params.slug,\n })\n\n if (!post) notFound()\n\n return (\n <article className=\"py-12 max-w-3xl mx-auto\">\n <h1 className=\"text-4xl font-bold mb-4\">{post.title}</h1>\n {post.featured_image && (\n <img\n src={post.featured_image}\n alt={post.title}\n className=\"w-full rounded-lg mb-8\"\n />\n )}\n <div \n className=\"prose prose-lg\"\n dangerouslySetInnerHTML={{ __html: post.content }}\n />\n </article>\n )\n}`,\n language: 'tsx',\n order: startOrder + 1,\n required: false,\n },\n ]\n}\n","/**\n * IntegrationCodeView - Display generated site-kit integration code\n * \n * Shows code snippets grouped by module with copy functionality.\n * Can be used in setup wizards or admin dashboards.\n */\n\n'use client'\n\nimport * as React from 'react'\nimport { useState, useMemo } from 'react'\nimport { generateIntegrationCode, getSnippetsByModule, type IntegrationSnippet, type GeneratorContext } from './integration-generator'\n\n// ============================================\n// Icons (inline SVG to avoid dependencies)\n// ============================================\n\nfunction CopyIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\nfunction ChevronDownIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n )\n}\n\nfunction ChevronRightIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n )\n}\n\n// ============================================\n// Module metadata\n// ============================================\n\nconst moduleLabels: Record<string, string> = {\n provider: 'Setup',\n analytics: 'Analytics',\n engage: 'Engage (Chat)',\n forms: 'Forms',\n commerce: 'Commerce',\n seo: 'SEO',\n blog: 'Blog',\n}\n\nconst moduleColors: Record<string, string> = {\n provider: '#6366f1', // indigo\n analytics: '#8b5cf6', // violet\n engage: '#ec4899', // pink\n forms: '#14b8a6', // teal\n commerce: '#f59e0b', // amber\n seo: '#10b981', // emerald\n blog: '#3b82f6', // blue\n}\n\n// ============================================\n// Component\n// ============================================\n\nexport interface IntegrationCodeViewProps {\n projectId: string\n enabledModules: string[]\n apiUrl?: string\n brand?: {\n primaryColor?: string\n businessName?: string\n }\n className?: string\n onCopy?: (code: string, title: string) => void\n}\n\nexport function IntegrationCodeView({\n projectId,\n enabledModules,\n apiUrl,\n brand,\n className,\n onCopy,\n}: IntegrationCodeViewProps) {\n const [expandedModules, setExpandedModules] = useState<Set<string>>(new Set(['provider']))\n const [copiedId, setCopiedId] = useState<string | null>(null)\n\n // Generate code snippets\n const snippets = useMemo(() => {\n return generateIntegrationCode({\n projectId,\n enabledModules,\n apiUrl,\n brand,\n })\n }, [projectId, enabledModules, apiUrl, brand])\n\n // Group by module\n const snippetsByModule = useMemo(() => {\n return getSnippetsByModule(snippets)\n }, [snippets])\n\n const toggleModule = (module: string) => {\n setExpandedModules(prev => {\n const next = new Set(prev)\n if (next.has(module)) {\n next.delete(module)\n } else {\n next.add(module)\n }\n return next\n })\n }\n\n const copyCode = async (code: string, id: string, title: string) => {\n try {\n await navigator.clipboard.writeText(code)\n setCopiedId(id)\n onCopy?.(code, title)\n setTimeout(() => setCopiedId(null), 2000)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n\n const copyAll = async () => {\n const allCode = snippets\n .map(s => `// ${s.title}\\n${s.filePath ? `// File: ${s.filePath}\\n` : ''}${s.code}`)\n .join('\\n\\n// ---\\n\\n')\n try {\n await navigator.clipboard.writeText(allCode)\n onCopy?.(allCode, 'All snippets')\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n\n if (enabledModules.length === 0) {\n return (\n <div className={className} style={{ textAlign: 'center', padding: '2rem', color: '#666' }}>\n <p>No modules enabled for this project.</p>\n <p style={{ fontSize: '0.875rem', marginTop: '0.5rem' }}>\n Enable modules in Project Settings to generate integration code.\n </p>\n </div>\n )\n }\n\n return (\n <div className={className} style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {/* Header */}\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <div>\n <h3 style={{ margin: 0, fontWeight: 600 }}>Integration Code</h3>\n <p style={{ margin: '0.25rem 0 0', fontSize: '0.875rem', color: '#666' }}>\n {snippets.length} snippets for {enabledModules.length} modules\n </p>\n </div>\n <button\n onClick={copyAll}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n padding: '0.5rem 1rem',\n border: '1px solid #e5e7eb',\n borderRadius: '0.375rem',\n background: 'white',\n cursor: 'pointer',\n fontSize: '0.875rem',\n }}\n >\n <CopyIcon />\n Copy All\n </button>\n </div>\n\n {/* Module Groups */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {Object.entries(snippetsByModule).map(([module, moduleSnippets]) => {\n const isExpanded = expandedModules.has(module)\n const color = moduleColors[module] || '#6366f1'\n \n return (\n <div \n key={module} \n style={{\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n overflow: 'hidden',\n }}\n >\n {/* Module Header */}\n <button\n onClick={() => toggleModule(module)}\n style={{\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '0.75rem 1rem',\n background: '#f9fafb',\n border: 'none',\n cursor: 'pointer',\n textAlign: 'left',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <div\n style={{\n width: '0.5rem',\n height: '0.5rem',\n borderRadius: '50%',\n background: color,\n }}\n />\n <span style={{ fontWeight: 500 }}>\n {moduleLabels[module] || module}\n </span>\n <span\n style={{\n fontSize: '0.75rem',\n padding: '0.125rem 0.5rem',\n background: '#e5e7eb',\n borderRadius: '9999px',\n }}\n >\n {moduleSnippets.length}\n </span>\n </div>\n {isExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </button>\n\n {/* Snippets */}\n {isExpanded && (\n <div>\n {moduleSnippets.map((snippet, idx) => {\n const snippetId = `${module}-${idx}`\n const isCopied = copiedId === snippetId\n\n return (\n <div\n key={idx}\n style={{\n padding: '1rem',\n borderTop: '1px solid #e5e7eb',\n }}\n >\n {/* Snippet Header */}\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '0.75rem' }}>\n <div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <span style={{ fontWeight: 500, fontSize: '0.875rem' }}>\n {snippet.title}\n </span>\n {snippet.required && (\n <span\n style={{\n fontSize: '0.625rem',\n padding: '0.125rem 0.375rem',\n border: '1px solid #e5e7eb',\n borderRadius: '0.25rem',\n textTransform: 'uppercase',\n }}\n >\n Required\n </span>\n )}\n </div>\n {snippet.description && (\n <p style={{ margin: '0.25rem 0 0', fontSize: '0.75rem', color: '#666' }}>\n {snippet.description}\n </p>\n )}\n {snippet.filePath && (\n <p style={{ margin: '0.25rem 0 0', fontSize: '0.75rem', color: color, fontFamily: 'monospace' }}>\n {snippet.filePath}\n </p>\n )}\n </div>\n <button\n onClick={() => copyCode(snippet.code, snippetId, snippet.title)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '2rem',\n height: '2rem',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '0.25rem',\n }}\n title=\"Copy code\"\n >\n {isCopied ? (\n <CheckIcon className=\"text-green-500\" />\n ) : (\n <CopyIcon />\n )}\n </button>\n </div>\n\n {/* Code Block */}\n <pre\n style={{\n margin: 0,\n padding: '0.75rem',\n background: '#1f2937',\n color: '#e5e7eb',\n borderRadius: '0.375rem',\n overflow: 'auto',\n fontSize: '0.75rem',\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n lineHeight: 1.5,\n }}\n >\n <code>{snippet.code}</code>\n </pre>\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n"]}
@@ -329,7 +329,7 @@ export default ${componentName}
329
329
  `;
330
330
  }
331
331
  async function createFormInUptrade(form, slug, options) {
332
- const response = await fetch("https://api.uptrademedia.com/forms", {
332
+ const response = await fetch("https://api.sonor.io/forms", {
333
333
  method: "POST",
334
334
  headers: {
335
335
  "Content-Type": "application/json",
@@ -371,14 +371,14 @@ async function migrateWidget(filePath, widget, options) {
371
371
  let content = await fs.readFile(fullPath, "utf-8");
372
372
  switch (widget.widgetType) {
373
373
  case "intercom":
374
- content = content.replace(/<Script[^>]*intercom[^>]*\/?>(?:<\/Script>)?/gi, "{/* Intercom replaced with Uptrade Engage */}");
374
+ content = content.replace(/<Script[^>]*intercom[^>]*\/?>(?:<\/Script>)?/gi, "{/* Intercom replaced with Sonor Engage */}");
375
375
  content = content.replace(/window\.Intercom\s*=\s*[^;]+;/g, "");
376
376
  break;
377
377
  case "crisp":
378
- content = content.replace(/<Script[^>]*crisp[^>]*\/?>(?:<\/Script>)?/gi, "{/* Crisp replaced with Uptrade Engage */}");
378
+ content = content.replace(/<Script[^>]*crisp[^>]*\/?>(?:<\/Script>)?/gi, "{/* Crisp replaced with Sonor Engage */}");
379
379
  break;
380
380
  case "drift":
381
- content = content.replace(/<Script[^>]*drift[^>]*\/?>(?:<\/Script>)?/gi, "{/* Drift replaced with Uptrade Engage */}");
381
+ content = content.replace(/<Script[^>]*drift[^>]*\/?>(?:<\/Script>)?/gi, "{/* Drift replaced with Sonor Engage */}");
382
382
  break;
383
383
  }
384
384
  await fs.writeFile(fullPath, content, "utf-8");
@@ -550,7 +550,7 @@ export async function generateMetadata() {
550
550
  return { filePath, success: true, changes };
551
551
  }
552
552
  async function createPageMetadata(pagePath, metadata, options) {
553
- const response = await fetch("https://api.uptrademedia.com/seo/pages", {
553
+ const response = await fetch("https://api.sonor.io/seo/pages", {
554
554
  method: "POST",
555
555
  headers: {
556
556
  "Content-Type": "application/json",
@@ -614,7 +614,7 @@ function extractSchemaJSON(content) {
614
614
  return null;
615
615
  }
616
616
  async function createSchemaRecord(pagePath, schemaType, schemaJson, options) {
617
- const apiUrl = process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.uptrademedia.com";
617
+ const apiUrl = process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.sonor.io";
618
618
  const response = await fetch(`${apiUrl}/api/public/seo/register-schema`, {
619
619
  method: "POST",
620
620
  headers: {
@@ -726,7 +726,7 @@ function extractFAQItems(content, faqType) {
726
726
  return items;
727
727
  }
728
728
  async function createFAQRecord(pagePath, items, options) {
729
- const apiUrl = process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.uptrademedia.com";
729
+ const apiUrl = process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.sonor.io";
730
730
  const response = await fetch(`${apiUrl}/api/public/seo/register-faq`, {
731
731
  method: "POST",
732
732
  headers: {
@@ -964,5 +964,5 @@ function detectFormType(form) {
964
964
  }
965
965
 
966
966
  export { migrateAnalytics, migrateFAQ, migrateFile, migrateFiles, migrateMetadata, migrateSchema, migrateSitemap };
967
- //# sourceMappingURL=chunk-24277A3Q.mjs.map
968
- //# sourceMappingURL=chunk-24277A3Q.mjs.map
967
+ //# sourceMappingURL=chunk-HF2FWDBJ.mjs.map
968
+ //# sourceMappingURL=chunk-HF2FWDBJ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/migrator/index.ts"],"names":["match","path"],"mappings":"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","file":"chunk-HF2FWDBJ.mjs","sourcesContent":["/**\n * Code Migrator - Transforms existing forms to Site-Kit managed forms\n * \n * IMPORTANT: This migrator modifies files in-place using safe string operations.\n * It preserves existing code and only adds/modifies the minimum necessary.\n * \n * Key safety features:\n * - Always reads full file content before modifying\n * - Preserves 'use client' directives at top of file\n * - Adds imports after directives but before other imports\n * - Never overwrites entire file contents (except for form migration which is opt-in)\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport { parse } from '@babel/parser'\nimport generate from '@babel/generator'\nimport traverse from '@babel/traverse'\nimport * as t from '@babel/types'\nimport type { ScanResults, DetectedForm, DetectedField } from '../scanner'\n\n// ============================================\n// Safe Import Insertion Helper\n// ============================================\n\n/**\n * Safely adds an import statement to a file, respecting 'use client'/'use server' directives\n * and avoiding duplicate imports.\n */\nfunction addImportSafely(content: string, importStatement: string): string {\n // Check if import already exists\n const importModule = importStatement.match(/from\\s+['\"]([^'\"]+)['\"]/)?.[1]\n if (importModule && content.includes(importModule)) {\n // Import from this module exists, might need to add to existing import\n return content\n }\n \n // Check for 'use client' or 'use server' directive at the start\n const directiveMatch = content.match(/^(['\"]use (client|server)['\"][\\s;]*\\n?)/)\n \n if (directiveMatch) {\n // Insert import AFTER the directive\n const directive = directiveMatch[0]\n const restOfFile = content.slice(directive.length)\n \n // Find first import or start of code\n const firstImportMatch = restOfFile.match(/^(import\\s+)/)\n if (firstImportMatch) {\n // Insert before first import but after directive\n return directive + importStatement + '\\n' + restOfFile\n } else {\n // No imports yet, add after directive with a newline\n return directive + importStatement + '\\n' + restOfFile\n }\n } else {\n // No directive, add import at the top\n // But check if there's already an import block at the top\n const firstImportMatch = content.match(/^(import\\s+)/)\n if (firstImportMatch) {\n return importStatement + '\\n' + content\n } else {\n return importStatement + '\\n\\n' + content\n }\n }\n}\n\n/**\n * Check if a file is a client component (has 'use client' directive at the top)\n */\nfunction isClientComponent(content: string): boolean {\n // Check first few lines for 'use client' directive\n const firstLines = content.split('\\n').slice(0, 5).join('\\n')\n return /['\"]use client['\"]/.test(firstLines)\n}\n\n/**\n * Adds a named export to an existing import statement from the same module\n */\nfunction addToExistingImport(content: string, namedExport: string, modulePath: string): string {\n // Pattern to find import from the module\n const importPattern = new RegExp(\n `(import\\\\s*\\\\{[^}]*)\\\\}\\\\s*from\\\\s*['\"]${modulePath.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}['\"]`,\n 'g'\n )\n \n if (importPattern.test(content)) {\n // Reset regex\n importPattern.lastIndex = 0\n return content.replace(importPattern, (match, imports) => {\n // Check if already imported\n if (imports.includes(namedExport)) {\n return match\n }\n // Add to imports\n return `${imports.trim()}, ${namedExport} } from '${modulePath}'`\n })\n }\n \n return content\n}\n\n/**\n * Insert ManagedSchema component into the JSX return statement of a page component.\n * Looks for the return statement and inserts ManagedSchema right after the opening tag/fragment.\n */\nfunction insertManagedSchemaIntoJSX(content: string, pagePath: string, isTypeScript: boolean): string {\n // Skip if ManagedSchema is already in the JSX (not just imported)\n if (content.includes('<ManagedSchema')) {\n return content\n }\n\n const projectIdSuffix = isTypeScript ? '!' : ''\n const schemaComponent = `<ManagedSchema\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID${projectIdSuffix}}\n path=\"${pagePath}\"\n />`\n\n // Pattern to find: return ( followed by < or <>\n // This handles: return (<div>...) or return (<>...) or return (\\n <div>...)\n const returnPatterns = [\n // return (<> ... - fragment\n /return\\s*\\(\\s*<>/,\n // return ( <Fragment> ...\n /return\\s*\\(\\s*<Fragment>/,\n // return (<div ... or return (<main ... etc\n /return\\s*\\(\\s*<([a-zA-Z][a-zA-Z0-9]*)[^>]*>/,\n ]\n\n for (const pattern of returnPatterns) {\n const match = content.match(pattern)\n if (match && match.index !== undefined) {\n const insertPos = match.index + match[0].length\n // Insert ManagedSchema right after the opening tag\n content = content.slice(0, insertPos) + '\\n ' + schemaComponent + content.slice(insertPos)\n return content\n }\n }\n\n // Fallback: try to find any return statement with JSX\n const simpleReturnMatch = content.match(/return\\s*\\(/)\n if (simpleReturnMatch && simpleReturnMatch.index !== undefined) {\n // Find the first < after the return (\n const afterReturn = content.slice(simpleReturnMatch.index + simpleReturnMatch[0].length)\n const firstTagMatch = afterReturn.match(/^\\s*<([a-zA-Z>][^>]*)>?/)\n if (firstTagMatch) {\n const insertPos = simpleReturnMatch.index + simpleReturnMatch[0].length + firstTagMatch[0].length\n content = content.slice(0, insertPos) + '\\n ' + schemaComponent + content.slice(insertPos)\n return content\n }\n }\n\n return content\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport interface MigrationResult {\n filePath: string\n success: boolean\n changes: string[]\n error?: string\n formId?: string\n}\n\nexport interface MigrationOptions {\n projectId: string\n apiKey: string\n dryRun?: boolean\n}\n\n// ============================================\n// Main Migrator\n// ============================================\n\nexport async function migrateFiles(\n scanResults: ScanResults,\n options: MigrationOptions\n): Promise<MigrationResult[]> {\n const results: MigrationResult[] = []\n\n // Migrate forms\n for (const form of scanResults.forms) {\n if (form.suggestedAction === 'manual') {\n results.push({\n filePath: form.filePath,\n success: false,\n changes: [],\n error: 'Form too complex for auto-migration',\n })\n continue\n }\n\n try {\n const result = await migrateForm(form, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: form.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n // Migrate widgets (simpler - just remove and add provider flag)\n for (const widget of scanResults.widgets) {\n try {\n const result = await migrateWidget(widget.filePath, widget, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: widget.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n // Migrate metadata\n for (const meta of scanResults.metadata || []) {\n try {\n const result = await migrateMetadata(meta.filePath, meta, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: meta.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n // Migrate schemas\n for (const schema of scanResults.schemas || []) {\n try {\n const result = await migrateSchema(schema.filePath, schema, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: schema.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n // Migrate FAQs\n for (const faq of scanResults.faqs || []) {\n try {\n const result = await migrateFAQ(faq.filePath, faq, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: faq.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n // Migrate sitemaps\n for (const sitemap of scanResults.sitemaps || []) {\n // Skip site-kit generated sitemaps\n if (sitemap.generator === 'site-kit') continue\n\n try {\n const result = await migrateSitemap(sitemap.filePath, sitemap, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: sitemap.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n // Report analytics (informational only)\n for (const analytics of scanResults.analytics || []) {\n try {\n const result = await migrateAnalytics(analytics.filePath, analytics, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: analytics.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n return results\n}\n\n// ============================================\n// Form Migration\n// ============================================\n\n/**\n * Migrate a form to Site-Kit managed form\n * \n * SAFETY: Form migration is DESTRUCTIVE by design - it replaces the entire form component.\n * This is intentional because forms need to be completely restructured to use the useForm hook.\n * \n * However, we now:\n * 1. Create a backup of the original file (.backup)\n * 2. Only proceed if user explicitly confirms\n * 3. Log all changes for easy rollback\n */\nasync function migrateForm(\n form: DetectedForm,\n options: MigrationOptions\n): Promise<MigrationResult> {\n const changes: string[] = []\n const fullPath = path.resolve(process.cwd(), form.filePath)\n\n // Step 1: Create the form in Sonor\n const formSlug = generateSlug(form.componentName)\n \n // In dry run, don't create the form in API\n let formId: string | undefined\n if (!options.dryRun) {\n try {\n formId = await createFormInUptrade(form, formSlug, options)\n changes.push(`Created managed form: ${formSlug}`)\n } catch (error: any) {\n // Form might already exist\n changes.push(`Form may already exist: ${formSlug}`)\n }\n } else {\n changes.push(`[DRY RUN] Would create managed form: ${formSlug}`)\n }\n\n if (options.dryRun) {\n changes.push('[DRY RUN] Would create backup of original file')\n changes.push('[DRY RUN] Would replace form with Site-Kit managed form')\n return { filePath: form.filePath, success: true, changes, formId }\n }\n\n // Step 2: Read the original file and create backup\n const content = await fs.readFile(fullPath, 'utf-8')\n const backupPath = fullPath + '.backup'\n await fs.writeFile(backupPath, content, 'utf-8')\n changes.push(`Created backup: ${form.filePath}.backup`)\n \n // Step 3: Determine if file is TypeScript\n const isTypeScript = form.filePath.endsWith('.tsx') || form.filePath.endsWith('.ts')\n \n // Step 4: Generate new code (preserves TypeScript vs JavaScript)\n const newCode = generateMigratedFormCode(form, formSlug, isTypeScript)\n\n // Step 5: Write the file\n await fs.writeFile(fullPath, newCode, 'utf-8')\n changes.push('Replaced component with Site-Kit managed form')\n changes.push('Original saved to .backup file - delete when satisfied')\n\n return {\n filePath: form.filePath,\n success: true,\n changes,\n formId,\n }\n}\n\nfunction generateMigratedFormCode(form: DetectedForm, formSlug: string, isTypeScript: boolean = true): string {\n // Generate a clean, migrated component\n const componentName = form.componentName || 'MigratedForm'\n const classNameType = isTypeScript ? '{ className?: string }' : '{ className }'\n const ext = isTypeScript ? '.tsx' : '.jsx'\n\n return `/**\n * ${componentName}\n * \n * Migrated to @sonordev/site-kit\n * Managed form: ${formSlug}\n * \n * Original file backed up to: ${form.filePath}.backup\n */\n\n'use client'\n\nimport { useForm } from '@sonordev/site-kit/forms'\n\nexport function ${componentName}(${classNameType}) {\n const { \n form,\n fields, \n values, \n errors, \n setFieldValue, \n submit, \n isSubmitting,\n isComplete \n } = useForm('${formSlug}')\n\n if (isComplete) {\n return (\n <div className={className}>\n <p className=\"text-green-600\">{form?.successMessage || 'Thanks for your submission!'}</p>\n </div>\n )\n }\n\n return (\n <form \n onSubmit={(e) => { e.preventDefault(); submit() }} \n className={className}\n >\n {fields.map(field => (\n <div key={field.slug} className=\"mb-4\">\n <label className=\"block text-sm font-medium mb-1\">\n {field.label}\n {field.isRequired && <span className=\"text-red-500 ml-1\">*</span>}\n </label>\n \n {field.fieldType === 'textarea' ? (\n <textarea\n name={field.slug}\n placeholder={field.placeholder}\n value={String(values[field.slug] || '')}\n onChange={(e) => setFieldValue(field.slug, e.target.value)}\n className=\"w-full p-2 border rounded focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n rows={4}\n />\n ) : field.fieldType === 'select' && field.options ? (\n <select\n name={field.slug}\n value={String(values[field.slug] || '')}\n onChange={(e) => setFieldValue(field.slug, e.target.value)}\n className=\"w-full p-2 border rounded focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n >\n <option value=\"\">Select...</option>\n {field.options.map(opt => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n ) : (\n <input\n type={field.fieldType}\n name={field.slug}\n placeholder={field.placeholder}\n value={String(values[field.slug] || '')}\n onChange={(e) => setFieldValue(field.slug, e.target.value)}\n className=\"w-full p-2 border rounded focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n />\n )}\n \n {errors[field.slug] && (\n <p className=\"mt-1 text-sm text-red-500\">{errors[field.slug]}</p>\n )}\n \n {field.helpText && (\n <p className=\"mt-1 text-xs text-gray-500\">{field.helpText}</p>\n )}\n </div>\n ))}\n \n <button \n type=\"submit\" \n disabled={isSubmitting}\n className=\"w-full py-2 px-4 bg-blue-600 text-white rounded hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {isSubmitting ? 'Submitting...' : (form?.submitButtonText || 'Submit')}\n </button>\n </form>\n )\n}\n\nexport default ${componentName}\n`\n}\n\nasync function createFormInUptrade(\n form: DetectedForm,\n slug: string,\n options: MigrationOptions\n): Promise<string> {\n // Call Portal API to create the form\n const response = await fetch('https://api.sonor.io/forms', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${options.apiKey}`,\n },\n body: JSON.stringify({\n projectId: options.projectId,\n slug,\n name: formatName(form.componentName),\n formType: detectFormType(form),\n successMessage: 'Thanks for your submission!',\n submitButtonText: 'Submit',\n fields: form.fields.map((f, i) => ({\n slug: f.name,\n label: formatLabel(f.name),\n fieldType: mapFieldType(f.type),\n placeholder: f.placeholder,\n isRequired: f.required,\n sortOrder: i,\n width: 'full',\n })),\n }),\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.message || 'Failed to create form')\n }\n\n const data = await response.json()\n return data.id\n}\n\n// ============================================\n// Widget Migration\n// ============================================\n\nasync function migrateWidget(\n filePath: string,\n widget: any,\n options: MigrationOptions\n): Promise<MigrationResult> {\n const changes: string[] = []\n\n if (options.dryRun) {\n changes.push(`[DRY RUN] Would remove ${widget.widgetType} script`)\n changes.push('[DRY RUN] Would enable Engage in SiteKitProvider')\n return { filePath, success: true, changes }\n }\n\n const fullPath = path.resolve(process.cwd(), filePath)\n let content = await fs.readFile(fullPath, 'utf-8')\n\n // Remove the widget script based on type\n switch (widget.widgetType) {\n case 'intercom':\n content = content.replace(/<Script[^>]*intercom[^>]*\\/?>(?:<\\/Script>)?/gi, '{/* Intercom replaced with Sonor Engage */}')\n content = content.replace(/window\\.Intercom\\s*=\\s*[^;]+;/g, '')\n break\n case 'crisp':\n content = content.replace(/<Script[^>]*crisp[^>]*\\/?>(?:<\\/Script>)?/gi, '{/* Crisp replaced with Sonor Engage */}')\n break\n case 'drift':\n content = content.replace(/<Script[^>]*drift[^>]*\\/?>(?:<\\/Script>)?/gi, '{/* Drift replaced with Sonor Engage */}')\n break\n }\n\n await fs.writeFile(fullPath, content, 'utf-8')\n changes.push(`Removed ${widget.widgetType} script`)\n changes.push('Enable Engage in SiteKitProvider to add chat widget')\n\n return { filePath, success: true, changes }\n}\n\n// ============================================\n// Metadata Migration\n// ============================================\n\n/**\n * Match a balanced brace expression starting from a position\n * Returns the full matched content including braces, or null if no match\n */\nfunction matchBalancedBraces(content: string, startIndex: number): string | null {\n if (content[startIndex] !== '{') return null\n \n let depth = 0\n let i = startIndex\n \n while (i < content.length) {\n if (content[i] === '{') depth++\n else if (content[i] === '}') {\n depth--\n if (depth === 0) {\n return content.slice(startIndex, i + 1)\n }\n }\n i++\n }\n \n return null // Unbalanced braces\n}\n\n/**\n * Migrate Next.js metadata to getManagedMetadata\n * \n * SAFETY: This function:\n * - Reads full file content\n * - Skips client components (they can't have metadata exports)\n * - Only modifies the metadata export, preserving everything else\n * - Uses balanced brace matching to avoid cutting off content\n */\nexport async function migrateMetadata(\n filePath: string,\n metadata: { title?: string; description?: string; type: string },\n options: MigrationOptions\n): Promise<MigrationResult> {\n const changes: string[] = []\n const fullPath = path.resolve(process.cwd(), filePath)\n\n // Determine page path from file path\n let pagePath = filePath\n .replace(/^app\\//, '/')\n .replace(/^src\\/app\\//, '/')\n .replace(/\\/page\\.(tsx?|jsx?)$/, '')\n .replace(/\\/layout\\.(tsx?|jsx?)$/, '')\n .replace(/\\[([^\\]]+)\\]/g, ':$1')\n\n if (pagePath === '') pagePath = '/'\n\n let content = await fs.readFile(fullPath, 'utf-8')\n\n // Determine file extension for new files\n const isTypeScript = filePath.endsWith('.tsx') || filePath.endsWith('.ts')\n const ext = isTypeScript ? '.tsx' : '.jsx'\n\n // Handle client components - create a layout file instead\n if (isClientComponent(content)) {\n const dir = path.dirname(fullPath)\n const layoutPath = path.join(dir, `layout${ext}`)\n \n // Check if layout already exists\n try {\n await fs.access(layoutPath)\n // Layout exists, check if it already has getManagedMetadata\n const layoutContent = await fs.readFile(layoutPath, 'utf-8')\n if (layoutContent.includes('getManagedMetadata')) {\n changes.push('Layout already has managed metadata')\n return { filePath, success: true, changes }\n }\n changes.push('Layout exists but does not have managed metadata - add generateMetadata manually')\n return { filePath, success: true, changes }\n } catch {\n // Layout doesn't exist, we'll create it\n }\n\n if (options.dryRun) {\n changes.push(`[DRY RUN] Client component detected - would create layout${ext} with managed metadata`)\n changes.push(`[DRY RUN] Page path: ${pagePath}`)\n return { filePath, success: true, changes }\n }\n\n // Create page record in Portal API\n try {\n await createPageMetadata(pagePath, metadata, options)\n changes.push(`Created managed metadata for page: ${pagePath}`)\n } catch (error: any) {\n changes.push(`Page metadata may already exist: ${pagePath}`)\n }\n\n // Generate the layout name from the directory\n // Handle dynamic route segments like [slug] -> Slug, [...slug] -> Slug\n const dirName = path.basename(dir)\n .replace(/^\\[\\.\\.\\.([^\\]]+)\\]$/, '$1') // [...slug] -> slug\n .replace(/^\\[([^\\]]+)\\]$/, '$1') // [slug] -> slug\n const layoutName = dirName\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('') + 'Layout'\n\n // Create layout file with managed metadata AND schema\n const layoutCode = `import { getManagedMetadata, ManagedSchema } from '@sonordev/site-kit/seo'\n\nexport async function generateMetadata() {\n return getManagedMetadata({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID${isTypeScript ? '!' : ''},\n path: '${pagePath}',\n fallback: {\n title: '${(metadata.title || 'Page Title').replace(/'/g, \"\\\\'\")}',\n description: '${(metadata.description || 'Page description').replace(/'/g, \"\\\\'\")}',\n },\n })\n}\n\nexport default function ${layoutName}({ children }${isTypeScript ? ': { children: React.ReactNode }' : ''}) {\n return (\n <>\n <ManagedSchema\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID${isTypeScript ? '!' : ''}}\n path=\"${pagePath}\"\n />\n {children}\n </>\n )\n}\n`\n\n await fs.writeFile(layoutPath, layoutCode, 'utf-8')\n changes.push(`Created layout${ext} with managed metadata and schema (client component page)`)\n return { filePath, success: true, changes }\n }\n\n if (options.dryRun) {\n changes.push(`[DRY RUN] Would create managed metadata for page: ${pagePath}`)\n changes.push('[DRY RUN] Would add generateMetadata function (preserving rest of file)')\n return { filePath, success: true, changes }\n }\n\n // Create page record in Portal API\n try {\n await createPageMetadata(pagePath, metadata, options)\n changes.push(`Created managed metadata for page: ${pagePath}`)\n } catch (error: any) {\n // Page might already exist, that's ok\n changes.push(`Page metadata may already exist: ${pagePath}`)\n }\n\n // Handle pages with no metadata - add generateMetadata to the file\n if (metadata.type === 'no-metadata') {\n // Add import with ManagedSchema\n if (!content.includes(\"'@sonordev/site-kit/seo\") && !content.includes('\"@sonordev/site-kit/seo')) {\n content = addImportSafely(content, `import { getManagedMetadata, ManagedSchema } from '@sonordev/site-kit/seo'`)\n } else if (!content.includes('ManagedSchema')) {\n content = addToExistingImport(content, 'ManagedSchema', '@sonordev/site-kit/seo')\n }\n\n // Build the generateMetadata function\n const generateMetadataCode = `\nexport async function generateMetadata() {\n return getManagedMetadata({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID${isTypeScript ? '!' : ''},\n path: '${pagePath}',\n fallback: {\n title: '${(metadata.title || 'Page Title').replace(/'/g, \"\\\\'\")}',\n description: '${(metadata.description || 'Page description').replace(/'/g, \"\\\\'\")}',\n },\n })\n}\n`\n\n // Find a good place to add it - after imports, before the first export/function\n const importEndMatch = content.match(/^(import\\s+.*?['\"][^'\"]+['\"];?\\s*\\n)+/m)\n if (importEndMatch) {\n const insertPos = importEndMatch.index! + importEndMatch[0].length\n content = content.slice(0, insertPos) + generateMetadataCode + content.slice(insertPos)\n } else {\n // No imports, add at the beginning (after 'use client' if present)\n const useClientMatch = content.match(/^['\"]use client['\"];?\\s*\\n/)\n if (useClientMatch) {\n const insertPos = useClientMatch[0].length\n content = content.slice(0, insertPos) + generateMetadataCode + content.slice(insertPos)\n } else {\n content = generateMetadataCode + content\n }\n }\n\n // Insert ManagedSchema into the component's JSX\n content = insertManagedSchemaIntoJSX(content, pagePath, isTypeScript)\n changes.push('Added ManagedSchema component')\n\n await fs.writeFile(fullPath, content, 'utf-8')\n changes.push('Added generateMetadata function')\n return { filePath, success: true, changes }\n }\n\n // Replace static metadata export with getManagedMetadata\n if (metadata.type === 'next-metadata') {\n // Handle: export const metadata = { ... }\n // Use a safer approach: find the export start, then match balanced braces\n const metadataExportMatch = content.match(/export const metadata(?::\\s*Metadata)?\\s*=\\s*/)\n \n if (metadataExportMatch && metadataExportMatch.index !== undefined) {\n const braceStart = metadataExportMatch.index + metadataExportMatch[0].length\n const braceContent = matchBalancedBraces(content, braceStart)\n \n if (braceContent) {\n const fullMatch = metadataExportMatch[0] + braceContent\n \n // Add import safely with ManagedSchema\n if (!content.includes(\"'@sonordev/site-kit/seo\") && !content.includes('\"@sonordev/site-kit/seo')) {\n content = addImportSafely(content, `import { getManagedMetadata, ManagedSchema } from '@sonordev/site-kit/seo'`)\n } else if (!content.includes('ManagedSchema')) {\n content = addToExistingImport(content, 'ManagedSchema', '@sonordev/site-kit/seo')\n }\n\n // Build the replacement generateMetadata function\n const generateMetadataCode = `export async function generateMetadata() {\n return getManagedMetadata({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID${isTypeScript ? '!' : ''},\n path: '${pagePath}',\n fallback: {\n title: '${(metadata.title || 'Page Title').replace(/'/g, \"\\\\'\")}',\n description: '${(metadata.description || 'Page description').replace(/'/g, \"\\\\'\")}',\n },\n })\n}`\n\n // Replace only the metadata export\n content = content.replace(fullMatch, generateMetadataCode)\n changes.push('Replaced static metadata with getManagedMetadata')\n \n // Insert ManagedSchema into the component's JSX\n content = insertManagedSchemaIntoJSX(content, pagePath, isTypeScript)\n changes.push('Added ManagedSchema component')\n }\n }\n\n // Handle existing generateMetadata - just add a comment, don't modify\n if (content.includes('generateMetadata') && !content.includes('getManagedMetadata')) {\n changes.push('generateMetadata function detected - add getManagedMetadata manually for full control')\n }\n }\n\n await fs.writeFile(fullPath, content, 'utf-8')\n return { filePath, success: true, changes }\n}\n\nasync function createPageMetadata(\n pagePath: string,\n metadata: { title?: string; description?: string },\n options: MigrationOptions\n): Promise<void> {\n const response = await fetch('https://api.sonor.io/seo/pages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${options.apiKey}`,\n },\n body: JSON.stringify({\n project_id: options.projectId,\n path: pagePath,\n managed_title: metadata.title,\n managed_meta_description: metadata.description,\n }),\n })\n\n if (!response.ok && response.status !== 409) {\n throw new Error(`Failed to create page: ${response.statusText}`)\n }\n}\n\n// ============================================\n// Schema Migration \n// ============================================\n\n/**\n * Extract JSON-LD schema content from a script tag\n */\nfunction extractSchemaJSON(content: string): { schemaType: string; schemaJson: object } | null {\n // Pattern to match script tag with JSON-LD content\n const scriptPatterns = [\n /<script\\s+type=[\"']application\\/ld\\+json[\"'][^>]*>([\\s\\S]*?)<\\/script>/i,\n /<Script\\s+[^>]*type=[\"']application\\/ld\\+json[\"'][^>]*>([\\s\\S]*?)<\\/Script>/i,\n ]\n \n for (const pattern of scriptPatterns) {\n const match = content.match(pattern)\n if (match && match[1]) {\n try {\n // Try to parse the JSON content\n let jsonStr = match[1].trim()\n \n // Handle JSX expression containers: {`...`} or {\"...\"}\n if (jsonStr.startsWith('{') && (jsonStr.includes('`') || jsonStr.includes('\"'))) {\n // Extract content between template literals or JSON.stringify\n const templateMatch = jsonStr.match(/\\{[`\"]([\\s\\S]*?)[`\"]\\}/)\n if (templateMatch) {\n jsonStr = templateMatch[1]\n }\n }\n \n // Handle dangerouslySetInnerHTML pattern\n const innerHTMLMatch = jsonStr.match(/dangerouslySetInnerHTML=\\{\\{\\s*__html:\\s*['\"`]([\\s\\S]*?)['\"`]\\s*\\}\\}/)\n if (innerHTMLMatch) {\n jsonStr = innerHTMLMatch[1]\n }\n \n // Try to parse as JSON\n const parsed = JSON.parse(jsonStr)\n return {\n schemaType: parsed['@type'] || 'Unknown',\n schemaJson: parsed,\n }\n } catch {\n // JSON parsing failed, schema might be dynamic\n return null\n }\n }\n }\n \n // Also try to find schema objects in code\n const schemaObjectMatch = content.match(/const\\s+\\w*[sS]chema\\w*\\s*=\\s*(\\{[\\s\\S]*?@context[\\s\\S]*?\\})\\s*;?/)\n if (schemaObjectMatch) {\n try {\n // This is tricky - the object might use JS syntax not JSON\n // For now, just extract the @type if we can\n const typeMatch = schemaObjectMatch[1].match(/@type[\"']?\\s*:\\s*[\"']([^\"']+)[\"']/)\n if (typeMatch) {\n return {\n schemaType: typeMatch[1],\n schemaJson: { '@type': typeMatch[1], '_note': 'Schema extracted from JS object - review in Portal' },\n }\n }\n } catch {\n return null\n }\n }\n \n return null\n}\n\n/**\n * Create schema record in Portal API\n */\nasync function createSchemaRecord(\n pagePath: string,\n schemaType: string,\n schemaJson: object,\n options: MigrationOptions\n): Promise<void> {\n const apiUrl = process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.sonor.io'\n \n const response = await fetch(`${apiUrl}/api/public/seo/register-schema`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': options.apiKey,\n },\n body: JSON.stringify({\n page_path: pagePath,\n schema_type: schemaType,\n schema_json: schemaJson,\n is_implemented: true,\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to create schema: ${response.status} ${errorText}`)\n }\n}\n\n/**\n * Migrate JSON-LD schema to ManagedSchema component\n * \n * This function:\n * 1. Extracts existing JSON-LD schema content\n * 2. Creates a managed schema record in the Portal database\n * 3. Replaces the script tag with ManagedSchema component\n * \n * SAFETY: Skips client components since ManagedSchema requires server rendering\n */\nexport async function migrateSchema(\n filePath: string,\n schema: { schemaType?: string; startLine: number; endLine: number },\n options: MigrationOptions\n): Promise<MigrationResult> {\n const changes: string[] = []\n const fullPath = path.resolve(process.cwd(), filePath)\n\n // Determine page path from file path\n let pagePath = filePath\n .replace(/^app\\//, '/')\n .replace(/^src\\/app\\//, '/')\n .replace(/\\/page\\.(tsx?|jsx?)$/, '')\n .replace(/\\[([^\\]]+)\\]/g, ':$1')\n\n if (pagePath === '') pagePath = '/'\n\n let content = await fs.readFile(fullPath, 'utf-8')\n\n // Skip client components - ManagedSchema requires server rendering\n if (isClientComponent(content)) {\n changes.push('Skipped: Client component cannot use ManagedSchema (requires server rendering)')\n changes.push('Consider moving schema to a parent server component or layout.tsx')\n return { filePath, success: true, changes }\n }\n\n // Extract existing schema content\n const extractedSchema = extractSchemaJSON(content)\n\n if (options.dryRun) {\n changes.push(`[DRY RUN] Would replace JSON-LD script with ManagedSchema component`)\n changes.push(`[DRY RUN] Schema type: ${extractedSchema?.schemaType || schema.schemaType || 'Unknown'}`)\n if (extractedSchema) {\n changes.push(`[DRY RUN] Would upload extracted schema to Portal`)\n }\n return { filePath, success: true, changes }\n }\n\n // Create schema record in Portal API with extracted content\n if (extractedSchema) {\n try {\n await createSchemaRecord(pagePath, extractedSchema.schemaType, extractedSchema.schemaJson, options)\n changes.push(`Created managed schema (${extractedSchema.schemaType}) for: ${pagePath}`)\n } catch (error: any) {\n changes.push(`Schema record may already exist for: ${pagePath}`)\n }\n }\n\n // Check if ManagedSchema is already in the JSX (may have been added by metadata migration)\n const alreadyHasManagedSchema = content.includes('<ManagedSchema')\n\n // Determine if file is TypeScript\n const isTypeScript = filePath.endsWith('.tsx') || filePath.endsWith('.ts')\n const projectIdSuffix = isTypeScript ? '!' : ''\n\n // Find JSON-LD scripts\n const jsonLdPattern = /<script\\s+type=[\"']application\\/ld\\+json[\"'][^>]*>[\\s\\S]*?<\\/script>/gi\n const scriptPattern = /<Script\\s+[^>]*type=[\"']application\\/ld\\+json[\"'][^>]*>[\\s\\S]*?<\\/Script>/gi\n\n const hasJsonLd = jsonLdPattern.test(content) || scriptPattern.test(content)\n \n if (hasJsonLd) {\n // Reset regex after test\n jsonLdPattern.lastIndex = 0\n scriptPattern.lastIndex = 0\n \n if (alreadyHasManagedSchema) {\n // ManagedSchema already exists (from metadata migration) - just remove the script tags\n content = content.replace(jsonLdPattern, '{/* JSON-LD migrated to ManagedSchema */}')\n content = content.replace(scriptPattern, '{/* JSON-LD migrated to ManagedSchema */}')\n changes.push('Removed JSON-LD script (ManagedSchema already present)')\n } else {\n // Add import for ManagedSchema safely\n if (!content.includes('ManagedSchema')) {\n if (content.includes(\"'@sonordev/site-kit/seo\") || content.includes('\"@sonordev/site-kit/seo')) {\n content = addToExistingImport(content, 'ManagedSchema', '@sonordev/site-kit/seo')\n } else {\n content = addImportSafely(content, `import { ManagedSchema } from '@sonordev/site-kit/seo'`)\n }\n changes.push('Added ManagedSchema import')\n }\n \n // Replace existing schema script with ManagedSchema component\n content = content.replace(jsonLdPattern, `<ManagedSchema \n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID${projectIdSuffix}}\n path=\"${pagePath}\"\n />`)\n content = content.replace(scriptPattern, `<ManagedSchema \n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID${projectIdSuffix}}\n path=\"${pagePath}\"\n />`)\n changes.push('Replaced JSON-LD script with ManagedSchema component')\n }\n }\n\n await fs.writeFile(fullPath, content, 'utf-8')\n return { filePath, success: true, changes }\n}\n\n// ============================================\n// FAQ Migration\n// ============================================\n\n/**\n * Extract FAQ items from various FAQ patterns in the code\n */\nfunction extractFAQItems(content: string, faqType: string): Array<{ question: string; answer: string }> {\n const items: Array<{ question: string; answer: string }> = []\n \n // Pattern for details/summary elements\n if (faqType === 'details-summary') {\n const detailsPattern = /<details[^>]*>[\\s\\S]*?<summary[^>]*>([\\s\\S]*?)<\\/summary>([\\s\\S]*?)<\\/details>/gi\n let match\n while ((match = detailsPattern.exec(content)) !== null) {\n const question = match[1].replace(/<[^>]+>/g, '').trim()\n const answer = match[2].replace(/<[^>]+>/g, '').trim()\n if (question && answer) {\n items.push({ question, answer })\n }\n }\n }\n \n // Pattern for accordion components with question/answer props\n const accordionItemPattern = /<(?:Accordion\\.Item|AccordionItem|FAQItem)[^>]*(?:question|title)=[\"'`]([^\"'`]+)[\"'`][^>]*>[\\s\\S]*?(?:answer|content)=[\"'`]([^\"'`]+)[\"'`]/gi\n let match\n while ((match = accordionItemPattern.exec(content)) !== null) {\n items.push({ question: match[1], answer: match[2] })\n }\n \n // Pattern for FAQ arrays/objects in code: { question: \"...\", answer: \"...\" }\n const faqArrayPattern = /\\{\\s*question:\\s*[\"'`]([^\"'`]+)[\"'`]\\s*,\\s*answer:\\s*[\"'`]([^\"'`]+)[\"'`]\\s*\\}/gi\n while ((match = faqArrayPattern.exec(content)) !== null) {\n items.push({ question: match[1], answer: match[2] })\n }\n \n // Alternative pattern: { q: \"...\", a: \"...\" }\n const shortFaqPattern = /\\{\\s*q:\\s*[\"'`]([^\"'`]+)[\"'`]\\s*,\\s*a:\\s*[\"'`]([^\"'`]+)[\"'`]\\s*\\}/gi\n while ((match = shortFaqPattern.exec(content)) !== null) {\n items.push({ question: match[1], answer: match[2] })\n }\n \n return items\n}\n\n/**\n * Create FAQ record in Portal API\n */\nasync function createFAQRecord(\n pagePath: string,\n items: Array<{ question: string; answer: string }>,\n options: MigrationOptions\n): Promise<void> {\n const apiUrl = process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.sonor.io'\n \n const response = await fetch(`${apiUrl}/api/public/seo/register-faq`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': options.apiKey,\n },\n body: JSON.stringify({\n path: pagePath,\n title: 'Frequently Asked Questions',\n items: items.map((item, index) => ({\n id: `faq-${index + 1}`,\n question: item.question,\n answer: item.answer,\n order: index,\n is_visible: true,\n })),\n include_schema: true,\n is_published: items.length > 0,\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to create FAQ: ${response.status} ${errorText}`)\n }\n}\n\n/**\n * Migrate FAQ section to ManagedFAQ component\n * \n * This function:\n * 1. Extracts FAQ content (questions/answers) from existing components\n * 2. Creates a managed FAQ record in the Portal database\n * 3. Inserts the ManagedFAQ component into the page\n * \n * SAFETY: Skips client components since ManagedFAQ requires server rendering\n */\nexport async function migrateFAQ(\n filePath: string,\n faq: { type: string; componentName?: string; hasSchema: boolean; startLine: number; endLine: number },\n options: MigrationOptions\n): Promise<MigrationResult> {\n const changes: string[] = []\n const fullPath = path.resolve(process.cwd(), filePath)\n\n // Determine page path from file path\n let pagePath = filePath\n .replace(/^app\\//, '/')\n .replace(/^src\\/app\\//, '/')\n .replace(/\\/page\\.(tsx?|jsx?)$/, '')\n .replace(/\\[([^\\]]+)\\]/g, ':$1')\n\n if (pagePath === '') pagePath = '/'\n\n let content = await fs.readFile(fullPath, 'utf-8')\n\n // Skip client components - ManagedFAQ requires server rendering\n if (isClientComponent(content)) {\n changes.push('Skipped: Client component cannot use ManagedFAQ (requires server rendering)')\n changes.push('Consider using ManagedFAQ in a parent server component or layout.tsx')\n return { filePath, success: true, changes }\n }\n\n // Extract FAQ items from the existing code\n const extractedItems = extractFAQItems(content, faq.type)\n \n if (options.dryRun) {\n changes.push(`[DRY RUN] Would extract ${extractedItems.length} FAQ items`)\n changes.push(`[DRY RUN] Would create managed FAQ record for path: ${pagePath}`)\n changes.push(`[DRY RUN] Would insert ManagedFAQ component`)\n changes.push(`[DRY RUN] FAQ type: ${faq.type}${faq.componentName ? ` (${faq.componentName})` : ''}`)\n return { filePath, success: true, changes }\n }\n\n // Create FAQ record in Portal API\n if (extractedItems.length > 0) {\n try {\n await createFAQRecord(pagePath, extractedItems, options)\n changes.push(`Created managed FAQ with ${extractedItems.length} items for: ${pagePath}`)\n } catch (error: any) {\n changes.push(`FAQ record may already exist for: ${pagePath}`)\n }\n } else {\n // Create empty FAQ record for manual population\n try {\n await createFAQRecord(pagePath, [], options)\n changes.push(`Created empty managed FAQ for: ${pagePath} (add items in Portal)`)\n } catch {\n changes.push(`FAQ record may already exist for: ${pagePath}`)\n }\n }\n\n // Add import for ManagedFAQ safely\n if (!content.includes('ManagedFAQ')) {\n if (content.includes(\"'@sonordev/site-kit/seo\") || content.includes('\"@sonordev/site-kit/seo')) {\n content = addToExistingImport(content, 'ManagedFAQ', '@sonordev/site-kit/seo')\n } else {\n content = addImportSafely(content, `import { ManagedFAQ } from '@sonordev/site-kit/seo'`)\n }\n changes.push('Added ManagedFAQ import')\n }\n\n // Determine if file is TypeScript for proper syntax\n const isTypeScript = filePath.endsWith('.tsx') || filePath.endsWith('.ts')\n const projectIdSuffix = isTypeScript ? '!' : ''\n\n const managedFAQComponent = `<ManagedFAQ\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID${projectIdSuffix}}\n path=\"${pagePath}\"\n />`\n\n // Try to insert ManagedFAQ component near the existing FAQ\n // Look for the FAQ component/section and insert before it\n if (faq.componentName) {\n // Look for the component tag and insert before it\n const componentPattern = new RegExp(`(<${faq.componentName}[^>]*>)`, 'i')\n if (componentPattern.test(content)) {\n content = content.replace(componentPattern, `{/* Managed FAQ - content controlled via Portal */}\\n ${managedFAQComponent}\\n {/* Original FAQ component (can be removed once migrated) */}\\n $1`)\n changes.push('Inserted ManagedFAQ component before existing FAQ')\n }\n } else if (faq.type === 'details-summary') {\n // For details/summary, look for the first <details> tag\n const detailsMatch = content.match(/<details[^>]*>/)\n if (detailsMatch && detailsMatch.index !== undefined) {\n content = content.slice(0, detailsMatch.index) + \n `{/* Managed FAQ - content controlled via Portal */}\\n ${managedFAQComponent}\\n {/* Original FAQ (can be removed once migrated) */}\\n ` + \n content.slice(detailsMatch.index)\n changes.push('Inserted ManagedFAQ component before details/summary FAQ')\n }\n }\n\n // If we couldn't insert near the FAQ, add a comment with instructions\n if (!changes.some(c => c.includes('Inserted ManagedFAQ'))) {\n changes.push(`Add ManagedFAQ to your page JSX: ${managedFAQComponent}`)\n }\n\n await fs.writeFile(fullPath, content, 'utf-8')\n return { filePath, success: true, changes }\n}\n\n// ============================================\n// Sitemap Migration\n// ============================================\n\n/**\n * Migrate sitemap configuration to Site-Kit managed sitemap\n */\nexport async function migrateSitemap(\n filePath: string,\n sitemap: { type: string; generator?: string },\n options: MigrationOptions\n): Promise<MigrationResult> {\n const changes: string[] = []\n const fullPath = path.resolve(process.cwd(), filePath)\n\n if (options.dryRun) {\n changes.push(`[DRY RUN] Would migrate ${sitemap.type} to Site-Kit sitemap`)\n if (sitemap.type === 'next-sitemap-config') {\n changes.push('[DRY RUN] Would update next-sitemap.config.js to use Site-Kit URLs')\n }\n return { filePath, success: true, changes }\n }\n\n // For next-sitemap configs, we can update the siteUrl and add additionalSitemaps\n if (sitemap.type === 'next-sitemap-config') {\n let content = await fs.readFile(fullPath, 'utf-8')\n\n // Add comment about Site-Kit integration\n if (!content.includes('Site-Kit')) {\n content = `/**\n * Site-Kit Integration\n * \n * Pages are automatically synced to Portal SEO module.\n * Manage URLs, priorities, and change frequencies in the Portal.\n */\n` + content\n }\n\n await fs.writeFile(fullPath, content, 'utf-8')\n changes.push('Added Site-Kit integration comment to sitemap config')\n changes.push('Configure sitemap settings in Portal SEO module for centralized management')\n }\n\n // For custom app/sitemap.ts files\n if (sitemap.type === 'custom-sitemap' && filePath.includes('sitemap')) {\n changes.push('Custom sitemap detected - consider using Site-Kit\\'s createSitemap helper')\n changes.push('Import: import { createSitemap } from \\'@sonordev/site-kit/seo\\'')\n }\n\n return { filePath, success: true, changes }\n}\n\n// ============================================\n// Analytics Migration\n// ============================================\n\n/**\n * Migrate analytics scripts (mostly informational - we don't remove existing analytics)\n */\nexport async function migrateAnalytics(\n filePath: string,\n analytics: { type: string; trackingId?: string },\n options: MigrationOptions\n): Promise<MigrationResult> {\n const changes: string[] = []\n\n // Analytics migration is mainly informational\n // We don't want to break existing tracking, but we note that SiteKitProvider can handle analytics\n if (options.dryRun) {\n changes.push(`[DRY RUN] Detected ${analytics.type}${analytics.trackingId ? ` (${analytics.trackingId})` : ''}`)\n changes.push('[DRY RUN] Would recommend moving to SiteKitProvider analytics')\n return { filePath, success: true, changes }\n }\n\n changes.push(`Detected ${analytics.type}${analytics.trackingId ? ` (${analytics.trackingId})` : ''}`)\n changes.push('SiteKitProvider supports analytics integration')\n changes.push('Configure analytics in project settings to consolidate tracking')\n \n // Don't actually modify the file - just report what was found\n return { filePath, success: true, changes }\n}\n\n// ============================================\n// Single File Migration\n// ============================================\n\n/**\n * Migrate a single file to Site-Kit\n */\nexport async function migrateFile(\n filePath: string,\n options: MigrationOptions\n): Promise<MigrationResult> {\n const fullPath = path.resolve(filePath)\n const relPath = path.relative(process.cwd(), fullPath)\n\n // Read and parse the file\n const content = await fs.readFile(fullPath, 'utf-8')\n \n // Simple detection: check if it looks like a form\n const hasFormTag = content.includes('<form') || content.includes('onSubmit')\n const hasWidget = /intercom|crisp|drift|hubspot|zendesk/i.test(content)\n\n if (!hasFormTag && !hasWidget) {\n return {\n filePath: relPath,\n success: false,\n changes: [],\n error: 'No migratable components found in file',\n }\n }\n\n // For widgets, do a simple replacement\n if (hasWidget) {\n const widgetType = content.toLowerCase().includes('intercom') ? 'intercom' as const :\n content.toLowerCase().includes('crisp') ? 'crisp' as const :\n content.toLowerCase().includes('drift') ? 'drift' as const :\n content.toLowerCase().includes('hubspot') ? 'hubspot' as const :\n content.toLowerCase().includes('zendesk') ? 'zendesk' as const :\n 'other' as const\n\n return migrateWidget(relPath, {\n filePath: relPath,\n widgetType,\n startLine: 0,\n endLine: 0,\n }, options)\n }\n\n // For forms, we need to scan first\n const { parse } = await import('@babel/parser')\n const ast = parse(content, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n })\n\n // Find form component name\n let componentName = 'Form'\n const traverse = (await import('@babel/traverse')).default\n traverse(ast, {\n ExportNamedDeclaration(path) {\n const decl = path.node.declaration\n if (decl && decl.type === 'FunctionDeclaration' && decl.id) {\n componentName = decl.id.name\n path.stop()\n }\n },\n ExportDefaultDeclaration(path) {\n const decl = path.node.declaration\n if (decl && decl.type === 'FunctionDeclaration' && decl.id) {\n componentName = decl.id.name\n path.stop()\n }\n },\n })\n\n const form: DetectedForm = {\n filePath: relPath,\n componentName,\n fields: [],\n hasValidation: false,\n formLibrary: 'native',\n submitsTo: null,\n complexity: 'simple',\n suggestedAction: 'auto-migrate',\n startLine: 0,\n endLine: 0,\n }\n\n return migrateForm(form, options)\n}\n\n// ============================================\n// Helpers\n// ============================================\n\nfunction generateSlug(name: string): string {\n return name\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')\n .replace(/form$/i, '')\n .replace(/-+/g, '-')\n .replace(/-$/, '') || 'form'\n}\n\nfunction formatName(name: string): string {\n return name\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim()\n}\n\nfunction formatLabel(name: string): string {\n return name\n .replace(/([A-Z])/g, ' $1')\n .replace(/_/g, ' ')\n .replace(/^./, str => str.toUpperCase())\n .trim()\n}\n\nfunction mapFieldType(type: string): string {\n const mapping: Record<string, string> = {\n 'text': 'text',\n 'email': 'email',\n 'tel': 'phone',\n 'phone': 'phone',\n 'number': 'number',\n 'textarea': 'textarea',\n 'select': 'select',\n 'checkbox': 'checkbox',\n 'radio': 'radio',\n 'date': 'date',\n 'file': 'file',\n 'url': 'url',\n 'password': 'text', // Don't use password for managed forms\n }\n return mapping[type] || 'text'\n}\n\nfunction detectFormType(form: DetectedForm): string {\n const name = form.componentName.toLowerCase()\n const fields = form.fields.map(f => f.name.toLowerCase()).join(' ')\n\n if (name.includes('contact') || fields.includes('message')) return 'contact'\n if (name.includes('newsletter') || name.includes('subscribe')) return 'newsletter'\n if (name.includes('quote') || name.includes('estimate')) return 'prospect'\n if (name.includes('support') || name.includes('help')) return 'support'\n if (name.includes('feedback')) return 'feedback'\n\n return 'contact'\n}\n"]}