@sonordev/site-kit 1.4.9 → 1.5.0

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.
@@ -339,5 +339,5 @@ async function handleRequest(req, route) {
339
339
  }
340
340
 
341
341
  exports.handleRequest = handleRequest;
342
- //# sourceMappingURL=chunk-JKPJ2QCC.js.map
343
- //# sourceMappingURL=chunk-JKPJ2QCC.js.map
342
+ //# sourceMappingURL=chunk-6YW6EWMH.js.map
343
+ //# sourceMappingURL=chunk-6YW6EWMH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/setup/api-handlers.ts"],"names":["NextResponse"],"mappings":"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","file":"chunk-JKPJ2QCC.js","sourcesContent":["/**\n * Setup Wizard API Handlers\n * \n * These are Next.js API route handlers that the SetupWizard component calls.\n * They run on the server and have access to fs for code generation.\n * \n * Usage: Copy these to your app/_uptrade/api/ folder\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\n\n// ============================================\n// Configuration\n// ============================================\n\nconst PORTAL_URL = process.env.UPTRADE_PORTAL_URL || 'https://app.sonor.io'\nconst API_URL = process.env.UPTRADE_API_URL || 'https://api.sonor.io'\n\n// In-memory session store (for dev server only)\nlet authSession: {\n accessToken?: string\n userId?: string\n email?: string\n pendingCode?: string\n} = {}\n\n// ============================================\n// Status Handler\n// ============================================\n\nexport async function handleStatus(): Promise<NextResponse> {\n const configured = !!(\n process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID &&\n process.env.NEXT_PUBLIC_SUPABASE_URL\n )\n\n return NextResponse.json({\n configured,\n authenticated: !!authSession.accessToken,\n email: authSession.email\n })\n}\n\n// ============================================\n// Auth Handlers\n// ============================================\n\nexport async function handleAuthStart(): Promise<NextResponse> {\n const state = Math.random().toString(36).substring(7)\n const redirectUri = 'http://localhost:3000/_uptrade/api/auth/callback'\n \n const authUrl = `${PORTAL_URL}/auth/cli?` + new URLSearchParams({\n redirect_uri: redirectUri,\n state\n })\n\n return NextResponse.json({ authUrl, state })\n}\n\nexport async function handleAuthCallback(req: NextRequest): Promise<NextResponse> {\n const { searchParams } = new URL(req.url)\n const code = searchParams.get('code')\n const error = searchParams.get('error')\n\n if (error) {\n return new NextResponse(errorHtml('Authentication Failed', error), {\n headers: { 'Content-Type': 'text/html' }\n })\n }\n\n if (!code) {\n return new NextResponse(errorHtml('Missing Code', 'No authorization code received'), {\n headers: { 'Content-Type': 'text/html' }\n })\n }\n\n try {\n // Exchange code for token\n const tokenResponse = await fetch(`${API_URL}/auth/cli-token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n code,\n redirect_uri: 'http://localhost:3000/_uptrade/api/auth/callback'\n })\n })\n\n if (!tokenResponse.ok) {\n throw new Error('Failed to exchange code for token')\n }\n\n const { access_token, user_id, email } = await tokenResponse.json()\n \n authSession = {\n accessToken: access_token,\n userId: user_id,\n email\n }\n\n return new NextResponse(successHtml(), {\n headers: { 'Content-Type': 'text/html' }\n })\n } catch (err) {\n return new NextResponse(errorHtml('Token Exchange Failed', (err as Error).message), {\n headers: { 'Content-Type': 'text/html' }\n })\n }\n}\n\nexport async function handleAuthStatus(): Promise<NextResponse> {\n return NextResponse.json({\n authenticated: !!authSession.accessToken,\n email: authSession.email\n })\n}\n\nexport async function handleApiKeyAuth(req: NextRequest): Promise<NextResponse> {\n const { apiKey } = await req.json()\n\n try {\n const response = await fetch(`${API_URL}/auth/verify-api-key`, {\n headers: { 'Authorization': `Bearer ${apiKey}` }\n })\n\n if (!response.ok) {\n return NextResponse.json({ error: 'Invalid API key' }, { status: 401 })\n }\n\n const { user_id, email } = await response.json()\n \n authSession = {\n accessToken: apiKey,\n userId: user_id,\n email\n }\n\n return NextResponse.json({ email })\n } catch {\n return NextResponse.json({ error: 'Authentication failed' }, { status: 500 })\n }\n}\n\n// ============================================\n// Organization & Project Handlers\n// ============================================\n\nexport async function handleGetOrganizations(): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n try {\n const response = await fetch(`${API_URL}/organizations`, {\n headers: { 'Authorization': `Bearer ${authSession.accessToken}` }\n })\n\n if (!response.ok) {\n throw new Error('Failed to fetch organizations')\n }\n\n const organizations = await response.json()\n return NextResponse.json({ organizations })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\nexport async function handleCreateProject(req: NextRequest): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n const { orgId, name, domain } = await req.json()\n\n try {\n const response = await fetch(`${API_URL}/organizations/${orgId}/projects`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${authSession.accessToken}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ name, domain })\n })\n\n if (!response.ok) {\n throw new Error('Failed to create project')\n }\n\n const project = await response.json()\n return NextResponse.json(project)\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Scan Handler\n// ============================================\n\nexport async function handleScan(): Promise<NextResponse> {\n const { scanCodebase } = await import('../cli/scanner')\n \n try {\n const results = await scanCodebase(process.cwd())\n \n return NextResponse.json({\n forms: results.forms.map(f => ({\n type: 'form',\n form_library: f.formLibrary,\n file: f.filePath,\n component_name: f.componentName,\n line: f.startLine,\n fields: f.fields,\n complexity: f.complexity,\n suggested_action: f.suggestedAction,\n has_validation: f.hasValidation,\n submits_to: f.submitsTo,\n })),\n widgets: results.widgets.map(w => ({\n type: 'widget',\n widget_type: w.widgetType,\n file: w.filePath,\n line: w.startLine,\n })),\n metadata: results.metadata.map(m => ({\n type: 'metadata',\n metadata_type: m.type,\n file: m.filePath,\n title: m.title,\n description: m.description,\n })),\n sitemaps: results.sitemaps.map(s => ({\n type: 'sitemap',\n sitemap_type: s.type,\n file: s.filePath,\n line: s.startLine,\n generator: s.generator,\n })),\n })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Migrate Handler\n// ============================================\n\nexport async function handleMigrate(req: NextRequest): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n const { item, projectId } = await req.json()\n const { migrateFiles } = await import('../cli/migrator')\n\n try {\n // Wrap item into ScanResults format\n const scanResults = { \n forms: [item], \n metadata: [], \n widgets: [], \n sitemaps: [],\n schemas: [],\n faqs: [],\n analytics: [],\n images: [],\n }\n const options = { projectId, apiKey: authSession.accessToken || '' }\n await migrateFiles(scanResults, options)\n return NextResponse.json({ success: true })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Configure Handler\n// ============================================\n\nexport async function handleConfigure(req: NextRequest): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n const { projectId } = await req.json()\n const { generateEnvFile, generateProvider } = await import('../cli/generators')\n\n try {\n // Get Supabase config from API\n const configResponse = await fetch(`${API_URL}/projects/${projectId}/config`, {\n headers: { 'Authorization': `Bearer ${authSession.accessToken}` }\n })\n\n if (!configResponse.ok) {\n throw new Error('Failed to fetch project config')\n }\n\n const config = await configResponse.json()\n\n // Generate API key\n const keyResponse = await fetch(`${API_URL}/projects/${projectId}/api-keys`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${authSession.accessToken}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ name: 'Site-Kit Setup' })\n })\n\n let apiKey = 'ut_xxx'\n if (keyResponse.ok) {\n const keyData = await keyResponse.json()\n // Portal API returns { key: string, apiKey: {...} }\n apiKey = keyData.key\n }\n\n // Generate env file\n await generateEnvFile({\n projectId,\n supabaseUrl: config.supabase_url,\n supabaseAnonKey: config.supabase_anon_key,\n apiKey\n })\n\n // Generate provider in layout\n await generateProvider()\n\n return NextResponse.json({ success: true })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Self-Destruct Handler\n// ============================================\n\nexport async function handleSelfDestruct(): Promise<NextResponse> {\n const { selfDestruct } = await import('../cli/generators')\n\n try {\n await selfDestruct()\n return NextResponse.json({ success: true })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// HTML Templates\n// ============================================\n\nfunction successHtml(): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Sonor - Authenticated</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex; justify-content: center; align-items: center;\n height: 100vh; margin: 0;\n background: linear-gradient(135deg, #1a1a2e 0%, #0f0f1a 100%);\n color: white;\n }\n .container {\n text-align: center; padding: 3rem;\n background: rgba(255, 255, 255, 0.05);\n border-radius: 1rem; border: 1px solid rgba(255, 255, 255, 0.1);\n }\n .icon { font-size: 4rem; margin-bottom: 1rem; }\n h1 { margin: 0 0 0.5rem; }\n p { color: rgba(255, 255, 255, 0.7); margin: 0; }\n </style>\n <script>setTimeout(() => window.close(), 2000)</script>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">✓</div>\n <h1>Authenticated!</h1>\n <p>This window will close automatically...</p>\n </div>\n</body>\n</html>`\n}\n\nfunction errorHtml(title: string, message: string): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Sonor - Error</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex; justify-content: center; align-items: center;\n height: 100vh; margin: 0;\n background: linear-gradient(135deg, #2e1a1a 0%, #1a0f0f 100%);\n color: white;\n }\n .container {\n text-align: center; padding: 3rem;\n background: rgba(255, 255, 255, 0.05);\n border-radius: 1rem; border: 1px solid rgba(255, 100, 100, 0.2);\n }\n .icon { font-size: 4rem; margin-bottom: 1rem; }\n h1 { margin: 0 0 0.5rem; color: #ff6b6b; }\n p { color: rgba(255, 255, 255, 0.7); margin: 0; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">✗</div>\n <h1>${title}</h1>\n <p>${message}</p>\n </div>\n</body>\n</html>`\n}\n\n// ============================================\n// Unified Route Handler\n// ============================================\n\nexport async function handleRequest(\n req: NextRequest,\n route: string\n): Promise<NextResponse> {\n switch (route) {\n case 'status':\n return handleStatus()\n case 'auth/start':\n return handleAuthStart()\n case 'auth/callback':\n return handleAuthCallback(req)\n case 'auth/status':\n return handleAuthStatus()\n case 'auth/apikey':\n return handleApiKeyAuth(req)\n case 'organizations':\n return handleGetOrganizations()\n case 'projects':\n return handleCreateProject(req)\n case 'scan':\n return handleScan()\n case 'migrate':\n return handleMigrate(req)\n case 'configure':\n return handleConfigure(req)\n case 'self-destruct':\n return handleSelfDestruct()\n default:\n return NextResponse.json({ error: 'Not found' }, { status: 404 })\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/setup/api-handlers.ts"],"names":["NextResponse"],"mappings":"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","file":"chunk-6YW6EWMH.js","sourcesContent":["/**\n * Setup Wizard API Handlers\n * \n * These are Next.js API route handlers that the SetupWizard component calls.\n * They run on the server and have access to fs for code generation.\n * \n * Usage: Copy these to your app/_uptrade/api/ folder\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\n\n// ============================================\n// Configuration\n// ============================================\n\nconst PORTAL_URL = process.env.UPTRADE_PORTAL_URL || 'https://app.sonor.io'\nconst API_URL = process.env.UPTRADE_API_URL || 'https://api.sonor.io'\n\n// In-memory session store (for dev server only)\nlet authSession: {\n accessToken?: string\n userId?: string\n email?: string\n pendingCode?: string\n} = {}\n\n// ============================================\n// Status Handler\n// ============================================\n\nexport async function handleStatus(): Promise<NextResponse> {\n const configured = !!(\n process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID &&\n process.env.NEXT_PUBLIC_SUPABASE_URL\n )\n\n return NextResponse.json({\n configured,\n authenticated: !!authSession.accessToken,\n email: authSession.email\n })\n}\n\n// ============================================\n// Auth Handlers\n// ============================================\n\nexport async function handleAuthStart(): Promise<NextResponse> {\n const state = Math.random().toString(36).substring(7)\n const redirectUri = 'http://localhost:3000/_uptrade/api/auth/callback'\n \n const authUrl = `${PORTAL_URL}/auth/cli?` + new URLSearchParams({\n redirect_uri: redirectUri,\n state\n })\n\n return NextResponse.json({ authUrl, state })\n}\n\nexport async function handleAuthCallback(req: NextRequest): Promise<NextResponse> {\n const { searchParams } = new URL(req.url)\n const code = searchParams.get('code')\n const error = searchParams.get('error')\n\n if (error) {\n return new NextResponse(errorHtml('Authentication Failed', error), {\n headers: { 'Content-Type': 'text/html' }\n })\n }\n\n if (!code) {\n return new NextResponse(errorHtml('Missing Code', 'No authorization code received'), {\n headers: { 'Content-Type': 'text/html' }\n })\n }\n\n try {\n // Exchange code for token\n const tokenResponse = await fetch(`${API_URL}/auth/cli-token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n code,\n redirect_uri: 'http://localhost:3000/_uptrade/api/auth/callback'\n })\n })\n\n if (!tokenResponse.ok) {\n throw new Error('Failed to exchange code for token')\n }\n\n const { access_token, user_id, email } = await tokenResponse.json()\n \n authSession = {\n accessToken: access_token,\n userId: user_id,\n email\n }\n\n return new NextResponse(successHtml(), {\n headers: { 'Content-Type': 'text/html' }\n })\n } catch (err) {\n return new NextResponse(errorHtml('Token Exchange Failed', (err as Error).message), {\n headers: { 'Content-Type': 'text/html' }\n })\n }\n}\n\nexport async function handleAuthStatus(): Promise<NextResponse> {\n return NextResponse.json({\n authenticated: !!authSession.accessToken,\n email: authSession.email\n })\n}\n\nexport async function handleApiKeyAuth(req: NextRequest): Promise<NextResponse> {\n const { apiKey } = await req.json()\n\n try {\n const response = await fetch(`${API_URL}/auth/verify-api-key`, {\n headers: { 'Authorization': `Bearer ${apiKey}` }\n })\n\n if (!response.ok) {\n return NextResponse.json({ error: 'Invalid API key' }, { status: 401 })\n }\n\n const { user_id, email } = await response.json()\n \n authSession = {\n accessToken: apiKey,\n userId: user_id,\n email\n }\n\n return NextResponse.json({ email })\n } catch {\n return NextResponse.json({ error: 'Authentication failed' }, { status: 500 })\n }\n}\n\n// ============================================\n// Organization & Project Handlers\n// ============================================\n\nexport async function handleGetOrganizations(): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n try {\n const response = await fetch(`${API_URL}/organizations`, {\n headers: { 'Authorization': `Bearer ${authSession.accessToken}` }\n })\n\n if (!response.ok) {\n throw new Error('Failed to fetch organizations')\n }\n\n const organizations = await response.json()\n return NextResponse.json({ organizations })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\nexport async function handleCreateProject(req: NextRequest): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n const { orgId, name, domain } = await req.json()\n\n try {\n const response = await fetch(`${API_URL}/organizations/${orgId}/projects`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${authSession.accessToken}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ name, domain })\n })\n\n if (!response.ok) {\n throw new Error('Failed to create project')\n }\n\n const project = await response.json()\n return NextResponse.json(project)\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Scan Handler\n// ============================================\n\nexport async function handleScan(): Promise<NextResponse> {\n const { scanCodebase } = await import('../cli/scanner')\n \n try {\n const results = await scanCodebase(process.cwd())\n \n return NextResponse.json({\n forms: results.forms.map(f => ({\n type: 'form',\n form_library: f.formLibrary,\n file: f.filePath,\n component_name: f.componentName,\n line: f.startLine,\n fields: f.fields,\n complexity: f.complexity,\n suggested_action: f.suggestedAction,\n has_validation: f.hasValidation,\n submits_to: f.submitsTo,\n })),\n widgets: results.widgets.map(w => ({\n type: 'widget',\n widget_type: w.widgetType,\n file: w.filePath,\n line: w.startLine,\n })),\n metadata: results.metadata.map(m => ({\n type: 'metadata',\n metadata_type: m.type,\n file: m.filePath,\n title: m.title,\n description: m.description,\n })),\n sitemaps: results.sitemaps.map(s => ({\n type: 'sitemap',\n sitemap_type: s.type,\n file: s.filePath,\n line: s.startLine,\n generator: s.generator,\n })),\n })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Migrate Handler\n// ============================================\n\nexport async function handleMigrate(req: NextRequest): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n const { item, projectId } = await req.json()\n const { migrateFiles } = await import('../cli/migrator')\n\n try {\n // Wrap item into ScanResults format\n const scanResults = { \n forms: [item], \n metadata: [], \n widgets: [], \n sitemaps: [],\n schemas: [],\n faqs: [],\n analytics: [],\n images: [],\n }\n const options = { projectId, apiKey: authSession.accessToken || '' }\n await migrateFiles(scanResults, options)\n return NextResponse.json({ success: true })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Configure Handler\n// ============================================\n\nexport async function handleConfigure(req: NextRequest): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n const { projectId } = await req.json()\n const { generateEnvFile, generateProvider } = await import('../cli/generators')\n\n try {\n // Get Supabase config from API\n const configResponse = await fetch(`${API_URL}/projects/${projectId}/config`, {\n headers: { 'Authorization': `Bearer ${authSession.accessToken}` }\n })\n\n if (!configResponse.ok) {\n throw new Error('Failed to fetch project config')\n }\n\n const config = await configResponse.json()\n\n // Generate API key\n const keyResponse = await fetch(`${API_URL}/projects/${projectId}/api-keys`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${authSession.accessToken}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ name: 'Site-Kit Setup' })\n })\n\n let apiKey = 'ut_xxx'\n if (keyResponse.ok) {\n const keyData = await keyResponse.json()\n // Portal API returns { key: string, apiKey: {...} }\n apiKey = keyData.key\n }\n\n // Generate env file\n await generateEnvFile({\n projectId,\n supabaseUrl: config.supabase_url,\n supabaseAnonKey: config.supabase_anon_key,\n apiKey\n })\n\n // Generate provider in layout\n await generateProvider()\n\n return NextResponse.json({ success: true })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Self-Destruct Handler\n// ============================================\n\nexport async function handleSelfDestruct(): Promise<NextResponse> {\n const { selfDestruct } = await import('../cli/generators')\n\n try {\n await selfDestruct()\n return NextResponse.json({ success: true })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// HTML Templates\n// ============================================\n\nfunction successHtml(): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Sonor - Authenticated</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex; justify-content: center; align-items: center;\n height: 100vh; margin: 0;\n background: linear-gradient(135deg, #1a1a2e 0%, #0f0f1a 100%);\n color: white;\n }\n .container {\n text-align: center; padding: 3rem;\n background: rgba(255, 255, 255, 0.05);\n border-radius: 1rem; border: 1px solid rgba(255, 255, 255, 0.1);\n }\n .icon { font-size: 4rem; margin-bottom: 1rem; }\n h1 { margin: 0 0 0.5rem; }\n p { color: rgba(255, 255, 255, 0.7); margin: 0; }\n </style>\n <script>setTimeout(() => window.close(), 2000)</script>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">✓</div>\n <h1>Authenticated!</h1>\n <p>This window will close automatically...</p>\n </div>\n</body>\n</html>`\n}\n\nfunction errorHtml(title: string, message: string): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Sonor - Error</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex; justify-content: center; align-items: center;\n height: 100vh; margin: 0;\n background: linear-gradient(135deg, #2e1a1a 0%, #1a0f0f 100%);\n color: white;\n }\n .container {\n text-align: center; padding: 3rem;\n background: rgba(255, 255, 255, 0.05);\n border-radius: 1rem; border: 1px solid rgba(255, 100, 100, 0.2);\n }\n .icon { font-size: 4rem; margin-bottom: 1rem; }\n h1 { margin: 0 0 0.5rem; color: #ff6b6b; }\n p { color: rgba(255, 255, 255, 0.7); margin: 0; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">✗</div>\n <h1>${title}</h1>\n <p>${message}</p>\n </div>\n</body>\n</html>`\n}\n\n// ============================================\n// Unified Route Handler\n// ============================================\n\nexport async function handleRequest(\n req: NextRequest,\n route: string\n): Promise<NextResponse> {\n switch (route) {\n case 'status':\n return handleStatus()\n case 'auth/start':\n return handleAuthStart()\n case 'auth/callback':\n return handleAuthCallback(req)\n case 'auth/status':\n return handleAuthStatus()\n case 'auth/apikey':\n return handleApiKeyAuth(req)\n case 'organizations':\n return handleGetOrganizations()\n case 'projects':\n return handleCreateProject(req)\n case 'scan':\n return handleScan()\n case 'migrate':\n return handleMigrate(req)\n case 'configure':\n return handleConfigure(req)\n case 'self-destruct':\n return handleSelfDestruct()\n default:\n return NextResponse.json({ error: 'Not found' }, { status: 404 })\n }\n}\n"]}
@@ -337,5 +337,5 @@ async function handleRequest(req, route) {
337
337
  }
