@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":["match","path"],"mappings":"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","file":"chunk-24277A3Q.mjs","sourcesContent":["/**\n * Code Migrator - Transforms existing forms to Site-Kit managed forms\n * \n * IMPORTANT: This migrator modifies files in-place using safe string operations.\n * It preserves existing code and only adds/modifies the minimum necessary.\n * \n * Key safety features:\n * - Always reads full file content before modifying\n * - Preserves 'use client' directives at top of file\n * - Adds imports after directives but before other imports\n * - Never overwrites entire file contents (except for form migration which is opt-in)\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport { parse } from '@babel/parser'\nimport generate from '@babel/generator'\nimport traverse from '@babel/traverse'\nimport * as t from '@babel/types'\nimport type { ScanResults, DetectedForm, DetectedField } from '../scanner'\n\n// ============================================\n// Safe Import Insertion Helper\n// ============================================\n\n/**\n * Safely adds an import statement to a file, respecting 'use client'/'use server' directives\n * and avoiding duplicate imports.\n */\nfunction addImportSafely(content: string, importStatement: string): string {\n // Check if import already exists\n const importModule = importStatement.match(/from\\s+['\"]([^'\"]+)['\"]/)?.[1]\n if (importModule && content.includes(importModule)) {\n // Import from this module exists, might need to add to existing import\n return content\n }\n \n // Check for 'use client' or 'use server' directive at the start\n const directiveMatch = content.match(/^(['\"]use (client|server)['\"][\\s;]*\\n?)/)\n \n if (directiveMatch) {\n // Insert import AFTER the directive\n const directive = directiveMatch[0]\n const restOfFile = content.slice(directive.length)\n \n // Find first import or start of code\n const firstImportMatch = restOfFile.match(/^(import\\s+)/)\n if (firstImportMatch) {\n // Insert before first import but after directive\n return directive + importStatement + '\\n' + restOfFile\n } else {\n // No imports yet, add after directive with a newline\n return directive + importStatement + '\\n' + restOfFile\n }\n } else {\n // No directive, add import at the top\n // But check if there's already an import block at the top\n const firstImportMatch = content.match(/^(import\\s+)/)\n if (firstImportMatch) {\n return importStatement + '\\n' + content\n } else {\n return importStatement + '\\n\\n' + content\n }\n }\n}\n\n/**\n * Check if a file is a client component (has 'use client' directive at the top)\n */\nfunction isClientComponent(content: string): boolean {\n // Check first few lines for 'use client' directive\n const firstLines = content.split('\\n').slice(0, 5).join('\\n')\n return /['\"]use client['\"]/.test(firstLines)\n}\n\n/**\n * Adds a named export to an existing import statement from the same module\n */\nfunction addToExistingImport(content: string, namedExport: string, modulePath: string): string {\n // Pattern to find import from the module\n const importPattern = new RegExp(\n `(import\\\\s*\\\\{[^}]*)\\\\}\\\\s*from\\\\s*['\"]${modulePath.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}['\"]`,\n 'g'\n )\n \n if (importPattern.test(content)) {\n // Reset regex\n importPattern.lastIndex = 0\n return content.replace(importPattern, (match, imports) => {\n // Check if already imported\n if (imports.includes(namedExport)) {\n return match\n }\n // Add to imports\n return `${imports.trim()}, ${namedExport} } from '${modulePath}'`\n })\n }\n \n return content\n}\n\n/**\n * Insert ManagedSchema component into the JSX return statement of a page component.\n * Looks for the return statement and inserts ManagedSchema right after the opening tag/fragment.\n */\nfunction insertManagedSchemaIntoJSX(content: string, pagePath: string, isTypeScript: boolean): string {\n // Skip if ManagedSchema is already in the JSX (not just imported)\n if (content.includes('<ManagedSchema')) {\n return content\n }\n\n const projectIdSuffix = isTypeScript ? '!' : ''\n const schemaComponent = `<ManagedSchema\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID${projectIdSuffix}}\n path=\"${pagePath}\"\n />`\n\n // Pattern to find: return ( followed by < or <>\n // This handles: return (<div>...) or return (<>...) or return (\\n <div>...)\n const returnPatterns = [\n // return (<> ... - fragment\n /return\\s*\\(\\s*<>/,\n // return ( <Fragment> ...\n /return\\s*\\(\\s*<Fragment>/,\n // return (<div ... or return (<main ... etc\n /return\\s*\\(\\s*<([a-zA-Z][a-zA-Z0-9]*)[^>]*>/,\n ]\n\n for (const pattern of returnPatterns) {\n const match = content.match(pattern)\n if (match && match.index !== undefined) {\n const insertPos = match.index + match[0].length\n // Insert ManagedSchema right after the opening tag\n content = content.slice(0, insertPos) + '\\n ' + schemaComponent + content.slice(insertPos)\n return content\n }\n }\n\n // Fallback: try to find any return statement with JSX\n const simpleReturnMatch = content.match(/return\\s*\\(/)\n if (simpleReturnMatch && simpleReturnMatch.index !== undefined) {\n // Find the first < after the return (\n const afterReturn = content.slice(simpleReturnMatch.index + simpleReturnMatch[0].length)\n const firstTagMatch = afterReturn.match(/^\\s*<([a-zA-Z>][^>]*)>?/)\n if (firstTagMatch) {\n const insertPos = simpleReturnMatch.index + simpleReturnMatch[0].length + firstTagMatch[0].length\n content = content.slice(0, insertPos) + '\\n ' + schemaComponent + content.slice(insertPos)\n return content\n }\n }\n\n return content\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport interface MigrationResult {\n filePath: string\n success: boolean\n changes: string[]\n error?: string\n formId?: string\n}\n\nexport interface MigrationOptions {\n projectId: string\n apiKey: string\n dryRun?: boolean\n}\n\n// ============================================\n// Main Migrator\n// ============================================\n\nexport async function migrateFiles(\n scanResults: ScanResults,\n options: MigrationOptions\n): Promise<MigrationResult[]> {\n const results: MigrationResult[] = []\n\n // Migrate forms\n for (const form of scanResults.forms) {\n if (form.suggestedAction === 'manual') {\n results.push({\n filePath: form.filePath,\n success: false,\n changes: [],\n error: 'Form too complex for auto-migration',\n })\n continue\n }\n\n try {\n const result = await migrateForm(form, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: form.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n // Migrate widgets (simpler - just remove and add provider flag)\n for (const widget of scanResults.widgets) {\n try {\n const result = await migrateWidget(widget.filePath, widget, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: widget.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n // Migrate metadata\n for (const meta of scanResults.metadata || []) {\n try {\n const result = await migrateMetadata(meta.filePath, meta, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: meta.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n // Migrate schemas\n for (const schema of scanResults.schemas || []) {\n try {\n const result = await migrateSchema(schema.filePath, schema, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: schema.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n // Migrate FAQs\n for (const faq of scanResults.faqs || []) {\n try {\n const result = await migrateFAQ(faq.filePath, faq, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: faq.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n // Migrate sitemaps\n for (const sitemap of scanResults.sitemaps || []) {\n // Skip site-kit generated sitemaps\n if (sitemap.generator === 'site-kit') continue\n\n try {\n const result = await migrateSitemap(sitemap.filePath, sitemap, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: sitemap.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n // Report analytics (informational only)\n for (const analytics of scanResults.analytics || []) {\n try {\n const result = await migrateAnalytics(analytics.filePath, analytics, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: analytics.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n return results\n}\n\n// ============================================\n// Form Migration\n// ============================================\n\n/**\n * Migrate a form to Site-Kit managed form\n * \n * SAFETY: Form migration is DESTRUCTIVE by design - it replaces the entire form component.\n * This is intentional because forms need to be completely restructured to use the useForm hook.\n * \n * However, we now:\n * 1. Create a backup of the original file (.backup)\n * 2. Only proceed if user explicitly confirms\n * 3. Log all changes for easy rollback\n */\nasync function migrateForm(\n form: DetectedForm,\n options: MigrationOptions\n): Promise<MigrationResult> {\n const changes: string[] = []\n const fullPath = path.resolve(process.cwd(), form.filePath)\n\n // Step 1: Create the form in 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,321 @@
1
+ 'use strict';
2
+
3
+ // src/forms/formsApi.ts
4
+ var config = null;
5
+ function configureFormsApi(options) {
6
+ config = options;
7
+ }
8
+ function getConfig() {
9
+ if (config) return config;
10
+ if (typeof window !== "undefined") {
11
+ const apiUrl = window.__SITE_KIT_API_URL__;
12
+ const apiKey = window.__SITE_KIT_API_KEY__;
13
+ if (apiUrl && apiKey) {
14
+ return { baseUrl: apiUrl, apiKey };
15
+ }
16
+ }
17
+ throw new Error(
18
+ "Forms API not configured. Either wrap your app in SiteKitProvider or call configureFormsApi() first."
19
+ );
20
+ }
21
+ async function apiRequest(method, path, body) {
22
+ const { baseUrl, apiKey, getAuthToken } = getConfig();
23
+ const headers = {
24
+ "Content-Type": "application/json"
25
+ };
26
+ if (apiKey) {
27
+ headers["x-api-key"] = apiKey;
28
+ } else if (getAuthToken) {
29
+ const token = await getAuthToken();
30
+ headers["Authorization"] = `Bearer ${token}`;
31
+ }
32
+ const response = await fetch(`${baseUrl}${path}`, {
33
+ method,
34
+ headers,
35
+ body: body ? JSON.stringify(body) : void 0
36
+ });
37
+ if (!response.ok) {
38
+ const error = await response.json().catch(() => ({ message: response.statusText }));
39
+ throw new Error(error.message || `API error: ${response.status}`);
40
+ }
41
+ if (response.status === 204) {
42
+ return void 0;
43
+ }
44
+ return response.json();
45
+ }
46
+ var formsApi = {
47
+ /**
48
+ * List all forms for a project
49
+ */
50
+ async list(options = {}) {
51
+ const params = new URLSearchParams();
52
+ if (options.projectId) params.set("projectId", options.projectId);
53
+ if (options.formType) params.set("formType", options.formType);
54
+ if (options.isActive !== void 0) params.set("isActive", String(options.isActive));
55
+ if (options.search) params.set("search", options.search);
56
+ const query = params.toString();
57
+ const result = await apiRequest("GET", `/forms${query ? `?${query}` : ""}`);
58
+ return result.data;
59
+ },
60
+ /**
61
+ * Get a single form by ID or slug
62
+ */
63
+ async get(idOrSlug) {
64
+ return apiRequest("GET", `/forms/${idOrSlug}`);
65
+ },
66
+ /**
67
+ * Create a new form
68
+ */
69
+ async create(input) {
70
+ return apiRequest("POST", "/forms", input);
71
+ },
72
+ /**
73
+ * Update an existing form
74
+ */
75
+ async update(id, input) {
76
+ return apiRequest("PUT", `/forms/${id}`, input);
77
+ },
78
+ /**
79
+ * Delete a form
80
+ */
81
+ async delete(id) {
82
+ return apiRequest("DELETE", `/forms/${id}`);
83
+ },
84
+ /**
85
+ * Add a field to an existing form
86
+ */
87
+ async addField(formId, field2) {
88
+ const form = await formsApi.get(formId);
89
+ const maxSortOrder = Math.max(0, ...(form.fields || []).map((f) => f.sortOrder || 0));
90
+ return formsApi.update(formId, {
91
+ fields: [
92
+ ...form.fields || [],
93
+ { ...field2, sortOrder: field2.sortOrder ?? maxSortOrder + 1 }
94
+ ]
95
+ });
96
+ },
97
+ /**
98
+ * Update a field in an existing form
99
+ */
100
+ async updateField(formId, fieldSlug, updates) {
101
+ const form = await formsApi.get(formId);
102
+ return formsApi.update(formId, {
103
+ fields: (form.fields || []).map(
104
+ (f) => f.slug === fieldSlug ? { ...f, ...updates } : f
105
+ )
106
+ });
107
+ },
108
+ /**
109
+ * Remove a field from a form
110
+ */
111
+ async removeField(formId, fieldSlug) {
112
+ const form = await formsApi.get(formId);
113
+ return formsApi.update(formId, {
114
+ fields: (form.fields || []).filter((f) => f.slug !== fieldSlug)
115
+ });
116
+ },
117
+ /**
118
+ * Reorder fields in a form
119
+ */
120
+ async reorderFields(formId, fieldSlugs) {
121
+ const form = await formsApi.get(formId);
122
+ const fieldsMap = new Map((form.fields || []).map((f) => [f.slug, f]));
123
+ const orderedFields = fieldSlugs.map((slug, index) => {
124
+ const field2 = fieldsMap.get(slug);
125
+ if (!field2) throw new Error(`Field not found: ${slug}`);
126
+ return { ...field2, sortOrder: index };
127
+ });
128
+ return formsApi.update(formId, { fields: orderedFields });
129
+ },
130
+ /**
131
+ * Clone a form
132
+ */
133
+ async clone(formId, newSlug, newName) {
134
+ const form = await formsApi.get(formId);
135
+ return formsApi.create({
136
+ projectId: form.projectId,
137
+ slug: newSlug,
138
+ name: newName || `${form.name} (Copy)`,
139
+ description: form.description,
140
+ formType: form.formType,
141
+ successMessage: form.successMessage,
142
+ redirectUrl: form.redirectUrl,
143
+ notificationEmails: form.notificationEmails,
144
+ submitButtonText: form.submitButtonText,
145
+ layout: form.layout,
146
+ showProgress: form.showProgress,
147
+ enableSaveDraft: form.enableSaveDraft,
148
+ isActive: false,
149
+ // Clone as inactive
150
+ fields: (form.fields || []).map(({ id, ...field2 }) => field2),
151
+ // Remove IDs
152
+ steps: (form.steps || []).map(({ id, ...step }) => step)
153
+ // Remove IDs
154
+ });
155
+ },
156
+ /**
157
+ * Activate or deactivate a form
158
+ */
159
+ async setActive(formId, isActive) {
160
+ return formsApi.update(formId, { isActive });
161
+ },
162
+ /**
163
+ * Sync a form definition to the backend
164
+ * Creates the form if it doesn't exist, updates if it does
165
+ * Perfect for defining forms in code during development
166
+ *
167
+ * @example
168
+ * ```tsx
169
+ * // In your app initialization or form component
170
+ * await formsApi.sync({
171
+ * slug: 'contact',
172
+ * name: 'Contact Form',
173
+ * formType: 'prospect',
174
+ * fields: [
175
+ * field.text('name', 'Your Name', { isRequired: true }),
176
+ * field.email('email', 'Email Address'),
177
+ * field.phone('phone', 'Phone Number'),
178
+ * field.textarea('message', 'Message'),
179
+ * ]
180
+ * })
181
+ * ```
182
+ */
183
+ async sync(input) {
184
+ return apiRequest(
185
+ "POST",
186
+ "/api/public/forms/sync",
187
+ input
188
+ );
189
+ },
190
+ /**
191
+ * Sync multiple forms at once
192
+ * Useful for initializing all forms in your app
193
+ */
194
+ async syncAll(forms) {
195
+ return Promise.all(forms.map((form) => formsApi.sync(form)));
196
+ }
197
+ };
198
+ var field = {
199
+ text: (slug, label, options) => ({
200
+ slug,
201
+ label,
202
+ fieldType: "text",
203
+ ...options
204
+ }),
205
+ email: (slug, label, options) => ({
206
+ slug,
207
+ label,
208
+ fieldType: "email",
209
+ isRequired: true,
210
+ ...options
211
+ }),
212
+ phone: (slug, label, options) => ({
213
+ slug,
214
+ label,
215
+ fieldType: "phone",
216
+ ...options
217
+ }),
218
+ textarea: (slug, label, options) => ({
219
+ slug,
220
+ label,
221
+ fieldType: "textarea",
222
+ ...options
223
+ }),
224
+ select: (slug, label, choices, options) => ({
225
+ slug,
226
+ label,
227
+ fieldType: "select",
228
+ options: choices,
229
+ ...options
230
+ }),
231
+ radio: (slug, label, choices, options) => ({
232
+ slug,
233
+ label,
234
+ fieldType: "radio",
235
+ options: choices,
236
+ ...options
237
+ }),
238
+ checkbox: (slug, label, options) => ({
239
+ slug,
240
+ label,
241
+ fieldType: "checkbox",
242
+ ...options
243
+ }),
244
+ date: (slug, label, options) => ({
245
+ slug,
246
+ label,
247
+ fieldType: "date",
248
+ ...options
249
+ }),
250
+ number: (slug, label, options) => ({
251
+ slug,
252
+ label,
253
+ fieldType: "number",
254
+ ...options
255
+ }),
256
+ rating: (slug, label, options) => ({
257
+ slug,
258
+ label,
259
+ fieldType: "rating",
260
+ ...options
261
+ }),
262
+ file: (slug, label, options) => ({
263
+ slug,
264
+ label,
265
+ fieldType: "file",
266
+ ...options
267
+ }),
268
+ hidden: (slug, defaultValue) => ({
269
+ slug,
270
+ label: "",
271
+ fieldType: "hidden",
272
+ defaultValue
273
+ }),
274
+ heading: (slug, label) => ({
275
+ slug,
276
+ label,
277
+ fieldType: "heading"
278
+ }),
279
+ paragraph: (slug, label) => ({
280
+ slug,
281
+ label,
282
+ fieldType: "paragraph"
283
+ })
284
+ };
285
+ function defineForm(definition) {
286
+ const fieldsWithOrder = definition.fields.map((f, index) => ({
287
+ ...f,
288
+ sortOrder: f.sortOrder ?? index
289
+ }));
290
+ return {
291
+ ...definition,
292
+ fields: fieldsWithOrder,
293
+ formType: definition.formType || "contact",
294
+ successMessage: definition.successMessage || "Thank you for your submission!",
295
+ submitButtonText: definition.submitButtonText || "Submit",
296
+ layout: definition.layout || "stacked",
297
+ isActive: definition.isActive ?? true
298
+ };
299
+ }
300
+ async function initializeForms(forms) {
301
+ if (typeof window === "undefined") {
302
+ console.log(`[Site-Kit] ${forms.length} form(s) ready to sync: ${forms.map((f) => f.slug).join(", ")}`);
303
+ return;
304
+ }
305
+ try {
306
+ const results = await formsApi.syncAll(forms);
307
+ const created = results.filter((r) => r.created).length;
308
+ const updated = results.filter((r) => r.updated).length;
309
+ console.log(`[Site-Kit] Forms synced: ${created} created, ${updated} updated`);
310
+ } catch (error) {
311
+ console.error("[Site-Kit] Failed to sync forms:", error);
312
+ }
313
+ }
314
+
315
+ exports.configureFormsApi = configureFormsApi;
316
+ exports.defineForm = defineForm;
317
+ exports.field = field;
318
+ exports.formsApi = formsApi;
319
+ exports.initializeForms = initializeForms;
320
+ //# sourceMappingURL=chunk-373TK6TZ.js.map
321
+ //# sourceMappingURL=chunk-373TK6TZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/forms/formsApi.ts"],"names":["field"],"mappings":"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","file":"chunk-373TK6TZ.js","sourcesContent":["/**\n * @sonordev/site-kit/forms - Forms API Client\n * \n * Full API client for form management. Allows developers to create, update,\n * and delete forms programmatically. Changes sync to Portal automatically.\n * \n * @example\n * ```tsx\n * import { formsApi } from '@sonordev/site-kit/forms'\n * \n * // Create a new form\n * const form = await formsApi.create({\n * projectId: 'xxx',\n * slug: 'contact-us',\n * name: 'Contact Form',\n * formType: 'prospect',\n * fields: [\n * { slug: 'name', label: 'Name', fieldType: 'text', isRequired: true },\n * { slug: 'email', label: 'Email', fieldType: 'email', isRequired: true },\n * { slug: 'message', label: 'Message', fieldType: 'textarea' },\n * ]\n * })\n * \n * // Update fields\n * await formsApi.update(form.id, {\n * fields: [...form.fields, { slug: 'phone', label: 'Phone', fieldType: 'phone' }]\n * })\n * ```\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport type FormType = \n | 'prospect' // → CRM leads\n | 'contact' // → Contact form\n | 'support' // → Support tickets\n | 'feedback' // → Feedback entries\n | 'newsletter' // → Email subscribers\n | 'custom' // → Custom webhook\n\nexport type FieldType =\n | 'text'\n | 'email'\n | 'phone'\n | 'number'\n | 'textarea'\n | 'select'\n | 'multi_select'\n | 'radio'\n | 'checkbox'\n | 'date'\n | 'time'\n | 'datetime'\n | 'url'\n | 'file'\n | 'rating'\n | 'slider'\n | 'hidden'\n | 'heading'\n | 'paragraph'\n\nexport type FieldWidth = 'full' | 'half' | 'third' | 'quarter'\n\nexport interface FieldOption {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface FieldValidation {\n min?: number\n max?: number\n minLength?: number\n maxLength?: number\n pattern?: string\n patternMessage?: string\n}\n\nexport interface FieldConditional {\n field: string\n operator: 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'is_empty' | 'not_empty' | 'greater_than' | 'less_than'\n value?: string | number | boolean\n}\n\nexport interface FormField {\n id?: string\n slug: string\n label: string\n fieldType: FieldType\n placeholder?: string\n helpText?: string\n defaultValue?: string\n isRequired?: boolean\n validation?: FieldValidation\n options?: FieldOption[]\n conditional?: FieldConditional\n width?: FieldWidth\n sortOrder?: number\n destinationField?: string\n stepId?: string\n}\n\nexport interface FormStep {\n id?: string\n stepNumber: number\n title?: string\n description?: string\n condition?: FieldConditional\n}\n\nexport interface Form {\n id: string\n projectId: string\n slug: string\n name: string\n description?: string\n formType: FormType\n successMessage: string\n redirectUrl?: string\n notificationEmails?: string[]\n submitButtonText: string\n layout: 'stacked' | 'inline' | 'grid'\n showProgress: boolean\n enableSaveDraft: boolean\n isActive: boolean\n createdAt: string\n updatedAt: string\n fields?: FormField[]\n steps?: FormStep[]\n}\n\nexport interface CreateFormInput {\n projectId: string\n slug: string\n name: string\n description?: string\n formType?: FormType\n successMessage?: string\n redirectUrl?: string\n notificationEmails?: string[]\n submitButtonText?: string\n layout?: 'stacked' | 'inline' | 'grid'\n showProgress?: boolean\n enableSaveDraft?: boolean\n isActive?: boolean\n fields?: FormField[]\n steps?: FormStep[]\n}\n\nexport interface UpdateFormInput {\n slug?: string\n name?: string\n description?: string\n formType?: FormType\n successMessage?: string\n redirectUrl?: string\n notificationEmails?: string[]\n submitButtonText?: string\n layout?: 'stacked' | 'inline' | 'grid'\n showProgress?: boolean\n enableSaveDraft?: boolean\n isActive?: boolean\n fields?: FormField[]\n steps?: FormStep[]\n}\n\nexport interface FormsListOptions {\n projectId?: string\n formType?: FormType\n isActive?: boolean\n search?: string\n}\n\n// ============================================\n// API Client Configuration\n// ============================================\n\ninterface FormsApiConfig {\n baseUrl: string\n apiKey?: string\n getAuthToken?: () => Promise<string> | string\n}\n\nlet config: FormsApiConfig | null = null\n\n/**\n * Configure the forms API client\n */\nexport function configureFormsApi(options: FormsApiConfig) {\n config = options\n}\n\n/**\n * Get API config, falling back to SiteKitProvider globals\n */\nfunction getConfig(): FormsApiConfig {\n if (config) return config\n \n // Try to get from window globals (set by SiteKitProvider)\n if (typeof window !== 'undefined') {\n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (apiUrl && apiKey) {\n return { baseUrl: apiUrl, apiKey }\n }\n }\n \n throw new Error(\n 'Forms API not configured. Either wrap your app in SiteKitProvider or call configureFormsApi() first.'\n )\n}\n\n// ============================================\n// HTTP Helpers\n// ============================================\n\nasync function apiRequest<T>(\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n path: string,\n body?: any\n): Promise<T> {\n const { baseUrl, apiKey, getAuthToken } = getConfig()\n \n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n \n // Use API key for public endpoints, auth token for admin endpoints\n if (apiKey) {\n headers['x-api-key'] = apiKey\n } else if (getAuthToken) {\n const token = await getAuthToken()\n headers['Authorization'] = `Bearer ${token}`\n }\n \n const response = await fetch(`${baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n })\n \n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: response.statusText }))\n throw new Error(error.message || `API error: ${response.status}`)\n }\n \n if (response.status === 204) {\n return undefined as T\n }\n \n return response.json()\n}\n\n// ============================================\n// Forms API\n// ============================================\n\nexport const formsApi = {\n /**\n * List all forms for a project\n */\n async list(options: FormsListOptions = {}): Promise<Form[]> {\n const params = new URLSearchParams()\n if (options.projectId) params.set('projectId', options.projectId)\n if (options.formType) params.set('formType', options.formType)\n if (options.isActive !== undefined) params.set('isActive', String(options.isActive))\n if (options.search) params.set('search', options.search)\n \n const query = params.toString()\n const result = await apiRequest<{ data: Form[] }>('GET', `/forms${query ? `?${query}` : ''}`)\n return result.data\n },\n \n /**\n * Get a single form by ID or slug\n */\n async get(idOrSlug: string): Promise<Form> {\n return apiRequest<Form>('GET', `/forms/${idOrSlug}`)\n },\n \n /**\n * Create a new form\n */\n async create(input: CreateFormInput): Promise<Form> {\n return apiRequest<Form>('POST', '/forms', input)\n },\n \n /**\n * Update an existing form\n */\n async update(id: string, input: UpdateFormInput): Promise<Form> {\n return apiRequest<Form>('PUT', `/forms/${id}`, input)\n },\n \n /**\n * Delete a form\n */\n async delete(id: string): Promise<void> {\n return apiRequest<void>('DELETE', `/forms/${id}`)\n },\n \n /**\n * Add a field to an existing form\n */\n async addField(formId: string, field: FormField): Promise<Form> {\n const form = await formsApi.get(formId)\n const maxSortOrder = Math.max(0, ...(form.fields || []).map(f => f.sortOrder || 0))\n \n return formsApi.update(formId, {\n fields: [\n ...(form.fields || []),\n { ...field, sortOrder: field.sortOrder ?? maxSortOrder + 1 }\n ]\n })\n },\n \n /**\n * Update a field in an existing form\n */\n async updateField(formId: string, fieldSlug: string, updates: Partial<FormField>): Promise<Form> {\n const form = await formsApi.get(formId)\n \n return formsApi.update(formId, {\n fields: (form.fields || []).map(f => \n f.slug === fieldSlug ? { ...f, ...updates } : f\n )\n })\n },\n \n /**\n * Remove a field from a form\n */\n async removeField(formId: string, fieldSlug: string): Promise<Form> {\n const form = await formsApi.get(formId)\n \n return formsApi.update(formId, {\n fields: (form.fields || []).filter(f => f.slug !== fieldSlug)\n })\n },\n \n /**\n * Reorder fields in a form\n */\n async reorderFields(formId: string, fieldSlugs: string[]): Promise<Form> {\n const form = await formsApi.get(formId)\n const fieldsMap = new Map((form.fields || []).map(f => [f.slug, f]))\n \n const orderedFields = fieldSlugs.map((slug, index) => {\n const field = fieldsMap.get(slug)\n if (!field) throw new Error(`Field not found: ${slug}`)\n return { ...field, sortOrder: index }\n })\n \n return formsApi.update(formId, { fields: orderedFields })\n },\n \n /**\n * Clone a form\n */\n async clone(formId: string, newSlug: string, newName?: string): Promise<Form> {\n const form = await formsApi.get(formId)\n \n return formsApi.create({\n projectId: form.projectId,\n slug: newSlug,\n name: newName || `${form.name} (Copy)`,\n description: form.description,\n formType: form.formType,\n successMessage: form.successMessage,\n redirectUrl: form.redirectUrl,\n notificationEmails: form.notificationEmails,\n submitButtonText: form.submitButtonText,\n layout: form.layout,\n showProgress: form.showProgress,\n enableSaveDraft: form.enableSaveDraft,\n isActive: false, // Clone as inactive\n fields: (form.fields || []).map(({ id, ...field }) => field), // Remove IDs\n steps: (form.steps || []).map(({ id, ...step }) => step), // Remove IDs\n })\n },\n \n /**\n * Activate or deactivate a form\n */\n async setActive(formId: string, isActive: boolean): Promise<Form> {\n return formsApi.update(formId, { isActive })\n },\n\n /**\n * Sync a form definition to the backend\n * Creates the form if it doesn't exist, updates if it does\n * Perfect for defining forms in code during development\n * \n * @example\n * ```tsx\n * // In your app initialization or form component\n * await formsApi.sync({\n * slug: 'contact',\n * name: 'Contact Form',\n * formType: 'prospect',\n * fields: [\n * field.text('name', 'Your Name', { isRequired: true }),\n * field.email('email', 'Email Address'),\n * field.phone('phone', 'Phone Number'),\n * field.textarea('message', 'Message'),\n * ]\n * })\n * ```\n */\n async sync(input: Omit<CreateFormInput, 'projectId'>): Promise<Form & { synced: boolean; created: boolean; updated: boolean }> {\n return apiRequest<Form & { synced: boolean; created: boolean; updated: boolean }>(\n 'POST',\n '/api/public/forms/sync',\n input\n )\n },\n\n /**\n * Sync multiple forms at once\n * Useful for initializing all forms in your app\n */\n async syncAll(forms: Array<Omit<CreateFormInput, 'projectId'>>): Promise<Array<Form & { synced: boolean; created: boolean; updated: boolean }>> {\n return Promise.all(forms.map(form => formsApi.sync(form)))\n },\n}\n\n// ============================================\n// Field Builder Helpers\n// ============================================\n\n/**\n * Helper functions to build field definitions\n */\nexport const field = {\n text: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'text',\n ...options,\n }),\n \n email: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'email',\n isRequired: true,\n ...options,\n }),\n \n phone: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'phone',\n ...options,\n }),\n \n textarea: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'textarea',\n ...options,\n }),\n \n select: (slug: string, label: string, choices: Array<{ value: string; label: string }>, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'select',\n options: choices,\n ...options,\n }),\n \n radio: (slug: string, label: string, choices: Array<{ value: string; label: string }>, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'radio',\n options: choices,\n ...options,\n }),\n \n checkbox: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'checkbox',\n ...options,\n }),\n \n date: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'date',\n ...options,\n }),\n \n number: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'number',\n ...options,\n }),\n \n rating: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'rating',\n ...options,\n }),\n \n file: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'file',\n ...options,\n }),\n \n hidden: (slug: string, defaultValue: string): FormField => ({\n slug,\n label: '',\n fieldType: 'hidden',\n defaultValue,\n }),\n \n heading: (slug: string, label: string): FormField => ({\n slug,\n label,\n fieldType: 'heading',\n }),\n \n paragraph: (slug: string, label: string): FormField => ({\n slug,\n label,\n fieldType: 'paragraph',\n }),\n}\n\n// ============================================\n// Form Definition Helper\n// ============================================\n\nexport interface FormDefinition extends Omit<CreateFormInput, 'projectId'> {\n slug: string\n name: string\n fields: FormField[]\n}\n\n/**\n * Define a form declaratively\n * Returns a form definition that can be synced to the backend\n * \n * @example\n * ```tsx\n * // forms/contact.ts\n * import { defineForm, field } from '@sonordev/site-kit/forms'\n * \n * export const contactForm = defineForm({\n * slug: 'contact',\n * name: 'Contact Us',\n * formType: 'prospect',\n * successMessage: 'Thanks! We\\'ll be in touch soon.',\n * fields: [\n * field.text('name', 'Your Name', { isRequired: true }),\n * field.email('email', 'Email Address'),\n * field.phone('phone', 'Phone Number'),\n * field.select('service', 'Service Needed', [\n * { value: 'consultation', label: 'Free Consultation' },\n * { value: 'representation', label: 'Legal Representation' },\n * ]),\n * field.textarea('message', 'Tell us about your case'),\n * ]\n * })\n * \n * // Then in your app:\n * await formsApi.sync(contactForm)\n * ```\n */\nexport function defineForm(definition: FormDefinition): FormDefinition {\n // Ensure fields have sort order\n const fieldsWithOrder = definition.fields.map((f, index) => ({\n ...f,\n sortOrder: f.sortOrder ?? index,\n }))\n \n return {\n ...definition,\n fields: fieldsWithOrder,\n formType: definition.formType || 'contact',\n successMessage: definition.successMessage || 'Thank you for your submission!',\n submitButtonText: definition.submitButtonText || 'Submit',\n layout: definition.layout || 'stacked',\n isActive: definition.isActive ?? true,\n }\n}\n\n/**\n * Initialize multiple forms and sync them to the backend\n * Call this once during app initialization (e.g., in layout.tsx or _app.tsx)\n * \n * @example\n * ```tsx\n * // app/layout.tsx\n * import { initializeForms } from '@sonordev/site-kit/forms'\n * import { contactForm } from './forms/contact'\n * import { consultationForm } from './forms/consultation'\n * \n * // Initialize forms (runs once per build/server start in dev)\n * if (process.env.NODE_ENV === 'development') {\n * initializeForms([contactForm, consultationForm])\n * }\n * ```\n */\nexport async function initializeForms(forms: FormDefinition[]): Promise<void> {\n if (typeof window === 'undefined') {\n // Server-side: log that forms need to be synced\n console.log(`[Site-Kit] ${forms.length} form(s) ready to sync: ${forms.map(f => f.slug).join(', ')}`)\n return\n }\n \n try {\n const results = await formsApi.syncAll(forms)\n const created = results.filter(r => r.created).length\n const updated = results.filter(r => r.updated).length\n console.log(`[Site-Kit] Forms synced: ${created} created, ${updated} updated`)\n } catch (error) {\n console.error('[Site-Kit] Failed to sync forms:', error)\n }\n}\n"]}
@@ -0,0 +1,30 @@
1
+ 'use strict';
2
+
3
+ // src/middleware/securityHeaders.ts
4
+ function buildSecurityHeaders(config) {
5
+ if (config === false) return {};
6
+ const c = typeof config === "object" ? config : {};
7
+ const headers = {};
8
+ if (c.dnsPrefetchControl !== false) {
9
+ headers["X-DNS-Prefetch-Control"] = "on";
10
+ }
11
+ if (c.frameOptions !== false) {
12
+ headers["X-Frame-Options"] = c.frameOptions || "DENY";
13
+ }
14
+ if (c.contentTypeOptions !== false) {
15
+ headers["X-Content-Type-Options"] = "nosniff";
16
+ }
17
+ if (c.xssProtection !== false) {
18
+ headers["X-XSS-Protection"] = "1; mode=block";
19
+ }
20
+ headers["Referrer-Policy"] = c.referrerPolicy || "strict-origin-when-cross-origin";
21
+ headers["Permissions-Policy"] = c.permissionsPolicy || "camera=(), microphone=(), geolocation=()";
22
+ if (c.customHeaders) {
23
+ Object.assign(headers, c.customHeaders);
24
+ }
25
+ return headers;
26
+ }
27
+
28
+ exports.buildSecurityHeaders = buildSecurityHeaders;
29
+ //# sourceMappingURL=chunk-3MYZS6PD.js.map
30
+ //# sourceMappingURL=chunk-3MYZS6PD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/middleware/securityHeaders.ts"],"names":[],"mappings":";;;AA2BO,SAAS,qBACd,MAAA,EACwB;AACxB,EAAA,IAAI,MAAA,KAAW,KAAA,EAAO,OAAO,EAAC;AAE9B,EAAA,MAAM,CAAA,GACJ,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,EAAC;AAEzC,EAAA,MAAM,UAAkC,EAAC;AAGzC,EAAA,IAAI,CAAA,CAAE,uBAAuB,KAAA,EAAO;AAClC,IAAA,OAAA,CAAQ,wBAAwB,CAAA,GAAI,IAAA;AAAA,EACtC;AAGA,EAAA,IAAI,CAAA,CAAE,iBAAiB,KAAA,EAAO;AAC5B,IAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,CAAA,CAAE,YAAA,IAAgB,MAAA;AAAA,EACjD;AAGA,EAAA,IAAI,CAAA,CAAE,uBAAuB,KAAA,EAAO;AAClC,IAAA,OAAA,CAAQ,wBAAwB,CAAA,GAAI,SAAA;AAAA,EACtC;AAGA,EAAA,IAAI,CAAA,CAAE,kBAAkB,KAAA,EAAO;AAC7B,IAAA,OAAA,CAAQ,kBAAkB,CAAA,GAAI,eAAA;AAAA,EAChC;AAGA,EAAA,OAAA,CAAQ,iBAAiB,CAAA,GACvB,CAAA,CAAE,cAAA,IAAkB,iCAAA;AAGtB,EAAA,OAAA,CAAQ,oBAAoB,CAAA,GAC1B,CAAA,CAAE,iBAAA,IAAqB,0CAAA;AAGzB,EAAA,IAAI,EAAE,aAAA,EAAe;AACnB,IAAA,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS,CAAA,CAAE,aAAa,CAAA;AAAA,EACxC;AAEA,EAAA,OAAO,OAAA;AACT","file":"chunk-3MYZS6PD.js","sourcesContent":["/**\n * Default security headers applied by site-kit middleware.\n *\n * These match industry best practices and are the same headers\n * recommended by Next.js documentation. All are opt-out.\n */\n\nexport interface SecurityHeadersConfig {\n /** X-Frame-Options value. false to disable. Default: 'DENY' */\n frameOptions?: 'DENY' | 'SAMEORIGIN' | false\n /** X-Content-Type-Options: nosniff. Default: true */\n contentTypeOptions?: boolean\n /** X-XSS-Protection header. Default: true */\n xssProtection?: boolean\n /** Referrer-Policy value. Default: 'strict-origin-when-cross-origin' */\n referrerPolicy?: string\n /** Permissions-Policy value. Default restricts camera, microphone, geolocation */\n permissionsPolicy?: string\n /** X-DNS-Prefetch-Control. Default: true (on) */\n dnsPrefetchControl?: boolean\n /** Additional custom headers */\n customHeaders?: Record<string, string>\n}\n\n/**\n * Build a flat Record of header name → value from the config.\n */\nexport function buildSecurityHeaders(\n config?: SecurityHeadersConfig | boolean,\n): Record<string, string> {\n if (config === false) return {}\n\n const c: SecurityHeadersConfig =\n typeof config === 'object' ? config : {}\n\n const headers: Record<string, string> = {}\n\n // X-DNS-Prefetch-Control\n if (c.dnsPrefetchControl !== false) {\n headers['X-DNS-Prefetch-Control'] = 'on'\n }\n\n // X-Frame-Options\n if (c.frameOptions !== false) {\n headers['X-Frame-Options'] = c.frameOptions || 'DENY'\n }\n\n // X-Content-Type-Options\n if (c.contentTypeOptions !== false) {\n headers['X-Content-Type-Options'] = 'nosniff'\n }\n\n // X-XSS-Protection\n if (c.xssProtection !== false) {\n headers['X-XSS-Protection'] = '1; mode=block'\n }\n\n // Referrer-Policy\n headers['Referrer-Policy'] =\n c.referrerPolicy || 'strict-origin-when-cross-origin'\n\n // Permissions-Policy\n headers['Permissions-Policy'] =\n c.permissionsPolicy || 'camera=(), microphone=(), geolocation=()'\n\n // Custom headers\n if (c.customHeaders) {\n Object.assign(headers, c.customHeaders)\n }\n\n return headers\n}\n"]}