@sonordev/site-kit 1.2.7

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 (300) hide show
  1. package/README.md +376 -0
  2. package/dist/SetupWizard-Cki06kB0.d.mts +12 -0
  3. package/dist/SetupWizard-Cki06kB0.d.ts +12 -0
  4. package/dist/analytics/index.d.mts +93 -0
  5. package/dist/analytics/index.d.ts +93 -0
  6. package/dist/analytics/index.js +89 -0
  7. package/dist/analytics/index.js.map +1 -0
  8. package/dist/analytics/index.mjs +71 -0
  9. package/dist/analytics/index.mjs.map +1 -0
  10. package/dist/api-CWtoFJCO.d.mts +137 -0
  11. package/dist/api-CWtoFJCO.d.ts +137 -0
  12. package/dist/blog/index.d.mts +305 -0
  13. package/dist/blog/index.d.ts +305 -0
  14. package/dist/blog/index.js +1578 -0
  15. package/dist/blog/index.js.map +1 -0
  16. package/dist/blog/index.mjs +1562 -0
  17. package/dist/blog/index.mjs.map +1 -0
  18. package/dist/blog/server.d.mts +229 -0
  19. package/dist/blog/server.d.ts +229 -0
  20. package/dist/blog/server.js +692 -0
  21. package/dist/blog/server.js.map +1 -0
  22. package/dist/blog/server.mjs +666 -0
  23. package/dist/blog/server.mjs.map +1 -0
  24. package/dist/chunk-24277A3Q.mjs +968 -0
  25. package/dist/chunk-24277A3Q.mjs.map +1 -0
  26. package/dist/chunk-373TK6TZ.js +321 -0
  27. package/dist/chunk-373TK6TZ.js.map +1 -0
  28. package/dist/chunk-3MYZS6PD.js +30 -0
  29. package/dist/chunk-3MYZS6PD.js.map +1 -0
  30. package/dist/chunk-43GBM4SX.js +283 -0
  31. package/dist/chunk-43GBM4SX.js.map +1 -0
  32. package/dist/chunk-4XPGGLVP.mjs +53 -0
  33. package/dist/chunk-4XPGGLVP.mjs.map +1 -0
  34. package/dist/chunk-622GAQP5.js +2008 -0
  35. package/dist/chunk-622GAQP5.js.map +1 -0
  36. package/dist/chunk-6BIPAKL4.mjs +28 -0
  37. package/dist/chunk-6BIPAKL4.mjs.map +1 -0
  38. package/dist/chunk-6ZCISNAB.mjs +343 -0
  39. package/dist/chunk-6ZCISNAB.mjs.map +1 -0
  40. package/dist/chunk-72MQFHYJ.js +1429 -0
  41. package/dist/chunk-72MQFHYJ.js.map +1 -0
  42. package/dist/chunk-7557OTHW.js +62 -0
  43. package/dist/chunk-7557OTHW.js.map +1 -0
  44. package/dist/chunk-7FUV73JZ.js +981 -0
  45. package/dist/chunk-7FUV73JZ.js.map +1 -0
  46. package/dist/chunk-7RF6PVHA.mjs +324 -0
  47. package/dist/chunk-7RF6PVHA.mjs.map +1 -0
  48. package/dist/chunk-7RYCHO6D.mjs +134 -0
  49. package/dist/chunk-7RYCHO6D.mjs.map +1 -0
  50. package/dist/chunk-7UKPRW25.mjs +1999 -0
  51. package/dist/chunk-7UKPRW25.mjs.map +1 -0
  52. package/dist/chunk-7URAOG2M.js +14864 -0
  53. package/dist/chunk-7URAOG2M.js.map +1 -0
  54. package/dist/chunk-AFAO3TGS.mjs +810 -0
  55. package/dist/chunk-AFAO3TGS.mjs.map +1 -0
  56. package/dist/chunk-BYLIU6XG.js +343 -0
  57. package/dist/chunk-BYLIU6XG.js.map +1 -0
  58. package/dist/chunk-D63MUKZ6.mjs +4423 -0
  59. package/dist/chunk-D63MUKZ6.mjs.map +1 -0
  60. package/dist/chunk-DDKW2FNA.js +390 -0
  61. package/dist/chunk-DDKW2FNA.js.map +1 -0
  62. package/dist/chunk-DQYMKR27.mjs +341 -0
  63. package/dist/chunk-DQYMKR27.mjs.map +1 -0
  64. package/dist/chunk-DW5UJKHH.js +221 -0
  65. package/dist/chunk-DW5UJKHH.js.map +1 -0
  66. package/dist/chunk-EEZCR6E6.js +50 -0
  67. package/dist/chunk-EEZCR6E6.js.map +1 -0
  68. package/dist/chunk-GCJXQ4AG.mjs +59 -0
  69. package/dist/chunk-GCJXQ4AG.mjs.map +1 -0
  70. package/dist/chunk-JGNQK2G6.mjs +14845 -0
  71. package/dist/chunk-JGNQK2G6.mjs.map +1 -0
  72. package/dist/chunk-JTLOJLWQ.mjs +563 -0
  73. package/dist/chunk-JTLOJLWQ.mjs.map +1 -0
  74. package/dist/chunk-K23A4G76.mjs +202 -0
  75. package/dist/chunk-K23A4G76.mjs.map +1 -0
  76. package/dist/chunk-KKU3K7RG.js +336 -0
  77. package/dist/chunk-KKU3K7RG.js.map +1 -0
  78. package/dist/chunk-KUGMH4ZF.js +571 -0
  79. package/dist/chunk-KUGMH4ZF.js.map +1 -0
  80. package/dist/chunk-LBVWVP72.js +110 -0
  81. package/dist/chunk-LBVWVP72.js.map +1 -0
  82. package/dist/chunk-LIVWLY2P.js +138 -0
  83. package/dist/chunk-LIVWLY2P.js.map +1 -0
  84. package/dist/chunk-M2T6R7BA.mjs +1003 -0
  85. package/dist/chunk-M2T6R7BA.mjs.map +1 -0
  86. package/dist/chunk-MV3QN7PW.mjs +47 -0
  87. package/dist/chunk-MV3QN7PW.mjs.map +1 -0
  88. package/dist/chunk-OB7E654K.js +72 -0
  89. package/dist/chunk-OB7E654K.js.map +1 -0
  90. package/dist/chunk-OIIKTGRL.mjs +380 -0
  91. package/dist/chunk-OIIKTGRL.mjs.map +1 -0
  92. package/dist/chunk-P3UWIUJS.mjs +1427 -0
  93. package/dist/chunk-P3UWIUJS.mjs.map +1 -0
  94. package/dist/chunk-PKN27UMH.mjs +136 -0
  95. package/dist/chunk-PKN27UMH.mjs.map +1 -0
  96. package/dist/chunk-QXV4667R.mjs +105 -0
  97. package/dist/chunk-QXV4667R.mjs.map +1 -0
  98. package/dist/chunk-S7FRYNSU.mjs +315 -0
  99. package/dist/chunk-S7FRYNSU.mjs.map +1 -0
  100. package/dist/chunk-TFLQX7K7.mjs +68 -0
  101. package/dist/chunk-TFLQX7K7.mjs.map +1 -0
  102. package/dist/chunk-UWE5PCYJ.mjs +279 -0
  103. package/dist/chunk-UWE5PCYJ.mjs.map +1 -0
  104. package/dist/chunk-UYFDNX2F.js +4469 -0
  105. package/dist/chunk-UYFDNX2F.js.map +1 -0
  106. package/dist/chunk-W4PALSGM.js +350 -0
  107. package/dist/chunk-W4PALSGM.js.map +1 -0
  108. package/dist/chunk-WECQ6KOB.js +1008 -0
  109. package/dist/chunk-WECQ6KOB.js.map +1 -0
  110. package/dist/chunk-XQQWI6WB.js +814 -0
  111. package/dist/chunk-XQQWI6WB.js.map +1 -0
  112. package/dist/chunk-XZJOZJB6.js +140 -0
  113. package/dist/chunk-XZJOZJB6.js.map +1 -0
  114. package/dist/chunk-ZSMWDLMK.js +63 -0
  115. package/dist/chunk-ZSMWDLMK.js.map +1 -0
  116. package/dist/cli/index.js +37243 -0
  117. package/dist/cli/index.js.map +1 -0
  118. package/dist/cli/index.mjs +37209 -0
  119. package/dist/cli/index.mjs.map +1 -0
  120. package/dist/commerce/index.d.mts +170 -0
  121. package/dist/commerce/index.d.ts +170 -0
  122. package/dist/commerce/index.js +174 -0
  123. package/dist/commerce/index.js.map +1 -0
  124. package/dist/commerce/index.mjs +5 -0
  125. package/dist/commerce/index.mjs.map +1 -0
  126. package/dist/commerce/server.d.mts +107 -0
  127. package/dist/commerce/server.d.ts +107 -0
  128. package/dist/commerce/server.js +187 -0
  129. package/dist/commerce/server.js.map +1 -0
  130. package/dist/commerce/server.mjs +177 -0
  131. package/dist/commerce/server.mjs.map +1 -0
  132. package/dist/config/index.d.mts +43 -0
  133. package/dist/config/index.d.ts +43 -0
  134. package/dist/config/index.js +66 -0
  135. package/dist/config/index.js.map +1 -0
  136. package/dist/config/index.mjs +64 -0
  137. package/dist/config/index.mjs.map +1 -0
  138. package/dist/engage/index.d.mts +33 -0
  139. package/dist/engage/index.d.ts +33 -0
  140. package/dist/engage/index.js +22 -0
  141. package/dist/engage/index.js.map +1 -0
  142. package/dist/engage/index.mjs +5 -0
  143. package/dist/engage/index.mjs.map +1 -0
  144. package/dist/forms/index.d.mts +437 -0
  145. package/dist/forms/index.d.ts +437 -0
  146. package/dist/forms/index.js +1168 -0
  147. package/dist/forms/index.js.map +1 -0
  148. package/dist/forms/index.mjs +1142 -0
  149. package/dist/forms/index.mjs.map +1 -0
  150. package/dist/generators-2XKQMPKH.mjs +4 -0
  151. package/dist/generators-2XKQMPKH.mjs.map +1 -0
  152. package/dist/generators-DTMO36DV.js +33 -0
  153. package/dist/generators-DTMO36DV.js.map +1 -0
  154. package/dist/images/index.d.mts +4 -0
  155. package/dist/images/index.d.ts +4 -0
  156. package/dist/images/index.js +46 -0
  157. package/dist/images/index.js.map +1 -0
  158. package/dist/images/index.mjs +5 -0
  159. package/dist/images/index.mjs.map +1 -0
  160. package/dist/images/server.d.mts +69 -0
  161. package/dist/images/server.d.ts +69 -0
  162. package/dist/images/server.js +21 -0
  163. package/dist/images/server.js.map +1 -0
  164. package/dist/images/server.mjs +4 -0
  165. package/dist/images/server.mjs.map +1 -0
  166. package/dist/index.d.mts +846 -0
  167. package/dist/index.d.ts +846 -0
  168. package/dist/index.js +2623 -0
  169. package/dist/index.js.map +1 -0
  170. package/dist/index.mjs +2416 -0
  171. package/dist/index.mjs.map +1 -0
  172. package/dist/layout/index.d.mts +53 -0
  173. package/dist/layout/index.d.ts +53 -0
  174. package/dist/layout/index.js +187 -0
  175. package/dist/layout/index.js.map +1 -0
  176. package/dist/layout/index.mjs +185 -0
  177. package/dist/layout/index.mjs.map +1 -0
  178. package/dist/llms/index.d.mts +448 -0
  179. package/dist/llms/index.d.ts +448 -0
  180. package/dist/llms/index.js +581 -0
  181. package/dist/llms/index.js.map +1 -0
  182. package/dist/llms/index.mjs +529 -0
  183. package/dist/llms/index.mjs.map +1 -0
  184. package/dist/manifest/index.d.mts +62 -0
  185. package/dist/manifest/index.d.ts +62 -0
  186. package/dist/manifest/index.js +85 -0
  187. package/dist/manifest/index.js.map +1 -0
  188. package/dist/manifest/index.mjs +83 -0
  189. package/dist/manifest/index.mjs.map +1 -0
  190. package/dist/middleware/index.d.mts +63 -0
  191. package/dist/middleware/index.d.ts +63 -0
  192. package/dist/middleware/index.js +54 -0
  193. package/dist/middleware/index.js.map +1 -0
  194. package/dist/middleware/index.mjs +51 -0
  195. package/dist/middleware/index.mjs.map +1 -0
  196. package/dist/migrator-2MQHOFDQ.mjs +4 -0
  197. package/dist/migrator-2MQHOFDQ.mjs.map +1 -0
  198. package/dist/migrator-THJCF6MZ.js +37 -0
  199. package/dist/migrator-THJCF6MZ.js.map +1 -0
  200. package/dist/redirects/index.d.mts +78 -0
  201. package/dist/redirects/index.d.ts +78 -0
  202. package/dist/redirects/index.js +26 -0
  203. package/dist/redirects/index.js.map +1 -0
  204. package/dist/redirects/index.mjs +5 -0
  205. package/dist/redirects/index.mjs.map +1 -0
  206. package/dist/reputation/index.d.mts +57 -0
  207. package/dist/reputation/index.d.ts +57 -0
  208. package/dist/reputation/index.js +21 -0
  209. package/dist/reputation/index.js.map +1 -0
  210. package/dist/reputation/index.mjs +4 -0
  211. package/dist/reputation/index.mjs.map +1 -0
  212. package/dist/robots/index.d.mts +38 -0
  213. package/dist/robots/index.d.ts +38 -0
  214. package/dist/robots/index.js +52 -0
  215. package/dist/robots/index.js.map +1 -0
  216. package/dist/robots/index.mjs +50 -0
  217. package/dist/robots/index.mjs.map +1 -0
  218. package/dist/routing-B5XS-6_W.d.mts +118 -0
  219. package/dist/routing-DZYzyDHw.d.ts +118 -0
  220. package/dist/scanner-GAF5PO5F.js +53 -0
  221. package/dist/scanner-GAF5PO5F.js.map +1 -0
  222. package/dist/scanner-LKJKW7IT.mjs +4 -0
  223. package/dist/scanner-LKJKW7IT.mjs.map +1 -0
  224. package/dist/securityHeaders-nwZ6nP4g.d.mts +24 -0
  225. package/dist/securityHeaders-nwZ6nP4g.d.ts +24 -0
  226. package/dist/seo/index.d.mts +600 -0
  227. package/dist/seo/index.d.ts +600 -0
  228. package/dist/seo/index.js +883 -0
  229. package/dist/seo/index.js.map +1 -0
  230. package/dist/seo/index.mjs +773 -0
  231. package/dist/seo/index.mjs.map +1 -0
  232. package/dist/seo/register-sitemap-cli.js +151 -0
  233. package/dist/seo/register-sitemap-cli.js.map +1 -0
  234. package/dist/seo/register-sitemap-cli.mjs +144 -0
  235. package/dist/seo/register-sitemap-cli.mjs.map +1 -0
  236. package/dist/seo/server.d.mts +107 -0
  237. package/dist/seo/server.d.ts +107 -0
  238. package/dist/seo/server.js +207 -0
  239. package/dist/seo/server.js.map +1 -0
  240. package/dist/seo/server.mjs +186 -0
  241. package/dist/seo/server.mjs.map +1 -0
  242. package/dist/server-api-EWXKOQZA.mjs +4 -0
  243. package/dist/server-api-EWXKOQZA.mjs.map +1 -0
  244. package/dist/server-api-GJPNRYUP.js +81 -0
  245. package/dist/server-api-GJPNRYUP.js.map +1 -0
  246. package/dist/setup/client.d.mts +60 -0
  247. package/dist/setup/client.d.ts +60 -0
  248. package/dist/setup/client.js +31 -0
  249. package/dist/setup/client.js.map +1 -0
  250. package/dist/setup/client.mjs +6 -0
  251. package/dist/setup/client.mjs.map +1 -0
  252. package/dist/setup/index.d.mts +5 -0
  253. package/dist/setup/index.d.ts +5 -0
  254. package/dist/setup/index.js +35 -0
  255. package/dist/setup/index.js.map +1 -0
  256. package/dist/setup/index.mjs +6 -0
  257. package/dist/setup/index.mjs.map +1 -0
  258. package/dist/setup/server.d.mts +14 -0
  259. package/dist/setup/server.d.ts +14 -0
  260. package/dist/setup/server.js +13 -0
  261. package/dist/setup/server.js.map +1 -0
  262. package/dist/setup/server.mjs +4 -0
  263. package/dist/setup/server.mjs.map +1 -0
  264. package/dist/site-config/index.d.mts +24 -0
  265. package/dist/site-config/index.d.ts +24 -0
  266. package/dist/site-config/index.js +17 -0
  267. package/dist/site-config/index.js.map +1 -0
  268. package/dist/site-config/index.mjs +4 -0
  269. package/dist/site-config/index.mjs.map +1 -0
  270. package/dist/sitemap/index.d.mts +96 -0
  271. package/dist/sitemap/index.d.ts +96 -0
  272. package/dist/sitemap/index.js +288 -0
  273. package/dist/sitemap/index.js.map +1 -0
  274. package/dist/sitemap/index.mjs +285 -0
  275. package/dist/sitemap/index.mjs.map +1 -0
  276. package/dist/socket-loader-J26QHHOB.js +16 -0
  277. package/dist/socket-loader-J26QHHOB.js.map +1 -0
  278. package/dist/socket-loader-R7S2YJ2J.mjs +14 -0
  279. package/dist/socket-loader-R7S2YJ2J.mjs.map +1 -0
  280. package/dist/types-0dmq3k20.d.mts +168 -0
  281. package/dist/types-0dmq3k20.d.ts +168 -0
  282. package/dist/types-Blb2QNkV.d.mts +263 -0
  283. package/dist/types-Blb2QNkV.d.ts +263 -0
  284. package/dist/types-BnCwwUX3.d.mts +250 -0
  285. package/dist/types-BnCwwUX3.d.ts +250 -0
  286. package/dist/types-CGlnp43R.d.mts +312 -0
  287. package/dist/types-CGlnp43R.d.ts +312 -0
  288. package/dist/types-D08004rU.d.mts +179 -0
  289. package/dist/types-D08004rU.d.ts +179 -0
  290. package/dist/types-DNSYU7qI.d.mts +127 -0
  291. package/dist/types-DNSYU7qI.d.ts +127 -0
  292. package/dist/types-KZP_VWZp.d.mts +266 -0
  293. package/dist/types-KZP_VWZp.d.ts +266 -0
  294. package/dist/useEventModal-BVTx69XE.d.mts +274 -0
  295. package/dist/useEventModal-Dx1dItTJ.d.ts +274 -0
  296. package/dist/web-vitals-444RLW3B.js +252 -0
  297. package/dist/web-vitals-444RLW3B.js.map +1 -0
  298. package/dist/web-vitals-KPICZIEF.mjs +241 -0
  299. package/dist/web-vitals-KPICZIEF.mjs.map +1 -0
  300. package/package.json +192 -0
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,324 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+
4
+ // src/cli/generators/index.ts
5
+ async function generateEnvFile(options) {
6
+ const envPath = path.join(process.cwd(), ".env.local");
7
+ let existingContent = "";
8
+ try {
9
+ existingContent = await fs.readFile(envPath, "utf-8");
10
+ } catch {
11
+ }
12
+ const newVars = {
13
+ "NEXT_PUBLIC_UPTRADE_PROJECT_ID": options.projectId,
14
+ "NEXT_PUBLIC_SUPABASE_URL": options.supabaseUrl,
15
+ "NEXT_PUBLIC_SUPABASE_ANON_KEY": options.supabaseAnonKey,
16
+ "UPTRADE_API_KEY": options.apiKey
17
+ };
18
+ const lines = existingContent.split("\n");
19
+ const existingVars = {};
20
+ for (const line of lines) {
21
+ if (line.startsWith("#") || line.trim() === "") {
22
+ continue;
23
+ }
24
+ const [key, ...valueParts] = line.split("=");
25
+ if (key) {
26
+ existingVars[key.trim()] = valueParts.join("=").trim();
27
+ }
28
+ }
29
+ let newContent = `# Uptrade Site-Kit Configuration
30
+ # Generated by @sonordev/site-kit setup wizard
31
+
32
+ # Project ID from Sonor
33
+ NEXT_PUBLIC_UPTRADE_PROJECT_ID=${newVars["NEXT_PUBLIC_UPTRADE_PROJECT_ID"]}
34
+
35
+ # Supabase Configuration
36
+ NEXT_PUBLIC_SUPABASE_URL=${newVars["NEXT_PUBLIC_SUPABASE_URL"]}
37
+ NEXT_PUBLIC_SUPABASE_ANON_KEY=${newVars["NEXT_PUBLIC_SUPABASE_ANON_KEY"]}
38
+
39
+ # Uptrade API Key (for server-side operations)
40
+ UPTRADE_API_KEY=${newVars["UPTRADE_API_KEY"]}
41
+
42
+ `;
43
+ const uptradeKeys = Object.keys(newVars);
44
+ const otherVars = Object.entries(existingVars).filter(([key]) => !uptradeKeys.includes(key));
45
+ if (otherVars.length > 0) {
46
+ newContent += "# Other Environment Variables\n";
47
+ for (const [key, value] of otherVars) {
48
+ newContent += `${key}=${value}
49
+ `;
50
+ }
51
+ }
52
+ await fs.writeFile(envPath, newContent, "utf-8");
53
+ }
54
+ function addImportSafely(content, importStatement) {
55
+ const importModule = importStatement.match(/from\s+['"]([^'"]+)['"]/)?.[1];
56
+ if (importModule && content.includes(importModule)) {
57
+ return content;
58
+ }
59
+ const directiveMatch = content.match(/^(['"]use (client|server)['"][\s;]*\n?)/);
60
+ if (directiveMatch) {
61
+ const directive = directiveMatch[0];
62
+ const restOfFile = content.slice(directive.length);
63
+ return directive + importStatement + "\n" + restOfFile;
64
+ } else {
65
+ const firstImportMatch = content.match(/^(import\s+)/);
66
+ if (firstImportMatch) {
67
+ return importStatement + "\n" + content;
68
+ } else {
69
+ return importStatement + "\n\n" + content;
70
+ }
71
+ }
72
+ }
73
+ async function generateProvider(options) {
74
+ const layoutPath = await findLayoutFile();
75
+ if (!layoutPath) {
76
+ throw new Error("Could not find layout.tsx file");
77
+ }
78
+ const content = await fs.readFile(layoutPath, "utf-8");
79
+ if (content.includes("SiteKitProvider")) {
80
+ return;
81
+ }
82
+ const backupPath = layoutPath + ".backup";
83
+ await fs.writeFile(backupPath, content, "utf-8");
84
+ let newContent = content;
85
+ for (const stmt of [
86
+ `import { SiteKitProvider } from '@sonordev/site-kit'`,
87
+ `import { ManagedFavicon } from '@sonordev/site-kit/images'`
88
+ ]) {
89
+ newContent = addImportSafely(newContent, stmt);
90
+ }
91
+ if (!newContent.includes("ManagedFavicon")) {
92
+ if (/<head[\s>]/.test(newContent)) {
93
+ newContent = newContent.replace(/(<head[^>]*>)(\s*)/, "$1\n <ManagedFavicon />\n $2");
94
+ } else {
95
+ newContent = newContent.replace(
96
+ /(<html[^>]*>)(\s*)(<body)/,
97
+ "$1$2<head>\n <ManagedFavicon />\n </head>$2$3"
98
+ );
99
+ }
100
+ }
101
+ const childrenPattern = /(\s*){children}/;
102
+ const childrenMatch = newContent.match(childrenPattern);
103
+ if (childrenMatch) {
104
+ const indent = childrenMatch[1] || " ";
105
+ const providerWrap = `
106
+ ${indent}<SiteKitProvider
107
+ ${indent} projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}
108
+ ${indent} supabaseUrl={process.env.NEXT_PUBLIC_SUPABASE_URL!}
109
+ ${indent} supabaseAnonKey={process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!}
110
+ ${indent} analytics={{ enabled: true }}
111
+ ${indent} engage={{ enabled: true }}
112
+ ${indent} forms={{ enabled: true }}
113
+ ${indent}>
114
+ ${indent} {children}
115
+ ${indent}</SiteKitProvider>`;
116
+ newContent = newContent.replace(childrenPattern, providerWrap);
117
+ } else {
118
+ const bodyPattern = /(<body[^>]*>)([\s\S]*?)(<\/body>)/;
119
+ const bodyMatch = newContent.match(bodyPattern);
120
+ if (bodyMatch) {
121
+ const bodyContent = bodyMatch[2];
122
+ const wrappedContent = `
123
+ <SiteKitProvider
124
+ projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}
125
+ supabaseUrl={process.env.NEXT_PUBLIC_SUPABASE_URL!}
126
+ supabaseAnonKey={process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!}
127
+ analytics={{ enabled: true }}
128
+ engage={{ enabled: true }}
129
+ forms={{ enabled: true }}
130
+ >
131
+ ${bodyContent.trim()}
132
+ </SiteKitProvider>
133
+ `;
134
+ newContent = newContent.replace(bodyPattern, `$1${wrappedContent}$3`);
135
+ }
136
+ }
137
+ await fs.writeFile(layoutPath, newContent, "utf-8");
138
+ }
139
+ async function findLayoutFile() {
140
+ const possiblePaths = [
141
+ "src/app/layout.tsx",
142
+ "app/layout.tsx",
143
+ "src/app/layout.jsx",
144
+ "app/layout.jsx"
145
+ ];
146
+ for (const relativePath of possiblePaths) {
147
+ const fullPath = path.join(process.cwd(), relativePath);
148
+ try {
149
+ await fs.access(fullPath);
150
+ return fullPath;
151
+ } catch {
152
+ continue;
153
+ }
154
+ }
155
+ return null;
156
+ }
157
+ async function generateSetupRoute() {
158
+ const routeDir = path.join(process.cwd(), "app", "_uptrade", "setup");
159
+ await fs.mkdir(routeDir, { recursive: true });
160
+ const pageContent = `/**
161
+ * Uptrade Setup Wizard
162
+ *
163
+ * This route is automatically removed after setup is complete.
164
+ * Visit /_uptrade/setup to configure Site-Kit.
165
+ */
166
+
167
+ import { SetupWizard } from '@sonordev/site-kit/setup'
168
+
169
+ export default function SetupPage() {
170
+ return <SetupWizard />
171
+ }
172
+ `;
173
+ await fs.writeFile(path.join(routeDir, "page.tsx"), pageContent, "utf-8");
174
+ }
175
+ async function selfDestruct() {
176
+ const setupDir = path.join(process.cwd(), "app", "_uptrade");
177
+ try {
178
+ await fs.rm(setupDir, { recursive: true, force: true });
179
+ } catch {
180
+ }
181
+ const layoutPath = await findLayoutFile();
182
+ if (layoutPath) {
183
+ let content = await fs.readFile(layoutPath, "utf-8");
184
+ content = content.replace(/import\s*{\s*UptradeSetup\s*}\s*from\s*['"]@sonordev\/site-kit\/setup['"][;\n]?/g, "");
185
+ content = content.replace(/\s*{process\.env\.NODE_ENV\s*===\s*['"]development['"]\s*&&\s*<UptradeSetup\s*\/>}\s*/g, "\n");
186
+ content = content.replace(/<UptradeSetup\s*\/>/g, "");
187
+ await fs.writeFile(layoutPath, content, "utf-8");
188
+ }
189
+ }
190
+ async function migrateSitemap(options) {
191
+ const deleted = [];
192
+ if (options.deleteExisting) {
193
+ for (const existing of options.existingSitemaps) {
194
+ if (existing.generator === "site-kit") continue;
195
+ const fullPath = path.join(process.cwd(), existing.filePath);
196
+ try {
197
+ await fs.unlink(fullPath);
198
+ deleted.push(existing.filePath);
199
+ } catch {
200
+ }
201
+ }
202
+ const configFiles = [
203
+ "next-sitemap.config.js",
204
+ "next-sitemap.config.mjs",
205
+ "next-sitemap.config.ts"
206
+ ];
207
+ for (const config of configFiles) {
208
+ const fullPath = path.join(process.cwd(), config);
209
+ try {
210
+ await fs.access(fullPath);
211
+ await fs.unlink(fullPath);
212
+ deleted.push(config);
213
+ } catch {
214
+ }
215
+ }
216
+ const staticSitemap = path.join(process.cwd(), "public", "sitemap.xml");
217
+ try {
218
+ await fs.access(staticSitemap);
219
+ await fs.unlink(staticSitemap);
220
+ deleted.push("public/sitemap.xml");
221
+ } catch {
222
+ }
223
+ const staticSitemapIndex = path.join(process.cwd(), "public", "sitemap-0.xml");
224
+ try {
225
+ await fs.access(staticSitemapIndex);
226
+ const publicDir = path.join(process.cwd(), "public");
227
+ const files = await fs.readdir(publicDir);
228
+ for (const file of files) {
229
+ if (file.match(/^sitemap-\d+\.xml$/)) {
230
+ await fs.unlink(path.join(publicDir, file));
231
+ deleted.push(`public/${file}`);
232
+ }
233
+ }
234
+ } catch {
235
+ }
236
+ }
237
+ const sitemapPath = await findSitemapLocation();
238
+ const sitemapContent = generateSitemapContent(options.baseUrl);
239
+ await fs.mkdir(path.dirname(sitemapPath), { recursive: true });
240
+ await fs.writeFile(sitemapPath, sitemapContent, "utf-8");
241
+ return {
242
+ deleted,
243
+ created: path.relative(process.cwd(), sitemapPath)
244
+ };
245
+ }
246
+ async function findSitemapLocation() {
247
+ const srcApp = path.join(process.cwd(), "src", "app", "sitemap.ts");
248
+ const app = path.join(process.cwd(), "app", "sitemap.ts");
249
+ try {
250
+ await fs.access(path.join(process.cwd(), "src", "app"));
251
+ return srcApp;
252
+ } catch {
253
+ return app;
254
+ }
255
+ }
256
+ function generateSitemapContent(baseUrl) {
257
+ return `/**
258
+ * Sitemap Generator - Powered by @sonordev/site-kit
259
+ *
260
+ * Automatically discovers pages from the app directory and syncs
261
+ * them to Portal API for SEO tracking and analytics validation.
262
+ *
263
+ * Generated by Uptrade Site-Kit Setup Wizard
264
+ */
265
+
266
+ import { createSitemap } from '@sonordev/site-kit/sitemap'
267
+
268
+ export default createSitemap({
269
+ baseUrl: '${baseUrl}',
270
+
271
+ // Optional: Exclude patterns (these are excluded by default)
272
+ // exclude: ['/admin/*', '/api/*'],
273
+
274
+ // Optional: Override priorities for specific paths
275
+ // priorities: {
276
+ // '/': 1.0,
277
+ // '/about': 0.8,
278
+ // '/contact': 0.7,
279
+ // },
280
+
281
+ // Optional: Add dynamic routes not discoverable from file system
282
+ // additionalPaths: async () => {
283
+ // // Example: Fetch blog posts from database
284
+ // // const posts = await getBlogPosts()
285
+ // // return posts.map(post => ({ path: \`/blog/\${post.slug}\`, priority: 0.7 }))
286
+ // return []
287
+ // },
288
+ })
289
+ `;
290
+ }
291
+ async function removeNextSitemapDependency() {
292
+ const packageJsonPath = path.join(process.cwd(), "package.json");
293
+ try {
294
+ const content = await fs.readFile(packageJsonPath, "utf-8");
295
+ const pkg = JSON.parse(content);
296
+ let modified = false;
297
+ if (pkg.dependencies?.["next-sitemap"]) {
298
+ delete pkg.dependencies["next-sitemap"];
299
+ modified = true;
300
+ }
301
+ if (pkg.devDependencies?.["next-sitemap"]) {
302
+ delete pkg.devDependencies["next-sitemap"];
303
+ modified = true;
304
+ }
305
+ if (pkg.scripts) {
306
+ for (const [key, value] of Object.entries(pkg.scripts)) {
307
+ if (typeof value === "string" && value.includes("next-sitemap")) {
308
+ delete pkg.scripts[key];
309
+ modified = true;
310
+ }
311
+ }
312
+ }
313
+ if (modified) {
314
+ await fs.writeFile(packageJsonPath, JSON.stringify(pkg, null, 2) + "\n", "utf-8");
315
+ }
316
+ return modified;
317
+ } catch {
318
+ return false;
319
+ }
320
+ }
321
+
322
+ export { generateEnvFile, generateProvider, generateSetupRoute, migrateSitemap, removeNextSitemapDependency, selfDestruct };
323
+ //# sourceMappingURL=chunk-7RF6PVHA.mjs.map
324
+ //# sourceMappingURL=chunk-7RF6PVHA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/generators/index.ts"],"names":[],"mappings":"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","file":"chunk-7RF6PVHA.mjs","sourcesContent":["/**\n * Code Generators - Creates SiteKitProvider setup and env files\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\n\n// ============================================\n// Types\n// ============================================\n\ninterface EnvOptions {\n projectId: string\n supabaseUrl: string\n supabaseAnonKey: string\n apiKey: string\n}\n\ninterface ProviderOptions {\n projectId: string\n}\n\n// ============================================\n// Env File Generator\n// ============================================\n\nexport async function generateEnvFile(options: EnvOptions): Promise<void> {\n const envPath = path.join(process.cwd(), '.env.local')\n \n // Check if file exists and read existing content\n let existingContent = ''\n try {\n existingContent = await fs.readFile(envPath, 'utf-8')\n } catch {\n // File doesn't exist, that's fine\n }\n\n // Build new env vars\n const newVars: Record<string, string> = {\n 'NEXT_PUBLIC_UPTRADE_PROJECT_ID': options.projectId,\n 'NEXT_PUBLIC_SUPABASE_URL': options.supabaseUrl,\n 'NEXT_PUBLIC_SUPABASE_ANON_KEY': options.supabaseAnonKey,\n 'UPTRADE_API_KEY': options.apiKey,\n }\n\n // Parse existing content\n const lines = existingContent.split('\\n')\n const existingVars: Record<string, string> = {}\n const comments: string[] = []\n\n for (const line of lines) {\n if (line.startsWith('#') || line.trim() === '') {\n comments.push(line)\n continue\n }\n const [key, ...valueParts] = line.split('=')\n if (key) {\n existingVars[key.trim()] = valueParts.join('=').trim()\n }\n }\n\n // Merge vars (new vars take precedence)\n const mergedVars = { ...existingVars, ...newVars }\n\n // Generate new content\n let newContent = `# Uptrade Site-Kit Configuration\n# Generated by @sonordev/site-kit setup wizard\n\n# Project ID from Sonor\nNEXT_PUBLIC_UPTRADE_PROJECT_ID=${newVars['NEXT_PUBLIC_UPTRADE_PROJECT_ID']}\n\n# Supabase Configuration\nNEXT_PUBLIC_SUPABASE_URL=${newVars['NEXT_PUBLIC_SUPABASE_URL']}\nNEXT_PUBLIC_SUPABASE_ANON_KEY=${newVars['NEXT_PUBLIC_SUPABASE_ANON_KEY']}\n\n# Uptrade API Key (for server-side operations)\nUPTRADE_API_KEY=${newVars['UPTRADE_API_KEY']}\n\n`\n\n // Add any existing vars that aren't Uptrade-related\n const uptradeKeys = Object.keys(newVars)\n const otherVars = Object.entries(existingVars)\n .filter(([key]) => !uptradeKeys.includes(key))\n \n if (otherVars.length > 0) {\n newContent += '# Other Environment Variables\\n'\n for (const [key, value] of otherVars) {\n newContent += `${key}=${value}\\n`\n }\n }\n\n await fs.writeFile(envPath, newContent, 'utf-8')\n}\n\n// ============================================\n// Provider Generator\n// ============================================\n\n/**\n * Safely adds an import statement to a file, respecting 'use client'/'use server' directives\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 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 return directive + importStatement + '\\n' + restOfFile\n } else {\n // No directive, add import at the top before other imports\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\nexport async function generateProvider(options: ProviderOptions): Promise<void> {\n // Find the layout file\n const layoutPath = await findLayoutFile()\n if (!layoutPath) {\n throw new Error('Could not find layout.tsx file')\n }\n\n const content = await fs.readFile(layoutPath, 'utf-8')\n\n // Check if SiteKitProvider is already added\n if (content.includes('SiteKitProvider')) {\n return // Already configured\n }\n\n // Create backup first\n const backupPath = layoutPath + '.backup'\n await fs.writeFile(backupPath, content, 'utf-8')\n\n // Add imports safely (respects 'use client' directive)\n let newContent = content\n for (const stmt of [\n `import { SiteKitProvider } from '@sonordev/site-kit'`,\n `import { ManagedFavicon } from '@sonordev/site-kit/images'`,\n ]) {\n newContent = addImportSafely(newContent, stmt)\n }\n\n // Add ManagedFavicon to head if missing\n if (!newContent.includes('ManagedFavicon')) {\n if (/<head[\\s>]/.test(newContent)) {\n newContent = newContent.replace(/(<head[^>]*>)(\\s*)/, '$1\\n <ManagedFavicon />\\n $2')\n } else {\n newContent = newContent.replace(\n /(<html[^>]*>)(\\s*)(<body)/,\n '$1$2<head>\\n <ManagedFavicon />\\n </head>$2$3'\n )\n }\n }\n\n // Wrap children with SiteKitProvider\n // Look for {children} and wrap it\n const childrenPattern = /(\\s*){children}/\n const childrenMatch = newContent.match(childrenPattern)\n \n if (childrenMatch) {\n const indent = childrenMatch[1] || ' '\n const providerWrap = `\n${indent}<SiteKitProvider\n${indent} projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n${indent} supabaseUrl={process.env.NEXT_PUBLIC_SUPABASE_URL!}\n${indent} supabaseAnonKey={process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!}\n${indent} analytics={{ enabled: true }}\n${indent} engage={{ enabled: true }}\n${indent} forms={{ enabled: true }}\n${indent}>\n${indent} {children}\n${indent}</SiteKitProvider>`\n\n newContent = newContent.replace(childrenPattern, providerWrap)\n } else {\n // Try alternative pattern for layouts that use a different structure\n const bodyPattern = /(<body[^>]*>)([\\s\\S]*?)(<\\/body>)/\n const bodyMatch = newContent.match(bodyPattern)\n \n if (bodyMatch) {\n const bodyContent = bodyMatch[2]\n const wrappedContent = `\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 analytics={{ enabled: true }}\n engage={{ enabled: true }}\n forms={{ enabled: true }}\n >\n ${bodyContent.trim()}\n </SiteKitProvider>\n `\n \n newContent = newContent.replace(bodyPattern, `$1${wrappedContent}$3`)\n }\n }\n\n await fs.writeFile(layoutPath, newContent, 'utf-8')\n}\n\n// ============================================\n// Helpers\n// ============================================\n\nasync function findLayoutFile(): Promise<string | null> {\n const possiblePaths = [\n 'src/app/layout.tsx',\n 'app/layout.tsx',\n 'src/app/layout.jsx',\n 'app/layout.jsx',\n ]\n\n for (const relativePath of possiblePaths) {\n const fullPath = path.join(process.cwd(), relativePath)\n try {\n await fs.access(fullPath)\n return fullPath\n } catch {\n continue\n }\n }\n\n return null\n}\n\n// ============================================\n// Setup Route Generator (for visual wizard)\n// ============================================\n\nexport async function generateSetupRoute(): Promise<void> {\n const routeDir = path.join(process.cwd(), 'app', '_uptrade', 'setup')\n \n // Create directory\n await fs.mkdir(routeDir, { recursive: true })\n\n // Create page.tsx\n const pageContent = `/**\n * Uptrade Setup Wizard\n * \n * This route is automatically removed after setup is complete.\n * Visit /_uptrade/setup to configure Site-Kit.\n */\n\nimport { SetupWizard } from '@sonordev/site-kit/setup'\n\nexport default function SetupPage() {\n return <SetupWizard />\n}\n`\n\n await fs.writeFile(path.join(routeDir, 'page.tsx'), pageContent, 'utf-8')\n}\n\n// ============================================\n// Self-Destruct\n// ============================================\n\nexport async function selfDestruct(): Promise<void> {\n // Remove setup route\n const setupDir = path.join(process.cwd(), 'app', '_uptrade')\n try {\n await fs.rm(setupDir, { recursive: true, force: true })\n } catch {\n // Directory might not exist\n }\n\n // Remove UptradeSetup from layout if present\n const layoutPath = await findLayoutFile()\n if (layoutPath) {\n let content = await fs.readFile(layoutPath, 'utf-8')\n \n // Remove import\n content = content.replace(/import\\s*{\\s*UptradeSetup\\s*}\\s*from\\s*['\"]@sonordev\\/site-kit\\/setup['\"][;\\n]?/g, '')\n \n // Remove component usage\n content = content.replace(/\\s*{process\\.env\\.NODE_ENV\\s*===\\s*['\"]development['\"]\\s*&&\\s*<UptradeSetup\\s*\\/>}\\s*/g, '\\n')\n content = content.replace(/<UptradeSetup\\s*\\/>/g, '')\n \n await fs.writeFile(layoutPath, content, 'utf-8')\n }\n}\n\n// ============================================\n// Sitemap Generator\n// ============================================\n\ninterface SitemapMigrationOptions {\n baseUrl: string\n existingSitemaps: Array<{\n filePath: string\n type: string\n generator?: string\n }>\n deleteExisting: boolean\n}\n\n/**\n * Generate site-kit sitemap and optionally remove existing sitemap files\n */\nexport async function migrateSitemap(options: SitemapMigrationOptions): Promise<{\n deleted: string[]\n created: string\n}> {\n const deleted: string[] = []\n\n // Delete existing sitemap files if requested\n if (options.deleteExisting) {\n for (const existing of options.existingSitemaps) {\n // Skip if it's already site-kit\n if (existing.generator === 'site-kit') continue\n\n const fullPath = path.join(process.cwd(), existing.filePath)\n try {\n await fs.unlink(fullPath)\n deleted.push(existing.filePath)\n } catch {\n // File might not exist or be locked\n }\n }\n\n // Also delete next-sitemap config files\n const configFiles = [\n 'next-sitemap.config.js',\n 'next-sitemap.config.mjs', \n 'next-sitemap.config.ts',\n ]\n for (const config of configFiles) {\n const fullPath = path.join(process.cwd(), config)\n try {\n await fs.access(fullPath)\n await fs.unlink(fullPath)\n deleted.push(config)\n } catch {\n // File doesn't exist\n }\n }\n\n // Delete static sitemap.xml if it exists in public\n const staticSitemap = path.join(process.cwd(), 'public', 'sitemap.xml')\n try {\n await fs.access(staticSitemap)\n await fs.unlink(staticSitemap)\n deleted.push('public/sitemap.xml')\n } catch {\n // File doesn't exist\n }\n\n // Delete sitemap index if exists\n const staticSitemapIndex = path.join(process.cwd(), 'public', 'sitemap-0.xml')\n try {\n await fs.access(staticSitemapIndex)\n // Find all sitemap-N.xml files\n const publicDir = path.join(process.cwd(), 'public')\n const files = await fs.readdir(publicDir)\n for (const file of files) {\n if (file.match(/^sitemap-\\d+\\.xml$/)) {\n await fs.unlink(path.join(publicDir, file))\n deleted.push(`public/${file}`)\n }\n }\n } catch {\n // File doesn't exist\n }\n }\n\n // Generate new sitemap.ts using site-kit\n const sitemapPath = await findSitemapLocation()\n const sitemapContent = generateSitemapContent(options.baseUrl)\n\n await fs.mkdir(path.dirname(sitemapPath), { recursive: true })\n await fs.writeFile(sitemapPath, sitemapContent, 'utf-8')\n\n return {\n deleted,\n created: path.relative(process.cwd(), sitemapPath),\n }\n}\n\n/**\n * Find where to put the sitemap file\n */\nasync function findSitemapLocation(): Promise<string> {\n // Check if using src/app or app\n const srcApp = path.join(process.cwd(), 'src', 'app', 'sitemap.ts')\n const app = path.join(process.cwd(), 'app', 'sitemap.ts')\n\n try {\n await fs.access(path.join(process.cwd(), 'src', 'app'))\n return srcApp\n } catch {\n return app\n }\n}\n\n/**\n * Generate sitemap.ts content\n */\nfunction generateSitemapContent(baseUrl: string): string {\n return `/**\n * Sitemap Generator - Powered by @sonordev/site-kit\n * \n * Automatically discovers pages from the app directory and syncs\n * them to Portal API for SEO tracking and analytics validation.\n * \n * Generated by Uptrade Site-Kit Setup Wizard\n */\n\nimport { createSitemap } from '@sonordev/site-kit/sitemap'\n\nexport default createSitemap({\n baseUrl: '${baseUrl}',\n \n // Optional: Exclude patterns (these are excluded by default)\n // exclude: ['/admin/*', '/api/*'],\n \n // Optional: Override priorities for specific paths\n // priorities: {\n // '/': 1.0,\n // '/about': 0.8,\n // '/contact': 0.7,\n // },\n \n // Optional: Add dynamic routes not discoverable from file system\n // additionalPaths: async () => {\n // // Example: Fetch blog posts from database\n // // const posts = await getBlogPosts()\n // // return posts.map(post => ({ path: \\`/blog/\\${post.slug}\\`, priority: 0.7 }))\n // return []\n // },\n})\n`\n}\n\n/**\n * Remove next-sitemap from package.json dependencies\n */\nexport async function removeNextSitemapDependency(): Promise<boolean> {\n const packageJsonPath = path.join(process.cwd(), 'package.json')\n \n try {\n const content = await fs.readFile(packageJsonPath, 'utf-8')\n const pkg = JSON.parse(content)\n \n let modified = false\n \n if (pkg.dependencies?.['next-sitemap']) {\n delete pkg.dependencies['next-sitemap']\n modified = true\n }\n \n if (pkg.devDependencies?.['next-sitemap']) {\n delete pkg.devDependencies['next-sitemap']\n modified = true\n }\n\n // Also remove from scripts if present\n if (pkg.scripts) {\n for (const [key, value] of Object.entries(pkg.scripts)) {\n if (typeof value === 'string' && value.includes('next-sitemap')) {\n delete pkg.scripts[key]\n modified = true\n }\n }\n }\n\n if (modified) {\n await fs.writeFile(packageJsonPath, JSON.stringify(pkg, null, 2) + '\\n', 'utf-8')\n }\n\n return modified\n } catch {\n return false\n }\n}\n\n"]}