338
338
 
339
339
  export { handleRequest };
340
- //# sourceMappingURL=chunk-QBFTBORL.mjs.map
341
- //# sourceMappingURL=chunk-QBFTBORL.mjs.map
340
+ //# sourceMappingURL=chunk-WY346LOO.mjs.map
341
+ //# sourceMappingURL=chunk-WY346LOO.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/setup/api-handlers.ts"],"names":[],"mappings":"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","file":"chunk-QBFTBORL.mjs","sourcesContent":["/**\n * Setup Wizard API Handlers\n * \n * These are Next.js API route handlers that the SetupWizard component calls.\n * They run on the server and have access to fs for code generation.\n * \n * Usage: Copy these to your app/_uptrade/api/ folder\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\n\n// ============================================\n// Configuration\n// ============================================\n\nconst PORTAL_URL = process.env.UPTRADE_PORTAL_URL || 'https://app.sonor.io'\nconst API_URL = process.env.UPTRADE_API_URL || 'https://api.sonor.io'\n\n// In-memory session store (for dev server only)\nlet authSession: {\n accessToken?: string\n userId?: string\n email?: string\n pendingCode?: string\n} = {}\n\n// ============================================\n// Status Handler\n// ============================================\n\nexport async function handleStatus(): Promise<NextResponse> {\n const configured = !!(\n process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID &&\n process.env.NEXT_PUBLIC_SUPABASE_URL\n )\n\n return NextResponse.json({\n configured,\n authenticated: !!authSession.accessToken,\n email: authSession.email\n })\n}\n\n// ============================================\n// Auth Handlers\n// ============================================\n\nexport async function handleAuthStart(): Promise<NextResponse> {\n const state = Math.random().toString(36).substring(7)\n const redirectUri = 'http://localhost:3000/_uptrade/api/auth/callback'\n \n const authUrl = `${PORTAL_URL}/auth/cli?` + new URLSearchParams({\n redirect_uri: redirectUri,\n state\n })\n\n return NextResponse.json({ authUrl, state })\n}\n\nexport async function handleAuthCallback(req: NextRequest): Promise<NextResponse> {\n const { searchParams } = new URL(req.url)\n const code = searchParams.get('code')\n const error = searchParams.get('error')\n\n if (error) {\n return new NextResponse(errorHtml('Authentication Failed', error), {\n headers: { 'Content-Type': 'text/html' }\n })\n }\n\n if (!code) {\n return new NextResponse(errorHtml('Missing Code', 'No authorization code received'), {\n headers: { 'Content-Type': 'text/html' }\n })\n }\n\n try {\n // Exchange code for token\n const tokenResponse = await fetch(`${API_URL}/auth/cli-token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n code,\n redirect_uri: 'http://localhost:3000/_uptrade/api/auth/callback'\n })\n })\n\n if (!tokenResponse.ok) {\n throw new Error('Failed to exchange code for token')\n }\n\n const { access_token, user_id, email } = await tokenResponse.json()\n \n authSession = {\n accessToken: access_token,\n userId: user_id,\n email\n }\n\n return new NextResponse(successHtml(), {\n headers: { 'Content-Type': 'text/html' }\n })\n } catch (err) {\n return new NextResponse(errorHtml('Token Exchange Failed', (err as Error).message), {\n headers: { 'Content-Type': 'text/html' }\n })\n }\n}\n\nexport async function handleAuthStatus(): Promise<NextResponse> {\n return NextResponse.json({\n authenticated: !!authSession.accessToken,\n email: authSession.email\n })\n}\n\nexport async function handleApiKeyAuth(req: NextRequest): Promise<NextResponse> {\n const { apiKey } = await req.json()\n\n try {\n const response = await fetch(`${API_URL}/auth/verify-api-key`, {\n headers: { 'Authorization': `Bearer ${apiKey}` }\n })\n\n if (!response.ok) {\n return NextResponse.json({ error: 'Invalid API key' }, { status: 401 })\n }\n\n const { user_id, email } = await response.json()\n \n authSession = {\n accessToken: apiKey,\n userId: user_id,\n email\n }\n\n return NextResponse.json({ email })\n } catch {\n return NextResponse.json({ error: 'Authentication failed' }, { status: 500 })\n }\n}\n\n// ============================================\n// Organization & Project Handlers\n// ============================================\n\nexport async function handleGetOrganizations(): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n try {\n const response = await fetch(`${API_URL}/organizations`, {\n headers: { 'Authorization': `Bearer ${authSession.accessToken}` }\n })\n\n if (!response.ok) {\n throw new Error('Failed to fetch organizations')\n }\n\n const organizations = await response.json()\n return NextResponse.json({ organizations })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\nexport async function handleCreateProject(req: NextRequest): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n const { orgId, name, domain } = await req.json()\n\n try {\n const response = await fetch(`${API_URL}/organizations/${orgId}/projects`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${authSession.accessToken}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ name, domain })\n })\n\n if (!response.ok) {\n throw new Error('Failed to create project')\n }\n\n const project = await response.json()\n return NextResponse.json(project)\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Scan Handler\n// ============================================\n\nexport async function handleScan(): Promise<NextResponse> {\n const { scanCodebase } = await import('../cli/scanner')\n \n try {\n const results = await scanCodebase(process.cwd())\n \n return NextResponse.json({\n forms: results.forms.map(f => ({\n type: 'form',\n form_library: f.formLibrary,\n file: f.filePath,\n component_name: f.componentName,\n line: f.startLine,\n fields: f.fields,\n complexity: f.complexity,\n suggested_action: f.suggestedAction,\n has_validation: f.hasValidation,\n submits_to: f.submitsTo,\n })),\n widgets: results.widgets.map(w => ({\n type: 'widget',\n widget_type: w.widgetType,\n file: w.filePath,\n line: w.startLine,\n })),\n metadata: results.metadata.map(m => ({\n type: 'metadata',\n metadata_type: m.type,\n file: m.filePath,\n title: m.title,\n description: m.description,\n })),\n sitemaps: results.sitemaps.map(s => ({\n type: 'sitemap',\n sitemap_type: s.type,\n file: s.filePath,\n line: s.startLine,\n generator: s.generator,\n })),\n })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Migrate Handler\n// ============================================\n\nexport async function handleMigrate(req: NextRequest): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n const { item, projectId } = await req.json()\n const { migrateFiles } = await import('../cli/migrator')\n\n try {\n // Wrap item into ScanResults format\n const scanResults = { \n forms: [item], \n metadata: [], \n widgets: [], \n sitemaps: [],\n schemas: [],\n faqs: [],\n analytics: [],\n images: [],\n }\n const options = { projectId, apiKey: authSession.accessToken || '' }\n await migrateFiles(scanResults, options)\n return NextResponse.json({ success: true })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Configure Handler\n// ============================================\n\nexport async function handleConfigure(req: NextRequest): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n const { projectId } = await req.json()\n const { generateEnvFile, generateProvider } = await import('../cli/generators')\n\n try {\n // Get Supabase config from API\n const configResponse = await fetch(`${API_URL}/projects/${projectId}/config`, {\n headers: { 'Authorization': `Bearer ${authSession.accessToken}` }\n })\n\n if (!configResponse.ok) {\n throw new Error('Failed to fetch project config')\n }\n\n const config = await configResponse.json()\n\n // Generate API key\n const keyResponse = await fetch(`${API_URL}/projects/${projectId}/api-keys`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${authSession.accessToken}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ name: 'Site-Kit Setup' })\n })\n\n let apiKey = 'ut_xxx'\n if (keyResponse.ok) {\n const keyData = await keyResponse.json()\n // Portal API returns { key: string, apiKey: {...} }\n apiKey = keyData.key\n }\n\n // Generate env file\n await generateEnvFile({\n projectId,\n supabaseUrl: config.supabase_url,\n supabaseAnonKey: config.supabase_anon_key,\n apiKey\n })\n\n // Generate provider in layout\n await generateProvider()\n\n return NextResponse.json({ success: true })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Self-Destruct Handler\n// ============================================\n\nexport async function handleSelfDestruct(): Promise<NextResponse> {\n const { selfDestruct } = await import('../cli/generators')\n\n try {\n await selfDestruct()\n return NextResponse.json({ success: true })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// HTML Templates\n// ============================================\n\nfunction successHtml(): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Sonor - Authenticated</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex; justify-content: center; align-items: center;\n height: 100vh; margin: 0;\n background: linear-gradient(135deg, #1a1a2e 0%, #0f0f1a 100%);\n color: white;\n }\n .container {\n text-align: center; padding: 3rem;\n background: rgba(255, 255, 255, 0.05);\n border-radius: 1rem; border: 1px solid rgba(255, 255, 255, 0.1);\n }\n .icon { font-size: 4rem; margin-bottom: 1rem; }\n h1 { margin: 0 0 0.5rem; }\n p { color: rgba(255, 255, 255, 0.7); margin: 0; }\n </style>\n <script>setTimeout(() => window.close(), 2000)</script>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">✓</div>\n <h1>Authenticated!</h1>\n <p>This window will close automatically...</p>\n </div>\n</body>\n</html>`\n}\n\nfunction errorHtml(title: string, message: string): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Sonor - Error</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex; justify-content: center; align-items: center;\n height: 100vh; margin: 0;\n background: linear-gradient(135deg, #2e1a1a 0%, #1a0f0f 100%);\n color: white;\n }\n .container {\n text-align: center; padding: 3rem;\n background: rgba(255, 255, 255, 0.05);\n border-radius: 1rem; border: 1px solid rgba(255, 100, 100, 0.2);\n }\n .icon { font-size: 4rem; margin-bottom: 1rem; }\n h1 { margin: 0 0 0.5rem; color: #ff6b6b; }\n p { color: rgba(255, 255, 255, 0.7); margin: 0; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">✗</div>\n <h1>${title}</h1>\n <p>${message}</p>\n </div>\n</body>\n</html>`\n}\n\n// ============================================\n// Unified Route Handler\n// ============================================\n\nexport async function handleRequest(\n req: NextRequest,\n route: string\n): Promise<NextResponse> {\n switch (route) {\n case 'status':\n return handleStatus()\n case 'auth/start':\n return handleAuthStart()\n case 'auth/callback':\n return handleAuthCallback(req)\n case 'auth/status':\n return handleAuthStatus()\n case 'auth/apikey':\n return handleApiKeyAuth(req)\n case 'organizations':\n return handleGetOrganizations()\n case 'projects':\n return handleCreateProject(req)\n case 'scan':\n return handleScan()\n case 'migrate':\n return handleMigrate(req)\n case 'configure':\n return handleConfigure(req)\n case 'self-destruct':\n return handleSelfDestruct()\n default:\n return NextResponse.json({ error: 'Not found' }, { status: 404 })\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/setup/api-handlers.ts"],"names":[],"mappings":"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","file":"chunk-WY346LOO.mjs","sourcesContent":["/**\n * Setup Wizard API Handlers\n * \n * These are Next.js API route handlers that the SetupWizard component calls.\n * They run on the server and have access to fs for code generation.\n * \n * Usage: Copy these to your app/_uptrade/api/ folder\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\n\n// ============================================\n// Configuration\n// ============================================\n\nconst PORTAL_URL = process.env.UPTRADE_PORTAL_URL || 'https://app.sonor.io'\nconst API_URL = process.env.UPTRADE_API_URL || 'https://api.sonor.io'\n\n// In-memory session store (for dev server only)\nlet authSession: {\n accessToken?: string\n userId?: string\n email?: string\n pendingCode?: string\n} = {}\n\n// ============================================\n// Status Handler\n// ============================================\n\nexport async function handleStatus(): Promise<NextResponse> {\n const configured = !!(\n process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID &&\n process.env.NEXT_PUBLIC_SUPABASE_URL\n )\n\n return NextResponse.json({\n configured,\n authenticated: !!authSession.accessToken,\n email: authSession.email\n })\n}\n\n// ============================================\n// Auth Handlers\n// ============================================\n\nexport async function handleAuthStart(): Promise<NextResponse> {\n const state = Math.random().toString(36).substring(7)\n const redirectUri = 'http://localhost:3000/_uptrade/api/auth/callback'\n \n const authUrl = `${PORTAL_URL}/auth/cli?` + new URLSearchParams({\n redirect_uri: redirectUri,\n state\n })\n\n return NextResponse.json({ authUrl, state })\n}\n\nexport async function handleAuthCallback(req: NextRequest): Promise<NextResponse> {\n const { searchParams } = new URL(req.url)\n const code = searchParams.get('code')\n const error = searchParams.get('error')\n\n if (error) {\n return new NextResponse(errorHtml('Authentication Failed', error), {\n headers: { 'Content-Type': 'text/html' }\n })\n }\n\n if (!code) {\n return new NextResponse(errorHtml('Missing Code', 'No authorization code received'), {\n headers: { 'Content-Type': 'text/html' }\n })\n }\n\n try {\n // Exchange code for token\n const tokenResponse = await fetch(`${API_URL}/auth/cli-token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n code,\n redirect_uri: 'http://localhost:3000/_uptrade/api/auth/callback'\n })\n })\n\n if (!tokenResponse.ok) {\n throw new Error('Failed to exchange code for token')\n }\n\n const { access_token, user_id, email } = await tokenResponse.json()\n \n authSession = {\n accessToken: access_token,\n userId: user_id,\n email\n }\n\n return new NextResponse(successHtml(), {\n headers: { 'Content-Type': 'text/html' }\n })\n } catch (err) {\n return new NextResponse(errorHtml('Token Exchange Failed', (err as Error).message), {\n headers: { 'Content-Type': 'text/html' }\n })\n }\n}\n\nexport async function handleAuthStatus(): Promise<NextResponse> {\n return NextResponse.json({\n authenticated: !!authSession.accessToken,\n email: authSession.email\n })\n}\n\nexport async function handleApiKeyAuth(req: NextRequest): Promise<NextResponse> {\n const { apiKey } = await req.json()\n\n try {\n const response = await fetch(`${API_URL}/auth/verify-api-key`, {\n headers: { 'Authorization': `Bearer ${apiKey}` }\n })\n\n if (!response.ok) {\n return NextResponse.json({ error: 'Invalid API key' }, { status: 401 })\n }\n\n const { user_id, email } = await response.json()\n \n authSession = {\n accessToken: apiKey,\n userId: user_id,\n email\n }\n\n return NextResponse.json({ email })\n } catch {\n return NextResponse.json({ error: 'Authentication failed' }, { status: 500 })\n }\n}\n\n// ============================================\n// Organization & Project Handlers\n// ============================================\n\nexport async function handleGetOrganizations(): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n try {\n const response = await fetch(`${API_URL}/organizations`, {\n headers: { 'Authorization': `Bearer ${authSession.accessToken}` }\n })\n\n if (!response.ok) {\n throw new Error('Failed to fetch organizations')\n }\n\n const organizations = await response.json()\n return NextResponse.json({ organizations })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\nexport async function handleCreateProject(req: NextRequest): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n const { orgId, name, domain } = await req.json()\n\n try {\n const response = await fetch(`${API_URL}/organizations/${orgId}/projects`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${authSession.accessToken}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ name, domain })\n })\n\n if (!response.ok) {\n throw new Error('Failed to create project')\n }\n\n const project = await response.json()\n return NextResponse.json(project)\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Scan Handler\n// ============================================\n\nexport async function handleScan(): Promise<NextResponse> {\n const { scanCodebase } = await import('../cli/scanner')\n \n try {\n const results = await scanCodebase(process.cwd())\n \n return NextResponse.json({\n forms: results.forms.map(f => ({\n type: 'form',\n form_library: f.formLibrary,\n file: f.filePath,\n component_name: f.componentName,\n line: f.startLine,\n fields: f.fields,\n complexity: f.complexity,\n suggested_action: f.suggestedAction,\n has_validation: f.hasValidation,\n submits_to: f.submitsTo,\n })),\n widgets: results.widgets.map(w => ({\n type: 'widget',\n widget_type: w.widgetType,\n file: w.filePath,\n line: w.startLine,\n })),\n metadata: results.metadata.map(m => ({\n type: 'metadata',\n metadata_type: m.type,\n file: m.filePath,\n title: m.title,\n description: m.description,\n })),\n sitemaps: results.sitemaps.map(s => ({\n type: 'sitemap',\n sitemap_type: s.type,\n file: s.filePath,\n line: s.startLine,\n generator: s.generator,\n })),\n })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Migrate Handler\n// ============================================\n\nexport async function handleMigrate(req: NextRequest): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n const { item, projectId } = await req.json()\n const { migrateFiles } = await import('../cli/migrator')\n\n try {\n // Wrap item into ScanResults format\n const scanResults = { \n forms: [item], \n metadata: [], \n widgets: [], \n sitemaps: [],\n schemas: [],\n faqs: [],\n analytics: [],\n images: [],\n }\n const options = { projectId, apiKey: authSession.accessToken || '' }\n await migrateFiles(scanResults, options)\n return NextResponse.json({ success: true })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Configure Handler\n// ============================================\n\nexport async function handleConfigure(req: NextRequest): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n const { projectId } = await req.json()\n const { generateEnvFile, generateProvider } = await import('../cli/generators')\n\n try {\n // Get Supabase config from API\n const configResponse = await fetch(`${API_URL}/projects/${projectId}/config`, {\n headers: { 'Authorization': `Bearer ${authSession.accessToken}` }\n })\n\n if (!configResponse.ok) {\n throw new Error('Failed to fetch project config')\n }\n\n const config = await configResponse.json()\n\n // Generate API key\n const keyResponse = await fetch(`${API_URL}/projects/${projectId}/api-keys`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${authSession.accessToken}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ name: 'Site-Kit Setup' })\n })\n\n let apiKey = 'ut_xxx'\n if (keyResponse.ok) {\n const keyData = await keyResponse.json()\n // Portal API returns { key: string, apiKey: {...} }\n apiKey = keyData.key\n }\n\n // Generate env file\n await generateEnvFile({\n projectId,\n supabaseUrl: config.supabase_url,\n supabaseAnonKey: config.supabase_anon_key,\n apiKey\n })\n\n // Generate provider in layout\n await generateProvider()\n\n return NextResponse.json({ success: true })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Self-Destruct Handler\n// ============================================\n\nexport async function handleSelfDestruct(): Promise<NextResponse> {\n const { selfDestruct } = await import('../cli/generators')\n\n try {\n await selfDestruct()\n return NextResponse.json({ success: true })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// HTML Templates\n// ============================================\n\nfunction successHtml(): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Sonor - Authenticated</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex; justify-content: center; align-items: center;\n height: 100vh; margin: 0;\n background: linear-gradient(135deg, #1a1a2e 0%, #0f0f1a 100%);\n color: white;\n }\n .container {\n text-align: center; padding: 3rem;\n background: rgba(255, 255, 255, 0.05);\n border-radius: 1rem; border: 1px solid rgba(255, 255, 255, 0.1);\n }\n .icon { font-size: 4rem; margin-bottom: 1rem; }\n h1 { margin: 0 0 0.5rem; }\n p { color: rgba(255, 255, 255, 0.7); margin: 0; }\n </style>\n <script>setTimeout(() => window.close(), 2000)</script>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">✓</div>\n <h1>Authenticated!</h1>\n <p>This window will close automatically...</p>\n </div>\n</body>\n</html>`\n}\n\nfunction errorHtml(title: string, message: string): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Sonor - Error</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex; justify-content: center; align-items: center;\n height: 100vh; margin: 0;\n background: linear-gradient(135deg, #2e1a1a 0%, #1a0f0f 100%);\n color: white;\n }\n .container {\n text-align: center; padding: 3rem;\n background: rgba(255, 255, 255, 0.05);\n border-radius: 1rem; border: 1px solid rgba(255, 100, 100, 0.2);\n }\n .icon { font-size: 4rem; margin-bottom: 1rem; }\n h1 { margin: 0 0 0.5rem; color: #ff6b6b; }\n p { color: rgba(255, 255, 255, 0.7); margin: 0; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">✗</div>\n <h1>${title}</h1>\n <p>${message}</p>\n </div>\n</body>\n</html>`\n}\n\n// ============================================\n// Unified Route Handler\n// ============================================\n\nexport async function handleRequest(\n req: NextRequest,\n route: string\n): Promise<NextResponse> {\n switch (route) {\n case 'status':\n return handleStatus()\n case 'auth/start':\n return handleAuthStart()\n case 'auth/callback':\n return handleAuthCallback(req)\n case 'auth/status':\n return handleAuthStatus()\n case 'auth/apikey':\n return handleApiKeyAuth(req)\n case 'organizations':\n return handleGetOrganizations()\n case 'projects':\n return handleCreateProject(req)\n case 'scan':\n return handleScan()\n case 'migrate':\n return handleMigrate(req)\n case 'configure':\n return handleConfigure(req)\n case 'self-destruct':\n return handleSelfDestruct()\n default:\n return NextResponse.json({ error: 'Not found' }, { status: 404 })\n }\n}\n"]}
package/dist/cli/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
+ var chunkJM3ZR6LB_js = require('../chunk-JM3ZR6LB.js');
4
5
  var chunkSLB5V4RT_js = require('../chunk-SLB5V4RT.js');
