@sonordev/site-kit 1.2.7 → 1.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/README.md +5 -3
  2. package/dist/analytics/index.js +6 -6
  3. package/dist/analytics/index.mjs +2 -2
  4. package/dist/{api-CWtoFJCO.d.mts → api-DTKSHh_w.d.mts} +1 -1
  5. package/dist/{api-CWtoFJCO.d.ts → api-DTKSHh_w.d.ts} +1 -1
  6. package/dist/blog/index.js +10 -10
  7. package/dist/blog/index.js.map +1 -1
  8. package/dist/blog/index.mjs +10 -10
  9. package/dist/blog/index.mjs.map +1 -1
  10. package/dist/blog/server.js +2 -2
  11. package/dist/blog/server.js.map +1 -1
  12. package/dist/blog/server.mjs +2 -2
  13. package/dist/blog/server.mjs.map +1 -1
  14. package/dist/{chunk-7RYCHO6D.mjs → chunk-2RHO4KSK.mjs} +9 -9
  15. package/dist/{chunk-7RYCHO6D.mjs.map → chunk-2RHO4KSK.mjs.map} +1 -1
  16. package/dist/{chunk-EEZCR6E6.js → chunk-2XOW276O.js} +5 -5
  17. package/dist/{chunk-EEZCR6E6.js.map → chunk-2XOW276O.js.map} +1 -1
  18. package/dist/{chunk-JTLOJLWQ.mjs → chunk-36Y7OWES.mjs} +4 -4
  19. package/dist/chunk-36Y7OWES.mjs.map +1 -0
  20. package/dist/{chunk-DQYMKR27.mjs → chunk-47Y3YSES.mjs} +10 -10
  21. package/dist/chunk-47Y3YSES.mjs.map +1 -0
  22. package/dist/{chunk-MV3QN7PW.mjs → chunk-5F7FFUPJ.mjs} +3 -3
  23. package/dist/{chunk-MV3QN7PW.mjs.map → chunk-5F7FFUPJ.mjs.map} +1 -1
  24. package/dist/{chunk-AFAO3TGS.mjs → chunk-5YDPPOUU.mjs} +10 -10
  25. package/dist/chunk-5YDPPOUU.mjs.map +1 -0
  26. package/dist/{chunk-D63MUKZ6.mjs → chunk-6YXRLC6W.mjs} +5 -5
  27. package/dist/chunk-6YXRLC6W.mjs.map +1 -0
  28. package/dist/{chunk-7RF6PVHA.mjs → chunk-7FKPJQVS.mjs} +33 -68
  29. package/dist/chunk-7FKPJQVS.mjs.map +1 -0
  30. package/dist/{chunk-BYLIU6XG.js → chunk-7ROZJDXE.js} +10 -10
  31. package/dist/chunk-7ROZJDXE.js.map +1 -0
  32. package/dist/{chunk-UWE5PCYJ.mjs → chunk-APZMXRI3.mjs} +3 -3
  33. package/dist/chunk-APZMXRI3.mjs.map +1 -0
  34. package/dist/{chunk-622GAQP5.js → chunk-BBITDUZQ.js} +6 -6
  35. package/dist/chunk-BBITDUZQ.js.map +1 -0
  36. package/dist/{chunk-DDKW2FNA.js → chunk-BFJDUTXK.js} +8 -8
  37. package/dist/chunk-BFJDUTXK.js.map +1 -0
  38. package/dist/chunk-C3A5HXHX.mjs +78 -0
  39. package/dist/chunk-C3A5HXHX.mjs.map +1 -0
  40. package/dist/{chunk-XZJOZJB6.js → chunk-CFEOOJUT.js} +12 -12
  41. package/dist/{chunk-XZJOZJB6.js.map → chunk-CFEOOJUT.js.map} +1 -1
  42. package/dist/{chunk-M2T6R7BA.mjs → chunk-DOSSLBNW.mjs} +4 -4
  43. package/dist/chunk-DOSSLBNW.mjs.map +1 -0
  44. package/dist/{chunk-OB7E654K.js → chunk-DY4K6X3A.js} +6 -6
  45. package/dist/chunk-DY4K6X3A.js.map +1 -0
  46. package/dist/{chunk-7UKPRW25.mjs → chunk-EISQ7LJG.mjs} +6 -6
  47. package/dist/chunk-EISQ7LJG.mjs.map +1 -0
  48. package/dist/{chunk-7557OTHW.js → chunk-EUNL6GAL.js} +5 -5
  49. package/dist/chunk-EUNL6GAL.js.map +1 -0
  50. package/dist/{chunk-KUGMH4ZF.js → chunk-G6VGUAK2.js} +4 -4
  51. package/dist/chunk-G6VGUAK2.js.map +1 -0
  52. package/dist/{chunk-XQQWI6WB.js → chunk-GVXZWXQ7.js} +10 -10
  53. package/dist/chunk-GVXZWXQ7.js.map +1 -0
  54. package/dist/{chunk-24277A3Q.mjs → chunk-HF2FWDBJ.mjs} +9 -9
  55. package/dist/chunk-HF2FWDBJ.mjs.map +1 -0
  56. package/dist/{chunk-72MQFHYJ.js → chunk-IFAW7JFO.js} +16 -16
  57. package/dist/chunk-IFAW7JFO.js.map +1 -0
  58. package/dist/{chunk-P3UWIUJS.mjs → chunk-IKIJEKU3.mjs} +16 -16
  59. package/dist/chunk-IKIJEKU3.mjs.map +1 -0
  60. package/dist/{chunk-PKN27UMH.mjs → chunk-JIDOXTX2.mjs} +3 -3
  61. package/dist/{chunk-PKN27UMH.mjs.map → chunk-JIDOXTX2.mjs.map} +1 -1
  62. package/dist/{chunk-7FUV73JZ.js → chunk-JM3ZR6LB.js} +9 -9
  63. package/dist/chunk-JM3ZR6LB.js.map +1 -0
  64. package/dist/{chunk-OIIKTGRL.mjs → chunk-JMNSED4O.mjs} +8 -8
  65. package/dist/chunk-JMNSED4O.mjs.map +1 -0
  66. package/dist/chunk-MG23BS36.js +82 -0
  67. package/dist/chunk-MG23BS36.js.map +1 -0
  68. package/dist/{chunk-TFLQX7K7.mjs → chunk-N24BPFF6.mjs} +6 -6
  69. package/dist/chunk-N24BPFF6.mjs.map +1 -0
  70. package/dist/{chunk-LIVWLY2P.js → chunk-PPRAW576.js} +3 -3
  71. package/dist/{chunk-LIVWLY2P.js.map → chunk-PPRAW576.js.map} +1 -1
  72. package/dist/{chunk-W4PALSGM.js → chunk-REMHGWXT.js} +3 -3
  73. package/dist/chunk-REMHGWXT.js.map +1 -0
  74. package/dist/{chunk-DW5UJKHH.js → chunk-RMOL4TZ6.js} +8 -8
  75. package/dist/chunk-RMOL4TZ6.js.map +1 -0
  76. package/dist/{chunk-KKU3K7RG.js → chunk-SLB5V4RT.js} +33 -67
  77. package/dist/chunk-SLB5V4RT.js.map +1 -0
  78. package/dist/{chunk-K23A4G76.mjs → chunk-SQSBAPWA.mjs} +8 -8
  79. package/dist/chunk-SQSBAPWA.mjs.map +1 -0
  80. package/dist/{chunk-WECQ6KOB.js → chunk-TG46LJFB.js} +4 -4
  81. package/dist/chunk-TG46LJFB.js.map +1 -0
  82. package/dist/{chunk-43GBM4SX.js → chunk-TKQLH33E.js} +3 -3
  83. package/dist/chunk-TKQLH33E.js.map +1 -0
  84. package/dist/{chunk-UYFDNX2F.js → chunk-TLHRV3LZ.js} +5 -5
  85. package/dist/chunk-TLHRV3LZ.js.map +1 -0
  86. package/dist/{chunk-6ZCISNAB.mjs → chunk-UPR5FEIO.mjs} +3 -3
  87. package/dist/chunk-UPR5FEIO.mjs.map +1 -0
  88. package/dist/{chunk-GCJXQ4AG.mjs → chunk-VZMDH3R4.mjs} +5 -5
  89. package/dist/chunk-VZMDH3R4.mjs.map +1 -0
  90. package/dist/{chunk-LBVWVP72.js → chunk-X4J33XQD.js} +7 -7
  91. package/dist/chunk-X4J33XQD.js.map +1 -0
  92. package/dist/{chunk-QXV4667R.mjs → chunk-XFOL6JDF.mjs} +5 -5
  93. package/dist/chunk-XFOL6JDF.mjs.map +1 -0
  94. package/dist/cli/index.js +80 -91
  95. package/dist/cli/index.js.map +1 -1
  96. package/dist/cli/index.mjs +76 -87
  97. package/dist/cli/index.mjs.map +1 -1
  98. package/dist/cms/index.d.mts +139 -0
  99. package/dist/cms/index.d.ts +139 -0
  100. package/dist/cms/index.js +409 -0
  101. package/dist/cms/index.js.map +1 -0
  102. package/dist/cms/index.mjs +388 -0
  103. package/dist/cms/index.mjs.map +1 -0
  104. package/dist/cms/server.d.mts +47 -0
  105. package/dist/cms/server.d.ts +47 -0
  106. package/dist/cms/server.js +21 -0
  107. package/dist/{server-api-GJPNRYUP.js.map → cms/server.js.map} +1 -1
  108. package/dist/cms/server.mjs +4 -0
  109. package/dist/{server-api-EWXKOQZA.mjs.map → cms/server.mjs.map} +1 -1
  110. package/dist/commerce/index.js +42 -42
  111. package/dist/commerce/index.mjs +1 -1
  112. package/dist/commerce/server.d.mts +1 -1
  113. package/dist/commerce/server.d.ts +1 -1
  114. package/dist/commerce/server.js.map +1 -1
  115. package/dist/commerce/server.mjs.map +1 -1
  116. package/dist/config/index.js +1 -1
  117. package/dist/config/index.js.map +1 -1
  118. package/dist/config/index.mjs +1 -1
  119. package/dist/config/index.mjs.map +1 -1
  120. package/dist/engage/index.js +4 -4
  121. package/dist/engage/index.mjs +1 -1
  122. package/dist/forms/index.js +5 -5
  123. package/dist/forms/index.js.map +1 -1
  124. package/dist/forms/index.mjs +5 -5
  125. package/dist/forms/index.mjs.map +1 -1
  126. package/dist/generators-DOFWGRXS.js +37 -0
  127. package/dist/{generators-DTMO36DV.js.map → generators-DOFWGRXS.js.map} +1 -1
  128. package/dist/generators-R62APO62.mjs +4 -0
  129. package/dist/{generators-2XKQMPKH.mjs.map → generators-R62APO62.mjs.map} +1 -1
  130. package/dist/images/index.d.mts +1 -1
  131. package/dist/images/index.d.ts +1 -1
  132. package/dist/images/index.js +11 -11
  133. package/dist/images/index.mjs +2 -2
  134. package/dist/images/server.d.mts +3 -3
  135. package/dist/images/server.d.ts +3 -3
  136. package/dist/images/server.js +4 -4
  137. package/dist/images/server.mjs +1 -1
  138. package/dist/index.d.mts +5 -5
  139. package/dist/index.d.ts +5 -5
  140. package/dist/index.js +81 -81
  141. package/dist/index.js.map +1 -1
  142. package/dist/index.mjs +28 -28
  143. package/dist/index.mjs.map +1 -1
  144. package/dist/layout/index.d.mts +2 -2
  145. package/dist/layout/index.d.ts +2 -2
  146. package/dist/layout/index.js +17 -17
  147. package/dist/layout/index.js.map +1 -1
  148. package/dist/layout/index.mjs +10 -10
  149. package/dist/layout/index.mjs.map +1 -1
  150. package/dist/llms/index.js +12 -12
  151. package/dist/llms/index.mjs +2 -2
  152. package/dist/manifest/index.js +4 -4
  153. package/dist/manifest/index.js.map +1 -1
  154. package/dist/manifest/index.mjs +3 -3
  155. package/dist/manifest/index.mjs.map +1 -1
  156. package/dist/middleware/index.js +3 -3
  157. package/dist/middleware/index.mjs +2 -2
  158. package/dist/{migrator-2MQHOFDQ.mjs → migrator-3WQB3KQ2.mjs} +3 -3
  159. package/dist/{migrator-2MQHOFDQ.mjs.map → migrator-3WQB3KQ2.mjs.map} +1 -1
  160. package/dist/migrator-HFVQYK5R.js +37 -0
  161. package/dist/{migrator-THJCF6MZ.js.map → migrator-HFVQYK5R.js.map} +1 -1
  162. package/dist/redirects/index.d.mts +2 -2
  163. package/dist/redirects/index.d.ts +2 -2
  164. package/dist/redirects/index.js +6 -6
  165. package/dist/redirects/index.mjs +2 -2
  166. package/dist/reputation/index.js +4 -4
  167. package/dist/reputation/index.mjs +1 -1
  168. package/dist/robots/index.d.mts +1 -1
  169. package/dist/robots/index.d.ts +1 -1
  170. package/dist/robots/index.js +3 -3
  171. package/dist/robots/index.js.map +1 -1
  172. package/dist/robots/index.mjs +2 -2
  173. package/dist/robots/index.mjs.map +1 -1
  174. package/dist/seo/index.d.mts +1 -1
  175. package/dist/seo/index.d.ts +1 -1
  176. package/dist/seo/index.js +43 -43
  177. package/dist/seo/index.js.map +1 -1
  178. package/dist/seo/index.mjs +6 -6
  179. package/dist/seo/index.mjs.map +1 -1
  180. package/dist/seo/register-sitemap-cli.js +18 -18
  181. package/dist/seo/register-sitemap-cli.js.map +1 -1
  182. package/dist/seo/register-sitemap-cli.mjs +18 -18
  183. package/dist/seo/register-sitemap-cli.mjs.map +1 -1
  184. package/dist/seo/server.d.mts +1 -1
  185. package/dist/seo/server.d.ts +1 -1
  186. package/dist/seo/server.js +10 -10
  187. package/dist/seo/server.js.map +1 -1
  188. package/dist/seo/server.mjs +8 -8
  189. package/dist/seo/server.mjs.map +1 -1
  190. package/dist/{server-api-GJPNRYUP.js → server-api-C5JXIROA.js} +21 -21
  191. package/dist/server-api-C5JXIROA.js.map +1 -0
  192. package/dist/{server-api-EWXKOQZA.mjs → server-api-HTSLBT6F.mjs} +3 -3
  193. package/dist/server-api-HTSLBT6F.mjs.map +1 -0
  194. package/dist/setup/client.js +7 -7
  195. package/dist/setup/client.mjs +2 -2
  196. package/dist/setup/index.js +9 -9
  197. package/dist/setup/index.mjs +3 -3
  198. package/dist/setup/server.js +2 -2
  199. package/dist/setup/server.mjs +1 -1
  200. package/dist/site-config/index.d.mts +1 -1
  201. package/dist/site-config/index.d.ts +1 -1
  202. package/dist/site-config/index.js +3 -3
  203. package/dist/site-config/index.mjs +1 -1
  204. package/dist/sitemap/index.d.mts +2 -2
  205. package/dist/sitemap/index.d.ts +2 -2
  206. package/dist/sitemap/index.js +10 -10
  207. package/dist/sitemap/index.js.map +1 -1
  208. package/dist/sitemap/index.mjs +8 -8
  209. package/dist/sitemap/index.mjs.map +1 -1
  210. package/dist/types-BG-x8yhh.d.mts +106 -0
  211. package/dist/types-BG-x8yhh.d.ts +106 -0
  212. package/package.json +13 -1
  213. package/dist/chunk-24277A3Q.mjs.map +0 -1
  214. package/dist/chunk-43GBM4SX.js.map +0 -1
  215. package/dist/chunk-622GAQP5.js.map +0 -1
  216. package/dist/chunk-6ZCISNAB.mjs.map +0 -1
  217. package/dist/chunk-72MQFHYJ.js.map +0 -1
  218. package/dist/chunk-7557OTHW.js.map +0 -1
  219. package/dist/chunk-7FUV73JZ.js.map +0 -1
  220. package/dist/chunk-7RF6PVHA.mjs.map +0 -1
  221. package/dist/chunk-7UKPRW25.mjs.map +0 -1
  222. package/dist/chunk-AFAO3TGS.mjs.map +0 -1
  223. package/dist/chunk-BYLIU6XG.js.map +0 -1
  224. package/dist/chunk-D63MUKZ6.mjs.map +0 -1
  225. package/dist/chunk-DDKW2FNA.js.map +0 -1
  226. package/dist/chunk-DQYMKR27.mjs.map +0 -1
  227. package/dist/chunk-DW5UJKHH.js.map +0 -1
  228. package/dist/chunk-GCJXQ4AG.mjs.map +0 -1
  229. package/dist/chunk-JTLOJLWQ.mjs.map +0 -1
  230. package/dist/chunk-K23A4G76.mjs.map +0 -1
  231. package/dist/chunk-KKU3K7RG.js.map +0 -1
  232. package/dist/chunk-KUGMH4ZF.js.map +0 -1
  233. package/dist/chunk-LBVWVP72.js.map +0 -1
  234. package/dist/chunk-M2T6R7BA.mjs.map +0 -1
  235. package/dist/chunk-OB7E654K.js.map +0 -1
  236. package/dist/chunk-OIIKTGRL.mjs.map +0 -1
  237. package/dist/chunk-P3UWIUJS.mjs.map +0 -1
  238. package/dist/chunk-QXV4667R.mjs.map +0 -1
  239. package/dist/chunk-TFLQX7K7.mjs.map +0 -1
  240. package/dist/chunk-UWE5PCYJ.mjs.map +0 -1
  241. package/dist/chunk-UYFDNX2F.js.map +0 -1
  242. package/dist/chunk-W4PALSGM.js.map +0 -1
  243. package/dist/chunk-WECQ6KOB.js.map +0 -1
  244. package/dist/chunk-XQQWI6WB.js.map +0 -1
  245. package/dist/generators-2XKQMPKH.mjs +0 -4
  246. package/dist/generators-DTMO36DV.js +0 -33
  247. package/dist/migrator-THJCF6MZ.js +0 -37
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/setup/SetupWizard.tsx"],"names":["useState","useCallback","useEffect","jsxs","jsx","userEmail","step","Fragment"],"mappings":"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","file":"chunk-72MQFHYJ.js","sourcesContent":["'use client'\n\n/**\n * Uptrade Setup Wizard\n * \n * Visual setup wizard that runs at /_uptrade/setup during development.\n * Supports THREE flows:\n * \n * 🆕 NEW SITE:\n * Brand new site, nothing exists yet.\n * Define brand manually → Choose modules → Scaffold → Integration → Copilot → Complete\n * \n * 🔧 EXISTING PROJECT:\n * NextJS project already built by us. Adding Portal integration.\n * Scan codebase → Migrate forms/widgets → Integration → Copilot → Complete\n * \n * 🔄 REBUILD:\n * Company has a live site, we're recreating it in NextJS.\n * Enter domain → Scrape live site → Review extracted data → Track redirects → Integration → Copilot → Complete\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\n\n// ============================================\n// Types\n// ============================================\n\ntype SetupType = 'new' | 'existing' | 'rebuild' | null\n\ntype Step = \n | 'welcome' \n | 'auth' \n | 'project' \n | 'setup-type'\n // NEW flow\n | 'brand'\n | 'modules'\n | 'scaffold'\n // EXISTING flow\n | 'scan'\n | 'migrate'\n // REBUILD flow\n | 'domain'\n | 'scrape'\n | 'review'\n | 'redirects'\n // Common finish\n | 'integration'\n | 'copilot'\n | 'complete'\n\ninterface ScanResults {\n forms: DetectedItem[]\n widgets: DetectedItem[]\n metadata: DetectedItem[]\n analytics: DetectedItem[]\n}\n\ninterface DetectedItem {\n type: string\n file: string\n line: number\n details: Record<string, unknown>\n selected: boolean\n}\n\ninterface Project {\n id: string\n name: string\n domain: string\n}\n\ninterface Organization {\n id: string\n name: string\n projects: Project[]\n}\n\ninterface ScrapeStatus {\n id: string\n status: 'pending' | 'running' | 'completed' | 'failed'\n progress: number\n current_step: string\n pages_found: number\n routes_planned: number\n faqs_imported: number\n brand?: {\n business_name?: string\n primary_colors?: { hex: string }[]\n secondary_colors?: { hex: string }[]\n logo_url?: string\n tagline?: string\n }\n routes?: Array<{ path: string; title: string; type: string }>\n error?: string\n}\n\ninterface BrandConfig {\n businessName: string\n tagline: string\n primaryColor: string\n secondaryColor?: string\n logoUrl: string\n}\n\n// Available Uptrade modules\nconst AVAILABLE_MODULES = [\n { id: 'analytics', name: 'Analytics', description: 'Page views, events, sessions, web vitals', icon: '📊', recommended: true },\n { id: 'seo', name: 'SEO', description: 'Managed FAQs, meta tags, schema markup', icon: '🔍', recommended: true },\n { id: 'forms', name: 'Forms', description: 'Managed forms with Portal submissions', icon: '📝', recommended: true },\n { id: 'engage', name: 'Engage', description: 'Live chat, popups, nudges, banners', icon: '💬', recommended: false },\n { id: 'commerce', name: 'Commerce', description: 'Products, services, checkout', icon: '🛒', recommended: false },\n]\n\ninterface SetupWizardProps {\n config?: {\n url?: string\n anonKey?: string\n portalApiUrl?: string\n }\n}\n\n// ============================================\n// Setup Wizard Component\n// ============================================\n\nexport function SetupWizard({ config }: SetupWizardProps = {}) {\n const [step, setStep] = useState<Step>('welcome')\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n \n // Auth state\n const [isAuthenticated, setIsAuthenticated] = useState(false)\n const [userEmail, setUserEmail] = useState<string | null>(null)\n const [accessToken, setAccessToken] = useState<string | null>(null)\n \n // Organization & Project state\n const [organizations, setOrganizations] = useState<Organization[]>([])\n const [selectedOrg, setSelectedOrg] = useState<Organization | null>(null)\n const [selectedProject, setSelectedProject] = useState<Project | null>(null)\n const [newProjectName, setNewProjectName] = useState('')\n const [newProjectDomain, setNewProjectDomain] = useState('')\n \n // ProjectStep local state (hoisted to avoid re-render issues)\n const [createNewProject, setCreateNewProject] = useState(false)\n const [creatingProject, setCreatingProject] = useState(false)\n const [creatingOrg, setCreatingOrg] = useState(false)\n const [newOrgName, setNewOrgName] = useState('')\n const [showNewOrg, setShowNewOrg] = useState(false)\n \n // Setup type\n const [setupType, setSetupType] = useState<SetupType>(null)\n \n // NEW flow: Brand configuration\n const [brandConfig, setBrandConfig] = useState<BrandConfig>({\n businessName: '',\n tagline: '',\n primaryColor: '#3B82F6',\n secondaryColor: undefined,\n logoUrl: '',\n })\n \n // NEW/EXISTING flow: Module selection\n const [selectedModules, setSelectedModules] = useState<string[]>(['analytics', 'seo', 'forms'])\n \n // EXISTING flow: Scan results\n const [scanResults, setScanResults] = useState<ScanResults | null>(null)\n const [migrationProgress, setMigrationProgress] = useState(0)\n const [migrationLog, setMigrationLog] = useState<string[]>([])\n \n // REBUILD flow: Scrape state\n const [scrapeDomain, setScrapeDomain] = useState('')\n const [scrapeStatus, setScrapeStatus] = useState<ScrapeStatus | null>(null)\n const [redirectMappings, setRedirectMappings] = useState<Array<{ from: string; to: string; enabled: boolean }>>([])\n \n // Copilot instructions\n const [copilotInstructions, setCopilotInstructions] = useState<string>('')\n const [generatingCopilot, setGeneratingCopilot] = useState(false)\n\n // API URL helpers\n const portalApiUrl = config?.portalApiUrl || 'http://localhost:3002'\n \n // Project step handlers (hoisted to prevent re-creation)\n const handleCreateOrg = useCallback(async () => {\n if (!newOrgName.trim()) return\n setCreatingOrg(true)\n try {\n const res = await fetch(`${portalApiUrl}/setup/organizations`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...(accessToken ? { 'Authorization': `Bearer ${accessToken}` } : {}) },\n body: JSON.stringify({ name: newOrgName })\n })\n if (!res.ok) throw new Error('Failed to create organization')\n const org = await res.json()\n setOrganizations(prev => [...prev, org])\n setSelectedOrg(org)\n setNewOrgName('')\n setShowNewOrg(false)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setCreatingOrg(false)\n }\n }, [portalApiUrl, accessToken, newOrgName])\n\n const handleCreateProject = useCallback(async () => {\n if (!selectedOrg || !newProjectName.trim()) return\n setCreatingProject(true)\n try {\n const res = await fetch(`${portalApiUrl}/setup/projects`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...(accessToken ? { 'Authorization': `Bearer ${accessToken}` } : {}) },\n body: JSON.stringify({ orgId: selectedOrg.id, name: newProjectName, domain: newProjectDomain || (typeof window !== 'undefined' ? window.location.hostname : 'localhost') })\n })\n if (!res.ok) throw new Error('Failed to create project')\n const project = await res.json()\n setSelectedProject(project)\n setStep('setup-type')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setCreatingProject(false)\n }\n }, [portalApiUrl, accessToken, selectedOrg, newProjectName, newProjectDomain])\n\n const handleSelectProject = useCallback((project: Project) => {\n setSelectedProject(project)\n setStep('setup-type')\n }, [])\n \n // Helper to make Portal API calls\n const callPortalApi = useCallback(async (path: string, options: RequestInit = {}) => {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(options.headers as Record<string, string> || {}),\n }\n if (accessToken) {\n headers['Authorization'] = `Bearer ${accessToken}`\n }\n return fetch(`${portalApiUrl}${path}`, {\n ...options,\n headers,\n })\n }, [portalApiUrl, accessToken])\n\n // Check if already configured\n useEffect(() => {\n checkExistingConfig()\n }, [])\n\n async function checkExistingConfig() {\n try {\n const localRes = await fetch('/_uptrade/api/status')\n const localData = await localRes.json()\n if (localData.configured) {\n setStep('complete')\n return\n }\n \n const storedToken = localStorage.getItem('uptrade_access_token')\n if (storedToken) {\n setAccessToken(storedToken)\n const res = await fetch(`${portalApiUrl}/setup/session`, {\n headers: { 'Authorization': `Bearer ${storedToken}` }\n })\n const data = await res.json()\n if (data.authenticated) {\n setIsAuthenticated(true)\n setUserEmail(data.email)\n setStep('project')\n }\n }\n } catch {\n // Not configured yet\n }\n }\n\n // ============================================\n // Step: Welcome\n // ============================================\n\n function WelcomeStep() {\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <div className=\"text-6xl mb-4\">🚀</div>\n <h1 className=\"text-3xl font-bold mb-2\">Welcome to Uptrade Site-Kit</h1>\n <p className=\"text-gray-400 text-lg\">\n Let's set up your project in just a few steps\n </p>\n </div>\n\n <div className=\"grid grid-cols-3 gap-4 my-8\">\n <FeatureCard icon=\"📊\" title=\"Analytics\" description=\"Track page views, events, and user sessions\" />\n <FeatureCard icon=\"📝\" title=\"Forms\" description=\"Managed forms with validation and submissions\" />\n <FeatureCard icon=\"💬\" title=\"Engage\" description=\"Popups, nudges, and live chat widgets\" />\n </div>\n\n <div className=\"flex justify-center\">\n <Button onClick={() => setStep('auth')}>Get Started →</Button>\n </div>\n </div>\n )\n }\n\n // ============================================\n // Step: Authentication\n // ============================================\n\n function AuthStep() {\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [authMode, setAuthMode] = useState<'portal' | 'login' | 'magic'>('portal')\n const [waitingForPopup, setWaitingForPopup] = useState(false)\n\n // Listen for messages from Portal popup\n useEffect(() => {\n function handleMessage(event: MessageEvent) {\n // Only accept messages from Portal\n const portalOrigins = ['https://portal.uptrademedia.com', 'http://localhost:5173', 'http://localhost:8888']\n if (!portalOrigins.includes(event.origin)) return\n \n if (event.data?.type === 'uptrade-auth-success') {\n const { accessToken: token, email: userEmail } = event.data\n if (token) {\n localStorage.setItem('uptrade_access_token', token)\n setAccessToken(token)\n setIsAuthenticated(true)\n setUserEmail(userEmail)\n setWaitingForPopup(false)\n loadOrganizations(token).then(() => setStep('project'))\n }\n } else if (event.data?.type === 'uptrade-auth-error') {\n setError(event.data.message || 'Authentication failed')\n setWaitingForPopup(false)\n }\n }\n \n window.addEventListener('message', handleMessage)\n return () => window.removeEventListener('message', handleMessage)\n }, [])\n\n async function handlePortalAuth() {\n setWaitingForPopup(true)\n setError(null)\n \n // Open Portal auth page in popup - use localhost:5173 for dev\n const portalUrl = portalApiUrl.includes('localhost') ? 'http://localhost:5173' : 'https://portal.uptrademedia.com'\n const callbackUrl = encodeURIComponent(window.location.origin)\n const popup = window.open(\n `${portalUrl}/auth/site-kit?callback=${callbackUrl}`,\n 'uptrade-auth',\n 'width=500,height=700,left=100,top=100'\n )\n \n // Check if popup was blocked\n if (!popup) {\n setError('Popup was blocked. Please allow popups and try again.')\n setWaitingForPopup(false)\n return\n }\n \n // Poll for popup close (in case user closes without completing)\n const pollInterval = setInterval(() => {\n if (popup.closed) {\n clearInterval(pollInterval)\n setWaitingForPopup(false)\n }\n }, 1000)\n }\n\n async function handleLogin() {\n if (!email.trim() || !password.trim()) return\n setIsLoading(true)\n setError(null)\n try {\n const supabaseUrl = config?.url || 'https://mwcjtnoqxolplwpkxnfe.supabase.co'\n const supabaseKey = config?.anonKey || ''\n \n const authRes = await fetch(`${supabaseUrl}/auth/v1/token?grant_type=password`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'apikey': supabaseKey },\n body: JSON.stringify({ email, password })\n })\n \n if (!authRes.ok) {\n const errData = await authRes.json()\n throw new Error(errData.error_description || errData.msg || 'Login failed')\n }\n \n const authData = await authRes.json()\n const token = authData.access_token\n \n localStorage.setItem('uptrade_access_token', token)\n setAccessToken(token)\n \n const sessionRes = await fetch(`${portalApiUrl}/setup/session`, {\n headers: { 'Authorization': `Bearer ${token}` }\n })\n const session = await sessionRes.json()\n \n if (session.authenticated) {\n setIsAuthenticated(true)\n setUserEmail(session.email)\n await loadOrganizations(token)\n setStep('project')\n } else {\n throw new Error('Authentication failed - user not found in Portal')\n }\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setIsLoading(false)\n }\n }\n\n async function handleMagicLink() {\n if (!email.trim()) return\n setIsLoading(true)\n setError(null)\n try {\n const supabaseUrl = config?.url || 'https://mwcjtnoqxolplwpkxnfe.supabase.co'\n const supabaseKey = config?.anonKey || ''\n \n const res = await fetch(`${supabaseUrl}/auth/v1/magiclink`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'apikey': supabaseKey },\n body: JSON.stringify({ email, options: { redirectTo: window.location.href } })\n })\n \n if (!res.ok) throw new Error('Failed to send magic link')\n alert('Check your email for a login link!')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setIsLoading(false)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-2\">Connect to Uptrade</h2>\n <p className=\"text-gray-400\">Sign in with your Sonor account</p>\n </div>\n\n {/* Primary: Sign in with Portal (uses existing session) */}\n <div className=\"max-w-md mx-auto\">\n <Button onClick={handlePortalAuth} loading={waitingForPopup} disabled={waitingForPopup}>\n {waitingForPopup ? 'Waiting for Sonor...' : '🚀 Sign in with Sonor'}\n </Button>\n <p className=\"text-gray-500 text-xs text-center mt-2\">\n Uses your existing Portal session (Google, email, etc.)\n </p>\n </div>\n\n <div className=\"flex items-center gap-4 max-w-md mx-auto\">\n <div className=\"flex-1 border-t border-gray-700\" />\n <span className=\"text-gray-500 text-sm\">or sign in directly</span>\n <div className=\"flex-1 border-t border-gray-700\" />\n </div>\n\n <div className=\"flex gap-4 justify-center mb-6\">\n <button className={`px-4 py-2 rounded-lg ${authMode === 'login' ? 'bg-blue-600' : 'bg-gray-700'}`} onClick={() => setAuthMode('login')}>\n Email & Password\n </button>\n <button className={`px-4 py-2 rounded-lg ${authMode === 'magic' ? 'bg-blue-600' : 'bg-gray-700'}`} onClick={() => setAuthMode('magic')}>\n Magic Link\n </button>\n </div>\n\n <div className=\"max-w-md mx-auto space-y-4\">\n <div>\n <label className=\"block text-sm text-gray-400 mb-2\">Email</label>\n <input type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} placeholder=\"you@example.com\"\n className=\"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg focus:outline-none focus:border-blue-500\" />\n </div>\n\n {authMode === 'login' && (\n <div>\n <label className=\"block text-sm text-gray-400 mb-2\">Password</label>\n <input type=\"password\" value={password} onChange={(e) => setPassword(e.target.value)} placeholder=\"••••••••\"\n className=\"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg focus:outline-none focus:border-blue-500\" />\n </div>\n )}\n\n <Button onClick={authMode === 'login' ? handleLogin : handleMagicLink} loading={isLoading} variant=\"secondary\"\n disabled={!email.trim() || (authMode === 'login' && !password.trim())}>\n {authMode === 'login' ? 'Sign In →' : 'Send Magic Link →'}\n </Button>\n\n <p className=\"text-gray-500 text-sm text-center\">\n Don't have an account?{' '}\n <a href=\"https://portal.uptrademedia.com/signup\" target=\"_blank\" className=\"text-blue-400 hover:underline\">\n Sign up at Portal\n </a>\n </p>\n </div>\n\n {error && (\n <div className=\"bg-red-500/10 border border-red-500/30 text-red-400 px-4 py-3 rounded-lg text-center\">{error}</div>\n )}\n </div>\n )\n }\n\n // ============================================\n // Step: Project Selection\n // ============================================\n\n async function loadOrganizations(token?: string) {\n try {\n const authToken = token || accessToken\n const res = await fetch(`${portalApiUrl}/setup/organizations`, {\n headers: authToken ? { 'Authorization': `Bearer ${authToken}` } : {}\n })\n const data = await res.json()\n setOrganizations(Array.isArray(data) ? data : [])\n } catch {\n setError('Failed to load organizations')\n }\n }\n\n // ============================================\n // Step: Setup Type Selection\n // ============================================\n\n function SetupTypeStep() {\n function handleSelectType(type: SetupType) {\n setSetupType(type)\n if (type === 'new') {\n setBrandConfig(prev => ({ ...prev, businessName: selectedProject?.name || '' }))\n setStep('brand')\n } else if (type === 'existing') {\n // Go to modules first, then scan\n setStep('modules')\n } else {\n setScrapeDomain(selectedProject?.domain || '')\n setStep('domain')\n }\n }\n\n return (\n <div className=\"space-y-8\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-2\">What are we setting up?</h2>\n <p className=\"text-gray-400\">Choose the flow that matches your project</p>\n </div>\n\n <div className=\"grid grid-cols-3 gap-4 max-w-4xl mx-auto\">\n {/* NEW Site */}\n <button onClick={() => handleSelectType('new')}\n className=\"p-6 bg-gray-800/50 rounded-xl border-2 border-gray-700 hover:border-blue-500 transition-all text-left group\">\n <div className=\"text-4xl mb-3\">🆕</div>\n <h3 className=\"text-lg font-bold mb-2 group-hover:text-blue-400 transition-colors\">New Site</h3>\n <p className=\"text-gray-400 text-sm mb-3\">\n Brand new project. Nothing exists yet - we'll define everything from scratch.\n </p>\n <ul className=\"text-xs text-gray-500 space-y-1\">\n <li>✓ Define brand & colors</li>\n <li>✓ Choose modules</li>\n <li>✓ Generate scaffolding</li>\n </ul>\n </button>\n\n {/* EXISTING Project */}\n <button onClick={() => handleSelectType('existing')}\n className=\"p-6 bg-gray-800/50 rounded-xl border-2 border-gray-700 hover:border-green-500 transition-all text-left group\">\n <div className=\"text-4xl mb-3\">🔧</div>\n <h3 className=\"text-lg font-bold mb-2 group-hover:text-green-400 transition-colors\">Existing Project</h3>\n <p className=\"text-gray-400 text-sm mb-3\">\n NextJS project already built. Adding Portal integration to manage content.\n </p>\n <ul className=\"text-xs text-gray-500 space-y-1\">\n <li>✓ Scan for forms & widgets</li>\n <li>✓ Migrate to managed versions</li>\n <li>✓ Keep existing structure</li>\n </ul>\n </button>\n\n {/* REBUILD */}\n <button onClick={() => handleSelectType('rebuild')}\n className=\"p-6 bg-gray-800/50 rounded-xl border-2 border-gray-700 hover:border-purple-500 transition-all text-left group\">\n <div className=\"text-4xl mb-3\">🔄</div>\n <h3 className=\"text-lg font-bold mb-2 group-hover:text-purple-400 transition-colors\">Rebuild</h3>\n <p className=\"text-gray-400 text-sm mb-3\">\n Client has a live site we didn't build. Recreating it in NextJS with Portal.\n </p>\n <ul className=\"text-xs text-gray-500 space-y-1\">\n <li>✓ Scrape existing site</li>\n <li>✓ Extract brand & content</li>\n <li>✓ Track redirects for SEO</li>\n </ul>\n </button>\n </div>\n </div>\n )\n }\n\n // ============================================\n // NEW FLOW: Brand Configuration\n // ============================================\n\n function BrandStep() {\n const [isExtracting, setIsExtracting] = useState(false)\n const [extractUrl, setExtractUrl] = useState('')\n const [showExtract, setShowExtract] = useState(false)\n \n async function handleExtractBrand() {\n if (!extractUrl.trim()) return\n \n setIsExtracting(true)\n setError(null)\n \n try {\n const response = await callPortalApi('/site-scrape/brand-only', {\n method: 'POST',\n body: JSON.stringify({ domain: extractUrl.replace(/^https?:\\/\\//, '').split('/')[0] }),\n }) as { business_name?: string; tagline?: string; primary_color?: string; secondary_color?: string; logo_url?: string }\n \n // Update brand config with extracted values\n setBrandConfig(prev => ({\n ...prev,\n businessName: response.business_name || prev.businessName,\n tagline: response.tagline || prev.tagline,\n primaryColor: response.primary_color || prev.primaryColor,\n logoUrl: response.logo_url || prev.logoUrl,\n }))\n \n setShowExtract(false)\n setExtractUrl('')\n } catch (err) {\n setError(`Failed to extract brand: ${(err as Error).message}`)\n } finally {\n setIsExtracting(false)\n }\n }\n\n function handleContinue() {\n if (!brandConfig.businessName.trim()) return\n setStep('modules')\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-2\">Define Your Brand</h2>\n <p className=\"text-gray-400\">Set up the basic brand identity for this project</p>\n </div>\n\n {/* Brand Extraction Option */}\n {!showExtract ? (\n <div className=\"max-w-lg mx-auto\">\n <button\n onClick={() => setShowExtract(true)}\n className=\"w-full flex items-center justify-center gap-3 p-4 bg-gradient-to-r from-purple-500/10 to-blue-500/10 border border-purple-500/30 rounded-lg hover:border-purple-500/50 transition-all\"\n >\n <span className=\"text-2xl\">🔍</span>\n <div className=\"text-left\">\n <div className=\"font-medium\">Extract from existing website</div>\n <div className=\"text-sm text-gray-400\">Auto-detect colors, name, and logo from a live site</div>\n </div>\n </button>\n </div>\n ) : (\n <div className=\"max-w-lg mx-auto bg-gray-800/50 rounded-lg border border-gray-700 p-4\">\n <div className=\"flex items-center gap-2 mb-3\">\n <span className=\"text-xl\">🔍</span>\n <span className=\"font-medium\">Extract Brand from Website</span>\n </div>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={extractUrl}\n onChange={(e) => setExtractUrl(e.target.value)}\n placeholder=\"example.com\"\n className=\"flex-1 px-4 py-2 bg-gray-900 border border-gray-700 rounded-lg\"\n onKeyDown={(e) => e.key === 'Enter' && handleExtractBrand()}\n />\n <Button onClick={handleExtractBrand} disabled={isExtracting || !extractUrl.trim()}>\n {isExtracting ? 'Extracting...' : 'Extract'}\n </Button>\n </div>\n <button\n onClick={() => setShowExtract(false)}\n className=\"text-sm text-gray-500 hover:text-gray-400 mt-2\"\n >\n Cancel\n </button>\n </div>\n )}\n\n <div className=\"max-w-lg mx-auto space-y-4\">\n <div>\n <label className=\"block text-sm text-gray-400 mb-2\">Business Name *</label>\n <input type=\"text\" value={brandConfig.businessName} onChange={(e) => setBrandConfig(prev => ({ ...prev, businessName: e.target.value }))}\n placeholder=\"Acme Inc\" className=\"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg\" />\n </div>\n\n <div>\n <label className=\"block text-sm text-gray-400 mb-2\">Tagline</label>\n <input type=\"text\" value={brandConfig.tagline} onChange={(e) => setBrandConfig(prev => ({ ...prev, tagline: e.target.value }))}\n placeholder=\"Making the world better\" className=\"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg\" />\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm text-gray-400 mb-2\">Primary Color</label>\n <div className=\"flex gap-2\">\n <input type=\"color\" value={brandConfig.primaryColor} onChange={(e) => setBrandConfig(prev => ({ ...prev, primaryColor: e.target.value }))}\n className=\"w-12 h-12 rounded border border-gray-700 cursor-pointer\" />\n <input type=\"text\" value={brandConfig.primaryColor} onChange={(e) => setBrandConfig(prev => ({ ...prev, primaryColor: e.target.value }))}\n className=\"flex-1 px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg font-mono text-sm\" />\n </div>\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm text-gray-400 mb-2\">Logo URL (optional)</label>\n <input type=\"text\" value={brandConfig.logoUrl} onChange={(e) => setBrandConfig(prev => ({ ...prev, logoUrl: e.target.value }))}\n placeholder=\"https://example.com/logo.svg\" className=\"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg\" />\n <p className=\"text-xs text-gray-500 mt-1\">You can add this later via Portal</p>\n </div>\n\n {/* Preview */}\n <div className=\"bg-gray-800/50 rounded-lg border border-gray-700 p-4\">\n <h4 className=\"text-sm text-gray-400 mb-3\">Preview</h4>\n <div className=\"flex items-center gap-4\">\n <div className=\"w-12 h-12 rounded-lg flex items-center justify-center text-white font-bold text-xl\"\n style={{ backgroundColor: brandConfig.primaryColor }}>\n {brandConfig.businessName.charAt(0) || '?'}\n </div>\n <div>\n <div className=\"font-semibold\">{brandConfig.businessName || 'Your Business'}</div>\n <div className=\"text-sm text-gray-400\">{brandConfig.tagline || 'Your tagline here'}</div>\n </div>\n </div>\n <div className=\"flex gap-2 mt-3\">\n <div className=\"w-8 h-8 rounded\" style={{ backgroundColor: brandConfig.primaryColor }} title=\"Primary\" />\n <div className=\"w-8 h-8 rounded\" style={{ backgroundColor: brandConfig.secondaryColor ?? '#6B7280' }} title=\"Secondary\" />\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-center gap-4\">\n <Button variant=\"secondary\" onClick={() => setStep('setup-type')}>← Back</Button>\n <Button onClick={handleContinue} disabled={!brandConfig.businessName.trim()}>Continue →</Button>\n </div>\n </div>\n )\n }\n\n // ============================================\n // NEW/EXISTING FLOW: Module Selection\n // ============================================\n\n function ModulesStep() {\n function toggleModule(moduleId: string) {\n setSelectedModules(prev => prev.includes(moduleId) ? prev.filter(m => m !== moduleId) : [...prev, moduleId])\n }\n\n async function handleContinue() {\n try {\n // Save brand config and modules to project\n await callPortalApi(`/setup/projects/${selectedProject?.id}`, {\n method: 'PATCH',\n body: JSON.stringify({\n brand_primary: brandConfig.primaryColor,\n settings: { brand: brandConfig },\n modules_enabled: selectedModules,\n })\n })\n // For existing projects, go to scan; for new projects, go to scaffold\n if (setupType === 'existing') {\n setStep('scan')\n } else {\n setStep('scaffold')\n }\n } catch (err) {\n setError((err as Error).message)\n }\n }\n\n // Back button goes to different places based on setup type\n function handleBack() {\n if (setupType === 'existing') {\n setStep('setup-type')\n } else {\n setStep('brand')\n }\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-2\">Select Modules</h2>\n <p className=\"text-gray-400\">Choose which Uptrade modules to enable</p>\n </div>\n\n <div className=\"max-w-2xl mx-auto space-y-3\">\n {AVAILABLE_MODULES.map(mod => (\n <button key={mod.id} onClick={() => toggleModule(mod.id)}\n className={`w-full flex items-center gap-4 p-4 rounded-lg border-2 transition-all text-left ${\n selectedModules.includes(mod.id) ? 'bg-blue-500/10 border-blue-500' : 'bg-gray-800/50 border-gray-700 hover:border-gray-600'\n }`}>\n <div className=\"text-3xl\">{mod.icon}</div>\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-semibold\">{mod.name}</span>\n {mod.recommended && <span className=\"text-xs bg-green-500/20 text-green-400 px-2 py-0.5 rounded\">Recommended</span>}\n </div>\n <p className=\"text-sm text-gray-400\">{mod.description}</p>\n </div>\n <div className={`w-6 h-6 rounded-full border-2 flex items-center justify-center ${\n selectedModules.includes(mod.id) ? 'bg-blue-500 border-blue-500' : 'border-gray-600'\n }`}>\n {selectedModules.includes(mod.id) && <span className=\"text-white text-sm\">✓</span>}\n </div>\n </button>\n ))}\n </div>\n\n <div className=\"flex justify-center gap-4\">\n <Button variant=\"secondary\" onClick={handleBack}>← Back</Button>\n <Button onClick={handleContinue} disabled={selectedModules.length === 0}>Continue →</Button>\n </div>\n </div>\n )\n }\n\n // ============================================\n // NEW FLOW: Scaffolding\n // ============================================\n\n function ScaffoldStep() {\n const [scaffolding, setScaffolding] = useState(false)\n const [scaffoldLog, setScaffoldLog] = useState<string[]>([])\n\n async function handleScaffold() {\n setScaffolding(true)\n setScaffoldLog(['Starting scaffolding...'])\n\n const steps = []\n if (selectedModules.includes('analytics')) steps.push('✓ Analytics provider configured')\n if (selectedModules.includes('seo')) {\n steps.push('✓ SEO utilities ready')\n steps.push('✓ ManagedFAQ component available')\n }\n if (selectedModules.includes('forms')) steps.push('✓ Forms integration configured')\n if (selectedModules.includes('engage')) steps.push('✓ Engage widgets ready')\n if (selectedModules.includes('commerce')) steps.push('✓ Commerce hooks available')\n\n for (const step of steps) {\n await new Promise(r => setTimeout(r, 400))\n setScaffoldLog(prev => [...prev, step])\n }\n\n setScaffoldLog(prev => [...prev, '', '🎉 Scaffolding complete!'])\n setScaffolding(false)\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-2\">Project Scaffolding</h2>\n <p className=\"text-gray-400\">Setting up your selected modules</p>\n </div>\n\n <div className=\"max-w-lg mx-auto\">\n <div className=\"bg-gray-800/50 rounded-lg border border-gray-700 p-4\">\n <h3 className=\"font-semibold mb-2\">Configuration</h3>\n <div className=\"text-sm text-gray-400 space-y-1\">\n <p><strong>Brand:</strong> {brandConfig.businessName}</p>\n <p><strong>Modules:</strong> {selectedModules.join(', ')}</p>\n </div>\n </div>\n\n {scaffoldLog.length > 0 && (\n <div className=\"mt-4 bg-gray-900 rounded-lg p-4 font-mono text-sm max-h-48 overflow-y-auto\">\n {scaffoldLog.map((log, i) => (\n <div key={i} className={log.startsWith('✓') ? 'text-green-400' : log.startsWith('🎉') ? 'text-yellow-400' : 'text-gray-400'}>{log}</div>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"flex justify-center gap-4\">\n {scaffoldLog.length === 0 ? (\n <>\n <Button variant=\"secondary\" onClick={() => setStep('modules')}>← Back</Button>\n <Button onClick={handleScaffold} loading={scaffolding}>Generate Scaffolding →</Button>\n </>\n ) : !scaffolding && (\n <Button onClick={() => setStep('integration')}>Continue to Integration →</Button>\n )}\n </div>\n </div>\n )\n }\n\n // ============================================\n // EXISTING FLOW: Scan Codebase\n // ============================================\n\n const handleScan = useCallback(async () => {\n setIsLoading(true)\n setError(null)\n try {\n const res = await fetch('/_uptrade/api/scan', { method: 'POST' })\n const data = await res.json()\n setScanResults({\n forms: (data.forms || []).map((f: DetectedItem) => ({ ...f, selected: true })),\n widgets: (data.widgets || []).map((w: DetectedItem) => ({ ...w, selected: true })),\n metadata: (data.metadata || []).map((m: DetectedItem) => ({ ...m, selected: true })),\n analytics: (data.analytics || []).map((a: DetectedItem) => ({ ...a, selected: false })),\n })\n setStep('migrate')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setIsLoading(false)\n }\n }, [])\n\n function ScanStep() {\n useEffect(() => { handleScan() }, [])\n\n return (\n <div className=\"space-y-6 text-center\">\n <div className=\"text-6xl animate-pulse\">🔍</div>\n <h2 className=\"text-2xl font-bold\">Scanning Your Codebase</h2>\n <p className=\"text-gray-400\">Looking for forms, widgets, and metadata to migrate...</p>\n <div className=\"flex justify-center\">\n <div className=\"w-8 h-8 border-2 border-green-500 border-t-transparent rounded-full animate-spin\" />\n </div>\n </div>\n )\n }\n\n // ============================================\n // EXISTING FLOW: Migration\n // ============================================\n\n function MigrateStep() {\n if (!scanResults) return null\n\n const allItems = [...scanResults.forms, ...scanResults.widgets, ...scanResults.metadata]\n const selectedItems = allItems.filter(i => i.selected)\n\n function toggleItem(type: keyof ScanResults, index: number) {\n setScanResults(prev => {\n if (!prev) return prev\n const updated = { ...prev }\n updated[type] = [...prev[type]]\n updated[type][index] = { ...updated[type][index], selected: !updated[type][index].selected }\n return updated\n })\n }\n\n async function handleMigrate() {\n setIsLoading(true)\n setMigrationLog([])\n setMigrationProgress(0)\n\n for (let i = 0; i < selectedItems.length; i++) {\n const item = selectedItems[i]\n setMigrationLog(prev => [...prev, `Migrating ${item.type} in ${item.file}...`])\n try {\n await fetch('/_uptrade/api/migrate', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ item, projectId: selectedProject?.id })\n })\n setMigrationLog(prev => [...prev, `✓ Migrated ${item.type}`])\n } catch {\n setMigrationLog(prev => [...prev, `✗ Failed to migrate ${item.type}`])\n }\n setMigrationProgress(Math.round(((i + 1) / selectedItems.length) * 100))\n }\n\n setIsLoading(false)\n setStep('integration')\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-2\">Review & Migrate</h2>\n <p className=\"text-gray-400\">Select items to migrate to managed versions</p>\n </div>\n\n {scanResults.forms.length > 0 && (\n <Section title=\"📝 Forms\" count={scanResults.forms.filter(f => f.selected).length}>\n {scanResults.forms.map((form, i) => <ItemRow key={i} item={form} onToggle={() => toggleItem('forms', i)} />)}\n </Section>\n )}\n\n {scanResults.widgets.length > 0 && (\n <Section title=\"💬 Widgets\" count={scanResults.widgets.filter(w => w.selected).length}>\n {scanResults.widgets.map((widget, i) => <ItemRow key={i} item={widget} onToggle={() => toggleItem('widgets', i)} />)}\n </Section>\n )}\n\n {scanResults.metadata.length > 0 && (\n <Section title=\"🏷️ Metadata/Schema\" count={scanResults.metadata.filter(m => m.selected).length}>\n {scanResults.metadata.map((meta, i) => <ItemRow key={i} item={meta} onToggle={() => toggleItem('metadata', i)} />)}\n </Section>\n )}\n\n {allItems.length === 0 && (\n <div className=\"text-center py-8 text-gray-400\">\n <div className=\"text-4xl mb-4\">✨</div>\n <p>No existing forms or widgets detected.</p>\n <p className=\"text-sm\">You're starting fresh!</p>\n </div>\n )}\n\n {migrationLog.length > 0 && (\n <div className=\"bg-gray-900 rounded-lg p-4 font-mono text-sm max-h-48 overflow-y-auto\">\n {migrationLog.map((log, i) => (\n <div key={i} className={log.startsWith('✗') ? 'text-red-400' : log.startsWith('✓') ? 'text-green-400' : 'text-gray-400'}>{log}</div>\n ))}\n </div>\n )}\n\n {isLoading && (\n <div className=\"h-2 bg-gray-700 rounded-full overflow-hidden\">\n <div className=\"h-full bg-green-500 transition-all duration-300\" style={{ width: `${migrationProgress}%` }} />\n </div>\n )}\n\n <div className=\"flex justify-center gap-4\">\n <Button variant=\"secondary\" onClick={() => setStep('integration')}>Skip Migration</Button>\n <Button onClick={handleMigrate} loading={isLoading}>Migrate {selectedItems.length} Items →</Button>\n </div>\n </div>\n )\n }\n\n // ============================================\n // REBUILD FLOW: Domain Input\n // ============================================\n\n function DomainStep() {\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-2\">Enter Existing Site Domain</h2>\n <p className=\"text-gray-400\">We'll scrape it to extract brand, routes, FAQs, and content</p>\n </div>\n\n <div className=\"max-w-lg mx-auto space-y-4\">\n <div>\n <label className=\"block text-sm text-gray-400 mb-2\">Website Domain</label>\n <input type=\"text\" value={scrapeDomain} onChange={(e) => setScrapeDomain(e.target.value)} placeholder=\"example.com\"\n className=\"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg focus:outline-none focus:border-purple-500\" />\n <p className=\"text-sm text-gray-500 mt-2\">Enter without https://</p>\n </div>\n\n <div className=\"bg-purple-500/10 border border-purple-500/30 rounded-lg p-4\">\n <h4 className=\"font-semibold text-purple-400 mb-2\">What we'll extract:</h4>\n <ul className=\"text-sm text-gray-400 space-y-1\">\n <li>🎨 Brand colors, logos, and fonts</li>\n <li>🗺️ Sitemap and all routes</li>\n <li>❓ FAQ sections → Managed FAQs</li>\n <li>📧 Contact info and social profiles</li>\n <li>🔀 Route mappings for redirects</li>\n </ul>\n </div>\n </div>\n\n <div className=\"flex justify-center gap-4\">\n <Button variant=\"secondary\" onClick={() => setStep('setup-type')}>← Back</Button>\n <Button onClick={() => setStep('scrape')} disabled={!scrapeDomain.trim()}>Start Scrape →</Button>\n </div>\n </div>\n )\n }\n\n // ============================================\n // REBUILD FLOW: Scraping\n // ============================================\n\n function ScrapeStep() {\n const [pollInterval, setPollInterval] = useState<NodeJS.Timeout | null>(null)\n\n useEffect(() => {\n startScrape()\n return () => { if (pollInterval) clearInterval(pollInterval) }\n }, [])\n\n async function startScrape() {\n try {\n const res = await callPortalApi('/site-scrape', {\n method: 'POST',\n body: JSON.stringify({ project_id: selectedProject?.id, domain: scrapeDomain.replace(/^https?:\\/\\//, '') })\n })\n if (!res.ok) throw new Error('Failed to start scrape')\n const data = await res.json()\n setScrapeStatus(data)\n\n const interval = setInterval(async () => {\n try {\n const statusRes = await callPortalApi(`/site-scrape/${data.id}/status`)\n const status = await statusRes.json()\n setScrapeStatus(status)\n\n if (status.status === 'completed') {\n clearInterval(interval)\n setPollInterval(null)\n // Initialize redirect mappings from scraped routes\n if (status.routes) {\n setRedirectMappings(status.routes.map((r: any) => ({ from: r.path, to: r.path, enabled: true })))\n }\n setTimeout(() => setStep('review'), 1000)\n } else if (status.status === 'failed') {\n clearInterval(interval)\n setPollInterval(null)\n setError(status.error || 'Scrape failed')\n }\n } catch (err) { console.error('Poll error:', err) }\n }, 2000)\n setPollInterval(interval)\n } catch (err) {\n setError((err as Error).message)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <div className=\"text-6xl animate-pulse mb-4\">🔍</div>\n <h2 className=\"text-2xl font-bold mb-2\">Scraping {scrapeDomain}</h2>\n <p className=\"text-gray-400\">{scrapeStatus?.current_step || 'Starting...'}</p>\n </div>\n\n <div className=\"max-w-lg mx-auto\">\n <div className=\"h-2 bg-gray-700 rounded-full overflow-hidden\">\n <div className=\"h-full bg-gradient-to-r from-purple-500 to-pink-500 transition-all duration-500\" style={{ width: `${scrapeStatus?.progress || 0}%` }} />\n </div>\n <div className=\"flex justify-between text-sm text-gray-500 mt-2\">\n <span>{scrapeStatus?.progress || 0}%</span>\n <span>{scrapeStatus?.pages_found || 0} pages</span>\n </div>\n </div>\n\n {scrapeStatus && (\n <div className=\"grid grid-cols-3 gap-4 max-w-lg mx-auto\">\n <StatCard value={scrapeStatus.pages_found || 0} label=\"Pages\" color=\"purple\" />\n <StatCard value={scrapeStatus.routes_planned || 0} label=\"Routes\" color=\"pink\" />\n <StatCard value={scrapeStatus.faqs_imported || 0} label=\"FAQs\" color=\"blue\" />\n </div>\n )}\n\n {error && (\n <div className=\"bg-red-500/10 border border-red-500/30 text-red-400 px-4 py-3 rounded-lg text-center max-w-lg mx-auto\">\n {error}\n <button onClick={() => { setError(null); startScrape() }} className=\"block mx-auto mt-2 text-sm underline\">Try again</button>\n </div>\n )}\n </div>\n )\n }\n\n // ============================================\n // REBUILD FLOW: Review Results\n // ============================================\n\n function ReviewStep() {\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <div className=\"text-5xl mb-4\">✅</div>\n <h2 className=\"text-2xl font-bold mb-2\">Scrape Complete!</h2>\n <p className=\"text-gray-400\">Here's what we found on {scrapeDomain}</p>\n </div>\n\n <div className=\"max-w-2xl mx-auto space-y-4\">\n {scrapeStatus?.brand && (\n <div className=\"bg-gray-800/50 rounded-lg border border-gray-700 p-4\">\n <h3 className=\"font-semibold mb-3\">🎨 Brand</h3>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <div className=\"text-sm text-gray-400 mb-1\">Business Name</div>\n <div className=\"font-medium\">{scrapeStatus.brand.business_name || 'Not found'}</div>\n </div>\n <div>\n <div className=\"text-sm text-gray-400 mb-1\">Colors</div>\n <div className=\"flex gap-2\">\n {scrapeStatus.brand.primary_colors?.slice(0, 4).map((c, i) => (\n <div key={i} className=\"w-8 h-8 rounded border border-gray-600\" style={{ backgroundColor: c.hex }} title={c.hex} />\n )) || <span className=\"text-gray-500\">None</span>}\n </div>\n </div>\n </div>\n </div>\n )}\n\n <div className=\"grid grid-cols-3 gap-4\">\n <StatCard value={scrapeStatus?.pages_found || 0} label=\"Pages Crawled\" color=\"purple\" large />\n <StatCard value={scrapeStatus?.routes_planned || 0} label=\"Routes Mapped\" color=\"pink\" large />\n <StatCard value={scrapeStatus?.faqs_imported || 0} label=\"FAQs Imported\" color=\"blue\" large />\n </div>\n\n <div className=\"bg-blue-500/10 border border-blue-500/30 rounded-lg p-4\">\n <p className=\"text-sm text-blue-400\">\n 💡 All data saved to your project. FAQs are ready in Portal. Next: set up redirects for SEO.\n </p>\n </div>\n </div>\n\n <div className=\"flex justify-center\">\n <Button onClick={() => setStep('redirects')}>Configure Redirects →</Button>\n </div>\n </div>\n )\n }\n\n // ============================================\n // REBUILD FLOW: Redirect Mappings\n // ============================================\n\n function RedirectsStep() {\n function updateRedirect(index: number, field: 'from' | 'to' | 'enabled', value: string | boolean) {\n setRedirectMappings(prev => {\n const updated = [...prev]\n updated[index] = { ...updated[index], [field]: value }\n return updated\n })\n }\n\n async function handleSaveRedirects() {\n try {\n await callPortalApi(`/site-scrape/${scrapeStatus?.id}/redirects`, {\n method: 'POST',\n body: JSON.stringify({ redirects: redirectMappings.filter(r => r.enabled && r.from !== r.to) })\n })\n setStep('integration')\n } catch (err) {\n setError((err as Error).message)\n }\n }\n\n const changedRedirects = redirectMappings.filter(r => r.enabled && r.from !== r.to)\n\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-2\">Configure Redirects</h2>\n <p className=\"text-gray-400\">Map old URLs to new routes to preserve SEO</p>\n </div>\n\n <div className=\"max-w-3xl mx-auto\">\n <div className=\"bg-gray-800/50 rounded-lg border border-gray-700 overflow-hidden\">\n <div className=\"px-4 py-3 bg-gray-800 flex justify-between items-center border-b border-gray-700\">\n <span className=\"font-medium\">Route Mappings</span>\n <span className=\"text-sm text-gray-400\">{changedRedirects.length} redirects</span>\n </div>\n <div className=\"max-h-80 overflow-y-auto divide-y divide-gray-700\">\n {redirectMappings.map((redirect, i) => (\n <div key={i} className={`flex items-center gap-4 px-4 py-3 ${!redirect.enabled ? 'opacity-50' : ''}`}>\n <input type=\"checkbox\" checked={redirect.enabled} onChange={(e) => updateRedirect(i, 'enabled', e.target.checked)}\n className=\"w-5 h-5 rounded border-gray-600 bg-gray-700\" />\n <input type=\"text\" value={redirect.from} onChange={(e) => updateRedirect(i, 'from', e.target.value)}\n className=\"flex-1 px-3 py-2 bg-gray-800 border border-gray-600 rounded text-sm font-mono\" placeholder=\"/old-path\" />\n <span className=\"text-gray-500\">→</span>\n <input type=\"text\" value={redirect.to} onChange={(e) => updateRedirect(i, 'to', e.target.value)}\n className=\"flex-1 px-3 py-2 bg-gray-800 border border-gray-600 rounded text-sm font-mono\" placeholder=\"/new-path\" />\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"mt-4 bg-yellow-500/10 border border-yellow-500/30 rounded-lg p-4\">\n <p className=\"text-sm text-yellow-400\">\n ⚠️ Only routes where \"from\" differs from \"to\" will create redirects. \n Same paths = no redirect needed.\n </p>\n </div>\n </div>\n\n <div className=\"flex justify-center gap-4\">\n <Button variant=\"secondary\" onClick={() => setStep('review')}>← Back</Button>\n <Button onClick={handleSaveRedirects}>\n {changedRedirects.length > 0 ? `Save ${changedRedirects.length} Redirects →` : 'Skip & Continue →'}\n </Button>\n </div>\n </div>\n )\n }\n\n // ============================================\n // COMMON: Integration Code\n // ============================================\n\n function IntegrationStep() {\n const envVars = `NEXT_PUBLIC_UPTRADE_PROJECT_ID=${selectedProject?.id || 'xxx'}\nNEXT_PUBLIC_SUPABASE_URL=${config?.url || 'https://xxx.supabase.co'}\nNEXT_PUBLIC_SUPABASE_ANON_KEY=${config?.anonKey || 'xxx'}`\n\n const providerCode = `import { SiteKitProvider } from '@sonordev/site-kit'\nimport { ManagedFavicon } from '@sonordev/site-kit/images'\n\nexport default function RootLayout({ children }) {\n return (\n <html>\n <head>\n <ManagedFavicon />\n </head>\n <body>\n <SiteKitProvider\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n supabaseUrl={process.env.NEXT_PUBLIC_SUPABASE_URL!}\n supabaseAnonKey={process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!}\n >\n {children}\n </SiteKitProvider>\n </body>\n </html>\n )\n}`\n\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-2\">Integration Code</h2>\n <p className=\"text-gray-400\">Add these to connect your project to Uptrade</p>\n </div>\n\n <div className=\"max-w-2xl mx-auto space-y-4\">\n <ConfigPreview title=\"Environment Variables\" description=\".env.local\" content={envVars} />\n <ConfigPreview title=\"Layout Provider\" description=\"app/layout.tsx\" content={providerCode} />\n <div className=\"text-center text-gray-500 text-sm\">\n <p>Install: <code className=\"bg-gray-800 px-2 py-1 rounded\">pnpm add @sonordev/site-kit</code></p>\n </div>\n </div>\n\n <div className=\"flex justify-center gap-4\">\n <Button variant=\"secondary\" onClick={() => {\n if (setupType === 'new') setStep('scaffold')\n else if (setupType === 'existing') setStep('migrate')\n else setStep('redirects')\n }}>← Back</Button>\n <Button onClick={() => setStep('copilot')}>Continue to Copilot →</Button>\n </div>\n </div>\n )\n }\n\n // ============================================\n // COMMON: Copilot Instructions\n // ============================================\n\n function CopilotStep() {\n useEffect(() => { generateCopilotInstructions() }, [])\n\n async function generateCopilotInstructions() {\n setGeneratingCopilot(true)\n try {\n const res = await callPortalApi('/signal/generate-copilot-instructions', {\n method: 'POST',\n body: JSON.stringify({\n projectId: selectedProject?.id,\n setupType,\n modules: selectedModules,\n domain: scrapeDomain || selectedProject?.domain,\n brand: setupType === 'new' ? brandConfig : scrapeStatus?.brand,\n routes: scrapeStatus?.routes,\n })\n })\n if (res.ok) {\n const data = await res.json()\n setCopilotInstructions(data.instructions || data.content || '')\n } else {\n setCopilotInstructions(generateFallbackTemplate())\n }\n } catch {\n setCopilotInstructions(generateFallbackTemplate())\n } finally {\n setGeneratingCopilot(false)\n }\n }\n\n function generateFallbackTemplate() {\n const brand = setupType === 'new' ? brandConfig : scrapeStatus?.brand\n const brandName = (brand as any)?.businessName || (brand as any)?.business_name || 'TBD'\n return `# ${selectedProject?.name} - Copilot Instructions\n\n**Project:** ${selectedProject?.name}\n**Domain:** ${scrapeDomain || selectedProject?.domain}\n**Stack:** Next.js + @sonordev/site-kit\n**Setup Type:** ${setupType}\n\n## Brand\n- **Name:** ${brandName}\n- **Primary Color:** ${brandConfig?.primaryColor || 'TBD'}\n- **Secondary Color:** ${brandConfig?.secondaryColor || 'TBD'}\n\n## Enabled Modules\n${selectedModules.map(m => `- ${m}`).join('\\n')}\n\n## Development Notes\n- This project uses @sonordev/site-kit for managed content\n- Forms, FAQs, and metadata are managed via Sonor\n- Analytics tracked via SiteKitProvider\n${setupType === 'rebuild' ? '- This is a rebuild of an existing site - check redirects for SEO' : ''}\n`\n }\n\n async function copyToClipboard() {\n await navigator.clipboard.writeText(copilotInstructions)\n alert('Copied!')\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-2\">Copilot Instructions</h2>\n <p className=\"text-gray-400\">Add this to your repo for better AI assistance</p>\n </div>\n\n <div className=\"max-w-2xl mx-auto\">\n {generatingCopilot ? (\n <div className=\"bg-gray-800/50 rounded-lg border border-gray-700 p-8 text-center\">\n <div className=\"w-8 h-8 border-2 border-blue-500 border-t-transparent rounded-full animate-spin mx-auto mb-4\" />\n <p className=\"text-gray-400\">Generating with AI...</p>\n </div>\n ) : (\n <div className=\"bg-gray-800/50 rounded-lg border border-gray-700 overflow-hidden\">\n <div className=\"px-4 py-2 bg-gray-800 flex justify-between items-center\">\n <span className=\"font-medium\">.github/copilot-instructions.md</span>\n <button onClick={copyToClipboard} className=\"text-sm text-blue-400 hover:underline\">Copy</button>\n </div>\n <pre className=\"p-4 text-sm overflow-x-auto max-h-80 overflow-y-auto\">\n <code className=\"text-gray-300 whitespace-pre-wrap\">{copilotInstructions}</code>\n </pre>\n </div>\n )}\n\n <div className=\"mt-4 bg-green-500/10 border border-green-500/30 rounded-lg p-4\">\n <p className=\"text-sm text-green-400\">\n 💡 Save as <code className=\"bg-gray-800 px-1 rounded\">.github/copilot-instructions.md</code> for GitHub Copilot context.\n </p>\n </div>\n </div>\n\n <div className=\"flex justify-center gap-4\">\n <Button variant=\"secondary\" onClick={() => setStep('integration')}>← Back</Button>\n <Button onClick={() => setStep('complete')}>Finish Setup →</Button>\n </div>\n </div>\n )\n }\n\n // ============================================\n // Step: Complete\n // ============================================\n\n function CompleteStep() {\n const [removing, setRemoving] = useState(false)\n\n async function handleRemoveSetup() {\n setRemoving(true)\n try {\n await fetch('/_uptrade/api/self-destruct', { method: 'POST' })\n window.location.href = '/'\n } catch (err) {\n setError((err as Error).message)\n setRemoving(false)\n }\n }\n\n function handleReset() {\n localStorage.removeItem('uptrade_access_token')\n setStep('welcome')\n setIsAuthenticated(false)\n setAccessToken(null)\n setUserEmail(null)\n setSelectedOrg(null)\n setSelectedProject(null)\n setSetupType(null)\n }\n\n return (\n <div className=\"space-y-6 text-center\">\n <div className=\"text-6xl\">🎉</div>\n <h2 className=\"text-3xl font-bold\">You're All Set!</h2>\n <p className=\"text-gray-400 text-lg\">Site-Kit is configured for {selectedProject?.name}</p>\n\n <div className=\"grid grid-cols-2 gap-4 max-w-lg mx-auto my-8\">\n <QuickLink icon=\"📊\" title=\"Project Dashboard\" href={`https://portal.uptrademedia.com/projects/${selectedProject?.id}`} />\n <QuickLink icon=\"📝\" title=\"Manage Forms\" href={`https://portal.uptrademedia.com/projects/${selectedProject?.id}/forms`} />\n <QuickLink icon=\"📖\" title=\"Documentation\" href=\"https://docs.uptrademedia.com/site-kit\" />\n <QuickLink icon=\"💬\" title=\"Get Help\" href=\"https://portal.uptrademedia.com/messages\" />\n </div>\n\n <div className=\"flex gap-4 justify-center\">\n <Button variant=\"secondary\" onClick={handleReset}>Restart Setup</Button>\n </div>\n\n <div className=\"pt-8 border-t border-gray-700\">\n <p className=\"text-gray-400 mb-4\">Remove this setup wizard from your project?</p>\n <Button variant=\"danger\" onClick={handleRemoveSetup} loading={removing}>Remove Setup Wizard</Button>\n <p className=\"text-gray-500 text-sm mt-2\">This will delete the /_uptrade route</p>\n </div>\n </div>\n )\n }\n\n // ============================================\n // Render\n // ============================================\n\n // Render step content directly to avoid component recreation on state changes\n const renderStep = () => {\n switch (step) {\n case 'welcome': return <WelcomeStep />\n case 'auth': return <AuthStep />\n case 'project': return (\n <div className=\"space-y-6\" key=\"project-step\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-2\">Select Your Project</h2>\n <p className=\"text-gray-400\">Choose an existing project or create a new one</p>\n </div>\n\n <div className=\"max-w-lg mx-auto\">\n <div className=\"flex justify-between items-center mb-2\">\n <label className=\"text-sm text-gray-400\">Organization</label>\n <button type=\"button\" className=\"text-sm text-blue-400 hover:underline\" onClick={() => setShowNewOrg(!showNewOrg)}>\n {showNewOrg ? 'Select existing' : '+ New organization'}\n </button>\n </div>\n \n {showNewOrg ? (\n <div className=\"space-y-3 p-4 bg-gray-800/50 rounded-lg border border-gray-700\">\n <input \n id=\"new-org-name\"\n key=\"new-org-name\"\n type=\"text\" \n value={newOrgName} \n onChange={(e) => setNewOrgName(e.target.value)} \n placeholder=\"Organization name\"\n autoComplete=\"off\"\n className=\"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg focus:outline-none focus:border-blue-500\" \n />\n <Button onClick={handleCreateOrg} loading={creatingOrg} disabled={!newOrgName.trim()}>Create Organization</Button>\n </div>\n ) : (\n <select value={selectedOrg?.id || ''} onChange={(e) => setSelectedOrg(organizations.find(o => o.id === e.target.value) || null)}\n className=\"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg\">\n <option value=\"\">Select organization...</option>\n {organizations.map(org => <option key={org.id} value={org.id}>{org.name}</option>)}\n </select>\n )}\n </div>\n\n {selectedOrg && (\n <div className=\"max-w-lg mx-auto space-y-4\">\n <div className=\"flex justify-between items-center\">\n <label className=\"text-sm text-gray-400\">Projects</label>\n <button type=\"button\" className=\"text-sm text-blue-400 hover:underline\" onClick={() => setCreateNewProject(!createNewProject)}>\n {createNewProject ? 'Select existing' : '+ Create new'}\n </button>\n </div>\n\n {createNewProject ? (\n <div className=\"space-y-4 p-4 bg-gray-800/50 rounded-lg border border-gray-700\">\n <input \n id=\"new-project-name\"\n key=\"new-project-name\"\n type=\"text\" \n value={newProjectName} \n onChange={(e) => setNewProjectName(e.target.value)} \n placeholder=\"Project name\"\n autoComplete=\"off\"\n className=\"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg\" \n />\n <input \n id=\"new-project-domain\"\n key=\"new-project-domain\"\n type=\"text\" \n value={newProjectDomain} \n onChange={(e) => setNewProjectDomain(e.target.value)} \n placeholder=\"localhost\"\n autoComplete=\"off\"\n className=\"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg\" \n />\n <Button onClick={handleCreateProject} loading={creatingProject} disabled={!newProjectName.trim()}>Create Project</Button>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {selectedOrg.projects.length === 0 ? (\n <p className=\"text-gray-500 text-center py-8\">\n No projects yet. <button type=\"button\" className=\"text-blue-400 hover:underline\" onClick={() => setCreateNewProject(true)}>Create one</button>\n </p>\n ) : selectedOrg.projects.map(project => (\n <button type=\"button\" key={project.id} onClick={() => handleSelectProject(project)}\n className=\"w-full text-left px-4 py-3 bg-gray-800/50 hover:bg-gray-800 border border-gray-700 rounded-lg transition-colors\">\n <div className=\"font-medium\">{project.name}</div>\n <div className=\"text-sm text-gray-400\">{project.domain}</div>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )\n case 'setup-type': return <SetupTypeStep />\n case 'brand': return <BrandStep />\n case 'modules': return <ModulesStep />\n case 'scaffold': return <ScaffoldStep />\n case 'scan': return <ScanStep />\n case 'migrate': return <MigrateStep />\n case 'domain': return <DomainStep />\n case 'scrape': return <ScrapeStep />\n case 'review': return <ReviewStep />\n case 'redirects': return <RedirectsStep />\n case 'integration': return <IntegrationStep />\n case 'copilot': return <CopilotStep />\n case 'complete': return <CompleteStep />\n default: return <WelcomeStep />\n }\n }\n\n const getProgress = () => {\n const common = ['welcome', 'auth', 'project', 'setup-type']\n const newFlow = ['brand', 'modules', 'scaffold']\n const existingFlow = ['modules', 'scan', 'migrate']\n const rebuildFlow = ['domain', 'scrape', 'review', 'redirects']\n const finish = ['integration', 'copilot', 'complete']\n \n const flow = setupType === 'new' ? [...common, ...newFlow, ...finish]\n : setupType === 'existing' ? [...common, ...existingFlow, ...finish]\n : setupType === 'rebuild' ? [...common, ...rebuildFlow, ...finish]\n : [...common, ...finish]\n \n const idx = flow.indexOf(step)\n return idx >= 0 ? (idx / (flow.length - 1)) * 100 : 0\n }\n\n const setupLabels = { new: '🆕 New Site', existing: '🔧 Existing', rebuild: '🔄 Rebuild' }\n\n return (\n <div style={{ \n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 99999,\n minHeight: '100vh', \n backgroundColor: '#0f172a', \n color: '#ffffff',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n overflow: 'auto'\n }} className=\"min-h-screen bg-gradient-to-br from-gray-900 via-gray-900 to-gray-800 text-white\">\n <div style={{ position: 'fixed', top: 0, left: 0, right: 0, height: '4px', backgroundColor: '#1e293b', zIndex: 100000 }}>\n <div style={{ height: '100%', background: 'linear-gradient(to right, #3b82f6, #8b5cf6)', transition: 'width 0.5s', width: `${getProgress()}%` }} />\n </div>\n\n <header style={{ padding: '1.5rem 2rem', display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <div className=\"flex items-center gap-3\">\n <div className=\"w-8 h-8 bg-gradient-to-br from-blue-500 to-purple-600 rounded-lg\" />\n <span className=\"font-semibold\">Uptrade Site-Kit</span>\n {setupType && (\n <span className={`text-xs px-2 py-1 rounded ${\n setupType === 'new' ? 'bg-blue-500/20 text-blue-400' \n : setupType === 'existing' ? 'bg-green-500/20 text-green-400'\n : 'bg-purple-500/20 text-purple-400'\n }`}>{setupLabels[setupType]}</span>\n )}\n </div>\n {userEmail && <div className=\"text-gray-400 text-sm\">{userEmail}</div>}\n </header>\n\n <main className=\"max-w-4xl mx-auto px-8 py-12\">{renderStep()}</main>\n\n <footer className=\"fixed bottom-0 left-0 right-0 px-8 py-4 text-center text-gray-500 text-sm\">\n <a href=\"https://uptrademedia.com\" target=\"_blank\" className=\"hover:text-gray-300\">Uptrade Media</a>\n {' · '}\n <a href=\"https://docs.uptrademedia.com\" target=\"_blank\" className=\"hover:text-gray-300\">Docs</a>\n </footer>\n </div>\n )\n}\n\n// ============================================\n// UI Components\n// ============================================\n\nfunction Button({ children, onClick, loading, disabled, variant = 'primary' }: {\n children: React.ReactNode; onClick?: () => void; loading?: boolean; disabled?: boolean; variant?: 'primary' | 'secondary' | 'danger'\n}) {\n const variants = {\n primary: 'bg-gradient-to-r from-blue-500 to-blue-600 hover:from-blue-600 hover:to-blue-700',\n secondary: 'bg-gray-700 hover:bg-gray-600',\n danger: 'bg-red-600/20 border border-red-500/30 text-red-400 hover:bg-red-600/30'\n }\n return (\n <button onClick={onClick} disabled={loading || disabled}\n className={`px-6 py-3 rounded-lg font-medium transition-all disabled:opacity-50 disabled:cursor-not-allowed ${variants[variant]}`}>\n {loading ? <span className=\"flex items-center gap-2\"><span className=\"w-4 h-4 border-2 border-current border-t-transparent rounded-full animate-spin\" />Loading...</span> : children}\n </button>\n )\n}\n\nfunction FeatureCard({ icon, title, description }: { icon: string; title: string; description: string }) {\n return (\n <div className=\"p-6 bg-gray-800/50 rounded-xl border border-gray-700 text-center\">\n <div className=\"text-3xl mb-3\">{icon}</div>\n <h3 className=\"font-semibold mb-1\">{title}</h3>\n <p className=\"text-sm text-gray-400\">{description}</p>\n </div>\n )\n}\n\nfunction StatCard({ value, label, color, large }: { value: number; label: string; color: 'purple' | 'pink' | 'blue'; large?: boolean }) {\n const colors = { purple: 'text-purple-400', pink: 'text-pink-400', blue: 'text-blue-400' }\n return (\n <div className=\"bg-gray-800/50 rounded-lg p-4 text-center border border-gray-700\">\n <div className={`${large ? 'text-3xl' : 'text-2xl'} font-bold ${colors[color]}`}>{value}</div>\n <div className=\"text-sm text-gray-400\">{label}</div>\n </div>\n )\n}\n\nfunction Section({ title, count, children }: { title: string; count: number; children: React.ReactNode }) {\n return (\n <div className=\"bg-gray-800/30 rounded-xl border border-gray-700 overflow-hidden\">\n <div className=\"px-4 py-3 bg-gray-800/50 flex justify-between items-center\">\n <span className=\"font-medium\">{title}</span>\n <span className=\"text-sm text-gray-400\">{count} selected</span>\n </div>\n <div className=\"divide-y divide-gray-700\">{children}</div>\n </div>\n )\n}\n\nfunction ItemRow({ item, onToggle }: { item: DetectedItem; onToggle: () => void }) {\n return (\n <div className=\"flex items-center gap-4 px-4 py-3 hover:bg-gray-800/30 transition-colors\">\n <input type=\"checkbox\" checked={item.selected} onChange={onToggle} className=\"w-5 h-5 rounded border-gray-600 bg-gray-700 text-blue-500\" />\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium truncate\">{item.type}</div>\n <div className=\"text-sm text-gray-400 truncate\">{item.file}:{item.line}</div>\n </div>\n </div>\n )\n}\n\nfunction ConfigPreview({ title, description, content }: { title: string; description: string; content: string }) {\n async function copy() { await navigator.clipboard.writeText(content) }\n return (\n <div className=\"bg-gray-800/50 rounded-lg border border-gray-700 overflow-hidden\">\n <div className=\"px-4 py-2 bg-gray-800 flex justify-between items-center\">\n <span className=\"font-medium\">{title}</span>\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-400\">{description}</span>\n <button onClick={copy} className=\"text-sm text-blue-400 hover:underline\">Copy</button>\n </div>\n </div>\n <pre className=\"p-4 text-sm overflow-x-auto\"><code className=\"text-green-400\">{content}</code></pre>\n </div>\n )\n}\n\nfunction QuickLink({ icon, title, href }: { icon: string; title: string; href: string }) {\n return (\n <a href={href} target=\"_blank\" className=\"flex items-center gap-3 p-4 bg-gray-800/50 rounded-lg border border-gray-700 hover:bg-gray-800 transition-colors\">\n <span className=\"text-2xl\">{icon}</span>\n <span className=\"font-medium\">{title}</span>\n </a>\n )\n}\n\nexport default SetupWizard\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/site-config/index.ts"],"names":[],"mappings":"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","file":"chunk-7557OTHW.js","sourcesContent":["/**\n * Site config from Portal (project-info) by API key.\n * Resolves site_url and domain so consumers only need NEXT_PUBLIC_UPTRADE_API_KEY.\n */\n\nexport interface SiteConfig {\n site_url: string\n domain: string\n}\n\nexport interface GetSiteConfigOptions {\n apiKey?: string\n apiUrl?: string\n}\n\nconst DEFAULT_API_URL = 'https://api.uptrademedia.com'\nconst CACHE_TTL_MS = 10 * 60 * 1000 // 10 minutes\n\ninterface CacheEntry {\n site_url: string\n domain: string\n expiry: number\n}\nconst cache = new Map<string, CacheEntry>()\n\nfunction getApiKey(options?: GetSiteConfigOptions): string | undefined {\n if (options?.apiKey) return options.apiKey\n if (typeof process !== 'undefined' && process.env) {\n return process.env.NEXT_PUBLIC_UPTRADE_API_KEY || process.env.UPTRADE_API_KEY\n }\n return undefined\n}\n\nfunction getApiUrl(options?: GetSiteConfigOptions): string {\n if (options?.apiUrl) return options.apiUrl.replace(/\\/$/, '')\n if (typeof process !== 'undefined' && process.env) {\n const u = process.env.NEXT_PUBLIC_UPTRADE_API_URL || process.env.UPTRADE_API_URL\n if (u) return u.replace(/\\/$/, '')\n }\n return DEFAULT_API_URL\n}\n\n/**\n * Fetch site_url and domain from Portal project-info for the given API key.\n * Uses in-memory cache (TTL 10 min) keyed by apiKey.\n * Safe for Edge (middleware) and Node (route handlers).\n */\nexport async function getSiteConfig(\n options?: GetSiteConfigOptions\n): Promise<SiteConfig | null> {\n const apiKey = getApiKey(options)\n if (!apiKey) return null\n\n const now = Date.now()\n const cached = cache.get(apiKey)\n if (cached && now < cached.expiry) {\n return { site_url: cached.site_url, domain: cached.domain }\n }\n\n const apiUrl = getApiUrl(options)\n const url = `${apiUrl}/api/public/seo/project-info`\n\n try {\n const res = await fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n next: { revalidate: 600 },\n })\n\n if (!res.ok) return null\n\n const data = await res.json()\n const site_url = data.site_url ?? (data.project_domain ? `https://${String(data.project_domain).replace(/^(https?:\\/\\/)?(www\\.)?/, '').replace(/\\/$/, '')}` : null)\n const domain = data.domain ?? (data.project_domain ? String(data.project_domain).replace(/^(https?:\\/\\/)?(www\\.)?/, '').replace(/\\/$/, '') : null)\n\n if (!site_url || !domain || typeof site_url !== 'string' || typeof domain !== 'string') return null\n\n cache.set(apiKey, {\n site_url,\n domain,\n expiry: now + CACHE_TTL_MS,\n })\n\n return { site_url, domain }\n } catch {\n return null\n }\n}\n\n/**\n * Clear in-memory site config cache (e.g. for tests).\n */\nexport function clearSiteConfigCache(): void {\n cache.clear()\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/migrator/index.ts"],"names":["path","fs","match"],"mappings":"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","file":"chunk-7FUV73JZ.js","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 Uptrade\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.uptrademedia.com/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 Uptrade 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 Uptrade Engage */}')\n break\n case 'drift':\n content = content.replace(/<Script[^>]*drift[^>]*\\/?>(?:<\\/Script>)?/gi, '{/* Drift replaced with Uptrade 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.uptrademedia.com/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.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com'\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.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com'\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"]}