@uptrademedia/site-kit 1.0.38 → 1.0.40

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 (64) hide show
  1. package/dist/api-BoW4FSlW.d.mts +671 -0
  2. package/dist/api-BoW4FSlW.d.ts +671 -0
  3. package/dist/{chunk-X66VOCWP.mjs → chunk-35Y3M4ZE.mjs} +6 -2
  4. package/dist/chunk-35Y3M4ZE.mjs.map +1 -0
  5. package/dist/{chunk-DRFTRTKV.js → chunk-5TTUNB63.js} +6 -2
  6. package/dist/chunk-5TTUNB63.js.map +1 -0
  7. package/dist/{chunk-KBS3KW2U.js → chunk-F6D3L676.js} +4 -4
  8. package/dist/{chunk-KBS3KW2U.js.map → chunk-F6D3L676.js.map} +1 -1
  9. package/dist/{chunk-Y4BW6XYJ.js → chunk-JRCYNWUZ.js} +6 -2
  10. package/dist/chunk-JRCYNWUZ.js.map +1 -0
  11. package/dist/chunk-K4B34K4J.mjs +306 -0
  12. package/dist/chunk-K4B34K4J.mjs.map +1 -0
  13. package/dist/{chunk-6ONUXZDO.mjs → chunk-QT73LSTP.mjs} +19 -4
  14. package/dist/chunk-QT73LSTP.mjs.map +1 -0
  15. package/dist/{chunk-CG53ASWX.mjs → chunk-SVSZVPP6.mjs} +36 -238
  16. package/dist/chunk-SVSZVPP6.mjs.map +1 -0
  17. package/dist/{chunk-EL5QTAA3.mjs → chunk-TEYPRKYU.mjs} +6 -2
  18. package/dist/chunk-TEYPRKYU.mjs.map +1 -0
  19. package/dist/{chunk-IT6R5VAZ.mjs → chunk-WZMRFNJK.mjs} +4 -4
  20. package/dist/{chunk-IT6R5VAZ.mjs.map → chunk-WZMRFNJK.mjs.map} +1 -1
  21. package/dist/chunk-XXAO5WVO.js +316 -0
  22. package/dist/chunk-XXAO5WVO.js.map +1 -0
  23. package/dist/{chunk-S2GXR5HY.js → chunk-ZG2AGGPZ.js} +19 -4
  24. package/dist/chunk-ZG2AGGPZ.js.map +1 -0
  25. package/dist/{chunk-VOR53RUR.js → chunk-ZVIOI47K.js} +35 -244
  26. package/dist/chunk-ZVIOI47K.js.map +1 -0
  27. package/dist/cli/index.js +3 -3
  28. package/dist/cli/index.mjs +1 -1
  29. package/dist/{generators-TYPILCWD.mjs → generators-H6YQQRR4.mjs} +3 -3
  30. package/dist/{generators-TYPILCWD.mjs.map → generators-H6YQQRR4.mjs.map} +1 -1
  31. package/dist/{generators-5EU4PTVF.js → generators-HZZLGIUB.js} +9 -9
  32. package/dist/{generators-5EU4PTVF.js.map → generators-HZZLGIUB.js.map} +1 -1
  33. package/dist/index.d.mts +1 -1
  34. package/dist/index.d.ts +1 -1
  35. package/dist/index.js +48 -47
  36. package/dist/index.js.map +1 -1
  37. package/dist/index.mjs +3 -2
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/llms/index.d.mts +24 -649
  40. package/dist/llms/index.d.ts +24 -649
  41. package/dist/llms/index.js +34 -25
  42. package/dist/llms/index.mjs +2 -1
  43. package/dist/seo/register-sitemap-cli.mjs +0 -0
  44. package/dist/setup/client.js +7 -7
  45. package/dist/setup/client.mjs +2 -2
  46. package/dist/setup/index.js +9 -9
  47. package/dist/setup/index.mjs +3 -3
  48. package/dist/setup/server.js +2 -2
  49. package/dist/setup/server.mjs +1 -1
  50. package/dist/sitemap/index.d.mts +14 -2
  51. package/dist/sitemap/index.d.ts +14 -2
  52. package/dist/sitemap/index.js +30 -5
  53. package/dist/sitemap/index.js.map +1 -1
  54. package/dist/sitemap/index.mjs +30 -5
  55. package/dist/sitemap/index.mjs.map +1 -1
  56. package/package.json +9 -9
  57. package/dist/chunk-6ONUXZDO.mjs.map +0 -1
  58. package/dist/chunk-CG53ASWX.mjs.map +0 -1
  59. package/dist/chunk-DRFTRTKV.js.map +0 -1
  60. package/dist/chunk-EL5QTAA3.mjs.map +0 -1
  61. package/dist/chunk-S2GXR5HY.js.map +0 -1
  62. package/dist/chunk-VOR53RUR.js.map +0 -1
  63. package/dist/chunk-X66VOCWP.mjs.map +0 -1
  64. package/dist/chunk-Y4BW6XYJ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sitemap/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @uptrade/site-kit - Sitemap Generator\n * \n * Automatically generates sitemap.xml from Next.js app directory structure.\n * Works at build time to discover all pages and sync them to Portal API.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com',\n * // Optional: exclude patterns\n * exclude: ['/admin/*', '/api/*'],\n * // Optional: additional dynamic routes\n * additionalPaths: async () => [\n * { path: '/blog/post-1', priority: 0.7 },\n * ]\n * })\n * ```\n */\n\nimport { readdirSync, statSync, existsSync } from 'fs'\nimport { join, relative } from 'path'\n\nexport interface SitemapEntry {\n url: string\n lastModified?: Date | string\n changeFrequency?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n priority?: number\n}\n\nexport interface SitemapConfig {\n /** Base URL for the site (required) */\n baseUrl: string\n /** Glob patterns to exclude (e.g., ['/admin/*', '/api/*']) */\n exclude?: string[]\n /** Default priority for pages */\n defaultPriority?: number\n /** Default change frequency */\n defaultChangeFrequency?: SitemapEntry['changeFrequency']\n /** Additional paths to include (for dynamic routes) */\n additionalPaths?: () => Promise<Array<{ path: string; priority?: number; changeFrequency?: SitemapEntry['changeFrequency'] }>>\n /** Priority overrides by path pattern */\n priorities?: Record<string, number>\n /** Portal API URL for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_URL or https://api.uptrademedia.com) */\n apiUrl?: string\n /** Portal API key for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_KEY) */\n apiKey?: string\n /** Disable auto-sync to Portal API */\n disableSync?: boolean\n}\n\n// Route groups and special folders to ignore\nconst IGNORED_FOLDERS = [\n 'api',\n 'admin',\n '_uptrade',\n '%5Fuptrade', // URL-encoded _uptrade\n 'uptrade-setup',\n 'offline',\n]\n\n// File patterns that indicate a page\nconst PAGE_FILES = ['page.tsx', 'page.jsx', 'page.js', 'page.ts']\n\n/**\n * Check if a path matches any exclude pattern\n */\nfunction isExcluded(path: string, patterns: string[]): boolean {\n return patterns.some(pattern => {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n return path.startsWith(prefix)\n }\n if (pattern.endsWith('*')) {\n const prefix = pattern.slice(0, -1)\n return path.startsWith(prefix)\n }\n return path === pattern\n })\n}\n\n/**\n * Recursively discover pages from the app directory\n */\nfunction discoverPages(\n appDir: string,\n currentPath: string = '',\n pages: string[] = []\n): string[] {\n const fullPath = join(appDir, currentPath)\n \n if (!existsSync(fullPath)) {\n return pages\n }\n\n const entries = readdirSync(fullPath)\n \n // Check if this directory has a page file\n const hasPage = entries.some(entry => PAGE_FILES.includes(entry))\n \n if (hasPage) {\n // Convert directory path to URL path\n let urlPath = '/' + currentPath\n \n // Handle route groups (parentheses) - remove them from URL\n urlPath = urlPath.replace(/\\/\\([^)]+\\)/g, '')\n \n // Clean up path\n urlPath = urlPath.replace(/\\/+/g, '/') // Remove double slashes\n if (urlPath !== '/' && urlPath.endsWith('/')) {\n urlPath = urlPath.slice(0, -1) // Remove trailing slash\n }\n \n pages.push(urlPath)\n }\n \n // Recurse into subdirectories\n for (const entry of entries) {\n const entryPath = join(fullPath, entry)\n const stat = statSync(entryPath)\n \n if (stat.isDirectory()) {\n // Skip ignored folders\n const folderName = entry.toLowerCase()\n if (IGNORED_FOLDERS.some(ignored => folderName.includes(ignored))) {\n continue\n }\n \n // Skip dynamic route segments for now (would need runtime data)\n if (entry.startsWith('[') && entry.endsWith(']')) {\n continue\n }\n \n // Skip private folders\n if (entry.startsWith('_')) {\n continue\n }\n \n discoverPages(appDir, join(currentPath, entry), pages)\n }\n }\n \n return pages\n}\n\n/**\n * Find the app directory from the current working directory\n */\nfunction findAppDir(): string {\n const cwd = process.cwd()\n \n // Try common locations\n const candidates = [\n join(cwd, 'app'),\n join(cwd, 'src', 'app'),\n ]\n \n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate\n }\n }\n \n throw new Error(\n '[site-kit] Could not find app directory. Ensure you have an \"app\" or \"src/app\" folder.'\n )\n}\n\n/**\n * Get priority for a path based on config\n */\nfunction getPriority(path: string, config: SitemapConfig): number {\n // Check priority overrides\n if (config.priorities) {\n for (const [pattern, priority] of Object.entries(config.priorities)) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n if (path.startsWith(prefix)) return priority\n } else if (path === pattern) {\n return priority\n }\n }\n }\n \n // Home page gets highest priority\n if (path === '/') return 1.0\n \n // Shallow pages get higher priority\n const depth = path.split('/').filter(Boolean).length\n if (depth === 1) return 0.8\n if (depth === 2) return 0.6\n \n return config.defaultPriority ?? 0.5\n}\n\n/**\n * Sync sitemap entries to Portal API\n * Called automatically by createSitemap at build time\n */\nexport async function syncSitemapToPortal(\n entries: SitemapEntry[],\n apiUrl: string,\n apiKey: string\n): Promise<{ success: boolean; created: number; updated: number }> {\n if (!apiKey) {\n console.warn('[site-kit] No API key provided, skipping sitemap sync')\n return { success: false, created: 0, updated: 0 }\n }\n \n const normalizedEntries = entries.map(entry => {\n let path: string\n try {\n const url = new URL(entry.url)\n path = url.pathname\n } catch {\n path = entry.url.startsWith('/') ? entry.url : `/${entry.url}`\n }\n \n return {\n path,\n priority: entry.priority,\n changefreq: entry.changeFrequency,\n }\n })\n \n try {\n const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ entries: normalizedEntries }),\n })\n \n if (!response.ok) {\n console.error('[site-kit] Sitemap sync failed:', response.status, await response.text())\n return { success: false, created: 0, updated: 0 }\n }\n \n const result = await response.json()\n \n return {\n success: true,\n created: result.created || 0,\n updated: result.updated || 0,\n }\n } catch (error) {\n console.error('[site-kit] Sitemap sync error:', error)\n return { success: false, created: 0, updated: 0 }\n }\n}\n\n/**\n * Create a sitemap generator function for Next.js\n * Automatically syncs to Portal API at build time.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com'\n * })\n * ```\n */\nexport function createSitemap(config: SitemapConfig): () => SitemapEntry[] | Promise<SitemapEntry[]> {\n return async () => {\n const { baseUrl, exclude = [], defaultChangeFrequency = 'weekly' } = config\n \n // Normalize base URL\n const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\n \n // Default exclusions\n const allExclusions = [\n '/api/*',\n '/admin/*',\n '/_uptrade/*',\n '/uptrade-setup/*',\n '/offline/*',\n ...exclude,\n ]\n \n // Discover pages from app directory\n let pages: string[] = []\n try {\n const appDir = findAppDir()\n pages = discoverPages(appDir)\n } catch (error) {\n console.warn('[site-kit] Failed to discover pages:', error)\n // Fall back to just the home page\n pages = ['/']\n }\n \n // Filter out excluded pages\n pages = pages.filter(page => !isExcluded(page, allExclusions))\n \n // Build sitemap entries\n const entries: SitemapEntry[] = pages.map(path => ({\n url: `${normalizedBaseUrl}${path}`,\n lastModified: new Date(),\n changeFrequency: defaultChangeFrequency,\n priority: getPriority(path, config),\n }))\n \n // Add additional dynamic paths if provided\n if (config.additionalPaths) {\n try {\n const additional = await config.additionalPaths()\n for (const item of additional) {\n if (!isExcluded(item.path, allExclusions)) {\n entries.push({\n url: `${normalizedBaseUrl}${item.path}`,\n lastModified: new Date(),\n changeFrequency: item.changeFrequency ?? defaultChangeFrequency,\n priority: item.priority ?? getPriority(item.path, config),\n })\n }\n }\n } catch (error) {\n console.warn('[site-kit] Failed to get additional paths:', error)\n }\n }\n \n // Sort by priority descending\n entries.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n \n console.log(`[site-kit] Generated sitemap with ${entries.length} pages`)\n \n // Auto-sync to Portal API at build time (unless disabled)\n if (!config.disableSync) {\n const apiUrl = config.apiUrl || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com'\n // Server-side operations use UPTRADE_API_KEY, not NEXT_PUBLIC_\n const apiKey = config.apiKey || process.env.UPTRADE_API_KEY || process.env.NEXT_PUBLIC_UPTRADE_API_KEY\n \n if (apiKey) {\n // Fire and forget - don't block sitemap generation\n syncSitemapToPortal(entries, apiUrl, apiKey)\n .then(result => {\n if (result.success) {\n console.log(`[site-kit] Synced to Portal API: ${result.created} created, ${result.updated} updated`)\n }\n })\n .catch(err => {\n console.warn('[site-kit] Failed to sync sitemap to Portal API:', err.message)\n })\n } else {\n console.log('[site-kit] No API key found, skipping Portal API sync')\n }\n }\n \n return entries\n }\n}\n\nexport default createSitemap\n"]}