5
6
  var chunk7URAOG2M_js = require('../chunk-7URAOG2M.js');
6
- var chunkJM3ZR6LB_js = require('../chunk-JM3ZR6LB.js');
7
7
  var chunkZSMWDLMK_js = require('../chunk-ZSMWDLMK.js');
8
8
  var dotenv = require('dotenv');
9
9
  var process6 = require('process');
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ import { migrateFiles, migrateFile } from '../chunk-HF2FWDBJ.mjs';
2
3
  import { generateEnvFile, generateLayout } from '../chunk-7FKPJQVS.mjs';
3
4
  import { require_lib, scanCodebase, scanForManagedFAQPaths } from '../chunk-JGNQK2G6.mjs';
4
- import { migrateFiles, migrateFile } from '../chunk-HF2FWDBJ.mjs';
5
5
  import { __commonJS, __require, __toESM, __privateAdd, __privateGet, __privateMethod, __privateSet, __privateWrapper, __publicField } from '../chunk-4XPGGLVP.mjs';
6
6
  import { config } from 'dotenv';
7
7
  import process6 from 'process';
package/dist/index.js CHANGED
@@ -3,12 +3,12 @@
3
3
  var chunkYBTYDBWY_js = require('./chunk-YBTYDBWY.js');
4
4
  var chunkX4J33XQD_js = require('./chunk-X4J33XQD.js');
