@uptrademedia/site-kit 1.1.0 → 1.1.2
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.
- package/README.md +1 -1
- package/dist/{chunk-6NTMCSHP.js → chunk-53UQPBNI.js} +2 -2
- package/dist/{chunk-6NTMCSHP.js.map → chunk-53UQPBNI.js.map} +1 -1
- package/dist/{chunk-GM2ZDV2B.mjs → chunk-AQWUIXKC.mjs} +4 -3
- package/dist/chunk-AQWUIXKC.mjs.map +1 -0
- package/dist/{chunk-JRCYNWUZ.js → chunk-GHSZWROI.js} +5 -5
- package/dist/{chunk-JRCYNWUZ.js.map → chunk-GHSZWROI.js.map} +1 -1
- package/dist/{chunk-ZG2AGGPZ.js → chunk-HAQGHTGV.js} +3 -3
- package/dist/chunk-HAQGHTGV.js.map +1 -0
- package/dist/{chunk-F6D3L676.js → chunk-HEUULOSC.js} +4 -4
- package/dist/{chunk-F6D3L676.js.map → chunk-HEUULOSC.js.map} +1 -1
- package/dist/{chunk-QT73LSTP.mjs → chunk-HYJHGCYY.mjs} +3 -3
- package/dist/chunk-HYJHGCYY.mjs.map +1 -0
- package/dist/{chunk-WG2SI2UN.mjs → chunk-KG46POJZ.mjs} +2 -2
- package/dist/{chunk-WG2SI2UN.mjs.map → chunk-KG46POJZ.mjs.map} +1 -1
- package/dist/{chunk-SONJCT7Z.mjs → chunk-TI5CH4WT.mjs} +142 -28
- package/dist/chunk-TI5CH4WT.mjs.map +1 -0
- package/dist/{chunk-ASVFZY6X.mjs → chunk-TJUON7TH.mjs} +2 -2
- package/dist/chunk-TJUON7TH.mjs.map +1 -0
- package/dist/{chunk-H5PVDCCM.js → chunk-UENZ4BYN.js} +4 -3
- package/dist/chunk-UENZ4BYN.js.map +1 -0
- package/dist/{chunk-4KKQQRZV.js → chunk-V7QPQBFG.js} +2 -2
- package/dist/chunk-V7QPQBFG.js.map +1 -0
- package/dist/{chunk-WZMRFNJK.mjs → chunk-YT5SBY5W.mjs} +4 -4
- package/dist/{chunk-WZMRFNJK.mjs.map → chunk-YT5SBY5W.mjs.map} +1 -1
- package/dist/{chunk-MVNUEXP3.js → chunk-YZRNC2Z6.js} +142 -28
- package/dist/chunk-YZRNC2Z6.js.map +1 -0
- package/dist/{chunk-35Y3M4ZE.mjs → chunk-ZUYWXUHQ.mjs} +5 -5
- package/dist/{chunk-35Y3M4ZE.mjs.map → chunk-ZUYWXUHQ.mjs.map} +1 -1
- package/dist/cli/index.js +4 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +2 -2
- package/dist/cli/index.mjs.map +1 -1
- package/dist/commerce/index.d.mts +1 -1
- package/dist/commerce/index.d.ts +1 -1
- package/dist/commerce/index.js +40 -40
- package/dist/commerce/index.mjs +1 -1
- package/dist/engage/index.d.mts +2 -1
- package/dist/engage/index.d.ts +2 -1
- package/dist/engage/index.js +4 -4
- package/dist/engage/index.mjs +1 -1
- package/dist/{generators-H6YQQRR4.mjs → generators-EQHJ22YW.mjs} +3 -3
- package/dist/{generators-H6YQQRR4.mjs.map → generators-EQHJ22YW.mjs.map} +1 -1
- package/dist/{generators-HZZLGIUB.js → generators-UXPMVYP4.js} +9 -9
- package/dist/{generators-HZZLGIUB.js.map → generators-UXPMVYP4.js.map} +1 -1
- package/dist/index.d.mts +10 -5
- package/dist/index.d.ts +10 -5
- package/dist/index.js +50 -48
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +20 -18
- package/dist/index.mjs.map +1 -1
- package/dist/redirects/index.d.mts +1 -1
- package/dist/redirects/index.d.ts +1 -1
- package/dist/redirects/index.js +5 -5
- package/dist/redirects/index.mjs +1 -1
- package/dist/{routing-DpR93G8R.d.ts → routing-D311WhuV.d.ts} +1 -1
- package/dist/{routing-yuOiCiAy.d.mts → routing-bTjqOM8S.d.mts} +1 -1
- package/dist/seo/index.d.mts +1 -1
- package/dist/seo/index.d.ts +1 -1
- package/dist/seo/index.js +5 -5
- package/dist/seo/index.mjs +1 -1
- package/dist/seo/server.d.mts +1 -1
- package/dist/seo/server.d.ts +1 -1
- package/dist/seo/server.js +3 -3
- package/dist/seo/server.mjs +1 -1
- package/dist/setup/client.js +3 -3
- package/dist/setup/client.mjs +1 -1
- package/dist/setup/index.js +5 -5
- package/dist/setup/index.mjs +2 -2
- package/dist/setup/server.js +2 -2
- package/dist/setup/server.mjs +1 -1
- package/dist/{useEventModal-BRRT7ZSv.d.ts → useEventModal-CaDHkAMI.d.ts} +3 -1
- package/dist/{useEventModal-NSrCRDlG.d.mts → useEventModal-CfeDPU95.d.mts} +3 -1
- package/package.json +2 -2
- package/dist/chunk-4KKQQRZV.js.map +0 -1
- package/dist/chunk-ASVFZY6X.mjs.map +0 -1
- package/dist/chunk-GM2ZDV2B.mjs.map +0 -1
- package/dist/chunk-H5PVDCCM.js.map +0 -1
- package/dist/chunk-MVNUEXP3.js.map +0 -1
- package/dist/chunk-QT73LSTP.mjs.map +0 -1
- package/dist/chunk-SONJCT7Z.mjs.map +0 -1
- package/dist/chunk-ZG2AGGPZ.js.map +0 -1
|
@@ -36,7 +36,7 @@ async function generateEnvFile(options) {
|
|
|
36
36
|
let newContent = `# Uptrade Site-Kit Configuration
|
|
37
37
|
# Generated by @uptrade/site-kit setup wizard
|
|
38
38
|
|
|
39
|
-
# Project ID from
|
|
39
|
+
# Project ID from Sonor
|
|
40
40
|
NEXT_PUBLIC_UPTRADE_PROJECT_ID=${newVars["NEXT_PUBLIC_UPTRADE_PROJECT_ID"]}
|
|
41
41
|
|
|
42
42
|
# Supabase Configuration
|
|
@@ -332,5 +332,5 @@ exports.generateSetupRoute = generateSetupRoute;
|
|
|
332
332
|
exports.migrateSitemap = migrateSitemap;
|
|
333
333
|
exports.removeNextSitemapDependency = removeNextSitemapDependency;
|
|
334
334
|
exports.selfDestruct = selfDestruct;
|
|
335
|
-
//# sourceMappingURL=chunk-
|
|
336
|
-
//# sourceMappingURL=chunk-
|
|
335
|
+
//# sourceMappingURL=chunk-HAQGHTGV.js.map
|
|
336
|
+
//# sourceMappingURL=chunk-HAQGHTGV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/generators/index.ts"],"names":["path","fs"],"mappings":"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","file":"chunk-HAQGHTGV.js","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 Sonor\nNEXT_PUBLIC_UPTRADE_PROJECT_ID=${newVars['NEXT_PUBLIC_UPTRADE_PROJECT_ID']}\n\n# Supabase Configuration\nNEXT_PUBLIC_SUPABASE_URL=${newVars['NEXT_PUBLIC_SUPABASE_URL']}\nNEXT_PUBLIC_SUPABASE_ANON_KEY=${newVars['NEXT_PUBLIC_SUPABASE_ANON_KEY']}\n\n# Uptrade API Key (for server-side operations)\nUPTRADE_API_KEY=${newVars['UPTRADE_API_KEY']}\n\n`\n\n // Add any existing vars that aren't Uptrade-related\n const uptradeKeys = Object.keys(newVars)\n const otherVars = Object.entries(existingVars)\n .filter(([key]) => !uptradeKeys.includes(key))\n \n if (otherVars.length > 0) {\n newContent += '# Other Environment Variables\\n'\n for (const [key, value] of otherVars) {\n newContent += `${key}=${value}\\n`\n }\n }\n\n await fs.writeFile(envPath, newContent, 'utf-8')\n}\n\n// ============================================\n// Provider Generator\n// ============================================\n\n/**\n * Safely adds an import statement to a file, respecting 'use client'/'use server' directives\n */\nfunction addImportSafely(content: string, importStatement: string): string {\n // Check if import already exists\n const importModule = importStatement.match(/from\\s+['\"]([^'\"]+)['\"]/)?.[1]\n if (importModule && content.includes(importModule)) {\n return content\n }\n \n // Check for 'use client' or 'use server' directive at the start\n const directiveMatch = content.match(/^(['\"]use (client|server)['\"][\\s;]*\\n?)/)\n \n if (directiveMatch) {\n // Insert import AFTER the directive\n const directive = directiveMatch[0]\n const restOfFile = content.slice(directive.length)\n return directive + importStatement + '\\n' + restOfFile\n } else {\n // No directive, add import at the top before other imports\n const firstImportMatch = content.match(/^(import\\s+)/)\n if (firstImportMatch) {\n return importStatement + '\\n' + content\n } else {\n return importStatement + '\\n\\n' + content\n }\n }\n}\n\nexport async function generateProvider(options: ProviderOptions): Promise<void> {\n // Find the layout file\n const layoutPath = await findLayoutFile()\n if (!layoutPath) {\n throw new Error('Could not find layout.tsx file')\n }\n\n const content = await fs.readFile(layoutPath, 'utf-8')\n\n // Check if SiteKitProvider is already added\n if (content.includes('SiteKitProvider')) {\n return // Already configured\n }\n\n // Create backup first\n const backupPath = layoutPath + '.backup'\n await fs.writeFile(backupPath, content, 'utf-8')\n\n // Add imports safely (respects 'use client' directive)\n let newContent = content\n for (const stmt of [\n `import { SiteKitProvider } from '@uptrade/site-kit'`,\n `import { ManagedFavicon } from '@uptrade/site-kit/images'`,\n ]) {\n newContent = addImportSafely(newContent, stmt)\n }\n\n // Add ManagedFavicon to head if missing\n if (!newContent.includes('ManagedFavicon')) {\n if (/<head[\\s>]/.test(newContent)) {\n newContent = newContent.replace(/(<head[^>]*>)(\\s*)/, '$1\\n <ManagedFavicon />\\n $2')\n } else {\n newContent = newContent.replace(\n /(<html[^>]*>)(\\s*)(<body)/,\n '$1$2<head>\\n <ManagedFavicon />\\n </head>$2$3'\n )\n }\n }\n\n // Wrap children with SiteKitProvider\n // Look for {children} and wrap it\n const childrenPattern = /(\\s*){children}/\n const childrenMatch = newContent.match(childrenPattern)\n \n if (childrenMatch) {\n const indent = childrenMatch[1] || ' '\n const providerWrap = `\n${indent}<SiteKitProvider\n${indent} projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n${indent} supabaseUrl={process.env.NEXT_PUBLIC_SUPABASE_URL!}\n${indent} supabaseAnonKey={process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!}\n${indent} analytics={{ enabled: true }}\n${indent} engage={{ enabled: true }}\n${indent} forms={{ enabled: true }}\n${indent}>\n${indent} {children}\n${indent}</SiteKitProvider>`\n\n newContent = newContent.replace(childrenPattern, providerWrap)\n } else {\n // Try alternative pattern for layouts that use a different structure\n const bodyPattern = /(<body[^>]*>)([\\s\\S]*?)(<\\/body>)/\n const bodyMatch = newContent.match(bodyPattern)\n \n if (bodyMatch) {\n const bodyContent = bodyMatch[2]\n const wrappedContent = `\n <SiteKitProvider\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n supabaseUrl={process.env.NEXT_PUBLIC_SUPABASE_URL!}\n supabaseAnonKey={process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!}\n analytics={{ enabled: true }}\n engage={{ enabled: true }}\n forms={{ enabled: true }}\n >\n ${bodyContent.trim()}\n </SiteKitProvider>\n `\n \n newContent = newContent.replace(bodyPattern, `$1${wrappedContent}$3`)\n }\n }\n\n await fs.writeFile(layoutPath, newContent, 'utf-8')\n}\n\n// ============================================\n// Helpers\n// ============================================\n\nasync function findLayoutFile(): Promise<string | null> {\n const possiblePaths = [\n 'src/app/layout.tsx',\n 'app/layout.tsx',\n 'src/app/layout.jsx',\n 'app/layout.jsx',\n ]\n\n for (const relativePath of possiblePaths) {\n const fullPath = path.join(process.cwd(), relativePath)\n try {\n await fs.access(fullPath)\n return fullPath\n } catch {\n continue\n }\n }\n\n return null\n}\n\n// ============================================\n// Setup Route Generator (for visual wizard)\n// ============================================\n\nexport async function generateSetupRoute(): Promise<void> {\n const routeDir = path.join(process.cwd(), 'app', '_uptrade', 'setup')\n \n // Create directory\n await fs.mkdir(routeDir, { recursive: true })\n\n // Create page.tsx\n const pageContent = `/**\n * Uptrade Setup Wizard\n * \n * This route is automatically removed after setup is complete.\n * Visit /_uptrade/setup to configure Site-Kit.\n */\n\nimport { SetupWizard } from '@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"]}
|
|
@@ -201,7 +201,7 @@ async function handleConfigure(req) {
|
|
|
201
201
|
return server.NextResponse.json({ error: "Not authenticated" }, { status: 401 });
|
|
202
202
|
}
|
|
203
203
|
const { projectId } = await req.json();
|
|
204
|
-
const { generateEnvFile, generateProvider } = await import('./generators-
|
|
204
|
+
const { generateEnvFile, generateProvider } = await import('./generators-UXPMVYP4.js');
|
|
205
205
|
try {
|
|
206
206
|
const configResponse = await fetch(`${API_URL}/projects/${projectId}/config`, {
|
|
207
207
|
headers: { "Authorization": `Bearer ${authSession.accessToken}` }
|
|
@@ -236,7 +236,7 @@ async function handleConfigure(req) {
|
|
|
236
236
|
}
|
|
237
237
|
}
|
|
238
238
|
async function handleSelfDestruct() {
|
|
239
|
-
const { selfDestruct } = await import('./generators-
|
|
239
|
+
const { selfDestruct } = await import('./generators-UXPMVYP4.js');
|
|
240
240
|
try {
|
|
241
241
|
await selfDestruct();
|
|
242
242
|
return server.NextResponse.json({ success: true });
|
|
@@ -339,5 +339,5 @@ async function handleRequest(req, route) {
|
|
|
339
339
|
}
|
|
340
340
|
|
|
341
341
|
exports.handleRequest = handleRequest;
|
|
342
|
-
//# sourceMappingURL=chunk-
|
|
343
|
-
//# sourceMappingURL=chunk-
|
|
342
|
+
//# sourceMappingURL=chunk-HEUULOSC.js.map
|
|
343
|
+
//# sourceMappingURL=chunk-HEUULOSC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/setup/api-handlers.ts"],"names":["NextResponse"],"mappings":"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","file":"chunk-F6D3L676.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://portal.uptrademedia.com'\nconst API_URL = process.env.UPTRADE_API_URL || 'https://api.uptrademedia.com'\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({ projectId })\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>Uptrade - 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>Uptrade - 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-HEUULOSC.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://portal.uptrademedia.com'\nconst API_URL = process.env.UPTRADE_API_URL || 'https://api.uptrademedia.com'\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({ projectId })\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>Uptrade - 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>Uptrade - 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"]}
|
|
@@ -29,7 +29,7 @@ async function generateEnvFile(options) {
|
|
|
29
29
|
let newContent = `# Uptrade Site-Kit Configuration
|
|
30
30
|
# Generated by @uptrade/site-kit setup wizard
|
|
31
31
|
|
|
32
|
-
# Project ID from
|
|
32
|
+
# Project ID from Sonor
|
|
33
33
|
NEXT_PUBLIC_UPTRADE_PROJECT_ID=${newVars["NEXT_PUBLIC_UPTRADE_PROJECT_ID"]}
|
|
34
34
|
|
|
35
35
|
# Supabase Configuration
|
|
@@ -320,5 +320,5 @@ async function removeNextSitemapDependency() {
|
|
|
320
320
|
}
|
|
321
321
|
|
|
322
322
|
export { generateEnvFile, generateProvider, generateSetupRoute, migrateSitemap, removeNextSitemapDependency, selfDestruct };
|
|
323
|
-
//# sourceMappingURL=chunk-
|
|
324
|
-
//# sourceMappingURL=chunk-
|
|
323
|
+
//# sourceMappingURL=chunk-HYJHGCYY.mjs.map
|
|
324
|
+
//# sourceMappingURL=chunk-HYJHGCYY.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/generators/index.ts"],"names":[],"mappings":";;;;AA0BA,eAAsB,gBAAgB,OAAA,EAAoC;AACxE,EAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,YAAY,CAAA;AAGrD,EAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,EAAA,IAAI;AACF,IAAA,eAAA,GAAkB,MAAM,EAAA,CAAG,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,kCAAkC,OAAA,CAAQ,SAAA;AAAA,IAC1C,4BAA4B,OAAA,CAAQ,WAAA;AAAA,IACpC,iCAAiC,OAAA,CAAQ,eAAA;AAAA,IACzC,mBAAmB,OAAA,CAAQ;AAAA,GAC7B;AAGA,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAA;AACxC,EAAA,MAAM,eAAuC,EAAC;AAG9C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,KAAK,UAAA,CAAW,GAAG,KAAK,IAAA,CAAK,IAAA,OAAW,EAAA,EAAI;AAE9C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,CAAC,GAAA,EAAK,GAAG,UAAU,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AAC3C,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,GAAI,WAAW,IAAA,CAAK,GAAG,EAAE,IAAA,EAAK;AAAA,IACvD;AAAA,EACF;AAMA,EAAA,IAAI,UAAA,GAAa,CAAA;AAAA;;AAAA;AAAA,+BAAA,EAIc,OAAA,CAAQ,gCAAgC,CAAC;;AAAA;AAAA,yBAAA,EAG/C,OAAA,CAAQ,0BAA0B,CAAC;AAAA,8BAAA,EAC9B,OAAA,CAAQ,+BAA+B,CAAC;;AAAA;AAAA,gBAAA,EAGtD,OAAA,CAAQ,iBAAiB,CAAC;;AAAA,CAAA;AAK1C,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,YAAY,EAC1C,MAAA,CAAO,CAAC,CAAC,GAAG,CAAA,KAAM,CAAC,WAAA,CAAY,QAAA,CAAS,GAAG,CAAC,CAAA;AAE/C,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,UAAA,IAAc,iCAAA;AACd,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,SAAA,EAAW;AACpC,MAAA,UAAA,IAAc,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK;AAAA,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,MAAM,EAAA,CAAG,SAAA,CAAU,OAAA,EAAS,UAAA,EAAY,OAAO,CAAA;AACjD;AASA,SAAS,eAAA,CAAgB,SAAiB,eAAA,EAAiC;AAEzE,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,KAAA,CAAM,yBAAyB,IAAI,CAAC,CAAA;AACzE,EAAA,IAAI,YAAA,IAAgB,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA,EAAG;AAClD,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,KAAA,CAAM,yCAAyC,CAAA;AAE9E,EAAA,IAAI,cAAA,EAAgB;AAElB,IAAA,MAAM,SAAA,GAAY,eAAe,CAAC,CAAA;AAClC,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA;AACjD,IAAA,OAAO,SAAA,GAAY,kBAAkB,IAAA,GAAO,UAAA;AAAA,EAC9C,CAAA,MAAO;AAEL,IAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,KAAA,CAAM,cAAc,CAAA;AACrD,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,OAAO,kBAAkB,IAAA,GAAO,OAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,OAAO,kBAAkB,MAAA,GAAS,OAAA;AAAA,IACpC;AAAA,EACF;AACF;AAEA,eAAsB,iBAAiB,OAAA,EAAyC;AAE9E,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AACxC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,QAAA,CAAS,YAAY,OAAO,CAAA;AAGrD,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,iBAAiB,CAAA,EAAG;AACvC,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAa,UAAA,GAAa,SAAA;AAChC,EAAA,MAAM,EAAA,CAAG,SAAA,CAAU,UAAA,EAAY,OAAA,EAAS,OAAO,CAAA;AAG/C,EAAA,IAAI,UAAA,GAAa,OAAA;AACjB,EAAA,KAAA,MAAW,IAAA,IAAQ;AAAA,IACjB,CAAA,mDAAA,CAAA;AAAA,IACA,CAAA,yDAAA;AAAA,GACF,EAAG;AACD,IAAA,UAAA,GAAa,eAAA,CAAgB,YAAY,IAAI,CAAA;AAAA,EAC/C;AAGA,EAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,gBAAgB,CAAA,EAAG;AAC1C,IAAA,IAAI,YAAA,CAAa,IAAA,CAAK,UAAU,CAAA,EAAG;AACjC,MAAA,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,oBAAA,EAAsB,8CAA8C,CAAA;AAAA,IACtG,CAAA,MAAO;AACL,MAAA,UAAA,GAAa,UAAA,CAAW,OAAA;AAAA,QACtB,2BAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAIA,EAAA,MAAM,eAAA,GAAkB,iBAAA;AACxB,EAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,KAAA,CAAM,eAAe,CAAA;AAEtD,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,CAAC,CAAA,IAAK,UAAA;AACnC,IAAA,MAAM,YAAA,GAAe;AAAA,EACvB,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA,kBAAA,CAAA;AAEJ,IAAA,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,eAAA,EAAiB,YAAY,CAAA;AAAA,EAC/D,CAAA,MAAO;AAEL,IAAA,MAAM,WAAA,GAAc,mCAAA;AACpB,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,KAAA,CAAM,WAAW,CAAA;AAE9C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,WAAA,GAAc,UAAU,CAAC,CAAA;AAC/B,MAAA,MAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EASf,WAAA,CAAY,MAAM;AAAA;AAAA,QAAA,CAAA;AAI1B,MAAA,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,WAAA,EAAa,CAAA,EAAA,EAAK,cAAc,CAAA,EAAA,CAAI,CAAA;AAAA,IACtE;AAAA,EACF;AAEA,EAAA,MAAM,EAAA,CAAG,SAAA,CAAU,UAAA,EAAY,UAAA,EAAY,OAAO,CAAA;AACpD;AAMA,eAAe,cAAA,GAAyC;AACtD,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,oBAAA;AAAA,IACA,gBAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,gBAAgB,aAAA,EAAe;AACxC,IAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,YAAY,CAAA;AACtD,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAMA,eAAsB,kBAAA,GAAoC;AACxD,EAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,OAAA,CAAQ,KAAI,EAAG,KAAA,EAAO,YAAY,OAAO,CAAA;AAGpE,EAAA,MAAM,GAAG,KAAA,CAAM,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AAG5C,EAAA,MAAM,WAAA,GAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAcpB,EAAA,MAAM,EAAA,CAAG,UAAU,IAAA,CAAK,IAAA,CAAK,UAAU,UAAU,CAAA,EAAG,aAAa,OAAO,CAAA;AAC1E;AAMA,eAAsB,YAAA,GAA8B;AAElD,EAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,OAAO,UAAU,CAAA;AAC3D,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,CAAG,GAAG,QAAA,EAAU,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AACxC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI,OAAA,GAAU,MAAM,EAAA,CAAG,QAAA,CAAS,YAAY,OAAO,CAAA;AAGnD,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,iFAAA,EAAmF,EAAE,CAAA;AAG/G,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,wFAAA,EAA0F,IAAI,CAAA;AACxH,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,sBAAA,EAAwB,EAAE,CAAA;AAEpD,IAAA,MAAM,EAAA,CAAG,SAAA,CAAU,UAAA,EAAY,OAAA,EAAS,OAAO,CAAA;AAAA,EACjD;AACF;AAmBA,eAAsB,eAAe,OAAA,EAGlC;AACD,EAAA,MAAM,UAAoB,EAAC;AAG3B,EAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,IAAA,KAAA,MAAW,QAAA,IAAY,QAAQ,gBAAA,EAAkB;AAE/C,MAAA,IAAI,QAAA,CAAS,cAAc,UAAA,EAAY;AAEvC,MAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,SAAS,QAAQ,CAAA;AAC3D,MAAA,IAAI;AACF,QAAA,MAAM,EAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,QAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,QAAQ,CAAA;AAAA,MAChC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,wBAAA;AAAA,MACA,yBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,MAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,MAAM,CAAA;AAChD,MAAA,IAAI;AACF,QAAA,MAAM,EAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,QAAA,MAAM,EAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,MACrB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,MAAM,gBAAgB,IAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,UAAU,aAAa,CAAA;AACtE,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,CAAG,OAAO,aAAa,CAAA;AAC7B,MAAA,MAAM,EAAA,CAAG,OAAO,aAAa,CAAA;AAC7B,MAAA,OAAA,CAAQ,KAAK,oBAAoB,CAAA;AAAA,IACnC,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,MAAM,qBAAqB,IAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,UAAU,eAAe,CAAA;AAC7E,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,CAAG,OAAO,kBAAkB,CAAA;AAElC,MAAA,MAAM,YAAY,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,QAAQ,CAAA;AACnD,MAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,CAAG,OAAA,CAAQ,SAAS,CAAA;AACxC,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,IAAA,CAAK,KAAA,CAAM,oBAAoB,CAAA,EAAG;AACpC,UAAA,MAAM,GAAG,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,IAAI,CAAC,CAAA;AAC1C,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,CAAE,CAAA;AAAA,QAC/B;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,MAAM,mBAAA,EAAoB;AAC9C,EAAA,MAAM,cAAA,GAAiB,sBAAA,CAAuB,OAAA,CAAQ,OAAO,CAAA;AAE7D,EAAA,MAAM,EAAA,CAAG,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC7D,EAAA,MAAM,EAAA,CAAG,SAAA,CAAU,WAAA,EAAa,cAAA,EAAgB,OAAO,CAAA;AAEvD,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,SAAS,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,GAAA,IAAO,WAAW;AAAA,GACnD;AACF;AAKA,eAAe,mBAAA,GAAuC;AAEpD,EAAA,MAAM,MAAA,GAAS,KAAK,IAAA,CAAK,OAAA,CAAQ,KAAI,EAAG,KAAA,EAAO,OAAO,YAAY,CAAA;AAClE,EAAA,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,OAAO,YAAY,CAAA;AAExD,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,CAAG,OAAO,IAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,KAAA,EAAO,KAAK,CAAC,CAAA;AACtD,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAKA,SAAS,uBAAuB,OAAA,EAAyB;AACvD,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,YAAA,EAYK,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAqBrB;AAKA,eAAsB,2BAAA,GAAgD;AACpE,EAAA,MAAM,kBAAkB,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,cAAc,CAAA;AAE/D,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,QAAA,CAAS,iBAAiB,OAAO,CAAA;AAC1D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAE9B,IAAA,IAAI,QAAA,GAAW,KAAA;AAEf,IAAA,IAAI,GAAA,CAAI,YAAA,GAAe,cAAc,CAAA,EAAG;AACtC,MAAA,OAAO,GAAA,CAAI,aAAa,cAAc,CAAA;AACtC,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AAEA,IAAA,IAAI,GAAA,CAAI,eAAA,GAAkB,cAAc,CAAA,EAAG;AACzC,MAAA,OAAO,GAAA,CAAI,gBAAgB,cAAc,CAAA;AACzC,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AAGA,IAAA,IAAI,IAAI,OAAA,EAAS;AACf,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACtD,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,QAAA,CAAS,cAAc,CAAA,EAAG;AAC/D,UAAA,OAAO,GAAA,CAAI,QAAQ,GAAG,CAAA;AACtB,UAAA,QAAA,GAAW,IAAA;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,EAAA,CAAG,SAAA,CAAU,eAAA,EAAiB,IAAA,CAAK,SAAA,CAAU,KAAK,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,OAAO,CAAA;AAAA,IAClF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF","file":"chunk-HYJHGCYY.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 Sonor\nNEXT_PUBLIC_UPTRADE_PROJECT_ID=${newVars['NEXT_PUBLIC_UPTRADE_PROJECT_ID']}\n\n# Supabase Configuration\nNEXT_PUBLIC_SUPABASE_URL=${newVars['NEXT_PUBLIC_SUPABASE_URL']}\nNEXT_PUBLIC_SUPABASE_ANON_KEY=${newVars['NEXT_PUBLIC_SUPABASE_ANON_KEY']}\n\n# Uptrade API Key (for server-side operations)\nUPTRADE_API_KEY=${newVars['UPTRADE_API_KEY']}\n\n`\n\n // Add any existing vars that aren't Uptrade-related\n const uptradeKeys = Object.keys(newVars)\n const otherVars = Object.entries(existingVars)\n .filter(([key]) => !uptradeKeys.includes(key))\n \n if (otherVars.length > 0) {\n newContent += '# Other Environment Variables\\n'\n for (const [key, value] of otherVars) {\n newContent += `${key}=${value}\\n`\n }\n }\n\n await fs.writeFile(envPath, newContent, 'utf-8')\n}\n\n// ============================================\n// Provider Generator\n// ============================================\n\n/**\n * Safely adds an import statement to a file, respecting 'use client'/'use server' directives\n */\nfunction addImportSafely(content: string, importStatement: string): string {\n // Check if import already exists\n const importModule = importStatement.match(/from\\s+['\"]([^'\"]+)['\"]/)?.[1]\n if (importModule && content.includes(importModule)) {\n return content\n }\n \n // Check for 'use client' or 'use server' directive at the start\n const directiveMatch = content.match(/^(['\"]use (client|server)['\"][\\s;]*\\n?)/)\n \n if (directiveMatch) {\n // Insert import AFTER the directive\n const directive = directiveMatch[0]\n const restOfFile = content.slice(directive.length)\n return directive + importStatement + '\\n' + restOfFile\n } else {\n // No directive, add import at the top before other imports\n const firstImportMatch = content.match(/^(import\\s+)/)\n if (firstImportMatch) {\n return importStatement + '\\n' + content\n } else {\n return importStatement + '\\n\\n' + content\n }\n }\n}\n\nexport async function generateProvider(options: ProviderOptions): Promise<void> {\n // Find the layout file\n const layoutPath = await findLayoutFile()\n if (!layoutPath) {\n throw new Error('Could not find layout.tsx file')\n }\n\n const content = await fs.readFile(layoutPath, 'utf-8')\n\n // Check if SiteKitProvider is already added\n if (content.includes('SiteKitProvider')) {\n return // Already configured\n }\n\n // Create backup first\n const backupPath = layoutPath + '.backup'\n await fs.writeFile(backupPath, content, 'utf-8')\n\n // Add imports safely (respects 'use client' directive)\n let newContent = content\n for (const stmt of [\n `import { SiteKitProvider } from '@uptrade/site-kit'`,\n `import { ManagedFavicon } from '@uptrade/site-kit/images'`,\n ]) {\n newContent = addImportSafely(newContent, stmt)\n }\n\n // Add ManagedFavicon to head if missing\n if (!newContent.includes('ManagedFavicon')) {\n if (/<head[\\s>]/.test(newContent)) {\n newContent = newContent.replace(/(<head[^>]*>)(\\s*)/, '$1\\n <ManagedFavicon />\\n $2')\n } else {\n newContent = newContent.replace(\n /(<html[^>]*>)(\\s*)(<body)/,\n '$1$2<head>\\n <ManagedFavicon />\\n </head>$2$3'\n )\n }\n }\n\n // Wrap children with SiteKitProvider\n // Look for {children} and wrap it\n const childrenPattern = /(\\s*){children}/\n const childrenMatch = newContent.match(childrenPattern)\n \n if (childrenMatch) {\n const indent = childrenMatch[1] || ' '\n const providerWrap = `\n${indent}<SiteKitProvider\n${indent} projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n${indent} supabaseUrl={process.env.NEXT_PUBLIC_SUPABASE_URL!}\n${indent} supabaseAnonKey={process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!}\n${indent} analytics={{ enabled: true }}\n${indent} engage={{ enabled: true }}\n${indent} forms={{ enabled: true }}\n${indent}>\n${indent} {children}\n${indent}</SiteKitProvider>`\n\n newContent = newContent.replace(childrenPattern, providerWrap)\n } else {\n // Try alternative pattern for layouts that use a different structure\n const bodyPattern = /(<body[^>]*>)([\\s\\S]*?)(<\\/body>)/\n const bodyMatch = newContent.match(bodyPattern)\n \n if (bodyMatch) {\n const bodyContent = bodyMatch[2]\n const wrappedContent = `\n <SiteKitProvider\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n supabaseUrl={process.env.NEXT_PUBLIC_SUPABASE_URL!}\n supabaseAnonKey={process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!}\n analytics={{ enabled: true }}\n engage={{ enabled: true }}\n forms={{ enabled: true }}\n >\n ${bodyContent.trim()}\n </SiteKitProvider>\n `\n \n newContent = newContent.replace(bodyPattern, `$1${wrappedContent}$3`)\n }\n }\n\n await fs.writeFile(layoutPath, newContent, 'utf-8')\n}\n\n// ============================================\n// Helpers\n// ============================================\n\nasync function findLayoutFile(): Promise<string | null> {\n const possiblePaths = [\n 'src/app/layout.tsx',\n 'app/layout.tsx',\n 'src/app/layout.jsx',\n 'app/layout.jsx',\n ]\n\n for (const relativePath of possiblePaths) {\n const fullPath = path.join(process.cwd(), relativePath)\n try {\n await fs.access(fullPath)\n return fullPath\n } catch {\n continue\n }\n }\n\n return null\n}\n\n// ============================================\n// Setup Route Generator (for visual wizard)\n// ============================================\n\nexport async function generateSetupRoute(): Promise<void> {\n const routeDir = path.join(process.cwd(), 'app', '_uptrade', 'setup')\n \n // Create directory\n await fs.mkdir(routeDir, { recursive: true })\n\n // Create page.tsx\n const pageContent = `/**\n * Uptrade Setup Wizard\n * \n * This route is automatically removed after setup is complete.\n * Visit /_uptrade/setup to configure Site-Kit.\n */\n\nimport { SetupWizard } from '@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"]}
|
|
@@ -130,5 +130,5 @@ async function isIndexable(projectId, path) {
|
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
export { generateSitemap, getRedirect, getRobotsDirective, isIndexable, registerLocalSitemap };
|
|
133
|
-
//# sourceMappingURL=chunk-
|
|
134
|
-
//# sourceMappingURL=chunk-
|
|
133
|
+
//# sourceMappingURL=chunk-KG46POJZ.mjs.map
|
|
134
|
+
//# sourceMappingURL=chunk-KG46POJZ.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/seo/routing.ts"],"names":[],"mappings":"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","file":"chunk-WG2SI2UN.mjs","sourcesContent":["import { getRedirectData, getRobotsData, getSitemapEntries } from './server-api'\nimport type { \n GetRedirectOptions, \n RedirectResult, \n GetRobotsOptions, \n RobotsDirective,\n GetSitemapEntriesOptions,\n SitemapEntry \n} from './types'\n\n/**\n * Get redirect for a path if one exists\n * \n * Use in Next.js middleware to handle managed redirects\n * \n * @example\n * ```tsx\n * // middleware.ts\n * import { getRedirect } from '@uptrade/seo'\n * \n * export async function middleware(request) {\n * const redirect = await getRedirect({\n * projectId: process.env.UPTRADE_PROJECT_ID!,\n * path: request.nextUrl.pathname\n * })\n * \n * if (redirect) {\n * return NextResponse.redirect(redirect.destination, redirect.statusCode)\n * }\n * }\n * ```\n */\nexport async function getRedirect(\n options: GetRedirectOptions\n): Promise<RedirectResult | null> {\n const { path } = options\n\n const redirect = await getRedirectData(path)\n\n if (!redirect) {\n return null\n }\n\n // Check if expired\n if (redirect.expires_at && new Date(redirect.expires_at) < new Date()) {\n return null\n }\n\n // Determine destination\n const destination = redirect.destination_url || redirect.destination_path\n const isExternal = destination.startsWith('http://') || destination.startsWith('https://')\n\n return {\n destination,\n statusCode: redirect.status_code,\n isExternal,\n }\n}\n\n/**\n * Parse robots directive string into structured object\n */\nfunction parseRobotsString(robots: string): RobotsDirective {\n const directive: RobotsDirective = {\n index: true,\n follow: true,\n }\n\n const parts = robots.toLowerCase().split(',').map(p => p.trim())\n\n for (const part of parts) {\n if (part === 'noindex') directive.index = false\n if (part === 'nofollow') directive.follow = false\n if (part === 'noarchive') directive.noarchive = true\n if (part === 'nosnippet') directive.nosnippet = true\n if (part === 'noimageindex') directive.noimageindex = true\n if (part.startsWith('max-snippet:')) {\n directive.max_snippet = parseInt(part.split(':')[1], 10)\n }\n if (part.startsWith('max-image-preview:')) {\n const value = part.split(':')[1] as 'none' | 'standard' | 'large'\n directive.max_image_preview = value\n }\n if (part.startsWith('max-video-preview:')) {\n directive.max_video_preview = parseInt(part.split(':')[1], 10)\n }\n }\n\n return directive\n}\n\n/**\n * Get robots directive for a page\n * \n * @example\n * ```tsx\n * const robots = await getRobotsDirective({\n * projectId: process.env.UPTRADE_PROJECT_ID!,\n * path: '/private-page'\n * })\n * \n * if (!robots.index) {\n * // Page should not be indexed\n * }\n * ```\n */\nexport async function getRobotsDirective(\n options: GetRobotsOptions\n): Promise<RobotsDirective> {\n const { path } = options\n\n const robotsString = await getRobotsData(path)\n\n if (!robotsString) {\n // Default: index and follow\n return { index: true, follow: true }\n }\n\n return parseRobotsString(robotsString)\n}\n\n/**\n * Get sitemap entries for a project\n * \n * Use in sitemap.ts to generate dynamic sitemap\n * \n * @example\n * ```tsx\n * // app/sitemap.ts\n * import { generateSitemap } from '@uptrade/seo'\n * \n * export default async function sitemap() {\n * return generateSitemap({\n * projectId: process.env.UPTRADE_PROJECT_ID!,\n * baseUrl: 'https://example.com',\n * publishedOnly: true\n * })\n * }\n * ```\n */\nexport async function generateSitemap(\n options: GetSitemapEntriesOptions\n): Promise<SitemapEntry[]> {\n const { baseUrl, publishedOnly = true } = options\n\n const pages = await getSitemapEntries({ publishedOnly })\n\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\n\n return pages.map((page: { path: string; lastmod?: string; changefreq?: string; priority?: number }) => ({\n path: page.path,\n url: `${normalizedBase}${page.path}`,\n lastmod: page.lastmod,\n changefreq: (page.changefreq || 'weekly') as SitemapEntry['changefreq'],\n priority: page.priority ?? 0.5,\n }))\n}\n\n/**\n * Register local sitemap entries with Uptrade Portal\n * \n * Call this at build time to sync your local routes to seo_pages.\n * This ensures analytics only tracks real pages.\n * \n * After registration, Signal AI will generate optimized meta titles\n * and descriptions for pages that don't have managed meta yet.\n * \n * @example\n * ```ts\n * // scripts/register-sitemap.ts\n * import { registerLocalSitemap } from '@uptrade/seo'\n * \n * // Option 1: Provide entries directly\n * await registerLocalSitemap({\n * entries: [\n * { path: '/', title: 'Home', priority: 1.0 },\n * { path: '/about', title: 'About Us', priority: 0.8 },\n * ]\n * })\n * \n * // Option 2: Auto-discover from Next.js app directory\n * await registerLocalSitemap({ autoDiscover: true })\n * \n * // Option 3: Skip Signal AI meta optimization\n * await registerLocalSitemap({ autoDiscover: true, optimize_meta: false })\n * ```\n */\nexport async function registerLocalSitemap(options: {\n entries?: Array<{\n path: string\n title?: string\n priority?: number\n changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n }>\n autoDiscover?: boolean\n /** Trigger Signal AI to generate optimized meta titles/descriptions (default: true) */\n optimize_meta?: boolean\n}): Promise<{ \n success: boolean\n created: number\n updated: number\n removed?: number\n meta_optimization?: {\n triggered: boolean\n pages_queued: number\n } | null\n}> {\n const { registerSitemap } = await import('./server-api')\n \n let entries = options.entries || []\n \n // Auto-discover from Next.js app directory if requested\n if (options.autoDiscover && entries.length === 0) {\n try {\n const fs = await import('fs')\n const path = await import('path')\n \n const appDir = path.join(process.cwd(), 'app')\n if (fs.existsSync(appDir)) {\n entries = discoverNextJsRoutes(appDir, fs, path)\n console.log(`[Uptrade] Auto-discovered ${entries.length} routes from app directory`)\n }\n } catch (error) {\n console.error('[Uptrade] Auto-discovery failed:', error)\n }\n }\n \n if (entries.length === 0) {\n console.warn('[Uptrade] No sitemap entries to register')\n return { success: true, created: 0, updated: 0 }\n }\n \n console.log(`[Uptrade] Registering ${entries.length} sitemap entries...`)\n const result = await registerSitemap(entries)\n \n if (result.success) {\n console.log(`[Uptrade] Sitemap registered: ${result.created} new, ${result.updated} updated`)\n }\n \n return result\n}\n\n/**\n * Discover routes from Next.js app directory\n */\nfunction discoverNextJsRoutes(\n appDir: string,\n fs: typeof import('fs'),\n path: typeof import('path'),\n basePath: string = ''\n): Array<{ path: string; priority: number }> {\n const entries: Array<{ path: string; priority: number }> = []\n \n const items = fs.readdirSync(appDir, { withFileTypes: true })\n \n for (const item of items) {\n // Skip private folders, api routes, and special files\n if (item.name.startsWith('_') || item.name.startsWith('.')) continue\n if (item.name === 'api') continue\n if (item.name === 'node_modules') continue\n \n const itemPath = path.join(appDir, item.name)\n \n if (item.isDirectory()) {\n // Check for page.tsx/page.js in this directory\n const hasPage = fs.existsSync(path.join(itemPath, 'page.tsx')) ||\n fs.existsSync(path.join(itemPath, 'page.js')) ||\n fs.existsSync(path.join(itemPath, 'page.jsx'))\n \n // Handle route groups (parentheses)\n const isRouteGroup = item.name.startsWith('(') && item.name.endsWith(')')\n \n // Handle dynamic segments [slug]\n const isDynamic = item.name.startsWith('[') && item.name.endsWith(']')\n \n let routePath = basePath\n if (!isRouteGroup && !isDynamic) {\n routePath = `${basePath}/${item.name}`\n }\n \n if (hasPage && !isDynamic) {\n const priority = routePath === '' ? 1.0 : 0.8\n entries.push({ path: routePath || '/', priority })\n }\n \n // Recurse into subdirectories (but not dynamic ones)\n if (!isDynamic) {\n const subEntries = discoverNextJsRoutes(itemPath, fs, path, isRouteGroup ? basePath : routePath)\n entries.push(...subEntries)\n }\n }\n }\n \n // Add root if app/page.tsx exists and we're at root\n if (basePath === '') {\n const hasRootPage = fs.existsSync(path.join(appDir, 'page.tsx')) ||\n fs.existsSync(path.join(appDir, 'page.js')) ||\n fs.existsSync(path.join(appDir, 'page.jsx'))\n if (hasRootPage) {\n entries.unshift({ path: '/', priority: 1.0 })\n }\n }\n \n return entries\n}\n\n/**\n * Check if a path should be indexed\n * \n * Quick helper to check indexability without full directive parsing\n */\nexport async function isIndexable(\n projectId: string,\n path: string\n): Promise<boolean> {\n const directive = await getRobotsDirective({ projectId, path })\n return directive.index\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/seo/routing.ts"],"names":[],"mappings":"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","file":"chunk-KG46POJZ.mjs","sourcesContent":["import { getRedirectData, getRobotsData, getSitemapEntries } from './server-api'\nimport type { \n GetRedirectOptions, \n RedirectResult, \n GetRobotsOptions, \n RobotsDirective,\n GetSitemapEntriesOptions,\n SitemapEntry \n} from './types'\n\n/**\n * Get redirect for a path if one exists\n * \n * Use in Next.js middleware to handle managed redirects\n * \n * @example\n * ```tsx\n * // middleware.ts\n * import { getRedirect } from '@uptrade/seo'\n * \n * export async function middleware(request) {\n * const redirect = await getRedirect({\n * projectId: process.env.UPTRADE_PROJECT_ID!,\n * path: request.nextUrl.pathname\n * })\n * \n * if (redirect) {\n * return NextResponse.redirect(redirect.destination, redirect.statusCode)\n * }\n * }\n * ```\n */\nexport async function getRedirect(\n options: GetRedirectOptions\n): Promise<RedirectResult | null> {\n const { path } = options\n\n const redirect = await getRedirectData(path)\n\n if (!redirect) {\n return null\n }\n\n // Check if expired\n if (redirect.expires_at && new Date(redirect.expires_at) < new Date()) {\n return null\n }\n\n // Determine destination\n const destination = redirect.destination_url || redirect.destination_path\n const isExternal = destination.startsWith('http://') || destination.startsWith('https://')\n\n return {\n destination,\n statusCode: redirect.status_code,\n isExternal,\n }\n}\n\n/**\n * Parse robots directive string into structured object\n */\nfunction parseRobotsString(robots: string): RobotsDirective {\n const directive: RobotsDirective = {\n index: true,\n follow: true,\n }\n\n const parts = robots.toLowerCase().split(',').map(p => p.trim())\n\n for (const part of parts) {\n if (part === 'noindex') directive.index = false\n if (part === 'nofollow') directive.follow = false\n if (part === 'noarchive') directive.noarchive = true\n if (part === 'nosnippet') directive.nosnippet = true\n if (part === 'noimageindex') directive.noimageindex = true\n if (part.startsWith('max-snippet:')) {\n directive.max_snippet = parseInt(part.split(':')[1], 10)\n }\n if (part.startsWith('max-image-preview:')) {\n const value = part.split(':')[1] as 'none' | 'standard' | 'large'\n directive.max_image_preview = value\n }\n if (part.startsWith('max-video-preview:')) {\n directive.max_video_preview = parseInt(part.split(':')[1], 10)\n }\n }\n\n return directive\n}\n\n/**\n * Get robots directive for a page\n * \n * @example\n * ```tsx\n * const robots = await getRobotsDirective({\n * projectId: process.env.UPTRADE_PROJECT_ID!,\n * path: '/private-page'\n * })\n * \n * if (!robots.index) {\n * // Page should not be indexed\n * }\n * ```\n */\nexport async function getRobotsDirective(\n options: GetRobotsOptions\n): Promise<RobotsDirective> {\n const { path } = options\n\n const robotsString = await getRobotsData(path)\n\n if (!robotsString) {\n // Default: index and follow\n return { index: true, follow: true }\n }\n\n return parseRobotsString(robotsString)\n}\n\n/**\n * Get sitemap entries for a project\n * \n * Use in sitemap.ts to generate dynamic sitemap\n * \n * @example\n * ```tsx\n * // app/sitemap.ts\n * import { generateSitemap } from '@uptrade/seo'\n * \n * export default async function sitemap() {\n * return generateSitemap({\n * projectId: process.env.UPTRADE_PROJECT_ID!,\n * baseUrl: 'https://example.com',\n * publishedOnly: true\n * })\n * }\n * ```\n */\nexport async function generateSitemap(\n options: GetSitemapEntriesOptions\n): Promise<SitemapEntry[]> {\n const { baseUrl, publishedOnly = true } = options\n\n const pages = await getSitemapEntries({ publishedOnly })\n\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\n\n return pages.map((page: { path: string; lastmod?: string; changefreq?: string; priority?: number }) => ({\n path: page.path,\n url: `${normalizedBase}${page.path}`,\n lastmod: page.lastmod,\n changefreq: (page.changefreq || 'weekly') as SitemapEntry['changefreq'],\n priority: page.priority ?? 0.5,\n }))\n}\n\n/**\n * Register local sitemap entries with Sonor\n * \n * Call this at build time to sync your local routes to seo_pages.\n * This ensures analytics only tracks real pages.\n * \n * After registration, Signal AI will generate optimized meta titles\n * and descriptions for pages that don't have managed meta yet.\n * \n * @example\n * ```ts\n * // scripts/register-sitemap.ts\n * import { registerLocalSitemap } from '@uptrade/seo'\n * \n * // Option 1: Provide entries directly\n * await registerLocalSitemap({\n * entries: [\n * { path: '/', title: 'Home', priority: 1.0 },\n * { path: '/about', title: 'About Us', priority: 0.8 },\n * ]\n * })\n * \n * // Option 2: Auto-discover from Next.js app directory\n * await registerLocalSitemap({ autoDiscover: true })\n * \n * // Option 3: Skip Signal AI meta optimization\n * await registerLocalSitemap({ autoDiscover: true, optimize_meta: false })\n * ```\n */\nexport async function registerLocalSitemap(options: {\n entries?: Array<{\n path: string\n title?: string\n priority?: number\n changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n }>\n autoDiscover?: boolean\n /** Trigger Signal AI to generate optimized meta titles/descriptions (default: true) */\n optimize_meta?: boolean\n}): Promise<{ \n success: boolean\n created: number\n updated: number\n removed?: number\n meta_optimization?: {\n triggered: boolean\n pages_queued: number\n } | null\n}> {\n const { registerSitemap } = await import('./server-api')\n \n let entries = options.entries || []\n \n // Auto-discover from Next.js app directory if requested\n if (options.autoDiscover && entries.length === 0) {\n try {\n const fs = await import('fs')\n const path = await import('path')\n \n const appDir = path.join(process.cwd(), 'app')\n if (fs.existsSync(appDir)) {\n entries = discoverNextJsRoutes(appDir, fs, path)\n console.log(`[Uptrade] Auto-discovered ${entries.length} routes from app directory`)\n }\n } catch (error) {\n console.error('[Uptrade] Auto-discovery failed:', error)\n }\n }\n \n if (entries.length === 0) {\n console.warn('[Uptrade] No sitemap entries to register')\n return { success: true, created: 0, updated: 0 }\n }\n \n console.log(`[Uptrade] Registering ${entries.length} sitemap entries...`)\n const result = await registerSitemap(entries)\n \n if (result.success) {\n console.log(`[Uptrade] Sitemap registered: ${result.created} new, ${result.updated} updated`)\n }\n \n return result\n}\n\n/**\n * Discover routes from Next.js app directory\n */\nfunction discoverNextJsRoutes(\n appDir: string,\n fs: typeof import('fs'),\n path: typeof import('path'),\n basePath: string = ''\n): Array<{ path: string; priority: number }> {\n const entries: Array<{ path: string; priority: number }> = []\n \n const items = fs.readdirSync(appDir, { withFileTypes: true })\n \n for (const item of items) {\n // Skip private folders, api routes, and special files\n if (item.name.startsWith('_') || item.name.startsWith('.')) continue\n if (item.name === 'api') continue\n if (item.name === 'node_modules') continue\n \n const itemPath = path.join(appDir, item.name)\n \n if (item.isDirectory()) {\n // Check for page.tsx/page.js in this directory\n const hasPage = fs.existsSync(path.join(itemPath, 'page.tsx')) ||\n fs.existsSync(path.join(itemPath, 'page.js')) ||\n fs.existsSync(path.join(itemPath, 'page.jsx'))\n \n // Handle route groups (parentheses)\n const isRouteGroup = item.name.startsWith('(') && item.name.endsWith(')')\n \n // Handle dynamic segments [slug]\n const isDynamic = item.name.startsWith('[') && item.name.endsWith(']')\n \n let routePath = basePath\n if (!isRouteGroup && !isDynamic) {\n routePath = `${basePath}/${item.name}`\n }\n \n if (hasPage && !isDynamic) {\n const priority = routePath === '' ? 1.0 : 0.8\n entries.push({ path: routePath || '/', priority })\n }\n \n // Recurse into subdirectories (but not dynamic ones)\n if (!isDynamic) {\n const subEntries = discoverNextJsRoutes(itemPath, fs, path, isRouteGroup ? basePath : routePath)\n entries.push(...subEntries)\n }\n }\n }\n \n // Add root if app/page.tsx exists and we're at root\n if (basePath === '') {\n const hasRootPage = fs.existsSync(path.join(appDir, 'page.tsx')) ||\n fs.existsSync(path.join(appDir, 'page.js')) ||\n fs.existsSync(path.join(appDir, 'page.jsx'))\n if (hasRootPage) {\n entries.unshift({ path: '/', priority: 1.0 })\n }\n }\n \n return entries\n}\n\n/**\n * Check if a path should be indexed\n * \n * Quick helper to check indexability without full directive parsing\n */\nexport async function isIndexable(\n projectId: string,\n path: string\n): Promise<boolean> {\n const directive = await getRobotsDirective({ projectId, path })\n return directive.index\n}\n"]}
|
|
@@ -2542,6 +2542,132 @@ var MONTHS = [
|
|
|
2542
2542
|
"November",
|
|
2543
2543
|
"December"
|
|
2544
2544
|
];
|
|
2545
|
+
function formatDateForTooltip(dateStr) {
|
|
2546
|
+
const d = new Date(dateStr);
|
|
2547
|
+
return d.toLocaleDateString("en-US", { weekday: "short", month: "short", day: "numeric", year: "numeric" });
|
|
2548
|
+
}
|
|
2549
|
+
function CalendarEventCell({
|
|
2550
|
+
item,
|
|
2551
|
+
eventDisplay,
|
|
2552
|
+
eventClassName,
|
|
2553
|
+
onEventClick,
|
|
2554
|
+
formatTime: formatTime2
|
|
2555
|
+
}) {
|
|
2556
|
+
const [hover, setHover] = React5.useState(false);
|
|
2557
|
+
const { event, schedule } = item;
|
|
2558
|
+
const imageUrl = event.featured_image_url;
|
|
2559
|
+
if (eventDisplay === "image") {
|
|
2560
|
+
return /* @__PURE__ */ jsxs(
|
|
2561
|
+
"div",
|
|
2562
|
+
{
|
|
2563
|
+
className: `site-kit-calendar-event-image-wrapper ${eventClassName}`,
|
|
2564
|
+
style: { position: "relative" },
|
|
2565
|
+
onMouseEnter: () => setHover(true),
|
|
2566
|
+
onMouseLeave: () => setHover(false),
|
|
2567
|
+
children: [
|
|
2568
|
+
/* @__PURE__ */ jsx(
|
|
2569
|
+
"button",
|
|
2570
|
+
{
|
|
2571
|
+
onClick: onEventClick,
|
|
2572
|
+
className: `site-kit-calendar-event site-kit-calendar-event-image ${eventClassName}`,
|
|
2573
|
+
style: {
|
|
2574
|
+
display: "block",
|
|
2575
|
+
width: "100%",
|
|
2576
|
+
height: "28px",
|
|
2577
|
+
padding: 0,
|
|
2578
|
+
border: "none",
|
|
2579
|
+
borderRadius: "4px",
|
|
2580
|
+
cursor: "pointer",
|
|
2581
|
+
overflow: "hidden",
|
|
2582
|
+
background: imageUrl ? "transparent" : "#dbeafe"
|
|
2583
|
+
},
|
|
2584
|
+
children: imageUrl ? /* @__PURE__ */ jsx(
|
|
2585
|
+
"img",
|
|
2586
|
+
{
|
|
2587
|
+
src: imageUrl,
|
|
2588
|
+
alt: event.name,
|
|
2589
|
+
style: {
|
|
2590
|
+
width: "100%",
|
|
2591
|
+
height: "100%",
|
|
2592
|
+
objectFit: "cover"
|
|
2593
|
+
}
|
|
2594
|
+
}
|
|
2595
|
+
) : /* @__PURE__ */ jsx("span", { style: {
|
|
2596
|
+
fontSize: "0.65rem",
|
|
2597
|
+
color: "#1d4ed8",
|
|
2598
|
+
fontWeight: 500,
|
|
2599
|
+
padding: "2px 4px",
|
|
2600
|
+
display: "block",
|
|
2601
|
+
overflow: "hidden",
|
|
2602
|
+
textOverflow: "ellipsis",
|
|
2603
|
+
whiteSpace: "nowrap"
|
|
2604
|
+
}, children: event.name })
|
|
2605
|
+
}
|
|
2606
|
+
),
|
|
2607
|
+
/* @__PURE__ */ jsxs(
|
|
2608
|
+
"div",
|
|
2609
|
+
{
|
|
2610
|
+
className: "site-kit-calendar-event-tooltip",
|
|
2611
|
+
style: {
|
|
2612
|
+
position: "absolute",
|
|
2613
|
+
bottom: "100%",
|
|
2614
|
+
left: "50%",
|
|
2615
|
+
transform: "translateX(-50%) translateY(-4px)",
|
|
2616
|
+
padding: "8px 12px",
|
|
2617
|
+
background: "#1f2937",
|
|
2618
|
+
color: "white",
|
|
2619
|
+
borderRadius: "8px",
|
|
2620
|
+
fontSize: "0.75rem",
|
|
2621
|
+
minWidth: "180px",
|
|
2622
|
+
maxWidth: "220px",
|
|
2623
|
+
boxShadow: "0 4px 12px rgba(0,0,0,0.2)",
|
|
2624
|
+
pointerEvents: "none",
|
|
2625
|
+
opacity: hover ? 1 : 0,
|
|
2626
|
+
visibility: hover ? "visible" : "hidden",
|
|
2627
|
+
transition: "opacity 0.15s, visibility 0.15s",
|
|
2628
|
+
zIndex: 50
|
|
2629
|
+
},
|
|
2630
|
+
children: [
|
|
2631
|
+
/* @__PURE__ */ jsx("div", { style: { fontWeight: 600, marginBottom: "4px" }, children: event.name }),
|
|
2632
|
+
/* @__PURE__ */ jsxs("div", { style: { opacity: 0.9, fontSize: "0.7rem" }, children: [
|
|
2633
|
+
formatDateForTooltip(schedule.starts_at),
|
|
2634
|
+
" \u2022 ",
|
|
2635
|
+
formatTime2(schedule.starts_at)
|
|
2636
|
+
] }),
|
|
2637
|
+
event.location && /* @__PURE__ */ jsx("div", { style: { opacity: 0.8, fontSize: "0.65rem", marginTop: "2px" }, children: event.location })
|
|
2638
|
+
]
|
|
2639
|
+
}
|
|
2640
|
+
)
|
|
2641
|
+
]
|
|
2642
|
+
}
|
|
2643
|
+
);
|
|
2644
|
+
}
|
|
2645
|
+
return /* @__PURE__ */ jsx(
|
|
2646
|
+
"button",
|
|
2647
|
+
{
|
|
2648
|
+
onClick: onEventClick,
|
|
2649
|
+
className: `site-kit-calendar-event ${eventClassName}`,
|
|
2650
|
+
style: {
|
|
2651
|
+
display: "block",
|
|
2652
|
+
width: "100%",
|
|
2653
|
+
padding: "2px 4px",
|
|
2654
|
+
fontSize: "0.7rem",
|
|
2655
|
+
fontWeight: 500,
|
|
2656
|
+
textAlign: "left",
|
|
2657
|
+
border: "none",
|
|
2658
|
+
borderRadius: "3px",
|
|
2659
|
+
background: "#dbeafe",
|
|
2660
|
+
color: "#1d4ed8",
|
|
2661
|
+
cursor: "pointer",
|
|
2662
|
+
overflow: "hidden",
|
|
2663
|
+
whiteSpace: "nowrap",
|
|
2664
|
+
textOverflow: "ellipsis"
|
|
2665
|
+
},
|
|
2666
|
+
title: `${event.name} - ${formatTime2(schedule.starts_at)}`,
|
|
2667
|
+
children: event.name
|
|
2668
|
+
}
|
|
2669
|
+
);
|
|
2670
|
+
}
|
|
2545
2671
|
function CalendarView({
|
|
2546
2672
|
events: propEvents,
|
|
2547
2673
|
initialDate,
|
|
@@ -2553,6 +2679,7 @@ function CalendarView({
|
|
|
2553
2679
|
weekStartsOn = 0,
|
|
2554
2680
|
minDate,
|
|
2555
2681
|
maxDate,
|
|
2682
|
+
eventDisplay = "image",
|
|
2556
2683
|
className = "",
|
|
2557
2684
|
headerClassName = "",
|
|
2558
2685
|
dayClassName = "",
|
|
@@ -2783,29 +2910,14 @@ function CalendarView({
|
|
|
2783
2910
|
background: day.isToday ? "#2563eb" : "transparent"
|
|
2784
2911
|
}, children: day.date.getDate() }) }),
|
|
2785
2912
|
/* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "2px" }, children: [
|
|
2786
|
-
day.events.slice(0, 3).map((item
|
|
2787
|
-
|
|
2913
|
+
day.events.slice(0, 3).map((item) => /* @__PURE__ */ jsx(
|
|
2914
|
+
CalendarEventCell,
|
|
2788
2915
|
{
|
|
2789
|
-
|
|
2790
|
-
|
|
2791
|
-
|
|
2792
|
-
|
|
2793
|
-
|
|
2794
|
-
padding: "2px 4px",
|
|
2795
|
-
fontSize: "0.7rem",
|
|
2796
|
-
fontWeight: 500,
|
|
2797
|
-
textAlign: "left",
|
|
2798
|
-
border: "none",
|
|
2799
|
-
borderRadius: "3px",
|
|
2800
|
-
background: "#dbeafe",
|
|
2801
|
-
color: "#1d4ed8",
|
|
2802
|
-
cursor: "pointer",
|
|
2803
|
-
overflow: "hidden",
|
|
2804
|
-
whiteSpace: "nowrap",
|
|
2805
|
-
textOverflow: "ellipsis"
|
|
2806
|
-
},
|
|
2807
|
-
title: `${item.event.name} - ${formatTime(item.schedule.starts_at)}`,
|
|
2808
|
-
children: item.event.name
|
|
2916
|
+
item,
|
|
2917
|
+
eventDisplay,
|
|
2918
|
+
eventClassName,
|
|
2919
|
+
onEventClick: (e) => handleEventClick(e, item.event, item.schedule),
|
|
2920
|
+
formatTime
|
|
2809
2921
|
},
|
|
2810
2922
|
`${item.event.id}-${item.schedule.id}`
|
|
2811
2923
|
)),
|
|
@@ -3764,10 +3876,11 @@ function EventsWidget({
|
|
|
3764
3876
|
}
|
|
3765
3877
|
),
|
|
3766
3878
|
effectiveView === "list" ? /* @__PURE__ */ jsxs("div", { className: `site-kit-events-list ${listClassName}`, children: [
|
|
3767
|
-
/* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", gap: "1rem" }, children: displayEvents.map((eventItem) => {
|
|
3879
|
+
/* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", gap: "1rem" }, children: displayEvents.map((eventItem, index) => {
|
|
3768
3880
|
const nextSchedule = eventItem.next_schedule || eventItem.schedules?.[0];
|
|
3769
3881
|
const isFree = !eventItem.price || eventItem.price === 0;
|
|
3770
3882
|
const imageUrl = eventItem.featured_image_url;
|
|
3883
|
+
const uniqueKey = nextSchedule ? `${eventItem.id}-${nextSchedule.id}` : `${eventItem.id}-${index}`;
|
|
3771
3884
|
return /* @__PURE__ */ jsxs(
|
|
3772
3885
|
"div",
|
|
3773
3886
|
{
|
|
@@ -3877,7 +3990,7 @@ function EventsWidget({
|
|
|
3877
3990
|
] })
|
|
3878
3991
|
]
|
|
3879
3992
|
},
|
|
3880
|
-
|
|
3993
|
+
uniqueKey
|
|
3881
3994
|
);
|
|
3882
3995
|
}) }),
|
|
3883
3996
|
showViewAll && events.length > limit && /* @__PURE__ */ jsx("div", { style: { textAlign: "center", marginTop: "1.5rem" }, children: /* @__PURE__ */ jsx(
|
|
@@ -3903,10 +4016,11 @@ function EventsWidget({
|
|
|
3903
4016
|
display: "grid",
|
|
3904
4017
|
gridTemplateColumns: "repeat(auto-fill, minmax(280px, 1fr))",
|
|
3905
4018
|
gap: "1.25rem"
|
|
3906
|
-
}, children: displayEvents.map((eventItem) => {
|
|
4019
|
+
}, children: displayEvents.map((eventItem, index) => {
|
|
3907
4020
|
const nextSchedule = eventItem.next_schedule || eventItem.schedules?.[0];
|
|
3908
4021
|
const isFree = !eventItem.price || eventItem.price === 0;
|
|
3909
4022
|
const imageUrl = eventItem.featured_image_url;
|
|
4023
|
+
const uniqueKey = nextSchedule ? `${eventItem.id}-${nextSchedule.id}` : `${eventItem.id}-${index}`;
|
|
3910
4024
|
return /* @__PURE__ */ jsxs(
|
|
3911
4025
|
"div",
|
|
3912
4026
|
{
|
|
@@ -3971,7 +4085,7 @@ function EventsWidget({
|
|
|
3971
4085
|
] })
|
|
3972
4086
|
]
|
|
3973
4087
|
},
|
|
3974
|
-
|
|
4088
|
+
uniqueKey
|
|
3975
4089
|
);
|
|
3976
4090
|
}) }),
|
|
3977
4091
|
showViewAll && events.length > limit && /* @__PURE__ */ jsx("div", { style: { textAlign: "center", marginTop: "1.5rem" }, children: /* @__PURE__ */ jsx(
|
|
@@ -4031,5 +4145,5 @@ function getApiKey() {
|
|
|
4031
4145
|
}
|
|
4032
4146
|
|
|
4033
4147
|
export { CalendarView, CheckoutForm, EventCalendar, EventEmbed, EventModal, EventTile, EventsWidget, OfferingCard, OfferingList, ProductDetail, ProductEmbed, ProductGrid, ProductPage, RegistrationForm, UpcomingEvents, createCheckoutSession, fetchActiveProcessor, fetchCategories, fetchLatestOffering, fetchNextEvent, fetchOffering, fetchOfferings, fetchProcessorConfig, fetchProductBySlug, fetchProducts, fetchProductsPublic, fetchServices, fetchUpcomingEvents, formatDate, formatDateRange, formatDateTime, formatPrice, formatTime, getOfferingUrl, getRelativeTimeUntil, getSpotsRemaining, isEventSoldOut, registerForEvent, useEventModal };
|
|
4034
|
-
//# sourceMappingURL=chunk-
|
|
4035
|
-
//# sourceMappingURL=chunk-
|
|
4148
|
+
//# sourceMappingURL=chunk-TI5CH4WT.mjs.map
|
|
4149
|
+
//# sourceMappingURL=chunk-TI5CH4WT.mjs.map
|