1
+ {"version":3,"sources":["../../src/sitemap/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @uptrade/site-kit - Sitemap Generator\n * \n * Automatically generates sitemap.xml from Next.js app directory structure.\n * Works at build time to discover all pages and sync them to Portal API.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com',\n * // Optional: exclude patterns\n * exclude: ['/admin/*', '/api/*'],\n * // Optional: additional dynamic routes\n * additionalPaths: async () => [\n * { path: '/blog/post-1', priority: 0.7 },\n * ]\n * })\n * ```\n */\n\nimport { readdirSync, statSync, existsSync } from 'fs'\nimport { join } from 'path'\nimport { writeLLMsTxtToPublic } from '../llms/writeLLMsTxt'\n\nexport interface SitemapEntry {\n url: string\n lastModified?: Date | string\n changeFrequency?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n priority?: number\n}\n\nexport interface SitemapConfig {\n /** Base URL for the site (required) */\n baseUrl: string\n /** Glob patterns to exclude (e.g., ['/admin/*', '/api/*']) */\n exclude?: string[]\n /** Default priority for pages */\n defaultPriority?: number\n /** Default change frequency */\n defaultChangeFrequency?: SitemapEntry['changeFrequency']\n /** Additional paths to include (for dynamic routes) */\n additionalPaths?: () => Promise<Array<{ path: string; priority?: number; changeFrequency?: SitemapEntry['changeFrequency'] }>>\n /** Priority overrides by path pattern */\n priorities?: Record<string, number>\n /** Portal API URL for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_URL or https://api.uptrademedia.com) */\n apiUrl?: string\n /** Portal API key for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_KEY) */\n apiKey?: string\n /** Disable auto-sync to Portal API */\n disableSync?: boolean\n /** When true, await meta optimization before build completes (for build-time llms.txt with managed_llm_schema) */\n awaitMetaOptimization?: boolean\n /** When true, write AI-optimized llms.txt to public/llms.txt after sitemap sync */\n optimizedLLMsTxt?: boolean\n /** When true with optimizedLLMsTxt, also write public/llms-full.txt */\n optimizedLLMsFullTxt?: boolean\n}\n\n// Route groups and special folders to ignore\nconst IGNORED_FOLDERS = [\n 'api',\n 'admin',\n '_uptrade',\n '%5Fuptrade', // URL-encoded _uptrade\n 'uptrade-setup',\n 'offline',\n]\n\n// File patterns that indicate a page\nconst PAGE_FILES = ['page.tsx', 'page.jsx', 'page.js', 'page.ts']\n\n/**\n * Check if a path matches any exclude pattern\n */\nfunction isExcluded(path: string, patterns: string[]): boolean {\n return patterns.some(pattern => {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n return path.startsWith(prefix)\n }\n if (pattern.endsWith('*')) {\n const prefix = pattern.slice(0, -1)\n return path.startsWith(prefix)\n }\n return path === pattern\n })\n}\n\n/**\n * Recursively discover pages from the app directory\n */\nfunction discoverPages(\n appDir: string,\n currentPath: string = '',\n pages: string[] = []\n): string[] {\n const fullPath = join(appDir, currentPath)\n \n if (!existsSync(fullPath)) {\n return pages\n }\n\n const entries = readdirSync(fullPath)\n \n // Check if this directory has a page file\n const hasPage = entries.some(entry => PAGE_FILES.includes(entry))\n \n if (hasPage) {\n // Convert directory path to URL path\n let urlPath = '/' + currentPath\n \n // Handle route groups (parentheses) - remove them from URL\n urlPath = urlPath.replace(/\\/\\([^)]+\\)/g, '')\n \n // Clean up path\n urlPath = urlPath.replace(/\\/+/g, '/') // Remove double slashes\n if (urlPath !== '/' && urlPath.endsWith('/')) {\n urlPath = urlPath.slice(0, -1) // Remove trailing slash\n }\n \n pages.push(urlPath)\n }\n \n // Recurse into subdirectories\n for (const entry of entries) {\n const entryPath = join(fullPath, entry)\n const stat = statSync(entryPath)\n \n if (stat.isDirectory()) {\n // Skip ignored folders\n const folderName = entry.toLowerCase()\n if (IGNORED_FOLDERS.some(ignored => folderName.includes(ignored))) {\n continue\n }\n \n // Skip dynamic route segments for now (would need runtime data)\n if (entry.startsWith('[') && entry.endsWith(']')) {\n continue\n }\n \n // Skip private folders\n if (entry.startsWith('_')) {\n continue\n }\n \n discoverPages(appDir, join(currentPath, entry), pages)\n }\n }\n \n return pages\n}\n\n/**\n * Find the app directory from the current working directory\n */\nfunction findAppDir(): string {\n const cwd = process.cwd()\n \n // Try common locations\n const candidates = [\n join(cwd, 'app'),\n join(cwd, 'src', 'app'),\n ]\n \n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate\n }\n }\n \n throw new Error(\n '[site-kit] Could not find app directory. Ensure you have an \"app\" or \"src/app\" folder.'\n )\n}\n\n/**\n * Get priority for a path based on config\n */\nfunction getPriority(path: string, config: SitemapConfig): number {\n // Check priority overrides\n if (config.priorities) {\n for (const [pattern, priority] of Object.entries(config.priorities)) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n if (path.startsWith(prefix)) return priority\n } else if (path === pattern) {\n return priority\n }\n }\n }\n \n // Home page gets highest priority\n if (path === '/') return 1.0\n \n // Shallow pages get higher priority\n const depth = path.split('/').filter(Boolean).length\n if (depth === 1) return 0.8\n if (depth === 2) return 0.6\n \n return config.defaultPriority ?? 0.5\n}\n\nexport interface SyncSitemapOptions {\n /** Trigger Signal AI meta optimization after sync */\n optimizeMeta?: boolean\n /** When true, wait for meta optimization to complete (for build-time llms.txt) */\n awaitMeta?: boolean\n}\n\n/**\n * Sync sitemap entries to Portal API\n * Called automatically by createSitemap at build time\n */\nexport async function syncSitemapToPortal(\n entries: SitemapEntry[],\n apiUrl: string,\n apiKey: string,\n options?: SyncSitemapOptions\n): Promise<{ success: boolean; created: number; updated: number }> {\n if (!apiKey) {\n console.warn('[site-kit] No API key provided, skipping sitemap sync')\n return { success: false, created: 0, updated: 0 }\n }\n \n const normalizedEntries = entries.map(entry => {\n let path: string\n try {\n const url = new URL(entry.url)\n path = url.pathname\n } catch {\n path = entry.url.startsWith('/') ? entry.url : `/${entry.url}`\n }\n \n return {\n path,\n priority: entry.priority,\n changefreq: entry.changeFrequency,\n }\n })\n \n try {\n const body: Record<string, unknown> = { entries: normalizedEntries }\n if (options?.optimizeMeta !== undefined) body.optimize_meta = options.optimizeMeta\n if (options?.awaitMeta !== undefined) body.await_meta = options.awaitMeta\n\n const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify(body),\n })\n \n if (!response.ok) {\n console.error('[site-kit] Sitemap sync failed:', response.status, await response.text())\n return { success: false, created: 0, updated: 0 }\n }\n \n const result = await response.json()\n \n return {\n success: true,\n created: result.created || 0,\n updated: result.updated || 0,\n }\n } catch (error) {\n console.error('[site-kit] Sitemap sync error:', error)\n return { success: false, created: 0, updated: 0 }\n }\n}\n\n/**\n * Create a sitemap generator function for Next.js\n * Automatically syncs to Portal API at build time.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com'\n * })\n * ```\n */\nexport function createSitemap(config: SitemapConfig): () => SitemapEntry[] | Promise<SitemapEntry[]> {\n return async () => {\n const { baseUrl, exclude = [], defaultChangeFrequency = 'weekly' } = config\n \n // Normalize base URL\n const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\n \n // Default exclusions\n const allExclusions = [\n '/api/*',\n '/admin/*',\n '/_uptrade/*',\n '/uptrade-setup/*',\n '/offline/*',\n ...exclude,\n ]\n \n // Discover pages from app directory\n let pages: string[] = []\n try {\n const appDir = findAppDir()\n pages = discoverPages(appDir)\n } catch (error) {\n console.warn('[site-kit] Failed to discover pages:', error)\n // Fall back to just the home page\n pages = ['/']\n }\n \n // Filter out excluded pages\n pages = pages.filter(page => !isExcluded(page, allExclusions))\n \n // Build sitemap entries\n const entries: SitemapEntry[] = pages.map(path => ({\n url: `${normalizedBaseUrl}${path}`,\n lastModified: new Date(),\n changeFrequency: defaultChangeFrequency,\n priority: getPriority(path, config),\n }))\n \n // Add additional dynamic paths if provided\n if (config.additionalPaths) {\n try {\n const additional = await config.additionalPaths()\n for (const item of additional) {\n if (!isExcluded(item.path, allExclusions)) {\n entries.push({\n url: `${normalizedBaseUrl}${item.path}`,\n lastModified: new Date(),\n changeFrequency: item.changeFrequency ?? defaultChangeFrequency,\n priority: item.priority ?? getPriority(item.path, config),\n })\n }\n }\n } catch (error) {\n console.warn('[site-kit] Failed to get additional paths:', error)\n }\n }\n \n // Sort by priority descending\n entries.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n \n console.log(`[site-kit] Generated sitemap with ${entries.length} pages`)\n \n // Auto-sync to Portal API at build time (unless disabled)\n if (!config.disableSync) {\n const apiUrl = config.apiUrl || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com'\n // Server-side operations use UPTRADE_API_KEY, not NEXT_PUBLIC_\n const apiKey = config.apiKey || process.env.UPTRADE_API_KEY || process.env.NEXT_PUBLIC_UPTRADE_API_KEY\n \n if (apiKey) {\n try {\n const syncOptions: SyncSitemapOptions = {}\n if (config.awaitMetaOptimization) {\n syncOptions.optimizeMeta = true\n syncOptions.awaitMeta = true\n }\n const result = await syncSitemapToPortal(entries, apiUrl, apiKey, syncOptions)\n if (result.success) {\n console.log(`[site-kit] Synced to Portal API: ${result.created} created, ${result.updated} updated`)\n }\n\n // Write AI-optimized llms.txt after sync (when enabled)\n if (config.optimizedLLMsTxt) {\n try {\n const writeResult = await writeLLMsTxtToPublic({\n apiUrl,\n apiKey,\n full: config.optimizedLLMsFullTxt ?? false,\n fallbackToLocal: true,\n })\n if (writeResult.success) {\n console.log(`[site-kit] Wrote llms.txt (optimized=${writeResult.optimized})`)\n }\n } catch (err) {\n console.warn('[site-kit] Failed to write llms.txt:', (err as Error).message)\n }\n }\n } catch (err) {\n console.warn('[site-kit] Failed to sync sitemap to Portal API:', (err as Error).message)\n }\n } else {\n console.log('[site-kit] No API key found, skipping Portal API sync')\n }\n }\n \n return entries\n }\n}\n\nexport default createSitemap\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uptrademedia/site-kit",
3
- "version": "1.0.38",
3
+ "version": "1.0.40",
4
4
  "description": "Complete client-side integration kit for Uptrade Portal - SEO, Analytics, Engage, Forms, Blog",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
@@ -112,6 +112,12 @@
112
112
  "dist",
113
113
  "README.md"
114
114
  ],
115
+ "scripts": {
116
+ "build": "tsup",
117
+ "dev": "tsup --watch",
118
+ "clean": "rm -rf dist",
119
+ "typecheck": "tsc --noEmit"
120
+ },
115
121
  "peerDependencies": {
116
122
  "next": "^14.0.0 || ^15.0.0 || ^16.0.0",
117
123
  "react": "^18.0.0 || ^19.0.0",
@@ -150,11 +156,5 @@
150
156
  "blog",
151
157
  "nextjs",
152
158
  "react"
153
- ],
154
- "scripts": {
155
- "build": "tsup",
156
- "dev": "tsup --watch",
157
- "clean": "rm -rf dist",
158
- "typecheck": "tsc --noEmit"
159
- }
160
- }
159
+ ]
160
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/generators/index.ts"],"names":[],"mappings":"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","file":"chunk-6ONUXZDO.mjs","sourcesContent":["/**\n * Code Generators - Creates SiteKitProvider setup and env files\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\n\n// ============================================\n// Types\n// ============================================\n\ninterface EnvOptions {\n projectId: string\n supabaseUrl: string\n supabaseAnonKey: string\n apiKey: string\n}\n\ninterface ProviderOptions {\n projectId: string\n}\n\n// ============================================\n// Env File Generator\n// ============================================\n\nexport async function generateEnvFile(options: EnvOptions): Promise<void> {\n const envPath = path.join(process.cwd(), '.env.local')\n \n // Check if file exists and read existing content\n let existingContent = ''\n try {\n existingContent = await fs.readFile(envPath, 'utf-8')\n } catch {\n // File doesn't exist, that's fine\n }\n\n // Build new env vars\n const newVars: Record<string, string> = {\n 'NEXT_PUBLIC_UPTRADE_PROJECT_ID': options.projectId,\n 'NEXT_PUBLIC_SUPABASE_URL': options.supabaseUrl,\n 'NEXT_PUBLIC_SUPABASE_ANON_KEY': options.supabaseAnonKey,\n 'UPTRADE_API_KEY': options.apiKey,\n }\n\n // Parse existing content\n const lines = existingContent.split('\\n')\n const existingVars: Record<string, string> = {}\n const comments: string[] = []\n\n for (const line of lines) {\n if (line.startsWith('#') || line.trim() === '') {\n comments.push(line)\n continue\n }\n const [key, ...valueParts] = line.split('=')\n if (key) {\n existingVars[key.trim()] = valueParts.join('=').trim()\n }\n }\n\n // Merge vars (new vars take precedence)\n const mergedVars = { ...existingVars, ...newVars }\n\n // Generate new content\n let newContent = `# Uptrade Site-Kit Configuration\n# Generated by @uptrade/site-kit setup wizard\n\n# Project ID from Uptrade Portal\nNEXT_PUBLIC_UPTRADE_PROJECT_ID=${newVars['NEXT_PUBLIC_UPTRADE_PROJECT_ID']}\n\n# Supabase Configuration\nNEXT_PUBLIC_SUPABASE_URL=${newVars['NEXT_PUBLIC_SUPABASE_URL']}\nNEXT_PUBLIC_SUPABASE_ANON_KEY=${newVars['NEXT_PUBLIC_SUPABASE_ANON_KEY']}\n\n# Uptrade API Key (for server-side operations)\nUPTRADE_API_KEY=${newVars['UPTRADE_API_KEY']}\n\n`\n\n // Add any existing vars that aren't Uptrade-related\n const uptradeKeys = Object.keys(newVars)\n const otherVars = Object.entries(existingVars)\n .filter(([key]) => !uptradeKeys.includes(key))\n \n if (otherVars.length > 0) {\n newContent += '# Other Environment Variables\\n'\n for (const [key, value] of otherVars) {\n newContent += `${key}=${value}\\n`\n }\n }\n\n await fs.writeFile(envPath, newContent, 'utf-8')\n}\n\n// ============================================\n// Provider Generator\n// ============================================\n\n/**\n * Safely adds an import statement to a file, respecting 'use client'/'use server' directives\n */\nfunction addImportSafely(content: string, importStatement: string): string {\n // Check if import already exists\n const importModule = importStatement.match(/from\\s+['\"]([^'\"]+)['\"]/)?.[1]\n if (importModule && content.includes(importModule)) {\n return content\n }\n \n // Check for 'use client' or 'use server' directive at the start\n const directiveMatch = content.match(/^(['\"]use (client|server)['\"][\\s;]*\\n?)/)\n \n if (directiveMatch) {\n // Insert import AFTER the directive\n const directive = directiveMatch[0]\n const restOfFile = content.slice(directive.length)\n return directive + importStatement + '\\n' + restOfFile\n } else {\n // No directive, add import at the top before other imports\n const firstImportMatch = content.match(/^(import\\s+)/)\n if (firstImportMatch) {\n return importStatement + '\\n' + content\n } else {\n return importStatement + '\\n\\n' + content\n }\n }\n}\n\nexport async function generateProvider(options: ProviderOptions): Promise<void> {\n // Find the layout file\n const layoutPath = await findLayoutFile()\n if (!layoutPath) {\n throw new Error('Could not find layout.tsx file')\n }\n\n const content = await fs.readFile(layoutPath, 'utf-8')\n\n // Check if SiteKitProvider is already added\n if (content.includes('SiteKitProvider')) {\n return // Already configured\n }\n\n // Create backup first\n const backupPath = layoutPath + '.backup'\n await fs.writeFile(backupPath, content, 'utf-8')\n\n // Add import safely (respects 'use client' directive)\n const importStatement = `import { SiteKitProvider } from '@uptrade/site-kit'`\n let newContent = addImportSafely(content, importStatement)\n\n // Wrap children with SiteKitProvider\n // Look for {children} and wrap it\n const childrenPattern = /(\\s*){children}/\n const childrenMatch = newContent.match(childrenPattern)\n \n if (childrenMatch) {\n const indent = childrenMatch[1] || ' '\n const providerWrap = `\n${indent}<SiteKitProvider\n${indent} projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n${indent} supabaseUrl={process.env.NEXT_PUBLIC_SUPABASE_URL!}\n${indent} supabaseAnonKey={process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!}\n${indent} analytics={{ enabled: true }}\n${indent} engage={{ enabled: true }}\n${indent} forms={{ enabled: true }}\n${indent}>\n${indent} {children}\n${indent}</SiteKitProvider>`\n\n newContent = newContent.replace(childrenPattern, providerWrap)\n } else {\n // Try alternative pattern for layouts that use a different structure\n const bodyPattern = /(<body[^>]*>)([\\s\\S]*?)(<\\/body>)/\n const bodyMatch = newContent.match(bodyPattern)\n \n if (bodyMatch) {\n const bodyContent = bodyMatch[2]\n const wrappedContent = `\n <SiteKitProvider\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n supabaseUrl={process.env.NEXT_PUBLIC_SUPABASE_URL!}\n supabaseAnonKey={process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!}\n analytics={{ enabled: true }}\n engage={{ enabled: true }}\n forms={{ enabled: true }}\n >\n ${bodyContent.trim()}\n </SiteKitProvider>\n `\n \n newContent = newContent.replace(bodyPattern, `$1${wrappedContent}$3`)\n }\n }\n\n await fs.writeFile(layoutPath, newContent, 'utf-8')\n}\n\n// ============================================\n// Helpers\n// ============================================\n\nasync function findLayoutFile(): Promise<string | null> {\n const possiblePaths = [\n 'src/app/layout.tsx',\n 'app/layout.tsx',\n 'src/app/layout.jsx',\n 'app/layout.jsx',\n ]\n\n for (const relativePath of possiblePaths) {\n const fullPath = path.join(process.cwd(), relativePath)\n try {\n await fs.access(fullPath)\n return fullPath\n } catch {\n continue\n }\n }\n\n return null\n}\n\n// ============================================\n// Setup Route Generator (for visual wizard)\n// ============================================\n\nexport async function generateSetupRoute(): Promise<void> {\n const routeDir = path.join(process.cwd(), 'app', '_uptrade', 'setup')\n \n // Create directory\n await fs.mkdir(routeDir, { recursive: true })\n\n // Create page.tsx\n const pageContent = `/**\n * Uptrade Setup Wizard\n * \n * This route is automatically removed after setup is complete.\n * Visit /_uptrade/setup to configure Site-Kit.\n */\n\nimport { SetupWizard } from '@uptrade/site-kit/setup'\n\nexport default function SetupPage() {\n return <SetupWizard />\n}\n`\n\n await fs.writeFile(path.join(routeDir, 'page.tsx'), pageContent, 'utf-8')\n}\n\n// ============================================\n// Self-Destruct\n// ============================================\n\nexport async function selfDestruct(): Promise<void> {\n // Remove setup route\n const setupDir = path.join(process.cwd(), 'app', '_uptrade')\n try {\n await fs.rm(setupDir, { recursive: true, force: true })\n } catch {\n // Directory might not exist\n }\n\n // Remove UptradeSetup from layout if present\n const layoutPath = await findLayoutFile()\n if (layoutPath) {\n let content = await fs.readFile(layoutPath, 'utf-8')\n \n // Remove import\n content = content.replace(/import\\s*{\\s*UptradeSetup\\s*}\\s*from\\s*['\"]@uptrade\\/site-kit\\/setup['\"][;\\n]?/g, '')\n \n // Remove component usage\n content = content.replace(/\\s*{process\\.env\\.NODE_ENV\\s*===\\s*['\"]development['\"]\\s*&&\\s*<UptradeSetup\\s*\\/>}\\s*/g, '\\n')\n content = content.replace(/<UptradeSetup\\s*\\/>/g, '')\n \n await fs.writeFile(layoutPath, content, 'utf-8')\n }\n}\n\n// ============================================\n// Sitemap Generator\n// ============================================\n\ninterface SitemapMigrationOptions {\n baseUrl: string\n existingSitemaps: Array<{\n filePath: string\n type: string\n generator?: string\n }>\n deleteExisting: boolean\n}\n\n/**\n * Generate site-kit sitemap and optionally remove existing sitemap files\n */\nexport async function migrateSitemap(options: SitemapMigrationOptions): Promise<{\n deleted: string[]\n created: string\n}> {\n const deleted: string[] = []\n\n // Delete existing sitemap files if requested\n if (options.deleteExisting) {\n for (const existing of options.existingSitemaps) {\n // Skip if it's already site-kit\n if (existing.generator === 'site-kit') continue\n\n const fullPath = path.join(process.cwd(), existing.filePath)\n try {\n await fs.unlink(fullPath)\n deleted.push(existing.filePath)\n } catch {\n // File might not exist or be locked\n }\n }\n\n // Also delete next-sitemap config files\n const configFiles = [\n 'next-sitemap.config.js',\n 'next-sitemap.config.mjs', \n 'next-sitemap.config.ts',\n ]\n for (const config of configFiles) {\n const fullPath = path.join(process.cwd(), config)\n try {\n await fs.access(fullPath)\n await fs.unlink(fullPath)\n deleted.push(config)\n } catch {\n // File doesn't exist\n }\n }\n\n // Delete static sitemap.xml if it exists in public\n const staticSitemap = path.join(process.cwd(), 'public', 'sitemap.xml')\n try {\n await fs.access(staticSitemap)\n await fs.unlink(staticSitemap)\n deleted.push('public/sitemap.xml')\n } catch {\n // File doesn't exist\n }\n\n // Delete sitemap index if exists\n const staticSitemapIndex = path.join(process.cwd(), 'public', 'sitemap-0.xml')\n try {\n await fs.access(staticSitemapIndex)\n // Find all sitemap-N.xml files\n const publicDir = path.join(process.cwd(), 'public')\n const files = await fs.readdir(publicDir)\n for (const file of files) {\n if (file.match(/^sitemap-\\d+\\.xml$/)) {\n await fs.unlink(path.join(publicDir, file))\n deleted.push(`public/${file}`)\n }\n }\n } catch {\n // File doesn't exist\n }\n }\n\n // Generate new sitemap.ts using site-kit\n const sitemapPath = await findSitemapLocation()\n const sitemapContent = generateSitemapContent(options.baseUrl)\n\n await fs.mkdir(path.dirname(sitemapPath), { recursive: true })\n await fs.writeFile(sitemapPath, sitemapContent, 'utf-8')\n\n return {\n deleted,\n created: path.relative(process.cwd(), sitemapPath),\n }\n}\n\n/**\n * Find where to put the sitemap file\n */\nasync function findSitemapLocation(): Promise<string> {\n // Check if using src/app or app\n const srcApp = path.join(process.cwd(), 'src', 'app', 'sitemap.ts')\n const app = path.join(process.cwd(), 'app', 'sitemap.ts')\n\n try {\n await fs.access(path.join(process.cwd(), 'src', 'app'))\n return srcApp\n } catch {\n return app\n }\n}\n\n/**\n * Generate sitemap.ts content\n */\nfunction generateSitemapContent(baseUrl: string): string {\n return `/**\n * Sitemap Generator - Powered by @uptrade/site-kit\n * \n * Automatically discovers pages from the app directory and syncs\n * them to Portal API for SEO tracking and analytics validation.\n * \n * Generated by Uptrade Site-Kit Setup Wizard\n */\n\nimport { createSitemap } from '@uptrade/site-kit/sitemap'\n\nexport default createSitemap({\n baseUrl: '${baseUrl}',\n \n // Optional: Exclude patterns (these are excluded by default)\n // exclude: ['/admin/*', '/api/*'],\n \n // Optional: Override priorities for specific paths\n // priorities: {\n // '/': 1.0,\n // '/about': 0.8,\n // '/contact': 0.7,\n // },\n \n // Optional: Add dynamic routes not discoverable from file system\n // additionalPaths: async () => {\n // // Example: Fetch blog posts from database\n // // const posts = await getBlogPosts()\n // // return posts.map(post => ({ path: \\`/blog/\\${post.slug}\\`, priority: 0.7 }))\n // return []\n // },\n})\n`\n}\n\n/**\n * Remove next-sitemap from package.json dependencies\n */\nexport async function removeNextSitemapDependency(): Promise<boolean> {\n const packageJsonPath = path.join(process.cwd(), 'package.json')\n \n try {\n const content = await fs.readFile(packageJsonPath, 'utf-8')\n const pkg = JSON.parse(content)\n \n let modified = false\n \n if (pkg.dependencies?.['next-sitemap']) {\n delete pkg.dependencies['next-sitemap']\n modified = true\n }\n \n if (pkg.devDependencies?.['next-sitemap']) {\n delete pkg.devDependencies['next-sitemap']\n modified = true\n }\n\n // Also remove from scripts if present\n if (pkg.scripts) {\n for (const [key, value] of Object.entries(pkg.scripts)) {\n if (typeof value === 'string' && value.includes('next-sitemap')) {\n delete pkg.scripts[key]\n modified = true\n }\n }\n }\n\n if (modified) {\n await fs.writeFile(packageJsonPath, JSON.stringify(pkg, null, 2) + '\\n', 'utf-8')\n }\n\n return modified\n } catch {\n return false\n }\n}\n\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/llms/api.ts","../src/llms/generateLLMsTxt.ts","../src/llms/handlers.ts","../src/llms/SpeakableSchema.tsx","../src/llms/AEOComponents.tsx"],"names":["jsx"],"mappings":"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","file":"chunk-CG53ASWX.mjs","sourcesContent":["/**\n * @uptrade/site-kit/llms - API Functions\n * \n * Data fetching for LLM visibility content.\n * Pulls from Signal knowledge base and project data.\n */\n\nimport { cache } from 'react'\nimport type { LLMsDataResponse, LLMBusinessInfo, LLMContactInfo, LLMService, LLMFAQItem, LLMPageSummary } from './types'\n\n// ============================================\n// API Config\n// ============================================\n\nfunction getApiConfig() {\n // Use site-kit globals if available, otherwise fall back to env vars\n const apiUrl = (typeof window !== 'undefined' && (window as any).__SITE_KIT_API_URL__) \n || process.env.NEXT_PUBLIC_UPTRADE_API_URL \n || 'https://api.uptrademedia.com'\n \n const apiKey = (typeof window !== 'undefined' && (window as any).__SITE_KIT_API_KEY__)\n || process.env.NEXT_PUBLIC_UPTRADE_API_KEY \n || ''\n \n return { apiUrl, apiKey }\n}\n\nasync function apiGet<T>(endpoint: string): Promise<T | null> {\n const { apiUrl, apiKey } = getApiConfig()\n \n if (!apiKey) {\n console.error('@uptrade/llms: No API key configured. Set NEXT_PUBLIC_UPTRADE_API_KEY.')\n return null\n }\n \n try {\n const response = await fetch(`${apiUrl}${endpoint}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n next: { revalidate: 3600 }, // Cache for 1 hour\n })\n \n if (!response.ok) {\n console.error(`@uptrade/llms: API error: ${response.statusText}`)\n return null\n }\n \n return await response.json()\n } catch (error) {\n console.error('@uptrade/llms: Network error:', error)\n return null\n }\n}\n\n// ============================================\n// Cached Data Fetchers\n// ============================================\n\n/**\n * Fetch all LLM visibility data for a project - cached per request\n * This is the main data source for llms.txt generation\n * \n * @param projectId - Optional project ID (API key identifies project if omitted)\n */\nexport const getLLMsData = cache(async (\n projectId?: string\n): Promise<LLMsDataResponse | null> => {\n return apiGet<LLMsDataResponse>(`/api/public/llms/data`)\n})\n\n/**\n * Fetch business info only - cached per request\n */\nexport const getBusinessInfo = cache(async (\n projectId?: string\n): Promise<LLMBusinessInfo | null> => {\n const result = await apiGet<{ business: LLMBusinessInfo }>(`/api/public/llms/business`)\n return result?.business || null\n})\n\n/**\n * Fetch services list - cached per request\n */\nexport const getServices = cache(async (\n projectId?: string\n): Promise<LLMService[]> => {\n const result = await apiGet<{ services: LLMService[] }>(`/api/public/llms/services`)\n return result?.services || []\n})\n\n/**\n * Fetch FAQ items - cached per request\n */\nexport const getFAQItems = cache(async (\n projectId?: string,\n limit?: number\n): Promise<LLMFAQItem[]> => {\n const endpoint = limit \n ? `/api/public/llms/faq?limit=${limit}`\n : '/api/public/llms/faq'\n const result = await apiGet<{ faq: LLMFAQItem[] }>(endpoint)\n return result?.faq || []\n})\n\n/**\n * Fetch page summaries for sitemap - cached per request\n */\nexport const getPageSummaries = cache(async (\n projectId?: string,\n limit?: number\n): Promise<LLMPageSummary[]> => {\n const endpoint = limit \n ? `/api/public/llms/pages?limit=${limit}`\n : '/api/public/llms/pages'\n const result = await apiGet<{ pages: LLMPageSummary[] }>(endpoint)\n return result?.pages || []\n})\n","/**\n * @uptrade/site-kit/llms - llms.txt Generator\n * \n * Generates llms.txt content following the llms.txt specification.\n * https://llmstxt.org/\n * \n * The llms.txt file provides a markdown-formatted overview of a website\n * specifically designed for LLM consumption. It helps AI systems understand\n * what a business does, what services it offers, and how to answer questions.\n */\n\nimport { getLLMsData, getBusinessInfo, getServices, getFAQItems, getPageSummaries } from './api'\nimport type { \n GenerateLLMSTxtOptions, \n LLMSTxtContent,\n LLMBusinessInfo,\n LLMContactInfo,\n LLMService,\n LLMFAQItem,\n LLMPageSummary\n} from './types'\n\n/**\n * Generate llms.txt content from Portal data\n * \n * @example\n * ```ts\n * // app/llms.txt/route.ts\n * import { generateLLMsTxt } from '@uptrade/site-kit/llms'\n * \n * export async function GET() {\n * const { markdown } = await generateLLMsTxt({\n * projectId: process.env.UPTRADE_PROJECT_ID!\n * })\n * \n * return new Response(markdown, {\n * headers: { 'Content-Type': 'text/plain; charset=utf-8' }\n * })\n * }\n * ```\n */\nexport async function generateLLMsTxt(\n options: GenerateLLMSTxtOptions\n): Promise<LLMSTxtContent> {\n const {\n projectId,\n includeBusinessInfo = true,\n includeServices = true,\n includeFAQ = true,\n includePages = true,\n includeContact = true,\n maxFAQItems = 20,\n maxPages = 50,\n customSections = [],\n } = options\n\n // Fetch all data\n const data = await getLLMsData(projectId)\n \n if (!data) {\n // Return minimal content if no data\n return {\n markdown: '# Website\\n\\n> Information not available.',\n metadata: {\n generated_at: new Date().toISOString(),\n project_id: projectId || '',\n sections: [],\n }\n }\n }\n\n const sections: string[] = []\n const sectionNames: string[] = []\n\n // ========================================\n // Header Section (H1 + blockquote summary)\n // ========================================\n if (includeBusinessInfo && data.business) {\n const header = generateHeaderSection(data.business)\n sections.push(header)\n sectionNames.push('header')\n }\n\n // ========================================\n // About Section\n // ========================================\n if (includeBusinessInfo && data.business?.description) {\n const about = generateAboutSection(data.business)\n sections.push(about)\n sectionNames.push('about')\n }\n\n // ========================================\n // Services Section\n // ========================================\n if (includeServices && data.services?.length > 0) {\n const services = generateServicesSection(data.services)\n sections.push(services)\n sectionNames.push('services')\n }\n\n // ========================================\n // Contact Section\n // ========================================\n if (includeContact && data.contact) {\n const contact = generateContactSection(data.contact)\n sections.push(contact)\n sectionNames.push('contact')\n }\n\n // ========================================\n // FAQ Section\n // ========================================\n if (includeFAQ && data.faq?.length > 0) {\n const faq = generateFAQSection(data.faq.slice(0, maxFAQItems))\n sections.push(faq)\n sectionNames.push('faq')\n }\n\n // ========================================\n // Pages Section (sitemap-like index)\n // ========================================\n if (includePages && data.pages?.length > 0) {\n const pages = generatePagesSection(data.pages.slice(0, maxPages), data.business?.website || '')\n sections.push(pages)\n sectionNames.push('pages')\n }\n\n // ========================================\n // Custom Sections\n // ========================================\n for (const custom of customSections) {\n sections.push(`## ${custom.title}\\n\\n${custom.content}`)\n sectionNames.push(custom.title.toLowerCase().replace(/\\s+/g, '-'))\n }\n\n return {\n markdown: sections.join('\\n\\n---\\n\\n'),\n metadata: {\n generated_at: new Date().toISOString(),\n project_id: projectId || '',\n sections: sectionNames,\n }\n }\n}\n\n/**\n * Generate llms-full.txt with comprehensive knowledge dump\n * Use this for AI systems that can handle larger context\n */\nexport async function generateLLMsFullTxt(\n options: GenerateLLMSTxtOptions\n): Promise<LLMSTxtContent> {\n return generateLLMsTxt({\n ...options,\n includeBusinessInfo: true,\n includeServices: true,\n includeFAQ: true,\n includePages: true,\n includeContact: true,\n maxFAQItems: 100,\n maxPages: 200,\n })\n}\n\n// ============================================\n// Section Generators\n// ============================================\n\nfunction generateHeaderSection(business: LLMBusinessInfo): string {\n const lines: string[] = []\n \n // H1 with business name\n lines.push(`# ${business.name}`)\n lines.push('')\n \n // Blockquote summary (per llms.txt spec)\n const summary = business.tagline || business.description.split('.')[0]\n lines.push(`> ${summary}`)\n \n if (business.industry) {\n lines.push('')\n lines.push(`**Industry:** ${business.industry}`)\n }\n \n if (business.service_area) {\n lines.push(`**Service Area:** ${business.service_area}`)\n }\n \n if (business.website) {\n lines.push(`**Website:** ${business.website}`)\n }\n\n return lines.join('\\n')\n}\n\nfunction generateAboutSection(business: LLMBusinessInfo): string {\n const lines: string[] = []\n \n lines.push('## About')\n lines.push('')\n lines.push(business.description)\n \n if (business.founded) {\n lines.push('')\n lines.push(`Established: ${business.founded}`)\n }\n\n return lines.join('\\n')\n}\n\nfunction generateServicesSection(services: LLMService[]): string {\n const lines: string[] = []\n \n lines.push('## Services')\n lines.push('')\n \n for (const service of services) {\n if (service.url) {\n lines.push(`- **[${service.name}](${service.url})**: ${service.description}`)\n } else {\n lines.push(`- **${service.name}**: ${service.description}`)\n }\n }\n\n return lines.join('\\n')\n}\n\nfunction generateContactSection(contact: LLMContactInfo): string {\n const lines: string[] = []\n \n lines.push('## Contact Information')\n lines.push('')\n \n if (contact.phone) {\n lines.push(`- **Phone:** ${contact.phone}`)\n }\n if (contact.email) {\n lines.push(`- **Email:** ${contact.email}`)\n }\n if (contact.address || contact.city) {\n const addressParts = [\n contact.address,\n contact.city,\n contact.state,\n contact.postal_code,\n contact.country\n ].filter(Boolean)\n lines.push(`- **Address:** ${addressParts.join(', ')}`)\n }\n if (contact.hours) {\n lines.push(`- **Hours:** ${contact.hours}`)\n }\n\n return lines.join('\\n')\n}\n\nfunction generateFAQSection(faq: LLMFAQItem[]): string {\n const lines: string[] = []\n \n lines.push('## Frequently Asked Questions')\n lines.push('')\n \n for (const item of faq) {\n lines.push(`### ${item.question}`)\n lines.push('')\n lines.push(item.answer)\n lines.push('')\n }\n\n return lines.join('\\n').trim()\n}\n\nfunction generatePagesSection(pages: LLMPageSummary[], baseUrl: string): string {\n const lines: string[] = []\n \n lines.push('## Site Pages')\n lines.push('')\n \n for (const page of pages) {\n const url = page.path.startsWith('http') ? page.path : `${baseUrl}${page.path}`\n if (page.description) {\n lines.push(`- [${page.title}](${url}): ${page.description}`)\n } else {\n lines.push(`- [${page.title}](${url})`)\n }\n }\n\n return lines.join('\\n')\n}\n\nexport default generateLLMsTxt\n","/**\n * @uptrade/site-kit/llms - Next.js Route Handlers\n * \n * Ready-to-use route handlers for /llms.txt and /llms-full.txt\n */\n\nimport { generateLLMsTxt, generateLLMsFullTxt } from './generateLLMsTxt'\nimport type { GenerateLLMSTxtOptions } from './types'\n\n/**\n * Create a route handler for /llms.txt\n * \n * Zero-config by default - uses NEXT_PUBLIC_UPTRADE_API_KEY from environment.\n * \n * @example\n * ```ts\n * // app/llms.txt/route.ts (zero-config)\n * import { createLLMsTxtHandler } from '@uptrade/site-kit/llms'\n * \n * export const GET = createLLMsTxtHandler()\n * ```\n * \n * @example\n * ```ts\n * // With custom options\n * export const GET = createLLMsTxtHandler({\n * includeServices: false\n * })\n * ```\n */\nexport function createLLMsTxtHandler(\n options: GenerateLLMSTxtOptions = {}\n): () => Promise<Response> {\n return async function GET(): Promise<Response> {\n try {\n const { markdown, metadata } = await generateLLMsTxt(options)\n \n return new Response(markdown, {\n status: 200,\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Cache-Control': 'public, max-age=3600, s-maxage=3600',\n 'X-Generated-At': metadata.generated_at,\n 'X-Sections': metadata.sections.join(','),\n },\n })\n } catch (error) {\n console.error('@uptrade/llms: Error generating llms.txt:', error)\n return new Response('# Error\\n\\nUnable to generate llms.txt content.', {\n status: 500,\n headers: { 'Content-Type': 'text/plain; charset=utf-8' },\n })\n }\n }\n}\n\n/**\n * Create a route handler for /llms-full.txt\n * \n * Zero-config by default - uses NEXT_PUBLIC_UPTRADE_API_KEY from environment.\n * \n * @example\n * ```ts\n * // app/llms-full.txt/route.ts (zero-config)\n * import { createLLMsFullTxtHandler } from '@uptrade/site-kit/llms'\n * \n * export const GET = createLLMsFullTxtHandler()\n * ```\n */\nexport function createLLMsFullTxtHandler(\n options: GenerateLLMSTxtOptions = {}\n): () => Promise<Response> {\n return async function GET(): Promise<Response> {\n try {\n const { markdown, metadata } = await generateLLMsFullTxt(options)\n \n return new Response(markdown, {\n status: 200,\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Cache-Control': 'public, max-age=3600, s-maxage=3600',\n 'X-Generated-At': metadata.generated_at,\n 'X-Sections': metadata.sections.join(','),\n },\n })\n } catch (error) {\n console.error('@uptrade/llms: Error generating llms-full.txt:', error)\n return new Response('# Error\\n\\nUnable to generate llms-full.txt content.', {\n status: 500,\n headers: { 'Content-Type': 'text/plain; charset=utf-8' },\n })\n }\n }\n}\n","/**\n * @uptrade/site-kit/llms - Speakable Schema Generator\n * \n * Generates JSON-LD with SpeakableSpecification for voice assistant\n * and AI system content extraction.\n * \n * @see https://schema.org/speakable\n * @see https://developers.google.com/search/docs/appearance/structured-data/speakable\n */\n\nimport * as React from 'react'\nimport type { SpeakableSchemaProps, SpeakableConfig } from './types'\n\n/**\n * Generate a WebPage or Article schema with speakable specification\n * \n * @example\n * ```tsx\n * // In a page component\n * <SpeakableSchema\n * type=\"Article\"\n * name=\"Family Law Services in Cincinnati\"\n * url=\"https://heinrichlaw.com/family-law\"\n * speakable={{\n * cssSelectors: ['.page-summary', '.key-points', 'h1']\n * }}\n * />\n * ```\n */\nexport function SpeakableSchema({\n type,\n name,\n url,\n speakable,\n additionalProperties = {},\n}: SpeakableSchemaProps): React.ReactElement {\n const schema = createSpeakableSchema(type, name, url, speakable, additionalProperties)\n \n return (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(schema, null, 0),\n }}\n />\n )\n}\n\n/**\n * Create speakable schema object (for manual use or testing)\n */\nexport function createSpeakableSchema(\n type: 'Article' | 'WebPage',\n name: string,\n url: string,\n speakable: SpeakableConfig,\n additionalProperties: Record<string, unknown> = {}\n): Record<string, unknown> {\n const speakableSpec: Record<string, unknown> = {\n '@type': 'SpeakableSpecification',\n }\n\n // Prefer CSS selectors, fall back to XPath\n if (speakable.cssSelectors?.length) {\n speakableSpec.cssSelector = speakable.cssSelectors\n } else if (speakable.xPaths?.length) {\n speakableSpec.xpath = speakable.xPaths\n } else {\n // Default speakable selectors for common patterns\n speakableSpec.cssSelector = [\n 'h1',\n '[data-speakable]',\n '.page-summary',\n '.key-points',\n 'meta[name=\"description\"]'\n ]\n }\n\n return {\n '@context': 'https://schema.org',\n '@type': type,\n name,\n url,\n speakable: speakableSpec,\n ...additionalProperties,\n }\n}\n\n/**\n * Default speakable CSS selectors for common page elements\n */\nexport const DEFAULT_SPEAKABLE_SELECTORS = {\n /** Standard page elements */\n page: ['h1', 'meta[name=\"description\"]', '.page-summary'],\n /** Article/blog post elements */\n article: ['h1', '.article-summary', '.article-intro', 'meta[name=\"description\"]'],\n /** Service page elements */\n service: ['h1', '.service-overview', '.key-benefits', 'meta[name=\"description\"]'],\n /** FAQ page elements */\n faq: ['h1', '.faq-intro', '.faq-item'],\n /** Contact page elements */\n contact: ['h1', '.contact-intro', '.business-hours', '.contact-info'],\n}\n\n/**\n * Get recommended speakable selectors for a page type\n */\nexport function getSpeakableSelectorsForPage(\n pageType: 'page' | 'article' | 'service' | 'faq' | 'contact'\n): string[] {\n return DEFAULT_SPEAKABLE_SELECTORS[pageType] || DEFAULT_SPEAKABLE_SELECTORS.page\n}\n\nexport default SpeakableSchema\n","/**\n * @uptrade/site-kit/llms - AEO Components\n * \n * Answer Engine Optimization (AEO) components for structuring content\n * in a way that AI systems can easily extract and cite.\n * \n * These components create semantic HTML with proper structure for:\n * - Featured snippets\n * - AI-generated answers\n * - Voice assistant responses\n * - AI retrieval and citation (Sonor AI Visibility)\n */\n\nimport * as React from 'react'\nimport type { AEOBlockProps, AEOSummaryProps, AEODefinitionProps, AEOClaimProps } from './types'\n\n/**\n * AEOBlock - Generic content block optimized for AI extraction\n * \n * Wraps content with semantic HTML and Sonor data attributes.\n * Use for any content you want AI systems to prioritize.\n * \n * @example\n * ```tsx\n * <AEOBlock type=\"answer\" question=\"What is family law?\" speakable>\n * Family law is the area of legal practice that deals with family-related \n * matters such as divorce, child custody, adoption, and domestic relations.\n * </AEOBlock>\n * ```\n */\nexport function AEOBlock({\n id,\n type,\n question,\n speakable = true,\n entityId,\n children,\n className = '',\n}: AEOBlockProps): React.ReactElement {\n const blockId = id || `aeo-${type}-${Math.random().toString(36).slice(2, 8)}`\n \n const baseClasses = `aeo-block aeo-${type}`\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n // Common data attributes for Sonor AI\n const sonorAttrs = {\n 'data-sonor-ai': type,\n 'data-sonor-block': 'true',\n ...(entityId && { 'data-sonor-entity': entityId }),\n }\n\n // Q&A format for answer type\n if (type === 'answer' && question) {\n return (\n <section \n id={blockId}\n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type={type}\n {...sonorAttrs}\n itemScope\n itemType=\"https://schema.org/Question\"\n >\n <h3 itemProp=\"name\" className=\"aeo-question\">\n {question}\n </h3>\n <div \n itemScope \n itemType=\"https://schema.org/Answer\" \n itemProp=\"acceptedAnswer\"\n className=\"aeo-answer\"\n >\n <div itemProp=\"text\">\n {children}\n </div>\n </div>\n </section>\n )\n }\n\n // Definition format\n if (type === 'definition') {\n return (\n <section \n id={blockId}\n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type={type}\n {...sonorAttrs}\n >\n {children}\n </section>\n )\n }\n\n // Steps format (numbered list)\n if (type === 'steps') {\n return (\n <section \n id={blockId}\n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type={type}\n {...sonorAttrs}\n itemScope\n itemType=\"https://schema.org/HowTo\"\n >\n {children}\n </section>\n )\n }\n\n // Default wrapper\n return (\n <section \n id={blockId}\n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type={type}\n {...sonorAttrs}\n >\n {children}\n </section>\n )\n}\n\n/**\n * AEOSummary - Key points summary for AI extraction\n * \n * Creates a scannable list of key points that AI can easily cite.\n * Perfect for \"at a glance\" or \"key takeaways\" sections.\n * \n * @example\n * ```tsx\n * <AEOSummary \n * title=\"Key Points\" \n * points={[\n * \"Family law covers divorce, custody, and adoption\",\n * \"Ohio is an equitable distribution state\",\n * \"Child custody decisions prioritize the child's best interests\"\n * ]} \n * />\n * ```\n */\nexport function AEOSummary({\n title = 'Key Points',\n points,\n speakable = true,\n entityId,\n className = '',\n}: AEOSummaryProps): React.ReactElement {\n const baseClasses = 'aeo-summary'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <div \n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type=\"summary\"\n data-sonor-ai=\"summary\"\n data-sonor-block=\"true\"\n {...(entityId && { 'data-sonor-entity': entityId })}\n >\n {title && <h3 className=\"aeo-summary-title\">{title}</h3>}\n <ul className=\"aeo-summary-points\">\n {points.map((point, index) => (\n <li key={index} className=\"aeo-summary-point\">\n {point}\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\n/**\n * AEODefinition - Term definition optimized for featured snippets\n * \n * Creates a clear definition format that works well for\n * \"What is X?\" queries in AI search results.\n * \n * @example\n * ```tsx\n * <AEODefinition \n * term=\"Equitable Distribution\" \n * definition=\"A legal principle used in Ohio divorce cases where marital \n * property is divided fairly, though not necessarily equally, between spouses.\"\n * />\n * ```\n */\nexport function AEODefinition({\n term,\n definition,\n speakable = true,\n entityId,\n source,\n className = '',\n}: AEODefinitionProps): React.ReactElement {\n const baseClasses = 'aeo-definition'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <dl \n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type=\"definition\"\n data-sonor-ai=\"definition\"\n data-sonor-block=\"true\"\n {...(entityId && { 'data-sonor-entity': entityId })}\n {...(source && { 'data-sonor-source': source })}\n itemScope\n itemType=\"https://schema.org/DefinedTerm\"\n >\n <dt className=\"aeo-term\" itemProp=\"name\">\n <strong>{term}</strong>\n </dt>\n <dd className=\"aeo-definition-text\" itemProp=\"description\">\n {definition}\n </dd>\n </dl>\n )\n}\n\n/**\n * AEOSteps - How-to steps for featured snippets\n * \n * Creates numbered steps with HowTo schema markup.\n * \n * @example\n * ```tsx\n * <AEOSteps title=\"How to File for Divorce in Ohio\">\n * <AEOStep number={1} name=\"Gather Documents\">\n * Collect financial records, property deeds, and marriage certificate.\n * </AEOStep>\n * <AEOStep number={2} name=\"File Petition\">\n * Submit divorce petition to the county court.\n * </AEOStep>\n * </AEOSteps>\n * ```\n */\nexport function AEOSteps({\n title,\n children,\n speakable = true,\n entityId,\n className = '',\n}: {\n title: string\n children: React.ReactNode\n speakable?: boolean\n entityId?: string\n className?: string\n}): React.ReactElement {\n const baseClasses = 'aeo-steps'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <section \n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type=\"steps\"\n data-sonor-ai=\"steps\"\n data-sonor-block=\"true\"\n {...(entityId && { 'data-sonor-entity': entityId })}\n itemScope\n itemType=\"https://schema.org/HowTo\"\n >\n <h3 className=\"aeo-steps-title\" itemProp=\"name\">{title}</h3>\n <ol className=\"aeo-steps-list\">\n {children}\n </ol>\n </section>\n )\n}\n\n/**\n * AEOStep - Individual step within AEOSteps\n */\nexport function AEOStep({\n number,\n name,\n children,\n}: {\n number: number\n name: string\n children: React.ReactNode\n}): React.ReactElement {\n return (\n <li \n className=\"aeo-step\"\n itemScope\n itemType=\"https://schema.org/HowToStep\"\n itemProp=\"step\"\n >\n <span className=\"aeo-step-number\" itemProp=\"position\">{number}</span>\n <strong className=\"aeo-step-name\" itemProp=\"name\">{name}</strong>\n <div className=\"aeo-step-content\" itemProp=\"text\">\n {children}\n </div>\n </li>\n )\n}\n\n/**\n * AEOComparison - Comparison table for AI extraction\n * \n * Creates a structured comparison that AI can understand and cite.\n * \n * @example\n * ```tsx\n * <AEOComparison \n * title=\"Divorce vs. Dissolution in Ohio\"\n * items={[\n * { aspect: 'Agreement', optionA: 'May be contested', optionB: 'Must be agreed upon' },\n * { aspect: 'Timeline', optionA: '6-12 months', optionB: '30-90 days' },\n * ]}\n * labelA=\"Divorce\"\n * labelB=\"Dissolution\"\n * />\n * ```\n */\nexport function AEOComparison({\n title,\n items,\n labelA,\n labelB,\n speakable = true,\n entityId,\n className = '',\n}: {\n title: string\n items: Array<{ aspect: string; optionA: string; optionB: string }>\n labelA: string\n labelB: string\n speakable?: boolean\n entityId?: string\n className?: string\n}): React.ReactElement {\n const baseClasses = 'aeo-comparison'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <section \n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type=\"comparison\"\n data-sonor-ai=\"comparison\"\n data-sonor-block=\"true\"\n {...(entityId && { 'data-sonor-entity': entityId })}\n >\n <h3 className=\"aeo-comparison-title\">{title}</h3>\n <table className=\"aeo-comparison-table\">\n <thead>\n <tr>\n <th>Aspect</th>\n <th>{labelA}</th>\n <th>{labelB}</th>\n </tr>\n </thead>\n <tbody>\n {items.map((item, index) => (\n <tr key={index}>\n <td className=\"aeo-comparison-aspect\">{item.aspect}</td>\n <td className=\"aeo-comparison-a\">{item.optionA}</td>\n <td className=\"aeo-comparison-b\">{item.optionB}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </section>\n )\n}\n\n/**\n * AEOClaim - AI-Verifiable Claim with Provenance\n * \n * Wraps factual claims with machine-readable source and confidence data.\n * LLMs prioritize verifiable facts with clear provenance.\n * \n * @example\n * ```tsx\n * <AEOClaim \n * source=\"KRS 281A.170\" \n * sourceUrl=\"https://apps.legislature.ky.gov/law/statutes/statute.aspx?id=6398\"\n * confidence={0.95}\n * claimType=\"statute\"\n * >\n * A CDL suspension is triggered at 26 MPH over the limit.\n * </AEOClaim>\n * ```\n */\nexport function AEOClaim({\n source,\n sourceUrl,\n confidence = 1.0,\n claimType = 'fact',\n retrievedAt,\n children,\n className = '',\n}: AEOClaimProps): React.ReactElement {\n const baseClasses = 'aeo-claim'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <span \n className={combinedClasses}\n data-sonor-claim=\"true\"\n data-sonor-source={source}\n {...(sourceUrl && { 'data-sonor-source-url': sourceUrl })}\n data-sonor-confidence={confidence.toString()}\n data-sonor-claim-type={claimType}\n {...(retrievedAt && { 'data-sonor-retrieved': retrievedAt })}\n itemScope\n itemType=\"https://schema.org/Claim\"\n >\n <span itemProp=\"text\">{children}</span>\n {sourceUrl ? (\n <meta itemProp=\"citation\" content={sourceUrl} />\n ) : (\n <meta itemProp=\"citation\" content={source} />\n )}\n </span>\n )\n}\n\n/**\n * AEOEntity - Inline entity annotation\n * \n * Wraps entity mentions with machine-readable entity IDs for knowledge graph linking.\n * \n * @example\n * ```tsx\n * <AEOEntity entityId=\"person-123\" entityType=\"person\" name=\"Shannon Sexton\">\n * Attorney Shannon Sexton\n * </AEOEntity> handles CDL defense cases.\n * ```\n */\nexport function AEOEntity({\n entityId,\n entityType,\n name,\n url,\n children,\n className = '',\n}: {\n entityId: string\n entityType: 'organization' | 'person' | 'service' | 'product' | 'location' | 'concept' | 'credential'\n name: string\n url?: string\n children: React.ReactNode\n className?: string\n}): React.ReactElement {\n const baseClasses = 'aeo-entity'\n const combinedClasses = className ? `${baseClasses} aeo-entity-${entityType} ${className}` : `${baseClasses} aeo-entity-${entityType}`\n\n return (\n <span \n className={combinedClasses}\n data-sonor-entity={entityId}\n data-sonor-entity-type={entityType}\n data-sonor-entity-name={name}\n {...(url && { 'data-sonor-entity-url': url })}\n itemScope\n itemType={`https://schema.org/${entityType === 'organization' ? 'Organization' : entityType === 'person' ? 'Person' : entityType === 'location' ? 'Place' : 'Thing'}`}\n >\n <span itemProp=\"name\">{children}</span>\n {url && <link itemProp=\"url\" href={url} />}\n </span>\n )\n}\n\n// ============================================\n// Content Provenance Components\n// ============================================\n\n/**\n * AEOProvenanceList - Display sources/citations for content\n * \n * Shows a list of provenance sources with machine-readable attributes.\n * LLMs use this to verify claims and assess source quality.\n * \n * @example\n * ```tsx\n * <AEOProvenanceList \n * title=\"Sources\"\n * sources={[\n * { id: '1', source_type: 'legal_statute', title: 'KRS 281A.170', url: '...' },\n * { id: '2', source_type: 'news_article', title: 'CDL News', publisher: 'Transport Weekly' }\n * ]}\n * />\n * ```\n */\nexport function AEOProvenanceList({\n sources,\n title = 'Sources & References',\n className = '',\n}: {\n sources: Array<{\n id: string\n source_type: 'press_release' | 'news_article' | 'legal_statute' | 'research_paper' | 'official_document' | 'internal' | 'citation'\n title: string\n url?: string\n publisher?: string\n published_at?: string\n accessed_at?: string\n excerpt?: string\n confidence?: number\n identifier?: string\n }>\n title?: string\n className?: string\n}): React.ReactElement {\n const baseClasses = 'aeo-provenance-list'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n const getSchemaType = (sourceType: string): string => {\n switch (sourceType) {\n case 'legal_statute':\n return 'https://schema.org/Legislation'\n case 'research_paper':\n return 'https://schema.org/ScholarlyArticle'\n case 'news_article':\n return 'https://schema.org/NewsArticle'\n case 'press_release':\n return 'https://schema.org/NewsArticle'\n default:\n return 'https://schema.org/CreativeWork'\n }\n }\n\n return (\n <aside \n className={combinedClasses}\n data-sonor-provenance=\"list\"\n data-sonor-source-count={sources.length.toString()}\n itemScope\n itemType=\"https://schema.org/ItemList\"\n >\n <h4 className=\"aeo-provenance-title\" itemProp=\"name\">{title}</h4>\n <ol className=\"aeo-provenance-sources\">\n {sources.map((source, index) => (\n <li \n key={source.id}\n className=\"aeo-provenance-item\"\n data-sonor-source-id={source.id}\n data-sonor-source-type={source.source_type}\n {...(source.confidence && { 'data-sonor-confidence': source.confidence.toString() })}\n itemScope\n itemType={getSchemaType(source.source_type)}\n itemProp=\"itemListElement\"\n >\n <span className=\"aeo-provenance-number\">[{index + 1}]</span>\n {source.url ? (\n <a \n href={source.url} \n className=\"aeo-provenance-link\"\n itemProp=\"url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span itemProp=\"name\">{source.title}</span>\n </a>\n ) : (\n <span itemProp=\"name\">{source.title}</span>\n )}\n {source.publisher && (\n <span className=\"aeo-provenance-publisher\" itemProp=\"publisher\">\n — {source.publisher}\n </span>\n )}\n {source.published_at && (\n <time \n className=\"aeo-provenance-date\" \n itemProp=\"datePublished\"\n dateTime={source.published_at}\n >\n ({new Date(source.published_at).toLocaleDateString()})\n </time>\n )}\n {source.identifier && (\n <span className=\"aeo-provenance-identifier\" data-sonor-identifier={source.identifier}>\n {source.identifier}\n </span>\n )}\n {source.excerpt && (\n <blockquote className=\"aeo-provenance-excerpt\" itemProp=\"description\">\n {source.excerpt}\n </blockquote>\n )}\n </li>\n ))}\n </ol>\n </aside>\n )\n}\n\n/**\n * AEOCitedContent - Content with inline citations linked to sources\n * \n * Wraps content that contains numbered citations [1], [2] etc., and links them\n * to a list of provenance sources for AI verification.\n * \n * @example\n * ```tsx\n * <AEOCitedContent \n * sources={[\n * { id: '1', source_type: 'legal_statute', title: 'KRS 281A.170' },\n * { id: '2', source_type: 'news_article', title: 'FMCSA Guidelines 2024' }\n * ]}\n * showSourcesList={true}\n * >\n * <p>Kentucky law requires CDL holders to report violations within 30 days [1]. \n * Federal guidelines add additional requirements [2].</p>\n * </AEOCitedContent>\n * ```\n */\nexport function AEOCitedContent({\n children,\n sources,\n showSourcesList = true,\n className = '',\n}: {\n children: React.ReactNode\n sources: Array<{\n id: string\n source_type: 'press_release' | 'news_article' | 'legal_statute' | 'research_paper' | 'official_document' | 'internal' | 'citation'\n title: string\n url?: string\n publisher?: string\n published_at?: string\n accessed_at?: string\n excerpt?: string\n confidence?: number\n identifier?: string\n }>\n showSourcesList?: boolean\n className?: string\n}): React.ReactElement {\n const baseClasses = 'aeo-cited-content'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <section \n className={combinedClasses}\n data-sonor-ai=\"cited-content\"\n data-sonor-provenance=\"inline\"\n data-sonor-source-count={sources.length.toString()}\n >\n <div className=\"aeo-cited-body\">\n {children}\n </div>\n {showSourcesList && sources.length > 0 && (\n <AEOProvenanceList sources={sources} title=\"References\" />\n )}\n </section>\n )\n}\n\nexport default AEOBlock\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/setup/integration-generator.ts","../src/setup/IntegrationCodeView.tsx"],"names":["jsxs","jsx","useState","useMemo"],"mappings":"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","file":"chunk-DRFTRTKV.js","sourcesContent":["/**\n * Integration Code Generator\n * \n * Generates site-kit integration code snippets based on enabled modules.\n * Used by SetupWizard and can be called standalone.\n */\n\nexport interface IntegrationSnippet {\n module: string\n snippetType: 'install' | 'layout' | 'component' | 'page' | 'api-route' | 'env'\n title: string\n description?: string\n filePath?: string\n code: string\n language: 'typescript' | 'tsx' | 'bash' | 'env'\n order: number\n required: boolean\n}\n\nexport interface GeneratorContext {\n projectId: string\n projectName?: string\n apiUrl?: string\n enabledModules: string[]\n brand?: {\n primaryColor?: string\n secondaryColor?: string\n businessName?: string\n }\n}\n\n/**\n * Generate all integration code snippets for enabled modules\n */\nexport function generateIntegrationCode(context: GeneratorContext): IntegrationSnippet[] {\n const snippets: IntegrationSnippet[] = []\n const apiUrl = context.apiUrl || 'https://api.uptrademedia.com'\n let order = 0\n\n // Always add provider setup first\n snippets.push(...generateProviderSnippets(context, apiUrl, order))\n order += 10\n\n // Add module-specific snippets\n for (const module of context.enabledModules) {\n switch (module) {\n case 'analytics':\n snippets.push(...generateAnalyticsSnippets(context, order))\n order += 10\n break\n case 'engage':\n snippets.push(...generateEngageSnippets(context, order))\n order += 10\n break\n case 'forms':\n snippets.push(...generateFormsSnippets(context, order))\n order += 10\n break\n case 'commerce':\n snippets.push(...generateCommerceSnippets(context, order))\n order += 10\n break\n case 'seo':\n snippets.push(...generateSEOSnippets(context, order))\n order += 10\n break\n case 'blog':\n snippets.push(...generateBlogSnippets(context, order))\n order += 10\n break\n }\n }\n\n return snippets\n}\n\n/**\n * Get snippets grouped by module\n */\nexport function getSnippetsByModule(snippets: IntegrationSnippet[]): Record<string, IntegrationSnippet[]> {\n return snippets.reduce((acc, snippet) => {\n if (!acc[snippet.module]) {\n acc[snippet.module] = []\n }\n acc[snippet.module].push(snippet)\n return acc\n }, {} as Record<string, IntegrationSnippet[]>)\n}\n\n// ============================================\n// Provider Snippets (always required)\n// ============================================\n\nfunction generateProviderSnippets(ctx: GeneratorContext, apiUrl: string, startOrder: number): IntegrationSnippet[] {\n const enabledModulesConfig = ctx.enabledModules\n .map(m => {\n if (m === 'analytics') return ' analytics={{ enabled: true }}'\n if (m === 'engage') return ' engage={{ enabled: true }}'\n return null\n })\n .filter(Boolean)\n .join('\\n')\n\n return [\n {\n module: 'provider',\n snippetType: 'install',\n title: 'Install @uptrade/site-kit',\n description: 'Install the Uptrade Site Kit package',\n code: `pnpm add @uptrade/site-kit`,\n language: 'bash',\n order: startOrder,\n required: true,\n },\n {\n module: 'provider',\n snippetType: 'env',\n title: 'Environment Variables',\n description: 'Add these to your .env.local file',\n filePath: '.env.local',\n code: `# Uptrade Integration\nNEXT_PUBLIC_UPTRADE_API_URL=${apiUrl}\nNEXT_PUBLIC_UPTRADE_PROJECT_ID=${ctx.projectId}\nUPTRADE_API_KEY=your-api-key-here`,\n language: 'env',\n order: startOrder + 1,\n required: true,\n },\n {\n module: 'provider',\n snippetType: 'layout',\n title: 'Root Layout Provider',\n description: 'Wrap your app with SiteKitProvider in app/layout.tsx',\n filePath: 'app/layout.tsx',\n code: `import { SiteKitProvider } from '@uptrade/site-kit'\n\nexport default function RootLayout({\n children,\n}: {\n children: React.ReactNode\n}) {\n return (\n <html lang=\"en\">\n <body>\n <SiteKitProvider\n apiUrl={process.env.NEXT_PUBLIC_UPTRADE_API_URL!}\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n${enabledModulesConfig}\n >\n {children}\n </SiteKitProvider>\n </body>\n </html>\n )\n}`,\n language: 'tsx',\n order: startOrder + 2,\n required: true,\n },\n ]\n}\n\n// ============================================\n// Analytics Snippets\n// ============================================\n\nfunction generateAnalyticsSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n return [\n {\n module: 'analytics',\n snippetType: 'component',\n title: 'Custom Event Tracking',\n description: 'Track custom events throughout your app',\n filePath: 'components/TrackableButton.tsx',\n code: `'use client'\n\nimport { useSiteKit } from '@uptrade/site-kit'\n\ninterface TrackableButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n eventName: string\n eventData?: Record<string, unknown>\n children: React.ReactNode\n}\n\nexport function TrackableButton({ \n children, \n eventName,\n eventData,\n ...props \n}: TrackableButtonProps) {\n const { analytics } = useSiteKit()\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n analytics?.trackEvent(eventName, eventData)\n props.onClick?.(e)\n }\n\n return (\n <button {...props} onClick={handleClick}>\n {children}\n </button>\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: false,\n },\n ]\n}\n\n// ============================================\n// Engage Snippets (Chat Widget)\n// ============================================\n\nfunction generateEngageSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n const primaryColor = ctx.brand?.primaryColor || '#0066cc'\n \n return [\n {\n module: 'engage',\n snippetType: 'component',\n title: 'Chat Widget',\n description: 'Add the AI chat widget to your site. This is unstyled - customize to match your brand.',\n filePath: 'components/ChatWidget.tsx',\n code: `'use client'\n\nimport { ChatWidget } from '@uptrade/site-kit/engage'\n\nexport function SiteChat() {\n return (\n <ChatWidget\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n config={{\n position: 'bottom-right',\n buttonColor: '${primaryColor}',\n greeting: 'Hi! How can I help you today?',\n placeholder: 'Type your message...',\n }}\n />\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: true,\n },\n {\n module: 'engage',\n snippetType: 'layout',\n title: 'Add Chat to Layout',\n description: 'Add the ChatWidget component to your root layout',\n filePath: 'app/layout.tsx',\n code: `// Add import at top:\nimport { SiteChat } from '@/components/ChatWidget'\n\n// Add inside your layout body, after SiteKitProvider children:\n<SiteChat />`,\n language: 'tsx',\n order: startOrder + 1,\n required: true,\n },\n ]\n}\n\n// ============================================\n// Forms Snippets\n// ============================================\n\nfunction generateFormsSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n return [\n {\n module: 'forms',\n snippetType: 'component',\n title: 'Managed Form Component',\n description: 'Embed a managed form from the Portal. Form slug must match one created in Forms module.',\n filePath: 'components/ContactForm.tsx',\n code: `import { ManagedForm } from '@uptrade/site-kit/forms'\n\ninterface ContactFormProps {\n formSlug?: string\n className?: string\n}\n\nexport async function ContactForm({ \n formSlug = 'contact',\n className \n}: ContactFormProps) {\n return (\n <ManagedForm\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n formSlug={formSlug}\n className={className}\n />\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: false,\n },\n {\n module: 'forms',\n snippetType: 'api-route',\n title: 'Form Submission Handler',\n description: 'API route to proxy form submissions to Portal API',\n filePath: 'app/api/forms/[formId]/submit/route.ts',\n code: `import { NextRequest, NextResponse } from 'next/server'\n\nexport async function POST(\n request: NextRequest,\n { params }: { params: { formId: string } }\n) {\n const body = await request.json()\n\n const response = await fetch(\n \\`\\${process.env.NEXT_PUBLIC_UPTRADE_API_URL}/forms/\\${params.formId}/submit\\`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': process.env.UPTRADE_API_KEY!,\n },\n body: JSON.stringify(body),\n }\n )\n\n const data = await response.json()\n return NextResponse.json(data, { status: response.status })\n}`,\n language: 'typescript',\n order: startOrder + 1,\n required: true,\n },\n ]\n}\n\n// ============================================\n// Commerce Snippets\n// ============================================\n\nfunction generateCommerceSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n return [\n {\n module: 'commerce',\n snippetType: 'component',\n title: 'Product Grid',\n description: 'Display products from your commerce catalog',\n filePath: 'components/Products.tsx',\n code: `import { ProductGrid } from '@uptrade/site-kit/commerce'\n\ninterface ProductsSectionProps {\n category?: string\n limit?: number\n}\n\nexport async function ProductsSection({ \n category = 'featured',\n limit = 8 \n}: ProductsSectionProps) {\n return (\n <section className=\"py-12\">\n <h2 className=\"text-2xl font-bold mb-6\">Our Products</h2>\n <ProductGrid\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n category={category}\n limit={limit}\n />\n </section>\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: false,\n },\n {\n module: 'commerce',\n snippetType: 'component',\n title: 'Upcoming Events',\n description: 'Display upcoming events and classes',\n filePath: 'components/Events.tsx',\n code: `import { UpcomingEvents, EventCalendar } from '@uptrade/site-kit/commerce'\n\nexport async function EventsSection({ limit = 6 }: { limit?: number }) {\n return (\n <section className=\"py-12\">\n <h2 className=\"text-2xl font-bold mb-6\">Upcoming Events</h2>\n <UpcomingEvents\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n limit={limit}\n />\n </section>\n )\n}\n\nexport async function FullCalendar() {\n return (\n <EventCalendar\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n />\n )\n}`,\n language: 'tsx',\n order: startOrder + 1,\n required: false,\n },\n ]\n}\n\n// ============================================\n// SEO Snippets (Managed FAQs, Schema)\n// ============================================\n\nfunction generateSEOSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n return [\n {\n module: 'seo',\n snippetType: 'component',\n title: 'Managed FAQ Section',\n description: 'Render FAQs with automatic JSON-LD schema markup. FAQs are managed in Portal SEO module.',\n filePath: 'components/FAQSection.tsx',\n code: `import { ManagedFAQ } from '@uptrade/site-kit/seo'\n\ninterface FAQSectionProps {\n path: string // Page path to fetch FAQs for (e.g., '/services/plumbing')\n className?: string\n}\n\nexport async function FAQSection({ path, className }: FAQSectionProps) {\n return (\n <section className={className}>\n <ManagedFAQ\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n path={path}\n showTitle\n includeSchema\n />\n </section>\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: true,\n },\n {\n module: 'seo',\n snippetType: 'page',\n title: 'Page with Managed Metadata + FAQs',\n description: 'Example dynamic page using managed metadata and FAQ sections',\n filePath: 'app/services/[slug]/page.tsx',\n code: `import { getManagedMetadata, ManagedFAQ } from '@uptrade/site-kit/seo'\nimport type { Metadata } from 'next'\n\ninterface Props {\n params: { slug: string }\n}\n\nexport async function generateMetadata({ params }: Props): Promise<Metadata> {\n const path = \\`/services/\\${params.slug}\\`\n return getManagedMetadata({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,\n path,\n })\n}\n\nexport default async function ServicePage({ params }: Props) {\n const path = \\`/services/\\${params.slug}\\`\n\n return (\n <main>\n <h1 className=\"text-3xl font-bold\">Service: {params.slug}</h1>\n \n {/* Your page content here */}\n \n {/* FAQs section with JSON-LD schema */}\n <section className=\"mt-12\">\n <ManagedFAQ\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n path={path}\n showTitle\n includeSchema\n />\n </section>\n </main>\n )\n}`,\n language: 'tsx',\n order: startOrder + 1,\n required: false,\n },\n ]\n}\n\n// ============================================\n// Blog Snippets\n// ============================================\n\nfunction generateBlogSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n return [\n {\n module: 'blog',\n snippetType: 'page',\n title: 'Blog List Page',\n description: 'Display all blog posts from Portal',\n filePath: 'app/blog/page.tsx',\n code: `import { getBlogPosts } from '@uptrade/site-kit/blog'\nimport Link from 'next/link'\n\nexport default async function BlogPage() {\n const posts = await getBlogPosts({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,\n limit: 10,\n })\n\n return (\n <main className=\"py-12\">\n <h1 className=\"text-3xl font-bold mb-8\">Blog</h1>\n <div className=\"grid gap-6 md:grid-cols-2 lg:grid-cols-3\">\n {posts.map((post) => (\n <article key={post.id} className=\"border rounded-lg p-4\">\n {post.featured_image && (\n <img\n src={post.featured_image}\n alt={post.title}\n className=\"w-full h-48 object-cover rounded mb-4\"\n />\n )}\n <h2 className=\"text-xl font-semibold mb-2\">\n <Link href={\\`/blog/\\${post.slug}\\`}>{post.title}</Link>\n </h2>\n <p className=\"text-gray-600\">{post.excerpt}</p>\n </article>\n ))}\n </div>\n </main>\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: false,\n },\n {\n module: 'blog',\n snippetType: 'page',\n title: 'Blog Post Page',\n description: 'Individual blog post page with SEO metadata',\n filePath: 'app/blog/[slug]/page.tsx',\n code: `import { getBlogPost, getBlogPosts } from '@uptrade/site-kit/blog'\nimport type { Metadata } from 'next'\nimport { notFound } from 'next/navigation'\n\ninterface Props {\n params: { slug: string }\n}\n\nexport async function generateStaticParams() {\n const posts = await getBlogPosts({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,\n })\n return posts.map((post) => ({ slug: post.slug }))\n}\n\nexport async function generateMetadata({ params }: Props): Promise<Metadata> {\n const post = await getBlogPost({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,\n slug: params.slug,\n })\n \n if (!post) return {}\n \n return {\n title: post.title,\n description: post.excerpt,\n openGraph: {\n title: post.title,\n description: post.excerpt,\n images: post.featured_image ? [post.featured_image] : [],\n },\n }\n}\n\nexport default async function BlogPostPage({ params }: Props) {\n const post = await getBlogPost({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,\n slug: params.slug,\n })\n\n if (!post) notFound()\n\n return (\n <article className=\"py-12 max-w-3xl mx-auto\">\n <h1 className=\"text-4xl font-bold mb-4\">{post.title}</h1>\n {post.featured_image && (\n <img\n src={post.featured_image}\n alt={post.title}\n className=\"w-full rounded-lg mb-8\"\n />\n )}\n <div \n className=\"prose prose-lg\"\n dangerouslySetInnerHTML={{ __html: post.content }}\n />\n </article>\n )\n}`,\n language: 'tsx',\n order: startOrder + 1,\n required: false,\n },\n ]\n}\n","/**\n * IntegrationCodeView - Display generated site-kit integration code\n * \n * Shows code snippets grouped by module with copy functionality.\n * Can be used in setup wizards or admin dashboards.\n */\n\n'use client'\n\nimport * as React from 'react'\nimport { useState, useMemo } from 'react'\nimport { generateIntegrationCode, getSnippetsByModule, type IntegrationSnippet, type GeneratorContext } from './integration-generator'\n\n// ============================================\n// Icons (inline SVG to avoid dependencies)\n// ============================================\n\nfunction CopyIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\nfunction ChevronDownIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n )\n}\n\nfunction ChevronRightIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n )\n}\n\n// ============================================\n// Module metadata\n// ============================================\n\nconst moduleLabels: Record<string, string> = {\n provider: 'Setup',\n analytics: 'Analytics',\n engage: 'Engage (Chat)',\n forms: 'Forms',\n commerce: 'Commerce',\n seo: 'SEO',\n blog: 'Blog',\n}\n\nconst moduleColors: Record<string, string> = {\n provider: '#6366f1', // indigo\n analytics: '#8b5cf6', // violet\n engage: '#ec4899', // pink\n forms: '#14b8a6', // teal\n commerce: '#f59e0b', // amber\n seo: '#10b981', // emerald\n blog: '#3b82f6', // blue\n}\n\n// ============================================\n// Component\n// ============================================\n\nexport interface IntegrationCodeViewProps {\n projectId: string\n enabledModules: string[]\n apiUrl?: string\n brand?: {\n primaryColor?: string\n businessName?: string\n }\n className?: string\n onCopy?: (code: string, title: string) => void\n}\n\nexport function IntegrationCodeView({\n projectId,\n enabledModules,\n apiUrl,\n brand,\n className,\n onCopy,\n}: IntegrationCodeViewProps) {\n const [expandedModules, setExpandedModules] = useState<Set<string>>(new Set(['provider']))\n const [copiedId, setCopiedId] = useState<string | null>(null)\n\n // Generate code snippets\n const snippets = useMemo(() => {\n return generateIntegrationCode({\n projectId,\n enabledModules,\n apiUrl,\n brand,\n })\n }, [projectId, enabledModules, apiUrl, brand])\n\n // Group by module\n const snippetsByModule = useMemo(() => {\n return getSnippetsByModule(snippets)\n }, [snippets])\n\n const toggleModule = (module: string) => {\n setExpandedModules(prev => {\n const next = new Set(prev)\n if (next.has(module)) {\n next.delete(module)\n } else {\n next.add(module)\n }\n return next\n })\n }\n\n const copyCode = async (code: string, id: string, title: string) => {\n try {\n await navigator.clipboard.writeText(code)\n setCopiedId(id)\n onCopy?.(code, title)\n setTimeout(() => setCopiedId(null), 2000)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n\n const copyAll = async () => {\n const allCode = snippets\n .map(s => `// ${s.title}\\n${s.filePath ? `// File: ${s.filePath}\\n` : ''}${s.code}`)\n .join('\\n\\n// ---\\n\\n')\n try {\n await navigator.clipboard.writeText(allCode)\n onCopy?.(allCode, 'All snippets')\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n\n if (enabledModules.length === 0) {\n return (\n <div className={className} style={{ textAlign: 'center', padding: '2rem', color: '#666' }}>\n <p>No modules enabled for this project.</p>\n <p style={{ fontSize: '0.875rem', marginTop: '0.5rem' }}>\n Enable modules in Project Settings to generate integration code.\n </p>\n </div>\n )\n }\n\n return (\n <div className={className} style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {/* Header */}\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <div>\n <h3 style={{ margin: 0, fontWeight: 600 }}>Integration Code</h3>\n <p style={{ margin: '0.25rem 0 0', fontSize: '0.875rem', color: '#666' }}>\n {snippets.length} snippets for {enabledModules.length} modules\n </p>\n </div>\n <button\n onClick={copyAll}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n padding: '0.5rem 1rem',\n border: '1px solid #e5e7eb',\n borderRadius: '0.375rem',\n background: 'white',\n cursor: 'pointer',\n fontSize: '0.875rem',\n }}\n >\n <CopyIcon />\n Copy All\n </button>\n </div>\n\n {/* Module Groups */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {Object.entries(snippetsByModule).map(([module, moduleSnippets]) => {\n const isExpanded = expandedModules.has(module)\n const color = moduleColors[module] || '#6366f1'\n \n return (\n <div \n key={module} \n style={{\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n overflow: 'hidden',\n }}\n >\n {/* Module Header */}\n <button\n onClick={() => toggleModule(module)}\n style={{\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '0.75rem 1rem',\n background: '#f9fafb',\n border: 'none',\n cursor: 'pointer',\n textAlign: 'left',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <div\n style={{\n width: '0.5rem',\n height: '0.5rem',\n borderRadius: '50%',\n background: color,\n }}\n />\n <span style={{ fontWeight: 500 }}>\n {moduleLabels[module] || module}\n </span>\n <span\n style={{\n fontSize: '0.75rem',\n padding: '0.125rem 0.5rem',\n background: '#e5e7eb',\n borderRadius: '9999px',\n }}\n >\n {moduleSnippets.length}\n </span>\n </div>\n {isExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </button>\n\n {/* Snippets */}\n {isExpanded && (\n <div>\n {moduleSnippets.map((snippet, idx) => {\n const snippetId = `${module}-${idx}`\n const isCopied = copiedId === snippetId\n\n return (\n <div\n key={idx}\n style={{\n padding: '1rem',\n borderTop: '1px solid #e5e7eb',\n }}\n >\n {/* Snippet Header */}\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '0.75rem' }}>\n <div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <span style={{ fontWeight: 500, fontSize: '0.875rem' }}>\n {snippet.title}\n </span>\n {snippet.required && (\n <span\n style={{\n fontSize: '0.625rem',\n padding: '0.125rem 0.375rem',\n border: '1px solid #e5e7eb',\n borderRadius: '0.25rem',\n textTransform: 'uppercase',\n }}\n >\n Required\n </span>\n )}\n </div>\n {snippet.description && (\n <p style={{ margin: '0.25rem 0 0', fontSize: '0.75rem', color: '#666' }}>\n {snippet.description}\n </p>\n )}\n {snippet.filePath && (\n <p style={{ margin: '0.25rem 0 0', fontSize: '0.75rem', color: color, fontFamily: 'monospace' }}>\n {snippet.filePath}\n </p>\n )}\n </div>\n <button\n onClick={() => copyCode(snippet.code, snippetId, snippet.title)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '2rem',\n height: '2rem',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '0.25rem',\n }}\n title=\"Copy code\"\n >\n {isCopied ? (\n <CheckIcon className=\"text-green-500\" />\n ) : (\n <CopyIcon />\n )}\n </button>\n </div>\n\n {/* Code Block */}\n <pre\n style={{\n margin: 0,\n padding: '0.75rem',\n background: '#1f2937',\n color: '#e5e7eb',\n borderRadius: '0.375rem',\n overflow: 'auto',\n fontSize: '0.75rem',\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n lineHeight: 1.5,\n }}\n >\n <code>{snippet.code}</code>\n </pre>\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/setup/integration-generator.ts","../src/setup/IntegrationCodeView.tsx"],"names":[],"mappings":"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","file":"chunk-EL5QTAA3.mjs","sourcesContent":["/**\n * Integration Code Generator\n * \n * Generates site-kit integration code snippets based on enabled modules.\n * Used by SetupWizard and can be called standalone.\n */\n\nexport interface IntegrationSnippet {\n module: string\n snippetType: 'install' | 'layout' | 'component' | 'page' | 'api-route' | 'env'\n title: string\n description?: string\n filePath?: string\n code: string\n language: 'typescript' | 'tsx' | 'bash' | 'env'\n order: number\n required: boolean\n}\n\nexport interface GeneratorContext {\n projectId: string\n projectName?: string\n apiUrl?: string\n enabledModules: string[]\n brand?: {\n primaryColor?: string\n secondaryColor?: string\n businessName?: string\n }\n}\n\n/**\n * Generate all integration code snippets for enabled modules\n */\nexport function generateIntegrationCode(context: GeneratorContext): IntegrationSnippet[] {\n const snippets: IntegrationSnippet[] = []\n const apiUrl = context.apiUrl || 'https://api.uptrademedia.com'\n let order = 0\n\n // Always add provider setup first\n snippets.push(...generateProviderSnippets(context, apiUrl, order))\n order += 10\n\n // Add module-specific snippets\n for (const module of context.enabledModules) {\n switch (module) {\n case 'analytics':\n snippets.push(...generateAnalyticsSnippets(context, order))\n order += 10\n break\n case 'engage':\n snippets.push(...generateEngageSnippets(context, order))\n order += 10\n break\n case 'forms':\n snippets.push(...generateFormsSnippets(context, order))\n order += 10\n break\n case 'commerce':\n snippets.push(...generateCommerceSnippets(context, order))\n order += 10\n break\n case 'seo':\n snippets.push(...generateSEOSnippets(context, order))\n order += 10\n break\n case 'blog':\n snippets.push(...generateBlogSnippets(context, order))\n order += 10\n break\n }\n }\n\n return snippets\n}\n\n/**\n * Get snippets grouped by module\n */\nexport function getSnippetsByModule(snippets: IntegrationSnippet[]): Record<string, IntegrationSnippet[]> {\n return snippets.reduce((acc, snippet) => {\n if (!acc[snippet.module]) {\n acc[snippet.module] = []\n }\n acc[snippet.module].push(snippet)\n return acc\n }, {} as Record<string, IntegrationSnippet[]>)\n}\n\n// ============================================\n// Provider Snippets (always required)\n// ============================================\n\nfunction generateProviderSnippets(ctx: GeneratorContext, apiUrl: string, startOrder: number): IntegrationSnippet[] {\n const enabledModulesConfig = ctx.enabledModules\n .map(m => {\n if (m === 'analytics') return ' analytics={{ enabled: true }}'\n if (m === 'engage') return ' engage={{ enabled: true }}'\n return null\n })\n .filter(Boolean)\n .join('\\n')\n\n return [\n {\n module: 'provider',\n snippetType: 'install',\n title: 'Install @uptrade/site-kit',\n description: 'Install the Uptrade Site Kit package',\n code: `pnpm add @uptrade/site-kit`,\n language: 'bash',\n order: startOrder,\n required: true,\n },\n {\n module: 'provider',\n snippetType: 'env',\n title: 'Environment Variables',\n description: 'Add these to your .env.local file',\n filePath: '.env.local',\n code: `# Uptrade Integration\nNEXT_PUBLIC_UPTRADE_API_URL=${apiUrl}\nNEXT_PUBLIC_UPTRADE_PROJECT_ID=${ctx.projectId}\nUPTRADE_API_KEY=your-api-key-here`,\n language: 'env',\n order: startOrder + 1,\n required: true,\n },\n {\n module: 'provider',\n snippetType: 'layout',\n title: 'Root Layout Provider',\n description: 'Wrap your app with SiteKitProvider in app/layout.tsx',\n filePath: 'app/layout.tsx',\n code: `import { SiteKitProvider } from '@uptrade/site-kit'\n\nexport default function RootLayout({\n children,\n}: {\n children: React.ReactNode\n}) {\n return (\n <html lang=\"en\">\n <body>\n <SiteKitProvider\n apiUrl={process.env.NEXT_PUBLIC_UPTRADE_API_URL!}\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n${enabledModulesConfig}\n >\n {children}\n </SiteKitProvider>\n </body>\n </html>\n )\n}`,\n language: 'tsx',\n order: startOrder + 2,\n required: true,\n },\n ]\n}\n\n// ============================================\n// Analytics Snippets\n// ============================================\n\nfunction generateAnalyticsSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n return [\n {\n module: 'analytics',\n snippetType: 'component',\n title: 'Custom Event Tracking',\n description: 'Track custom events throughout your app',\n filePath: 'components/TrackableButton.tsx',\n code: `'use client'\n\nimport { useSiteKit } from '@uptrade/site-kit'\n\ninterface TrackableButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n eventName: string\n eventData?: Record<string, unknown>\n children: React.ReactNode\n}\n\nexport function TrackableButton({ \n children, \n eventName,\n eventData,\n ...props \n}: TrackableButtonProps) {\n const { analytics } = useSiteKit()\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n analytics?.trackEvent(eventName, eventData)\n props.onClick?.(e)\n }\n\n return (\n <button {...props} onClick={handleClick}>\n {children}\n </button>\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: false,\n },\n ]\n}\n\n// ============================================\n// Engage Snippets (Chat Widget)\n// ============================================\n\nfunction generateEngageSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n const primaryColor = ctx.brand?.primaryColor || '#0066cc'\n \n return [\n {\n module: 'engage',\n snippetType: 'component',\n title: 'Chat Widget',\n description: 'Add the AI chat widget to your site. This is unstyled - customize to match your brand.',\n filePath: 'components/ChatWidget.tsx',\n code: `'use client'\n\nimport { ChatWidget } from '@uptrade/site-kit/engage'\n\nexport function SiteChat() {\n return (\n <ChatWidget\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n config={{\n position: 'bottom-right',\n buttonColor: '${primaryColor}',\n greeting: 'Hi! How can I help you today?',\n placeholder: 'Type your message...',\n }}\n />\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: true,\n },\n {\n module: 'engage',\n snippetType: 'layout',\n title: 'Add Chat to Layout',\n description: 'Add the ChatWidget component to your root layout',\n filePath: 'app/layout.tsx',\n code: `// Add import at top:\nimport { SiteChat } from '@/components/ChatWidget'\n\n// Add inside your layout body, after SiteKitProvider children:\n<SiteChat />`,\n language: 'tsx',\n order: startOrder + 1,\n required: true,\n },\n ]\n}\n\n// ============================================\n// Forms Snippets\n// ============================================\n\nfunction generateFormsSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n return [\n {\n module: 'forms',\n snippetType: 'component',\n title: 'Managed Form Component',\n description: 'Embed a managed form from the Portal. Form slug must match one created in Forms module.',\n filePath: 'components/ContactForm.tsx',\n code: `import { ManagedForm } from '@uptrade/site-kit/forms'\n\ninterface ContactFormProps {\n formSlug?: string\n className?: string\n}\n\nexport async function ContactForm({ \n formSlug = 'contact',\n className \n}: ContactFormProps) {\n return (\n <ManagedForm\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n formSlug={formSlug}\n className={className}\n />\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: false,\n },\n {\n module: 'forms',\n snippetType: 'api-route',\n title: 'Form Submission Handler',\n description: 'API route to proxy form submissions to Portal API',\n filePath: 'app/api/forms/[formId]/submit/route.ts',\n code: `import { NextRequest, NextResponse } from 'next/server'\n\nexport async function POST(\n request: NextRequest,\n { params }: { params: { formId: string } }\n) {\n const body = await request.json()\n\n const response = await fetch(\n \\`\\${process.env.NEXT_PUBLIC_UPTRADE_API_URL}/forms/\\${params.formId}/submit\\`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': process.env.UPTRADE_API_KEY!,\n },\n body: JSON.stringify(body),\n }\n )\n\n const data = await response.json()\n return NextResponse.json(data, { status: response.status })\n}`,\n language: 'typescript',\n order: startOrder + 1,\n required: true,\n },\n ]\n}\n\n// ============================================\n// Commerce Snippets\n// ============================================\n\nfunction generateCommerceSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n return [\n {\n module: 'commerce',\n snippetType: 'component',\n title: 'Product Grid',\n description: 'Display products from your commerce catalog',\n filePath: 'components/Products.tsx',\n code: `import { ProductGrid } from '@uptrade/site-kit/commerce'\n\ninterface ProductsSectionProps {\n category?: string\n limit?: number\n}\n\nexport async function ProductsSection({ \n category = 'featured',\n limit = 8 \n}: ProductsSectionProps) {\n return (\n <section className=\"py-12\">\n <h2 className=\"text-2xl font-bold mb-6\">Our Products</h2>\n <ProductGrid\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n category={category}\n limit={limit}\n />\n </section>\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: false,\n },\n {\n module: 'commerce',\n snippetType: 'component',\n title: 'Upcoming Events',\n description: 'Display upcoming events and classes',\n filePath: 'components/Events.tsx',\n code: `import { UpcomingEvents, EventCalendar } from '@uptrade/site-kit/commerce'\n\nexport async function EventsSection({ limit = 6 }: { limit?: number }) {\n return (\n <section className=\"py-12\">\n <h2 className=\"text-2xl font-bold mb-6\">Upcoming Events</h2>\n <UpcomingEvents\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n limit={limit}\n />\n </section>\n )\n}\n\nexport async function FullCalendar() {\n return (\n <EventCalendar\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n />\n )\n}`,\n language: 'tsx',\n order: startOrder + 1,\n required: false,\n },\n ]\n}\n\n// ============================================\n// SEO Snippets (Managed FAQs, Schema)\n// ============================================\n\nfunction generateSEOSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n return [\n {\n module: 'seo',\n snippetType: 'component',\n title: 'Managed FAQ Section',\n description: 'Render FAQs with automatic JSON-LD schema markup. FAQs are managed in Portal SEO module.',\n filePath: 'components/FAQSection.tsx',\n code: `import { ManagedFAQ } from '@uptrade/site-kit/seo'\n\ninterface FAQSectionProps {\n path: string // Page path to fetch FAQs for (e.g., '/services/plumbing')\n className?: string\n}\n\nexport async function FAQSection({ path, className }: FAQSectionProps) {\n return (\n <section className={className}>\n <ManagedFAQ\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n path={path}\n showTitle\n includeSchema\n />\n </section>\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: true,\n },\n {\n module: 'seo',\n snippetType: 'page',\n title: 'Page with Managed Metadata + FAQs',\n description: 'Example dynamic page using managed metadata and FAQ sections',\n filePath: 'app/services/[slug]/page.tsx',\n code: `import { getManagedMetadata, ManagedFAQ } from '@uptrade/site-kit/seo'\nimport type { Metadata } from 'next'\n\ninterface Props {\n params: { slug: string }\n}\n\nexport async function generateMetadata({ params }: Props): Promise<Metadata> {\n const path = \\`/services/\\${params.slug}\\`\n return getManagedMetadata({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,\n path,\n })\n}\n\nexport default async function ServicePage({ params }: Props) {\n const path = \\`/services/\\${params.slug}\\`\n\n return (\n <main>\n <h1 className=\"text-3xl font-bold\">Service: {params.slug}</h1>\n \n {/* Your page content here */}\n \n {/* FAQs section with JSON-LD schema */}\n <section className=\"mt-12\">\n <ManagedFAQ\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n path={path}\n showTitle\n includeSchema\n />\n </section>\n </main>\n )\n}`,\n language: 'tsx',\n order: startOrder + 1,\n required: false,\n },\n ]\n}\n\n// ============================================\n// Blog Snippets\n// ============================================\n\nfunction generateBlogSnippets(ctx: GeneratorContext, startOrder: number): IntegrationSnippet[] {\n return [\n {\n module: 'blog',\n snippetType: 'page',\n title: 'Blog List Page',\n description: 'Display all blog posts from Portal',\n filePath: 'app/blog/page.tsx',\n code: `import { getBlogPosts } from '@uptrade/site-kit/blog'\nimport Link from 'next/link'\n\nexport default async function BlogPage() {\n const posts = await getBlogPosts({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,\n limit: 10,\n })\n\n return (\n <main className=\"py-12\">\n <h1 className=\"text-3xl font-bold mb-8\">Blog</h1>\n <div className=\"grid gap-6 md:grid-cols-2 lg:grid-cols-3\">\n {posts.map((post) => (\n <article key={post.id} className=\"border rounded-lg p-4\">\n {post.featured_image && (\n <img\n src={post.featured_image}\n alt={post.title}\n className=\"w-full h-48 object-cover rounded mb-4\"\n />\n )}\n <h2 className=\"text-xl font-semibold mb-2\">\n <Link href={\\`/blog/\\${post.slug}\\`}>{post.title}</Link>\n </h2>\n <p className=\"text-gray-600\">{post.excerpt}</p>\n </article>\n ))}\n </div>\n </main>\n )\n}`,\n language: 'tsx',\n order: startOrder,\n required: false,\n },\n {\n module: 'blog',\n snippetType: 'page',\n title: 'Blog Post Page',\n description: 'Individual blog post page with SEO metadata',\n filePath: 'app/blog/[slug]/page.tsx',\n code: `import { getBlogPost, getBlogPosts } from '@uptrade/site-kit/blog'\nimport type { Metadata } from 'next'\nimport { notFound } from 'next/navigation'\n\ninterface Props {\n params: { slug: string }\n}\n\nexport async function generateStaticParams() {\n const posts = await getBlogPosts({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,\n })\n return posts.map((post) => ({ slug: post.slug }))\n}\n\nexport async function generateMetadata({ params }: Props): Promise<Metadata> {\n const post = await getBlogPost({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,\n slug: params.slug,\n })\n \n if (!post) return {}\n \n return {\n title: post.title,\n description: post.excerpt,\n openGraph: {\n title: post.title,\n description: post.excerpt,\n images: post.featured_image ? [post.featured_image] : [],\n },\n }\n}\n\nexport default async function BlogPostPage({ params }: Props) {\n const post = await getBlogPost({\n projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,\n slug: params.slug,\n })\n\n if (!post) notFound()\n\n return (\n <article className=\"py-12 max-w-3xl mx-auto\">\n <h1 className=\"text-4xl font-bold mb-4\">{post.title}</h1>\n {post.featured_image && (\n <img\n src={post.featured_image}\n alt={post.title}\n className=\"w-full rounded-lg mb-8\"\n />\n )}\n <div \n className=\"prose prose-lg\"\n dangerouslySetInnerHTML={{ __html: post.content }}\n />\n </article>\n )\n}`,\n language: 'tsx',\n order: startOrder + 1,\n required: false,\n },\n ]\n}\n","/**\n * IntegrationCodeView - Display generated site-kit integration code\n * \n * Shows code snippets grouped by module with copy functionality.\n * Can be used in setup wizards or admin dashboards.\n */\n\n'use client'\n\nimport * as React from 'react'\nimport { useState, useMemo } from 'react'\nimport { generateIntegrationCode, getSnippetsByModule, type IntegrationSnippet, type GeneratorContext } from './integration-generator'\n\n// ============================================\n// Icons (inline SVG to avoid dependencies)\n// ============================================\n\nfunction CopyIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\nfunction ChevronDownIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n )\n}\n\nfunction ChevronRightIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n )\n}\n\n// ============================================\n// Module metadata\n// ============================================\n\nconst moduleLabels: Record<string, string> = {\n provider: 'Setup',\n analytics: 'Analytics',\n engage: 'Engage (Chat)',\n forms: 'Forms',\n commerce: 'Commerce',\n seo: 'SEO',\n blog: 'Blog',\n}\n\nconst moduleColors: Record<string, string> = {\n provider: '#6366f1', // indigo\n analytics: '#8b5cf6', // violet\n engage: '#ec4899', // pink\n forms: '#14b8a6', // teal\n commerce: '#f59e0b', // amber\n seo: '#10b981', // emerald\n blog: '#3b82f6', // blue\n}\n\n// ============================================\n// Component\n// ============================================\n\nexport interface IntegrationCodeViewProps {\n projectId: string\n enabledModules: string[]\n apiUrl?: string\n brand?: {\n primaryColor?: string\n businessName?: string\n }\n className?: string\n onCopy?: (code: string, title: string) => void\n}\n\nexport function IntegrationCodeView({\n projectId,\n enabledModules,\n apiUrl,\n brand,\n className,\n onCopy,\n}: IntegrationCodeViewProps) {\n const [expandedModules, setExpandedModules] = useState<Set<string>>(new Set(['provider']))\n const [copiedId, setCopiedId] = useState<string | null>(null)\n\n // Generate code snippets\n const snippets = useMemo(() => {\n return generateIntegrationCode({\n projectId,\n enabledModules,\n apiUrl,\n brand,\n })\n }, [projectId, enabledModules, apiUrl, brand])\n\n // Group by module\n const snippetsByModule = useMemo(() => {\n return getSnippetsByModule(snippets)\n }, [snippets])\n\n const toggleModule = (module: string) => {\n setExpandedModules(prev => {\n const next = new Set(prev)\n if (next.has(module)) {\n next.delete(module)\n } else {\n next.add(module)\n }\n return next\n })\n }\n\n const copyCode = async (code: string, id: string, title: string) => {\n try {\n await navigator.clipboard.writeText(code)\n setCopiedId(id)\n onCopy?.(code, title)\n setTimeout(() => setCopiedId(null), 2000)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n\n const copyAll = async () => {\n const allCode = snippets\n .map(s => `// ${s.title}\\n${s.filePath ? `// File: ${s.filePath}\\n` : ''}${s.code}`)\n .join('\\n\\n// ---\\n\\n')\n try {\n await navigator.clipboard.writeText(allCode)\n onCopy?.(allCode, 'All snippets')\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n\n if (enabledModules.length === 0) {\n return (\n <div className={className} style={{ textAlign: 'center', padding: '2rem', color: '#666' }}>\n <p>No modules enabled for this project.</p>\n <p style={{ fontSize: '0.875rem', marginTop: '0.5rem' }}>\n Enable modules in Project Settings to generate integration code.\n </p>\n </div>\n )\n }\n\n return (\n <div className={className} style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {/* Header */}\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <div>\n <h3 style={{ margin: 0, fontWeight: 600 }}>Integration Code</h3>\n <p style={{ margin: '0.25rem 0 0', fontSize: '0.875rem', color: '#666' }}>\n {snippets.length} snippets for {enabledModules.length} modules\n </p>\n </div>\n <button\n onClick={copyAll}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n padding: '0.5rem 1rem',\n border: '1px solid #e5e7eb',\n borderRadius: '0.375rem',\n background: 'white',\n cursor: 'pointer',\n fontSize: '0.875rem',\n }}\n >\n <CopyIcon />\n Copy All\n </button>\n </div>\n\n {/* Module Groups */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {Object.entries(snippetsByModule).map(([module, moduleSnippets]) => {\n const isExpanded = expandedModules.has(module)\n const color = moduleColors[module] || '#6366f1'\n \n return (\n <div \n key={module} \n style={{\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n overflow: 'hidden',\n }}\n >\n {/* Module Header */}\n <button\n onClick={() => toggleModule(module)}\n style={{\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '0.75rem 1rem',\n background: '#f9fafb',\n border: 'none',\n cursor: 'pointer',\n textAlign: 'left',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <div\n style={{\n width: '0.5rem',\n height: '0.5rem',\n borderRadius: '50%',\n background: color,\n }}\n />\n <span style={{ fontWeight: 500 }}>\n {moduleLabels[module] || module}\n </span>\n <span\n style={{\n fontSize: '0.75rem',\n padding: '0.125rem 0.5rem',\n background: '#e5e7eb',\n borderRadius: '9999px',\n }}\n >\n {moduleSnippets.length}\n </span>\n </div>\n {isExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </button>\n\n {/* Snippets */}\n {isExpanded && (\n <div>\n {moduleSnippets.map((snippet, idx) => {\n const snippetId = `${module}-${idx}`\n const isCopied = copiedId === snippetId\n\n return (\n <div\n key={idx}\n style={{\n padding: '1rem',\n borderTop: '1px solid #e5e7eb',\n }}\n >\n {/* Snippet Header */}\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '0.75rem' }}>\n <div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <span style={{ fontWeight: 500, fontSize: '0.875rem' }}>\n {snippet.title}\n </span>\n {snippet.required && (\n <span\n style={{\n fontSize: '0.625rem',\n padding: '0.125rem 0.375rem',\n border: '1px solid #e5e7eb',\n borderRadius: '0.25rem',\n textTransform: 'uppercase',\n }}\n >\n Required\n </span>\n )}\n </div>\n {snippet.description && (\n <p style={{ margin: '0.25rem 0 0', fontSize: '0.75rem', color: '#666' }}>\n {snippet.description}\n </p>\n )}\n {snippet.filePath && (\n <p style={{ margin: '0.25rem 0 0', fontSize: '0.75rem', color: color, fontFamily: 'monospace' }}>\n {snippet.filePath}\n </p>\n )}\n </div>\n <button\n onClick={() => copyCode(snippet.code, snippetId, snippet.title)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '2rem',\n height: '2rem',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '0.25rem',\n }}\n title=\"Copy code\"\n >\n {isCopied ? (\n <CheckIcon className=\"text-green-500\" />\n ) : (\n <CopyIcon />\n )}\n </button>\n </div>\n\n {/* Code Block */}\n <pre\n style={{\n margin: 0,\n padding: '0.75rem',\n background: '#1f2937',\n color: '#e5e7eb',\n borderRadius: '0.375rem',\n overflow: 'auto',\n fontSize: '0.75rem',\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n lineHeight: 1.5,\n }}\n >\n <code>{snippet.code}</code>\n </pre>\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n"]}