5
5
  var chunkG6VGUAK2_js = require('./chunk-G6VGUAK2.js');
6
- var chunkTKQLH33E_js = require('./chunk-TKQLH33E.js');
7
6
  require('./chunk-DY4K6X3A.js');
7
+ var chunkTKQLH33E_js = require('./chunk-TKQLH33E.js');
8
+ require('./chunk-EUNL6GAL.js');
8
9
  var chunkYP5YVWAG_js = require('./chunk-YP5YVWAG.js');
9
10
  var chunkIJ2LWZID_js = require('./chunk-IJ2LWZID.js');
10
11
  var chunkIFAW7JFO_js = require('./chunk-IFAW7JFO.js');
11
- require('./chunk-EUNL6GAL.js');
12
12
  var chunkYBQT623Y_js = require('./chunk-YBQT623Y.js');
13
13
  require('./chunk-AWSVC7SP.js');
14
14
  var chunkDKSHZ7TG_js = require('./chunk-DKSHZ7TG.js');
package/dist/index.mjs CHANGED
@@ -2,12 +2,12 @@ import { SignalBridge, useSignalExperiment, useSignalEvent } from './chunk-4QHHF
2
2
  export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from './chunk-4QHHFCAA.mjs';
3
3
  export { clearRedirectCache, fetchRedirectRules, generateNextRedirects, handleManagedRedirects } from './chunk-XFOL6JDF.mjs';
4
4
  export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from './chunk-36Y7OWES.mjs';
5
- export { TestimonialSection, fetchReviewStats, fetchReviews } from './chunk-APZMXRI3.mjs';
6
5
  import './chunk-N24BPFF6.mjs';
6
+ export { TestimonialSection, fetchReviewStats, fetchReviews } from './chunk-APZMXRI3.mjs';
7
+ import './chunk-VZMDH3R4.mjs';
7
8
  export { CalendarView, CheckoutForm, EventCalendar, EventEmbed, EventModal, EventTile, OfferingCard, OfferingList, ProductEmbed, RegistrationForm, UpcomingEvents, createCheckoutSession, fetchNextEvent, fetchOffering, fetchOfferings, fetchProducts, fetchServices, fetchUpcomingEvents, formatDate, formatDateTime, formatPrice, getOfferingUrl, registerForEvent, useEventModal } from './chunk-CYZYPWGW.mjs';
8
9
  export { BookingWidget, createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate as formatBookingDate, formatTime as formatBookingTime, formatDuration, releaseSlotHold } from './chunk-ZU6YPEAF.mjs';
9
10
  export { SetupWizard } from './chunk-IKIJEKU3.mjs';
10
- import './chunk-VZMDH3R4.mjs';
11
11
  import { SitemapSync } from './chunk-HNCSTGVK.mjs';
12
12
  import './chunk-BPXMOHVH.mjs';
13
13
  import { AnalyticsProvider } from './chunk-35L6FXF5.mjs';
@@ -0,0 +1,25 @@
1
+ /**
2
+ * SitemapSync - Automatically sync sitemap.xml to Portal API
3
+ *
4
+ * Client-only component. Lives at package root so the main entry does not
5
+ * pull in seo/ (and server-only code). For use in SiteKitProvider and
6
+ * from @sonordev/site-kit/seo.
7
+ *
8
+ * @example
9
+ * ```tsx
10
+ * import { SitemapSync } from '@sonordev/site-kit'
11
+ * // or
12
+ * import { SitemapSync } from '@sonordev/site-kit/seo'
13
+ * ```
14
+ */
15
+ interface SitemapSyncProps {
16
+ /** Custom sitemap URL (defaults to /sitemap.xml) */
17
+ sitemapUrl?: string;
18
+ /** How often to re-sync in minutes (0 = only on mount, default: 60) */
19
+ syncInterval?: number;
20
+ /** Enable debug logging */
21
+ debug?: boolean;
22
+ }
23
+ declare function SitemapSync({ sitemapUrl, syncInterval, debug, }: SitemapSyncProps): null;
24
+
25
+ export { SitemapSync };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * SitemapSync - Automatically sync sitemap.xml to Portal API
3
+ *
4
+ * Client-only component. Lives at package root so the main entry does not
5
+ * pull in seo/ (and server-only code). For use in SiteKitProvider and
6
+ * from @sonordev/site-kit/seo.
7
+ *
8
+ * @example
9
+ * ```tsx
10
+ * import { SitemapSync } from '@sonordev/site-kit'
11
+ * // or
12
+ * import { SitemapSync } from '@sonordev/site-kit/seo'
13
+ * ```
14
+ */
15
+ interface SitemapSyncProps {
16
+ /** Custom sitemap URL (defaults to /sitemap.xml) */
17
+ sitemapUrl?: string;
18
+ /** How often to re-sync in minutes (0 = only on mount, default: 60) */
19
+ syncInterval?: number;
20
+ /** Enable debug logging */
21
+ debug?: boolean;
22
+ }
23
+ declare function SitemapSync({ sitemapUrl, syncInterval, debug, }: SitemapSyncProps): null;
24
+
25
+ export { SitemapSync };
@@ -0,0 +1,14 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ var chunkYBQT623Y_js = require('../chunk-YBQT623Y.js');
5
+ require('../chunk-ZSMWDLMK.js');
6
+
7
+
8
+
9
+ Object.defineProperty(exports, "SitemapSync", {
10
+ enumerable: true,
11
+ get: function () { return chunkYBQT623Y_js.SitemapSync; }
12
+ });
13
+ //# sourceMappingURL=client.js.map
14
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"client.js"}
@@ -0,0 +1,5 @@
1
+ 'use client';
2
+ export { SitemapSync } from '../chunk-HNCSTGVK.mjs';
3
+ import '../chunk-4XPGGLVP.mjs';
4
+ //# sourceMappingURL=client.mjs.map
5
+ //# sourceMappingURL=client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"client.mjs"}
@@ -3,6 +3,7 @@ export { A as ABTest, F as FAQItem, m as GetRedirectOptions, q as GetRobotsOptio
3
3
  import { ResolvingMetadata, Metadata } from 'next';
4
4
  export { g as generateSitemap, a as getRedirect, b as getRobotsDirective, i as isIndexable } from '../routing-B5XS-6_W.mjs';
5
5
  import * as React from 'react';
6
+ export { SitemapSync } from './client.mjs';
6
7
 
7
8
  /**
8
9
  * @sonordev/site-kit/seo - Server-Only API Functions
@@ -394,28 +395,4 @@ declare const getLocationSection: (projectId: string, path: string, section: str
394
395
  */
395
396
  declare function LocationPageContent(props: LocationPageContentProps): React.ReactElement;
396
397
 
397
- /**
398
- * SitemapSync - Automatically sync sitemap.xml to Portal API
399
- *
400
- * Client-only component. Lives at package root so the main entry does not
401
- * pull in seo/ (and server-only code). For use in SiteKitProvider and
402
- * from @sonordev/site-kit/seo.
403
- *
404
- * @example
405
- * ```tsx
406
- * import { SitemapSync } from '@sonordev/site-kit'
407
- * // or
408
- * import { SitemapSync } from '@sonordev/site-kit/seo'
409
- * ```
410
- */
411
- interface SitemapSyncProps {
412
- /** Custom sitemap URL (defaults to /sitemap.xml) */
413
- sitemapUrl?: string;
414
- /** How often to re-sync in minutes (0 = only on mount, default: 60) */
415
- syncInterval?: number;
416
- /** Enable debug logging */
417
- debug?: boolean;
418
- }
419
- declare function SitemapSync({ sitemapUrl, syncInterval, debug, }: SitemapSyncProps): null;
420
-
421
- export { ABTestResult, type EntityType, GetABVariantOptions, GetManagedMetadataOptions, LLMSchema, type HeroSectionContent as LocationHeroContent, LocationPageContent, type LocationPageContentProps, type LocationSectionData, type ServiceGridContent as LocationServicesContent, type TextSectionContent as LocationTextContent, ManagedContent, ManagedContentBlock, ManagedContentProps, ManagedFAQ, ManagedFAQProps, ManagedInternalLinks, ManagedInternalLinksProps, ManagedMetadataResult, ManagedNoScripts, ManagedSchema, ManagedSchemaProps, ManagedScripts, ManagedScriptsProps, type SEOEntity, SitemapSync, createBreadcrumbSchema, createSchema, getABTest, getABVariant, getContentBlock, getEntities, getEntityEnhancedSchema, getFAQData, getInternalLinks, getLocationSection, getManagedContentData, getManagedMetadata, getManagedMetadataWithAB, getManagedScripts, getPrimaryEntity, getRedirectData, getRobotsData, getSEOPageData, getSchemaMarkups, getSitemapEntries, getVisibilityScore, getVisibilitySummary, recordABImpression, registerSitemap, withManagedMetadata };
398
+ export { ABTestResult, type EntityType, GetABVariantOptions, GetManagedMetadataOptions, LLMSchema, type HeroSectionContent as LocationHeroContent, LocationPageContent, type LocationPageContentProps, type LocationSectionData, type ServiceGridContent as LocationServicesContent, type TextSectionContent as LocationTextContent, ManagedContent, ManagedContentBlock, ManagedContentProps, ManagedFAQ, ManagedFAQProps, ManagedInternalLinks, ManagedInternalLinksProps, ManagedMetadataResult, ManagedNoScripts, ManagedSchema, ManagedSchemaProps, ManagedScripts, ManagedScriptsProps, type SEOEntity, createBreadcrumbSchema, createSchema, getABTest, getABVariant, getContentBlock, getEntities, getEntityEnhancedSchema, getFAQData, getInternalLinks, getLocationSection, getManagedContentData, getManagedMetadata, getManagedMetadataWithAB, getManagedScripts, getPrimaryEntity, getRedirectData, getRobotsData, getSEOPageData, getSchemaMarkups, getSitemapEntries, getVisibilityScore, getVisibilitySummary, recordABImpression, registerSitemap, withManagedMetadata };
@@ -3,6 +3,7 @@ export { A as ABTest, F as FAQItem, m as GetRedirectOptions, q as GetRobotsOptio
3
3
  import { ResolvingMetadata, Metadata } from 'next';
4
4
  export { g as generateSitemap, a as getRedirect, b as getRobotsDirective, i as isIndexable } from '../routing-DZYzyDHw.js';
5
5
  import * as React from 'react';
6
+ export { SitemapSync } from './client.js';
6
7
 
7
8
  /**
8
9
  * @sonordev/site-kit/seo - Server-Only API Functions
@@ -394,28 +395,4 @@ declare const getLocationSection: (projectId: string, path: string, section: str
394
395
  */
395
396
  declare function LocationPageContent(props: LocationPageContentProps): React.ReactElement;
396
397
 
397
- /**
398
- * SitemapSync - Automatically sync sitemap.xml to Portal API
399
- *
400
- * Client-only component. Lives at package root so the main entry does not
401
- * pull in seo/ (and server-only code). For use in SiteKitProvider and
402
- * from @sonordev/site-kit/seo.
403
- *
404
- * @example
405
- * ```tsx
406
- * import { SitemapSync } from '@sonordev/site-kit'
407
- * // or
408
- * import { SitemapSync } from '@sonordev/site-kit/seo'
409
- * ```
410
- */
411
- interface SitemapSyncProps {
412
- /** Custom sitemap URL (defaults to /sitemap.xml) */
413
- sitemapUrl?: string;
414
- /** How often to re-sync in minutes (0 = only on mount, default: 60) */
415
- syncInterval?: number;
416
- /** Enable debug logging */
417
- debug?: boolean;
418
- }
419
- declare function SitemapSync({ sitemapUrl, syncInterval, debug, }: SitemapSyncProps): null;
420
-
421
- export { ABTestResult, type EntityType, GetABVariantOptions, GetManagedMetadataOptions, LLMSchema, type HeroSectionContent as LocationHeroContent, LocationPageContent, type LocationPageContentProps, type LocationSectionData, type ServiceGridContent as LocationServicesContent, type TextSectionContent as LocationTextContent, ManagedContent, ManagedContentBlock, ManagedContentProps, ManagedFAQ, ManagedFAQProps, ManagedInternalLinks, ManagedInternalLinksProps, ManagedMetadataResult, ManagedNoScripts, ManagedSchema, ManagedSchemaProps, ManagedScripts, ManagedScriptsProps, type SEOEntity, SitemapSync, createBreadcrumbSchema, createSchema, getABTest, getABVariant, getContentBlock, getEntities, getEntityEnhancedSchema, getFAQData, getInternalLinks, getLocationSection, getManagedContentData, getManagedMetadata, getManagedMetadataWithAB, getManagedScripts, getPrimaryEntity, getRedirectData, getRobotsData, getSEOPageData, getSchemaMarkups, getSitemapEntries, getVisibilityScore, getVisibilitySummary, recordABImpression, registerSitemap, withManagedMetadata };
398
+ export { ABTestResult, type EntityType, GetABVariantOptions, GetManagedMetadataOptions, LLMSchema, type HeroSectionContent as LocationHeroContent, LocationPageContent, type LocationPageContentProps, type LocationSectionData, type ServiceGridContent as LocationServicesContent, type TextSectionContent as LocationTextContent, ManagedContent, ManagedContentBlock, ManagedContentProps, ManagedFAQ, ManagedFAQProps, ManagedInternalLinks, ManagedInternalLinksProps, ManagedMetadataResult, ManagedNoScripts, ManagedSchema, ManagedSchemaProps, ManagedScripts, ManagedScriptsProps, type SEOEntity, createBreadcrumbSchema, createSchema, getABTest, getABVariant, getContentBlock, getEntities, getEntityEnhancedSchema, getFAQData, getInternalLinks, getLocationSection, getManagedContentData, getManagedMetadata, getManagedMetadataWithAB, getManagedScripts, getPrimaryEntity, getRedirectData, getRobotsData, getSEOPageData, getSchemaMarkups, getSitemapEntries, getVisibilityScore, getVisibilitySummary, recordABImpression, registerSitemap, withManagedMetadata };
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkGVXZWXQ7_js = require('../chunk-GVXZWXQ7.js');
4
- var chunkJKPJ2QCC_js = require('../chunk-JKPJ2QCC.js');
4
+ var chunk6YW6EWMH_js = require('../chunk-6YW6EWMH.js');
5
5
  var chunkIFAW7JFO_js = require('../chunk-IFAW7JFO.js');
6
6
  require('../chunk-ZSMWDLMK.js');
7
7
 
@@ -21,7 +21,7 @@ Object.defineProperty(exports, "getSnippetsByModule", {
21
21
  });
22
22
  Object.defineProperty(exports, "handleRequest", {
23
23
  enumerable: true,
24
- get: function () { return chunkJKPJ2QCC_js.handleRequest; }
24
+ get: function () { return chunk6YW6EWMH_js.handleRequest; }
25
25
  });
26
26
  Object.defineProperty(exports, "SetupWizard", {
27
27
  enumerable: true,
@@ -1,5 +1,5 @@
1
1
  export { IntegrationCodeView, generateIntegrationCode, getSnippetsByModule } from '../chunk-5YDPPOUU.mjs';
2
- export { handleRequest } from '../chunk-QBFTBORL.mjs';
2
+ export { handleRequest } from '../chunk-WY346LOO.mjs';
3
3
  export { SetupWizard, SetupWizard as UptradeSetup } from '../chunk-IKIJEKU3.mjs';
4
4
  import '../chunk-4XPGGLVP.mjs';
5
5
  //# sourceMappingURL=index.mjs.map
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var chunkJKPJ2QCC_js = require('../chunk-JKPJ2QCC.js');
3
+ var chunk6YW6EWMH_js = require('../chunk-6YW6EWMH.js');
4
4
  require('../chunk-ZSMWDLMK.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "handleRequest", {
9
9
  enumerable: true,
10
- get: function () { return chunkJKPJ2QCC_js.handleRequest; }
10
+ get: function () { return chunk6YW6EWMH_js.handleRequest; }
11
11
  });
12
12
  //# sourceMappingURL=server.js.map
13
13
  //# sourceMappingURL=server.js.map
@@ -1,4 +1,4 @@
1
- export { handleRequest } from '../chunk-QBFTBORL.mjs';
1
+ export { handleRequest } from '../chunk-WY346LOO.mjs';
2
2
  import '../chunk-4XPGGLVP.mjs';
3
3
  //# sourceMappingURL=server.mjs.map
4
4
  //# sourceMappingURL=server.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sonordev/site-kit",
3
- "version": "1.4.9",
3
+ "version": "1.5.0",
4
4
  "description": "Complete client-side integration kit for Sonor - SEO, Analytics, Engage, Forms, Blog",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
@@ -22,6 +22,11 @@
22
22
  "import": "./dist/seo/index.mjs",
23
23
  "require": "./dist/seo/index.js"
24
24
  },
25
+ "./seo/client": {
26
+ "types": "./dist/seo/client.d.ts",
27
+ "import": "./dist/seo/client.mjs",
28
+ "require": "./dist/seo/client.js"
29
+ },
25
30
  "./seo/server": {
26
31
  "types": "./dist/seo/server.d.ts",
27
32
  "import": "./dist/seo/server.mjs",