olova 2.0.26 → 2.0.28
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/dist/vite.js +1 -0
- package/dist/vite.js.map +1 -1
- package/package.json +1 -1
package/dist/vite.js
CHANGED
package/dist/vite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/config.ts","../src/plugins/router.ts","../src/plugins/framework.ts","../src/plugins/virtual-html.ts","../src/plugins/hydration.ts","../src/plugins/ssg.ts","../src/plugins/utils.ts","../src/plugins/clean-url.ts","../src/plugins/auto-generate.ts","../src/plugins/error-overlay.ts","../src/plugins/index.ts","../src/plugins/terminal.ts"],"sourcesContent":["import { type Plugin } from 'vite';\r\nimport fs from 'fs';\r\nimport path from 'path';\r\n\r\n// Terminal colors\r\nconst colors = {\r\n reset: '\\x1b[0m',\r\n bold: '\\x1b[1m',\r\n dim: '\\x1b[2m',\r\n cyan: '\\x1b[36m',\r\n green: '\\x1b[32m',\r\n white: '\\x1b[37m',\r\n};\r\n\r\n// =============================================================================\r\n// CONFIG PLUGIN - Creates .olova folder and configures Vite settings\r\n// =============================================================================\r\nexport function configPlugin(): Plugin {\r\n const olovaDir = path.resolve('.olova');\r\n \r\n return {\r\n name: 'olova-config',\r\n config(_config, { command }) {\r\n // Create .olova folder on startup\r\n if (!fs.existsSync(olovaDir)) {\r\n fs.mkdirSync(olovaDir, { recursive: true });\r\n }\r\n \r\n // Skip build config for SSG builds\r\n if (process.env.IS_SSG_BUILD) {\r\n return {\r\n appType: 'custom',\r\n cacheDir: './.olova/cache',\r\n };\r\n }\r\n \r\n // Show startup banner for dev mode\r\n if (command === 'serve') {\r\n console.log('');\r\n console.log(` ${colors.bold}${colors.cyan}▲ Olova${colors.reset} ${colors.dim}v1.0.0${colors.reset}`);\r\n console.log('');\r\n }\r\n \r\n return {\r\n appType: 'custom',\r\n cacheDir: './.olova/cache',\r\n build: {\r\n outDir: './.olova/dist',\r\n sourcemap: false,\r\n chunkSizeWarningLimit: 500,\r\n rollupOptions: {\r\n onwarn(warning, warn) {\r\n // Suppress \"dynamic import will not move module\" warnings\r\n if (warning.code === 'PLUGIN_WARNING' && warning.message?.includes('dynamic import will not move')) {\r\n return;\r\n }\r\n // Suppress \"static\" directive warnings (Olova uses this for static routes)\r\n if (warning.message?.includes('Module level directives') && warning.message?.includes('static')) {\r\n return;\r\n }\r\n // Suppress sourcemap warnings for static directive\r\n if (warning.message?.includes('sourcemap') && warning.message?.includes(\"Can't resolve original location\")) {\r\n return;\r\n }\r\n warn(warning);\r\n },\r\n output: {\r\n chunkFileNames: 'pro_olova_static/chunks/[name]-[hash].js',\r\n entryFileNames: 'pro_olova_static/olova-[hash].js',\r\n assetFileNames: 'pro_olova_static/[name]-[hash][extname]',\r\n manualChunks(id) {\r\n if (id.includes('node_modules')) {\r\n if (id.includes('react-dom')) {\r\n return 'vendor-react-dom';\r\n }\r\n if (id.includes('react')) {\r\n return 'vendor-react';\r\n }\r\n return 'vendor';\r\n }\r\n },\r\n },\r\n },\r\n },\r\n preview: {\r\n port: 4173,\r\n strictPort: false,\r\n },\r\n };\r\n },\r\n configureServer(server) {\r\n // Show ready message when server starts\r\n server.httpServer?.once('listening', () => {\r\n const address = server.httpServer?.address();\r\n const port = typeof address === 'object' && address ? address.port : 5173;\r\n \r\n setTimeout(() => {\r\n console.log(` ${colors.green}✓${colors.reset} Ready in ${colors.dim}${Math.round(performance.now())}ms${colors.reset}`);\r\n console.log('');\r\n console.log(` ${colors.dim}➜${colors.reset} ${colors.bold}Local:${colors.reset} ${colors.cyan}http://localhost:${port}/${colors.reset}`);\r\n console.log('');\r\n }, 100);\r\n });\r\n },\r\n };\r\n}\r\n","import { type Plugin, type ViteDevServer } from 'vite';\r\nimport fs from 'fs';\r\nimport path from 'path';\r\n\r\n// =============================================================================\r\n// ROUTER PLUGIN - File-system based routing with HMR support\r\n// =============================================================================\r\nexport function routerPlugin(): Plugin {\r\n const virtualModuleId = 'olova/routes';\r\n const resolvedVirtualModuleId = '\\0' + virtualModuleId;\r\n let server: ViteDevServer | null = null;\r\n\r\n // Helper function to invalidate the virtual module and trigger HMR\r\n const invalidateRoutes = () => {\r\n if (server) {\r\n const mod = server.moduleGraph.getModuleById(resolvedVirtualModuleId);\r\n if (mod) {\r\n server.moduleGraph.invalidateModule(mod);\r\n // Send HMR update to refresh the routes\r\n server.ws.send({\r\n type: 'full-reload',\r\n path: '*'\r\n });\r\n }\r\n }\r\n };\r\n\r\n return {\r\n name: 'olova-router',\r\n \r\n // Configure dev server to watch for file changes\r\n configureServer(devServer) {\r\n server = devServer;\r\n const srcDir = path.resolve(process.cwd(), 'src');\r\n \r\n // Watch the src directory for file changes\r\n const watcher = devServer.watcher;\r\n \r\n // Handle file additions\r\n watcher.on('add', (filePath: string) => {\r\n if (filePath.startsWith(srcDir) && /\\.(tsx|jsx|html|md)$/.test(filePath)) {\r\n console.log('\\x1b[36m[olova]\\x1b[0m New route detected:', path.relative(srcDir, filePath));\r\n invalidateRoutes();\r\n }\r\n });\r\n \r\n // Handle file deletions\r\n watcher.on('unlink', (filePath: string) => {\r\n if (filePath.startsWith(srcDir) && /\\.(tsx|jsx|html|md)$/.test(filePath)) {\r\n console.log('\\x1b[36m[olova]\\x1b[0m Route removed:', path.relative(srcDir, filePath));\r\n invalidateRoutes();\r\n }\r\n });\r\n \r\n // Handle directory additions (new route folders)\r\n watcher.on('addDir', (dirPath: string) => {\r\n if (dirPath.startsWith(srcDir) && dirPath !== srcDir) {\r\n console.log('\\x1b[36m[olova]\\x1b[0m New route folder detected:', path.relative(srcDir, dirPath));\r\n // Don't invalidate immediately - wait for files to be added\r\n }\r\n });\r\n \r\n // Handle directory deletions\r\n watcher.on('unlinkDir', (dirPath: string) => {\r\n if (dirPath.startsWith(srcDir) && dirPath !== srcDir) {\r\n console.log('\\x1b[36m[olova]\\x1b[0m Route folder removed:', path.relative(srcDir, dirPath));\r\n invalidateRoutes();\r\n }\r\n });\r\n },\r\n \r\n resolveId(id) {\r\n if (id === virtualModuleId) {\r\n return resolvedVirtualModuleId;\r\n }\r\n },\r\n \r\n // Mark the virtual module as having side effects for proper HMR\r\n handleHotUpdate({ file, server: devServer }) {\r\n const srcDir = path.resolve(process.cwd(), 'src');\r\n \r\n // If a route file's content changes (like adding \"static\" directive), refresh routes\r\n if (file.startsWith(srcDir) && /\\.(tsx|jsx)$/.test(file)) {\r\n const mod = devServer.moduleGraph.getModuleById(resolvedVirtualModuleId);\r\n if (mod) {\r\n devServer.moduleGraph.invalidateModule(mod);\r\n }\r\n }\r\n },\r\n \r\n load(id) {\r\n if (id === resolvedVirtualModuleId) {\r\n const srcDir = path.resolve(process.cwd(), 'src');\r\n \r\n // Helper to scan directory recursively\r\n // Supports Next.js-style conventions:\r\n // - (folder) = Route Group (ignored in URL, for organization only)\r\n // - [folder] = Dynamic Route (captures URL parameter)\r\n const getRoutes = (dir: string, baseRoute: string = '', baseImportPath: string = ''): string[] => {\r\n const entries = fs.readdirSync(dir, { withFileTypes: true });\r\n let routes: string[] = [];\r\n\r\n for (const entry of entries) {\r\n const entryName = entry.name;\r\n const fullPath = path.join(dir, entryName);\r\n \r\n if (entry.isDirectory()) {\r\n // Check if it's a route group (folder wrapped in parentheses)\r\n const isRouteGroup = /^\\(.+\\)$/.test(entryName);\r\n \r\n if (isRouteGroup) {\r\n // Route groups: folder is ignored in URL path but kept in import path\r\n // e.g., (auth) folder -> URL stays same, import includes (auth)\r\n routes = routes.concat(getRoutes(\r\n fullPath, \r\n baseRoute, // URL path stays the same (group is ignored)\r\n `${baseImportPath}/${entryName}` // Import path includes the folder\r\n ));\r\n } else {\r\n // Regular folder or dynamic route folder\r\n routes = routes.concat(getRoutes(\r\n fullPath, \r\n `${baseRoute}/${entryName}`,\r\n `${baseImportPath}/${entryName}`\r\n ));\r\n }\r\n } else {\r\n // Support multiple file types: .tsx, .jsx, .html, .md\r\n const ext = path.extname(entryName);\r\n const supportedExts = ['.tsx', '.jsx', '.html', '.md'];\r\n \r\n if (supportedExts.includes(ext)) {\r\n const nameNoExt = entryName.replace(/\\.(tsx|jsx|html|md)$/, '');\r\n \r\n let routePath = baseRoute;\r\n if (nameNoExt !== 'index' && nameNoExt !== 'App') {\r\n routePath = `${baseRoute}/${nameNoExt}`;\r\n }\r\n \r\n if (routePath === '') routePath = '/';\r\n \r\n // Convert $param to :param for dynamic routes (Olova convention)\r\n const normalizedRoutePath = routePath\r\n .replace(/\\$(.+?)(?=\\/|$)/g, ':$1');\r\n \r\n // Path relative to project root for import\r\n const importPath = `/src${baseImportPath}/${entryName}`;\r\n \r\n if (ext === '.html') {\r\n // HTML files: create a wrapper that fetches and renders the HTML\r\n routes.push(` \"${normalizedRoutePath}\": () => import(\"${importPath}?raw\").then(m => ({ default: () => { const div = document.createElement('div'); div.innerHTML = m.default; return div.innerHTML; }, __isHtml: true, __isStatic: true, __rawHtml: m.default })),`);\r\n } else if (ext === '.md') {\r\n // MD files: import as raw and render as markdown\r\n routes.push(` \"${normalizedRoutePath}\": () => import(\"${importPath}?raw\").then(m => ({ default: m.default, __isMd: true, __isStatic: true })),`);\r\n } else {\r\n // TSX/JSX files: check for \"static\" directive\r\n const fileContent = fs.readFileSync(fullPath, 'utf-8');\r\n const firstLine = fileContent.trim().split('\\n')[0].trim();\r\n const hasStaticDirective = firstLine === '\"static\"' || firstLine === \"'static'\";\r\n \r\n if (hasStaticDirective) {\r\n // Static route: add __isStatic flag\r\n routes.push(` \"${normalizedRoutePath}\": () => import(\"${importPath}\").then(m => Object.assign({}, m, { __isStatic: true })),`);\r\n } else {\r\n // Client-only route: standard import\r\n routes.push(` \"${normalizedRoutePath}\": () => import(\"${importPath}\"),`);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return routes;\r\n };\r\n\r\n let routeLines: string[] = [];\r\n if (fs.existsSync(srcDir)) {\r\n routeLines = getRoutes(srcDir);\r\n }\r\n\r\n return `export const routes = {\r\n${routeLines.join('\\n')}\r\n};`;\r\n }\r\n },\r\n };\r\n}\r\n","import { type Plugin, transformWithEsbuild } from 'vite';\r\n\r\n// =============================================================================\r\n// FRAMEWORK PLUGIN - Virtual entry points for client and server\r\n// =============================================================================\r\nexport function frameworkPlugin(): Plugin {\r\n const virtualClientEntry = 'olova/client';\r\n const resolvedVirtualClientEntry = '\\0' + virtualClientEntry;\r\n const virtualServerEntry = 'olova/server';\r\n const resolvedVirtualServerEntry = '\\0' + virtualServerEntry;\r\n\r\n return {\r\n name: 'olova-framework',\r\n enforce: 'pre',\r\n resolveId(id: string) {\r\n if (id === virtualClientEntry || id === '/olova/client' || id === 'olova/client.tsx') return resolvedVirtualClientEntry;\r\n if (id === virtualServerEntry || id === '/olova/server' || id === 'olova/server.tsx') return resolvedVirtualServerEntry;\r\n },\r\n async load(id: string) {\r\n if (id === resolvedVirtualClientEntry) {\r\n const code = `\r\nimport React from 'react';\r\nimport { hydrateRoot, createRoot } from 'react-dom/client';\r\nimport Layout, { metadata as defaultMetadata } from '/src/root.tsx';\r\nimport { Router, loadRoute } from 'olova/router';\r\n\r\n// Helper to generate SEO meta tags\r\nfunction generateSeoTags(metadata) {\r\n const meta = { ...defaultMetadata, ...metadata };\r\n const tags = [];\r\n \r\n // Title\r\n if (meta.title) {\r\n document.title = meta.title;\r\n }\r\n \r\n // Description\r\n if (meta.description) {\r\n let tag = document.querySelector('meta[name=\"description\"]');\r\n if (!tag) {\r\n tag = document.createElement('meta');\r\n tag.setAttribute('name', 'description');\r\n document.head.appendChild(tag);\r\n }\r\n tag.setAttribute('content', meta.description);\r\n }\r\n \r\n // Keywords\r\n if (meta.keywords) {\r\n const content = Array.isArray(meta.keywords) ? meta.keywords.join(', ') : meta.keywords;\r\n let tag = document.querySelector('meta[name=\"keywords\"]');\r\n if (!tag) {\r\n tag = document.createElement('meta');\r\n tag.setAttribute('name', 'keywords');\r\n document.head.appendChild(tag);\r\n }\r\n tag.setAttribute('content', content);\r\n }\r\n \r\n // Open Graph\r\n if (meta.openGraph) {\r\n const og = meta.openGraph;\r\n const ogTags = [\r\n ['og:title', og.title || meta.title],\r\n ['og:description', og.description],\r\n ['og:url', og.url],\r\n ['og:site_name', og.siteName],\r\n ['og:type', og.type],\r\n ];\r\n ogTags.forEach(([prop, content]) => {\r\n if (content) {\r\n let tag = document.querySelector(\\`meta[property=\"\\${prop}\"]\\`);\r\n if (!tag) {\r\n tag = document.createElement('meta');\r\n tag.setAttribute('property', prop);\r\n document.head.appendChild(tag);\r\n }\r\n tag.setAttribute('content', content);\r\n }\r\n });\r\n }\r\n \r\n // Twitter Card\r\n if (meta.twitter) {\r\n const tw = meta.twitter;\r\n const twTags = [\r\n ['twitter:card', tw.card || 'summary'],\r\n ['twitter:site', tw.site],\r\n ['twitter:creator', tw.creator],\r\n ['twitter:title', tw.title || meta.title],\r\n ['twitter:description', tw.description],\r\n ];\r\n twTags.forEach(([name, content]) => {\r\n if (content) {\r\n let tag = document.querySelector(\\`meta[name=\"\\${name}\"]\\`);\r\n if (!tag) {\r\n tag = document.createElement('meta');\r\n tag.setAttribute('name', name);\r\n document.head.appendChild(tag);\r\n }\r\n tag.setAttribute('content', content);\r\n }\r\n });\r\n }\r\n}\r\n\r\nconst path = window.location.pathname;\r\nloadRoute(path).then((result) => {\r\n const Component = result ? result.module.default : () => <div>404 Not Found</div>;\r\n // @ts-ignore\r\n const serverData = window.__OLOVA_DATA__ || {};\r\n const params = serverData.params || (result ? result.params : {});\r\n const metadata = serverData.metadata || (result ? result.metadata : undefined);\r\n\r\n // Framework handles SEO automatically (like Next.js)\r\n generateSeoTags(metadata);\r\n\r\n const rootElement = document.getElementById('root');\r\n const app = (\r\n <React.StrictMode>\r\n <Layout>\r\n <Router url={path} initialComponent={Component} initialParams={params} onRouteChange={(newMetadata) => generateSeoTags(newMetadata)} />\r\n </Layout>\r\n </React.StrictMode>\r\n );\r\n\r\n if (rootElement && rootElement.innerHTML.trim() !== \"\") {\r\n console.log(\"[Olova] Hydrating pre-rendered content\");\r\n hydrateRoot(document, app);\r\n } else {\r\n console.log(\"[Olova] Rendering client-side (no SSR content found)\");\r\n createRoot(document).render(app);\r\n }\r\n});`;\r\n const result = await transformWithEsbuild(code, 'olova-client.tsx', {\r\n loader: 'tsx',\r\n jsx: 'automatic',\r\n });\r\n return result.code;\r\n }\r\n if (id === resolvedVirtualServerEntry) {\r\n const code = `\r\nimport React from 'react';\r\nimport { renderToString } from 'react-dom/server';\r\nimport Layout, { metadata as defaultMetadata } from '/src/root.tsx';\r\nimport { Router, loadRoute } from 'olova/router';\r\n\r\n// Generate SEO head content\r\nfunction generateSeoHead(metadata) {\r\n const meta = { ...defaultMetadata, ...metadata };\r\n let head = '';\r\n \r\n // Title\r\n if (meta.title) {\r\n head += \\`<title>\\${meta.title}</title>\\\\n\\`;\r\n }\r\n \r\n // Basic meta\r\n if (meta.description) {\r\n head += \\`<meta name=\"description\" content=\"\\${meta.description}\" />\\\\n\\`;\r\n }\r\n if (meta.keywords) {\r\n const content = Array.isArray(meta.keywords) ? meta.keywords.join(', ') : meta.keywords;\r\n head += \\`<meta name=\"keywords\" content=\"\\${content}\" />\\\\n\\`;\r\n }\r\n if (meta.robots) {\r\n head += \\`<meta name=\"robots\" content=\"\\${meta.robots}\" />\\\\n\\`;\r\n }\r\n if (meta.canonical) {\r\n head += \\`<link rel=\"canonical\" href=\"\\${meta.canonical}\" />\\\\n\\`;\r\n }\r\n \r\n // Open Graph\r\n if (meta.openGraph) {\r\n const og = meta.openGraph;\r\n head += \\`<meta property=\"og:title\" content=\"\\${og.title || meta.title}\" />\\\\n\\`;\r\n if (og.description) head += \\`<meta property=\"og:description\" content=\"\\${og.description}\" />\\\\n\\`;\r\n if (og.url) head += \\`<meta property=\"og:url\" content=\"\\${og.url}\" />\\\\n\\`;\r\n if (og.siteName) head += \\`<meta property=\"og:site_name\" content=\"\\${og.siteName}\" />\\\\n\\`;\r\n if (og.type) head += \\`<meta property=\"og:type\" content=\"\\${og.type}\" />\\\\n\\`;\r\n if (og.images) {\r\n og.images.forEach(img => {\r\n head += \\`<meta property=\"og:image\" content=\"\\${img.url}\" />\\\\n\\`;\r\n });\r\n }\r\n }\r\n \r\n // Twitter Card\r\n if (meta.twitter) {\r\n const tw = meta.twitter;\r\n head += \\`<meta name=\"twitter:card\" content=\"\\${tw.card || 'summary'}\" />\\\\n\\`;\r\n if (tw.site) head += \\`<meta name=\"twitter:site\" content=\"\\${tw.site}\" />\\\\n\\`;\r\n if (tw.creator) head += \\`<meta name=\"twitter:creator\" content=\"\\${tw.creator}\" />\\\\n\\`;\r\n head += \\`<meta name=\"twitter:title\" content=\"\\${tw.title || meta.title}\" />\\\\n\\`;\r\n if (tw.description) head += \\`<meta name=\"twitter:description\" content=\"\\${tw.description}\" />\\\\n\\`;\r\n if (tw.images) {\r\n tw.images.forEach(img => {\r\n head += \\`<meta name=\"twitter:image\" content=\"\\${img}\" />\\\\n\\`;\r\n });\r\n }\r\n }\r\n \r\n return head;\r\n}\r\n\r\nexport async function render(url) {\r\n const result = await loadRoute(url);\r\n const Component = result ? result.module.default : () => <div>404 Not Found</div>;\r\n const params = result ? result.params : {};\r\n const metadata = result ? result.metadata : undefined;\r\n \r\n // Generate the SEO head content\r\n const seoHead = generateSeoHead(metadata);\r\n \r\n let html = renderToString(\r\n <Layout>\r\n <Router url={url} initialComponent={Component} initialParams={params} />\r\n </Layout>\r\n );\r\n \r\n // Inject SEO tags into head (framework handles this automatically)\r\n if (html.includes('</head>')) {\r\n html = html.replace('</head>', seoHead + '</head>');\r\n }\r\n \r\n return { html, hydrationData: { params, metadata } };\r\n}\r\n\r\n// Render empty shell from Layout (for client-only pages)\r\nexport function renderShell() {\r\n const seoHead = generateSeoHead({});\r\n let html = renderToString(<Layout>{null}</Layout>);\r\n if (html.includes('</head>')) {\r\n html = html.replace('</head>', seoHead + '</head>');\r\n }\r\n return html;\r\n}\r\n\r\n// Render shell WITH metadata for client-only pages that have metadata exports\r\n// This enables SEO pre-rendering even for pages without \"static\" directive\r\nexport function renderShellWithMetadata(metadata) {\r\n const seoHead = generateSeoHead(metadata);\r\n let html = renderToString(<Layout>{null}</Layout>);\r\n if (html.includes('</head>')) {\r\n html = html.replace('</head>', seoHead + '</head>');\r\n }\r\n return html;\r\n}\r\n\r\n// Re-export loadRoute so it can be used during SSG to extract metadata from any route\r\nexport { loadRoute };`;\r\n const result = await transformWithEsbuild(code, 'olova-server.tsx', {\r\n loader: 'tsx',\r\n jsx: 'automatic',\r\n });\r\n return result.code;\r\n }\r\n }\r\n }\r\n}\r\n","import { type Plugin } from 'vite';\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport { generateOlovaHydration, generateJsonLd } from './hydration';\r\n\r\n// =============================================================================\r\n// VIRTUAL HTML PLUGIN - Generates HTML dynamically (no index.html needed)\r\n// =============================================================================\r\nexport function virtualHtmlPlugin(): Plugin {\r\n const htmlTemplate = `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n <title>My Framework</title>\r\n </head>\r\n <body>\r\n <div id=\"root\"></div>\r\n <script type=\"module\">\r\n import '/olova/client';\r\n </script>\r\n </body>\r\n</html>`;\r\n\r\n return {\r\n name: 'olova-virtual-html',\r\n enforce: 'pre',\r\n // Handle virtual index.html resolution for build\r\n resolveId(id: string) {\r\n if (id === 'index.html' || id === 'virtual:index.html' || id === 'olova.html') {\r\n return 'olova.html';\r\n }\r\n },\r\n load(id: string) {\r\n if (id === 'olova.html' || id === 'virtual:index.html') {\r\n return htmlTemplate;\r\n }\r\n },\r\n // Serve HTML for all routes in dev mode with SSR (like Next.js)\r\n configureServer(server) {\r\n // Helper to check if route file has \"static\" directive or is HTML/MD (always static)\r\n const isStaticRoute = (routePath: string): boolean => {\r\n const srcDir = path.resolve('src');\r\n // Convert route path to file path\r\n let filePath = routePath === '/' ? 'index' : routePath.slice(1);\r\n \r\n // Check for HTML and MD files first (always static)\r\n const staticPaths = [\r\n path.join(srcDir, filePath, 'index.html'),\r\n path.join(srcDir, filePath, 'index.md'),\r\n path.join(srcDir, filePath + '.html'),\r\n path.join(srcDir, filePath + '.md'),\r\n ];\r\n \r\n for (const p of staticPaths) {\r\n if (fs.existsSync(p)) {\r\n return true; // HTML and MD are always static\r\n }\r\n }\r\n \r\n // Check for TSX/JSX files with \"static\" directive\r\n const possiblePaths = [\r\n path.join(srcDir, filePath, 'index.tsx'),\r\n path.join(srcDir, filePath, 'index.jsx'),\r\n path.join(srcDir, filePath + '.tsx'),\r\n path.join(srcDir, filePath + '.jsx'),\r\n path.join(srcDir, 'App.tsx'),\r\n path.join(srcDir, 'App.jsx'),\r\n ];\r\n \r\n for (const p of possiblePaths) {\r\n if (fs.existsSync(p)) {\r\n const content = fs.readFileSync(p, 'utf-8');\r\n const firstLine = content.trim().split('\\n')[0].trim();\r\n return firstLine === '\"static\"' || firstLine === \"'static'\";\r\n }\r\n }\r\n return false;\r\n };\r\n \r\n // Return a function to run after other middlewares\r\n return () => {\r\n server.middlewares.use(async (req, res, next) => {\r\n const url = req.url || '/';\r\n \r\n // Only handle requests that accept HTML\r\n const accept = req.headers.accept || '';\r\n if (!accept.includes('text/html')) {\r\n return next();\r\n }\r\n \r\n // Skip Vite internal routes and assets\r\n if (url.startsWith('/@') || url.startsWith('/__') || url.startsWith('/node_modules')) {\r\n return next();\r\n }\r\n \r\n // Skip if it has a file extension (assets, scripts, etc.)\r\n if (/\\.\\w+$/.test(url) && !url.endsWith('.html')) {\r\n return next();\r\n }\r\n \r\n const routePath = url.split('?')[0];\r\n const shouldSSR = isStaticRoute(routePath);\r\n \r\n try {\r\n if (shouldSSR) {\r\n // SSR for static routes\r\n const { render } = await server.ssrLoadModule('olova/server');\r\n const { html: ssrHtml, hydrationData } = await render(routePath);\r\n \r\n let fullHtml = ssrHtml;\r\n \r\n // Add hydration data script\r\n const hydrationScript = `<script>window.__OLOVA_DATA__ = ${JSON.stringify(hydrationData)};</script>`;\r\n fullHtml = fullHtml.replace('</body>', `${hydrationScript}\\n</body>`);\r\n \r\n // Add client entry script for hydration\r\n const clientScript = `<script type=\"module\" src=\"/olova/client\"></script>`;\r\n fullHtml = fullHtml.replace('</body>', `${clientScript}\\n</body>`);\r\n \r\n // Add Olova Flight scripts (Next.js-style self.__olova_f)\r\n const devBuildId = 'dev-' + Date.now().toString(36);\r\n const flightScripts = generateOlovaHydration({\r\n route: routePath,\r\n metadata: hydrationData.metadata,\r\n params: hydrationData.params,\r\n chunks: []\r\n }, devBuildId);\r\n fullHtml = fullHtml.replace('</body>', `${flightScripts}</body>`);\r\n \r\n // Add JSON-LD structured data for SEO in dev mode\r\n const jsonLdScript = generateJsonLd({ route: routePath, metadata: hydrationData.metadata });\r\n fullHtml = fullHtml.replace('</head>', `${jsonLdScript}</head>`);\r\n \r\n // Transform through Vite's pipeline for HMR\r\n const html = await server.transformIndexHtml(url, fullHtml);\r\n \r\n res.setHeader('Content-Type', 'text/html');\r\n res.statusCode = 200;\r\n res.end(html);\r\n } else {\r\n // Client-only rendering WITH metadata pre-rendering for SEO\r\n // Even client-only pages should have their metadata in the HTML\r\n const { renderShellWithMetadata } = await server.ssrLoadModule('olova/server');\r\n const { loadRoute: clientLoadRoute } = await server.ssrLoadModule('olova/router');\r\n \r\n let pageMetadata = {};\r\n try {\r\n // Try to load the route to get metadata\r\n const result = await clientLoadRoute(routePath);\r\n if (result && result.metadata) {\r\n pageMetadata = result.metadata;\r\n }\r\n } catch (e) {\r\n // Continue with empty metadata if extraction fails\r\n }\r\n \r\n // Use shell with metadata for SEO\r\n let fullHtml = renderShellWithMetadata(pageMetadata);\r\n \r\n // Add client entry script\r\n const clientScript = `<script type=\"module\" src=\"/olova/client\"></script>`;\r\n fullHtml = fullHtml.replace('</body>', `${clientScript}\\n</body>`);\r\n \r\n // Add Olova Flight scripts (Next.js-style self.__olova_f)\r\n const devBuildId = 'dev-' + Date.now().toString(36);\r\n const flightScripts = generateOlovaHydration({\r\n route: routePath,\r\n metadata: pageMetadata,\r\n chunks: []\r\n }, devBuildId);\r\n fullHtml = fullHtml.replace('</body>', `${flightScripts}</body>`);\r\n \r\n // Add JSON-LD structured data for SEO in dev mode\r\n const jsonLdScript = generateJsonLd({ route: routePath, metadata: pageMetadata });\r\n fullHtml = fullHtml.replace('</head>', `${jsonLdScript}</head>`);\r\n \r\n const html = await server.transformIndexHtml(url, fullHtml);\r\n res.setHeader('Content-Type', 'text/html');\r\n res.statusCode = 200;\r\n res.end(html);\r\n }\r\n } catch (e) {\r\n console.error('[Olova] Error:', e);\r\n // Fallback to client-only rendering on error\r\n try {\r\n const html = await server.transformIndexHtml(url, htmlTemplate);\r\n res.setHeader('Content-Type', 'text/html');\r\n res.statusCode = 200;\r\n res.end(html);\r\n } catch (e2) {\r\n next(e2);\r\n }\r\n }\r\n });\r\n };\r\n }\r\n }\r\n}\r\n","// =============================================================================\r\n// OLOVA HYDRATION SYSTEM\r\n// Implements \"Flight\" format for efficient client hydration\r\n// \r\n\r\n\r\nexport interface OlovaHydrationData {\r\n route: string;\r\n metadata?: Record<string, unknown>;\r\n params?: Record<string, string>;\r\n chunks?: string[];\r\n isStatic?: boolean;\r\n}\r\n\r\n// Flight data types for streaming\r\ntype FlightDataType = \r\n | 'M' // Metadata\r\n | 'T' // Component Tree\r\n | 'R' // Route info\r\n | 'P' // Params\r\n | 'A' // Assets/Chunks\r\n | 'S' // State\r\n | 'D' // Structured Data (Schema.org/JSON-LD)\r\n | 'H' // Hints (prefetch, preload)\r\n | 'E'; // End marker\r\n\r\ninterface FlightChunk {\r\n type: FlightDataType;\r\n data: unknown;\r\n}\r\n\r\nexport function generateOlovaHydration(data: OlovaHydrationData, buildId: string): string {\r\n const meta = (data.metadata || {}) as Record<string, unknown>;\r\n const scripts: string[] = [];\r\n \r\n // Initialize the flight array (like Next.js's self.__next_f)\r\n scripts.push(`<script>self.__olova_f=self.__olova_f||[];function _oF(d){self.__olova_f.push(d)}</script>`);\r\n \r\n // ==========================================================================\r\n // CHUNK 0: Route Information (Critical for navigation)\r\n // ==========================================================================\r\n const routeChunk: FlightChunk = {\r\n type: 'R',\r\n data: {\r\n path: data.route,\r\n params: data.params || {},\r\n pattern: data.route === '/' ? '/' : data.route.replace(/\\/[^/]+$/, '/:slug'),\r\n isStatic: data.isStatic ?? true,\r\n buildId: buildId\r\n }\r\n };\r\n scripts.push(`<script>_oF([0,\"${routeChunk.type}\",${JSON.stringify(routeChunk.data)}])</script>`);\r\n \r\n // ==========================================================================\r\n // CHUNK 1: Metadata (SEO Critical - must be early)\r\n // ==========================================================================\r\n const metadataChunk: FlightChunk = {\r\n type: 'M',\r\n data: {\r\n title: meta.title || 'Olova App',\r\n description: meta.description || '',\r\n keywords: Array.isArray(meta.keywords) ? meta.keywords : [],\r\n robots: meta.robots || 'index, follow',\r\n canonical: meta.canonical || null,\r\n og: {\r\n type: 'website',\r\n locale: 'en_US',\r\n ...((meta.openGraph as object) || {})\r\n },\r\n twitter: {\r\n card: 'summary_large_image',\r\n ...((meta.twitter as object) || {})\r\n }\r\n }\r\n };\r\n scripts.push(`<script>_oF([1,\"${metadataChunk.type}\",${JSON.stringify(metadataChunk.data)}])</script>`);\r\n \r\n // ==========================================================================\r\n // CHUNK 2: Component Tree (For React reconciliation)\r\n // ==========================================================================\r\n const pageName = data.route === '/' \r\n ? 'HomePage' \r\n : data.route.slice(1).split('/').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('') + 'Page';\r\n \r\n const treeChunk: FlightChunk = {\r\n type: 'T',\r\n data: {\r\n layout: 'RootLayout',\r\n page: pageName,\r\n template: null,\r\n loading: null,\r\n error: null,\r\n notFound: null\r\n }\r\n };\r\n scripts.push(`<script>_oF([2,\"${treeChunk.type}\",${JSON.stringify(treeChunk.data)}])</script>`);\r\n \r\n // ==========================================================================\r\n // CHUNK 3: Structured Data (JSON-LD for SEO boost)\r\n // ==========================================================================\r\n const structuredData: FlightChunk = {\r\n type: 'D',\r\n data: [\r\n {\r\n '@context': 'https://schema.org',\r\n '@type': 'WebPage',\r\n name: meta.title || 'Olova App',\r\n description: meta.description || '',\r\n url: data.route\r\n },\r\n {\r\n '@context': 'https://schema.org',\r\n '@type': 'WebApplication',\r\n name: 'Olova',\r\n applicationCategory: 'WebApplication',\r\n operatingSystem: 'Any'\r\n }\r\n ]\r\n };\r\n scripts.push(`<script>_oF([3,\"${structuredData.type}\",${JSON.stringify(structuredData.data)}])</script>`);\r\n \r\n // ==========================================================================\r\n // CHUNK 4: Assets for prefetching (Performance optimization)\r\n // ==========================================================================\r\n const assetsChunk: FlightChunk = {\r\n type: 'A',\r\n data: {\r\n chunks: data.chunks || [],\r\n styles: [],\r\n // Prefetch hints for next likely navigations\r\n prefetch: (data.chunks || []).slice(0, 5)\r\n }\r\n };\r\n scripts.push(`<script>_oF([4,\"${assetsChunk.type}\",${JSON.stringify(assetsChunk.data)}])</script>`);\r\n \r\n // ==========================================================================\r\n // CHUNK 5: Resource Hints (Browser optimization)\r\n // ==========================================================================\r\n const hintsChunk: FlightChunk = {\r\n type: 'H',\r\n data: {\r\n dnsPrefetch: ['fonts.googleapis.com', 'fonts.gstatic.com'],\r\n preconnect: ['https://fonts.googleapis.com', 'https://fonts.gstatic.com'],\r\n modulePreload: (data.chunks || []).slice(0, 3)\r\n }\r\n };\r\n scripts.push(`<script>_oF([5,\"${hintsChunk.type}\",${JSON.stringify(hintsChunk.data)}])</script>`);\r\n \r\n // ==========================================================================\r\n // CHUNK 6: Hydration State (Final - marks ready)\r\n // ==========================================================================\r\n const stateChunk: FlightChunk = {\r\n type: 'S',\r\n data: {\r\n hydrated: false,\r\n streaming: false,\r\n ready: true,\r\n timestamp: Date.now(),\r\n version: '1.0.0',\r\n buildId: buildId\r\n }\r\n };\r\n scripts.push(`<script>_oF([6,\"${stateChunk.type}\",${JSON.stringify(stateChunk.data)}])</script>`);\r\n \r\n // ==========================================================================\r\n // END MARKER: Signals all chunks are delivered\r\n // ==========================================================================\r\n scripts.push(`<script>_oF([7,\"E\",null])</script>`);\r\n \r\n // ==========================================================================\r\n // GLOBAL $OLOVA OBJECT: Easy access to hydration data (backward compatible)\r\n // ==========================================================================\r\n const globalPayload = {\r\n $route: routeChunk.data,\r\n $meta: metadataChunk.data,\r\n $tree: treeChunk.data,\r\n $schema: structuredData.data,\r\n $assets: assetsChunk.data,\r\n $hints: hintsChunk.data,\r\n $state: stateChunk.data,\r\n $build: {\r\n id: buildId,\r\n version: '1.0.0',\r\n timestamp: Date.now(),\r\n env: 'production'\r\n }\r\n };\r\n scripts.push(`<script>$OLOVA=${JSON.stringify(globalPayload)}</script>`);\r\n \r\n return scripts.join('');\r\n}\r\n\r\n/**\r\n * Generate JSON-LD structured data script for SEO\r\n * This is injected into <head> for search engine crawlers\r\n */\r\nexport function generateJsonLd(data: OlovaHydrationData): string {\r\n const meta = (data.metadata || {}) as Record<string, unknown>;\r\n \r\n const jsonLd = {\r\n '@context': 'https://schema.org',\r\n '@graph': [\r\n {\r\n '@type': 'WebPage',\r\n '@id': data.route,\r\n name: meta.title || 'Olova App',\r\n description: meta.description || '',\r\n url: data.route,\r\n isPartOf: {\r\n '@type': 'WebSite',\r\n name: 'Olova App'\r\n }\r\n },\r\n {\r\n '@type': 'BreadcrumbList',\r\n itemListElement: data.route.split('/').filter(Boolean).map((segment, index, arr) => ({\r\n '@type': 'ListItem',\r\n position: index + 1,\r\n name: segment.charAt(0).toUpperCase() + segment.slice(1),\r\n item: '/' + arr.slice(0, index + 1).join('/')\r\n }))\r\n }\r\n ]\r\n };\r\n \r\n return `<script type=\"application/ld+json\">${JSON.stringify(jsonLd)}</script>`;\r\n}\r\n\r\n/**\r\n * Parse flight data from the page (client-side utility)\r\n * Use this to access hydration data in your components\r\n */\r\nexport function parseFlightData(): Record<string, unknown> | null {\r\n // Check if we're in a browser environment\r\n if (typeof globalThis === 'undefined' || typeof (globalThis as Record<string, unknown>).document === 'undefined') {\r\n return null;\r\n }\r\n \r\n const flightArray = ((globalThis as Record<string, unknown>).__olova_f) as unknown[] | undefined;\r\n if (!flightArray) return null;\r\n \r\n const result: Record<string, unknown> = {};\r\n const typeMap: Record<FlightDataType, string> = {\r\n 'M': '$meta',\r\n 'T': '$tree', \r\n 'R': '$route',\r\n 'P': '$params',\r\n 'A': '$assets',\r\n 'S': '$state',\r\n 'D': '$schema',\r\n 'H': '$hints',\r\n 'E': '$end'\r\n };\r\n \r\n for (const chunk of flightArray) {\r\n if (Array.isArray(chunk) && chunk.length >= 3) {\r\n const [_index, type, data] = chunk;\r\n const key = typeMap[type as FlightDataType];\r\n if (key && key !== '$end') {\r\n result[key] = data;\r\n }\r\n }\r\n }\r\n \r\n return result;\r\n}\r\n","import { type Plugin, build } from 'vite';\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport { pathToFileURL } from 'url';\r\nimport { \r\n minifyHtml, \r\n generateBuildId, \r\n generateResourceHints, \r\n generateCriticalCSS, \r\n generatePerformanceMeta, \r\n generateServiceWorkerScript, \r\n generateServiceWorkerContent \r\n} from './utils';\r\nimport { generateOlovaHydration, generateJsonLd } from './hydration';\r\n\r\n// =============================================================================\r\n// TERMINAL STYLING - Next.js-inspired console output\r\n// =============================================================================\r\nconst colors = {\r\n reset: '\\x1b[0m',\r\n bold: '\\x1b[1m',\r\n dim: '\\x1b[2m',\r\n green: '\\x1b[32m',\r\n cyan: '\\x1b[36m',\r\n yellow: '\\x1b[33m',\r\n magenta: '\\x1b[35m',\r\n blue: '\\x1b[34m',\r\n red: '\\x1b[31m',\r\n white: '\\x1b[37m',\r\n gray: '\\x1b[90m',\r\n bgGreen: '\\x1b[42m',\r\n bgCyan: '\\x1b[46m',\r\n bgMagenta: '\\x1b[45m',\r\n};\r\n\r\nconst symbols = {\r\n success: '✓',\r\n arrow: '→',\r\n bullet: '○',\r\n filled: '●',\r\n lambda: 'λ',\r\n static: '○',\r\n ssr: '●',\r\n info: 'ℹ',\r\n};\r\n\r\n// Format milliseconds to human readable\r\nfunction formatTime(ms: number): string {\r\n if (ms < 1) return '<1ms';\r\n if (ms < 10) return `${ms.toFixed(1)}ms`;\r\n if (ms < 1000) return `${Math.round(ms)}ms`;\r\n if (ms < 60000) return `${(ms / 1000).toFixed(2)}s`;\r\n const mins = Math.floor(ms / 60000);\r\n const secs = Math.round((ms % 60000) / 1000);\r\n return `${mins}m ${secs}s`;\r\n}\r\n\r\n// Format bytes to human readable\r\nfunction formatBytes(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} kB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\r\n}\r\n\r\n// Logger with Next.js-style formatting\r\nconst logger = {\r\n header: (text: string) => {\r\n console.log(`\\n${colors.bold}${colors.white}${text}${colors.reset}`);\r\n },\r\n \r\n info: (text: string) => {\r\n console.log(`${colors.cyan}${symbols.info}${colors.reset} ${text}`);\r\n },\r\n \r\n success: (text: string) => {\r\n console.log(`${colors.green}${symbols.success}${colors.reset} ${text}`);\r\n },\r\n \r\n route: (route: string, type: 'static' | 'ssr' | 'isr', size?: number, time?: number) => {\r\n const symbol = type === 'static' ? symbols.static : symbols.ssr;\r\n const color = type === 'static' ? colors.white : colors.magenta;\r\n const sizeStr = size ? ` ${colors.dim}${formatBytes(size)}${colors.reset}` : '';\r\n const timeStr = time ? ` ${colors.gray}(${formatTime(time)})${colors.reset}` : '';\r\n console.log(`${color}${symbol}${colors.reset} ${route}${sizeStr}${timeStr}`);\r\n },\r\n \r\n step: (step: string, time?: number) => {\r\n const timeStr = time ? ` ${colors.gray}${formatTime(time)}${colors.reset}` : '';\r\n console.log(` ${colors.dim}${symbols.arrow}${colors.reset} ${step}${timeStr}`);\r\n },\r\n \r\n buildComplete: (totalRoutes: number, staticRoutes: number, totalTime: number) => {\r\n console.log('');\r\n console.log(`${colors.bold}${colors.green}${symbols.success} Build completed!${colors.reset}`);\r\n console.log('');\r\n console.log(` ${colors.dim}Routes:${colors.reset} ${totalRoutes} total`);\r\n console.log(` ${colors.dim}Static:${colors.reset} ${staticRoutes} prerendered`);\r\n console.log(` ${colors.dim}Time:${colors.reset} ${formatTime(totalTime)}`);\r\n console.log('');\r\n },\r\n \r\n legend: () => {\r\n console.log(`${colors.dim}${symbols.static} Static${colors.reset} ${colors.dim}${symbols.ssr} SSR${colors.reset} ${colors.dim}λ ISR${colors.reset}`);\r\n },\r\n \r\n banner: (buildId: string) => {\r\n console.log('');\r\n console.log(`${colors.bold}${colors.cyan} ▲ Olova${colors.reset} ${colors.dim}Static Export${colors.reset}`);\r\n console.log(`${colors.dim} Build ID: ${buildId}${colors.reset}`);\r\n console.log('');\r\n },\r\n \r\n error: (text: string) => {\r\n console.log(`${colors.red}✗${colors.reset} ${colors.red}${text}${colors.reset}`);\r\n },\r\n \r\n warn: (text: string) => {\r\n console.log(`${colors.yellow}⚠${colors.reset} ${colors.yellow}${text}${colors.reset}`);\r\n },\r\n};\r\n\r\n// =============================================================================\r\n// SSG PLUGIN - Static Site Generation\r\n// =============================================================================\r\nexport function ssgPlugin(): Plugin {\r\n return {\r\n name: 'olova-ssg',\r\n apply: 'build',\r\n config() {\r\n if (process.env.IS_SSG_BUILD) {\r\n return {};\r\n }\r\n return {\r\n build: {\r\n manifest: true,\r\n rollupOptions: {\r\n input: 'index.html'\r\n }\r\n }\r\n }\r\n },\r\n async closeBundle() {\r\n if (process.env.IS_SSG_BUILD) return;\r\n process.env.IS_SSG_BUILD = 'true';\r\n \r\n const totalStartTime = performance.now();\r\n const buildId = generateBuildId();\r\n \r\n // Show banner\r\n logger.banner(buildId);\r\n \r\n // =========================================================\r\n // STEP 1: Build Server Entry\r\n // =========================================================\r\n logger.header('Generating static pages...');\r\n const serverBuildStart = performance.now();\r\n \r\n try {\r\n await build({\r\n configFile: './vite.config.ts',\r\n build: {\r\n ssr: true,\r\n outDir: '.olova/server',\r\n rollupOptions: {\r\n input: 'olova/server',\r\n },\r\n emptyOutDir: true,\r\n reportCompressedSize: false,\r\n },\r\n logLevel: 'silent',\r\n });\r\n logger.step('Server bundle compiled', performance.now() - serverBuildStart);\r\n } catch (e) {\r\n logger.error('SSG Build Failed');\r\n console.error(e);\r\n process.env.IS_SSG_BUILD = '';\r\n return;\r\n } finally {\r\n process.env.IS_SSG_BUILD = '';\r\n }\r\n\r\n // =========================================================\r\n // STEP 2: Scan Routes\r\n // =========================================================\r\n const scanStart = performance.now();\r\n const allRoutes: { route: string, isStatic: boolean, filePath: string }[] = [];\r\n \r\n const scan = (dir: string, base: string = '') => {\r\n if (!fs.existsSync(dir)) return;\r\n const entries = fs.readdirSync(dir, { withFileTypes: true });\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n if (entry.isDirectory()) {\r\n const isRouteGroup = /^\\(.+\\)$/.test(entry.name);\r\n if (isRouteGroup) {\r\n scan(fullPath, base);\r\n } else {\r\n scan(fullPath, `${base}/${entry.name}`);\r\n }\r\n } else {\r\n const ext = path.extname(entry.name);\r\n const supportedExts = ['.tsx', '.jsx', '.html', '.md'];\r\n \r\n if (supportedExts.includes(ext)) {\r\n const nameNoExt = entry.name.replace(/\\.(tsx|jsx|html|md)$/, '');\r\n let route = base;\r\n if (nameNoExt !== 'index' && nameNoExt !== 'App') {\r\n route = `${base}/${nameNoExt}`;\r\n }\r\n if (route === '') route = '/';\r\n if (route.includes('$')) continue;\r\n \r\n if (ext === '.html' || ext === '.md') {\r\n allRoutes.push({ route, isStatic: true, filePath: fullPath });\r\n } else {\r\n const fileContent = fs.readFileSync(fullPath, 'utf-8');\r\n const firstLine = fileContent.trim().split('\\n')[0].trim();\r\n const isStatic = firstLine === '\"static\"' || firstLine === \"'static'\";\r\n allRoutes.push({ route, isStatic, filePath: fullPath });\r\n }\r\n }\r\n }\r\n }\r\n };\r\n scan(path.resolve('src'));\r\n logger.step(`Found ${allRoutes.length} routes`, performance.now() - scanStart);\r\n\r\n // =========================================================\r\n // STEP 3: Load Server Entry\r\n // =========================================================\r\n const serverDir = path.resolve('.olova/server');\r\n let serverFile = fs.readdirSync(serverDir).find(f => \r\n (f === 'server.js' || f.includes('server-entry')) && f.endsWith('.js')\r\n );\r\n if (!serverFile) {\r\n logger.error('Could not find server build artifact');\r\n return;\r\n }\r\n const serverEntryPath = path.join(serverDir, serverFile);\r\n const { render, renderShell, renderShellWithMetadata, loadRoute } = await import(pathToFileURL(serverEntryPath).href);\r\n\r\n // =========================================================\r\n // STEP 4: Prepare Assets\r\n // =========================================================\r\n const assetsStart = performance.now();\r\n const distDir = path.resolve('.olova/dist');\r\n const clientHtmlPath = path.join(distDir, 'olova.html');\r\n \r\n let shellHtml = renderShell();\r\n if (!shellHtml.startsWith('<!DOCTYPE html>')) {\r\n shellHtml = `<!DOCTYPE html>\\n${shellHtml}`;\r\n }\r\n \r\n let template = '';\r\n if (fs.existsSync(clientHtmlPath)) {\r\n template = fs.readFileSync(clientHtmlPath, 'utf-8');\r\n }\r\n\r\n const scripts = template.match(/<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi) || [];\r\n const links = template.match(/<link[\\s\\S]*?>/gi) || [];\r\n \r\n const chunksDir = path.join(distDir, 'pro_olova_static', 'chunks');\r\n let preloadLinks: string[] = [];\r\n if (fs.existsSync(chunksDir)) {\r\n const chunks = fs.readdirSync(chunksDir).filter(f => f.endsWith('.js'));\r\n preloadLinks = chunks.map(chunk => \r\n `<link rel=\"modulepreload\" crossorigin href=\"/pro_olova_static/chunks/${chunk}\" />`\r\n );\r\n }\r\n \r\n const mainScriptMatch = template.match(/src=\"(\\/pro_olova_static\\/olova-[^\"]+\\.js)\"/);\r\n if (mainScriptMatch) {\r\n preloadLinks.unshift(`<link rel=\"modulepreload\" crossorigin href=\"${mainScriptMatch[1]}\" />`);\r\n }\r\n \r\n const chunkList: string[] = [];\r\n if (fs.existsSync(chunksDir)) {\r\n const chunks = fs.readdirSync(chunksDir).filter(f => f.endsWith('.js'));\r\n chunks.forEach(chunk => chunkList.push(`/pro_olova_static/chunks/${chunk}`));\r\n }\r\n \r\n // Performance optimizations\r\n const resourceHints = generateResourceHints();\r\n const criticalCSS = generateCriticalCSS();\r\n const performanceMeta = generatePerformanceMeta();\r\n const swScript = generateServiceWorkerScript();\r\n const performanceHead = [performanceMeta, resourceHints, criticalCSS].join('');\r\n \r\n // Service Worker\r\n const allAssetsForSW = [\r\n '/',\r\n '/index.html',\r\n ...chunkList,\r\n ...links.map(l => l.match(/href=\"([^\"]+)\"/)?.[1]).filter(Boolean) as string[]\r\n ];\r\n const swContent = generateServiceWorkerContent(buildId, allAssetsForSW);\r\n fs.writeFileSync(path.join(distDir, 'sw.js'), swContent);\r\n \r\n const assets = [performanceHead, ...links, ...preloadLinks, ...scripts, swScript].join('\\n');\r\n logger.step(`Assets optimized (${preloadLinks.length} preloads, SW ready)`, performance.now() - assetsStart);\r\n\r\n // =========================================================\r\n // STEP 5: Generate Routes\r\n // =========================================================\r\n console.log('');\r\n logger.header('Route');\r\n logger.legend();\r\n console.log('');\r\n \r\n let staticCount = 0;\r\n const routeResults: { route: string, type: 'static' | 'ssr', size: number, time: number }[] = [];\r\n \r\n for (const { route, isStatic } of allRoutes) {\r\n const routeStart = performance.now();\r\n let finalHtml = '';\r\n \r\n if (isStatic) {\r\n staticCount++;\r\n const { html, hydrationData } = await render(route);\r\n finalHtml = html;\r\n \r\n if (Object.keys(hydrationData.params || {}).length > 0) {\r\n const scriptTag = `<script>window.__OLOVA_DATA__ = ${JSON.stringify(hydrationData)};</script>`;\r\n if (finalHtml.includes('</body>')) {\r\n finalHtml = finalHtml.replace('</body>', `${scriptTag}\\n</body>`);\r\n } else {\r\n finalHtml += `\\n${scriptTag}`;\r\n }\r\n }\r\n\r\n const jsonLdScript = generateJsonLd({ route, metadata: hydrationData.metadata });\r\n \r\n if (finalHtml.includes('</head>')) {\r\n finalHtml = finalHtml.replace('</head>', `${jsonLdScript}${assets}\\n</head>`);\r\n } else {\r\n finalHtml = finalHtml.replace('</body>', `${assets}\\n</body>`);\r\n }\r\n if (!finalHtml.startsWith('<!DOCTYPE html>')) {\r\n finalHtml = `<!DOCTYPE html>\\n${finalHtml}`;\r\n }\r\n\r\n const flightScripts = generateOlovaHydration({\r\n route,\r\n metadata: hydrationData.metadata,\r\n params: hydrationData.params,\r\n chunks: chunkList,\r\n isStatic: true,\r\n }, buildId);\r\n if (finalHtml.includes('</body>')) {\r\n finalHtml = finalHtml.replace('</body>', `${flightScripts}</body>`);\r\n }\r\n\r\n finalHtml = minifyHtml(finalHtml);\r\n\r\n } else {\r\n let pageMetadata = {};\r\n try {\r\n const routeResult = await loadRoute(route);\r\n if (routeResult && routeResult.metadata) {\r\n pageMetadata = routeResult.metadata;\r\n }\r\n } catch (e) {\r\n // Continue with empty metadata\r\n }\r\n \r\n finalHtml = renderShellWithMetadata(pageMetadata);\r\n if (!finalHtml.startsWith('<!DOCTYPE html>')) {\r\n finalHtml = `<!DOCTYPE html>\\n${finalHtml}`;\r\n }\r\n \r\n const jsonLdScript = generateJsonLd({ route, metadata: pageMetadata });\r\n \r\n if (finalHtml.includes('</head>')) {\r\n finalHtml = finalHtml.replace('</head>', `${jsonLdScript}${assets}\\n</head>`);\r\n } else {\r\n finalHtml = finalHtml.replace('</body>', `${assets}\\n</body>`);\r\n }\r\n \r\n const flightScripts = generateOlovaHydration({\r\n route,\r\n metadata: pageMetadata,\r\n chunks: chunkList,\r\n isStatic: false,\r\n }, buildId);\r\n if (finalHtml.includes('</body>')) {\r\n finalHtml = finalHtml.replace('</body>', `${flightScripts}</body>`);\r\n }\r\n \r\n finalHtml = minifyHtml(finalHtml);\r\n }\r\n\r\n const outPath = path.join(distDir, route === '/' ? 'index.html' : `${route}/index.html`);\r\n fs.mkdirSync(path.dirname(outPath), { recursive: true });\r\n fs.writeFileSync(outPath, finalHtml);\r\n \r\n const routeTime = performance.now() - routeStart;\r\n const routeSize = Buffer.byteLength(finalHtml, 'utf8');\r\n routeResults.push({ route, type: isStatic ? 'static' : 'ssr', size: routeSize, time: routeTime });\r\n \r\n logger.route(route, isStatic ? 'static' : 'ssr', routeSize, routeTime);\r\n }\r\n\r\n // =========================================================\r\n // STEP 6: Generate 404.html\r\n // =========================================================\r\n const fallbackPath = path.join(distDir, '404.html');\r\n if (fs.existsSync(clientHtmlPath)) {\r\n fs.copyFileSync(clientHtmlPath, fallbackPath);\r\n }\r\n\r\n // =========================================================\r\n // Final Summary\r\n // =========================================================\r\n const totalTime = performance.now() - totalStartTime;\r\n logger.buildComplete(allRoutes.length, staticCount, totalTime);\r\n \r\n // Output directory info\r\n console.log(`${colors.dim} Output:${colors.reset} .olova/dist`);\r\n console.log('');\r\n }\r\n };\r\n}\r\n","// Helper function to minify HTML (Next.js-style compact output)\r\nexport function minifyHtml(html: string): string {\r\n return html\r\n // Remove HTML comments (but keep conditional comments)\r\n .replace(/<!--(?!\\[if).*?-->/gs, '')\r\n // Collapse multiple whitespace to single space\r\n .replace(/\\s+/g, ' ')\r\n // Remove whitespace between tags\r\n .replace(/> </g, '><')\r\n // Remove whitespace around tags\r\n .replace(/\\s*(<[^>]+>)\\s*/g, '$1')\r\n // Trim\r\n .trim();\r\n}\r\n\r\n// Generate unique build ID for cache busting (like Next.js buildId)\r\nexport function generateBuildId(): string {\r\n return Math.random().toString(36).substring(2, 15) + Date.now().toString(36);\r\n}\r\n\r\nexport function generateResourceHints(): string {\r\n return `\r\n <link rel=\"dns-prefetch\" href=\"//fonts.googleapis.com\">\r\n <link rel=\"dns-prefetch\" href=\"//fonts.gstatic.com\">\r\n <link rel=\"dns-prefetch\" href=\"//cdn.jsdelivr.net\">\r\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" crossorigin>\r\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\r\n `.trim().replace(/\\n\\s+/g, '');\r\n}\r\n\r\n// Generate critical CSS for above-the-fold content (inline in head)\r\nexport function generateCriticalCSS(): string {\r\n return `<style id=\"olova-critical\">\r\n *{box-sizing:border-box;margin:0;padding:0}\r\n html{-webkit-text-size-adjust:100%;line-height:1.5}\r\n body{font-family:system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif}\r\n img,video{max-width:100%;height:auto}\r\n [hidden]{display:none!important}\r\n </style>`.replace(/\\n\\s*/g, '');\r\n}\r\n\r\n// Generate service worker registration script\r\nexport function generateServiceWorkerScript(): string {\r\n return `<script>if('serviceWorker'in navigator){window.addEventListener('load',()=>{navigator.serviceWorker.register('/sw.js').catch(()=>{})})}</script>`;\r\n}\r\n\r\n// Generate service worker file content for offline caching\r\nexport function generateServiceWorkerContent(buildId: string, assets: string[]): string {\r\n return `// Olova Service Worker v${buildId}\r\nconst CACHE_NAME = 'olova-cache-${buildId}';\r\nconst ASSETS = ${JSON.stringify(assets)};\r\n\r\nself.addEventListener('install', (e) => {\r\n e.waitUntil(caches.open(CACHE_NAME).then(cache => cache.addAll(ASSETS)));\r\n self.skipWaiting();\r\n});\r\n\r\nself.addEventListener('activate', (e) => {\r\n e.waitUntil(caches.keys().then(keys => Promise.all(\r\n keys.filter(k => k !== CACHE_NAME).map(k => caches.delete(k))\r\n )));\r\n});\r\n\r\nself.addEventListener('fetch', (e) => {\r\n e.respondWith(caches.match(e.request).then(r => r || fetch(e.request)));\r\n});\r\n`;\r\n}\r\n\r\n// Generate performance meta tags\r\nexport function generatePerformanceMeta(): string {\r\n return `<meta http-equiv=\"x-dns-prefetch-control\" content=\"on\"><meta name=\"color-scheme\" content=\"light dark\">`;\r\n}\r\n","import { type Plugin } from 'vite';\r\nimport fs from 'fs';\r\nimport path from 'path';\r\n\r\n// =============================================================================\r\n// CLEAN URL PLUGIN - Handles clean URLs in preview mode\r\n// =============================================================================\r\nexport function cleanUrlPlugin(): Plugin {\r\n return {\r\n name: 'olova-clean-url',\r\n configurePreviewServer(server) {\r\n // Use middleware that runs BEFORE Vite's static serving\r\n server.middlewares.use((req, res, next) => {\r\n const urlPath = (req.url || '/').split('?')[0];\r\n const distDir = path.resolve('.olova/dist');\r\n \r\n // Handle root path\r\n if (urlPath === '/') {\r\n const indexPath = path.join(distDir, 'index.html');\r\n if (fs.existsSync(indexPath)) {\r\n const content = fs.readFileSync(indexPath, 'utf-8');\r\n res.setHeader('Content-Type', 'text/html');\r\n res.end(content);\r\n return;\r\n }\r\n }\r\n \r\n // Skip if it has a file extension (assets, scripts, etc.)\r\n if (urlPath.includes('.')) return next();\r\n \r\n // Check if /route/index.html exists (clean URLs)\r\n const indexPath = path.join(distDir, urlPath, 'index.html');\r\n if (fs.existsSync(indexPath)) {\r\n const content = fs.readFileSync(indexPath, 'utf-8');\r\n res.setHeader('Content-Type', 'text/html');\r\n res.end(content);\r\n return;\r\n }\r\n \r\n next();\r\n });\r\n }\r\n };\r\n}\r\n","import { type Plugin } from \"vite\";\r\nimport fs from \"fs\";\r\nimport path from \"path\";\r\n\r\n// =============================================================================\r\n// AUTO GENERATE PLUGIN - Auto-generates boilerplate code for new route files\r\n// =============================================================================\r\n\r\n/**\r\n * Converts a folder name to PascalCase for component naming\r\n */\r\nfunction toPascalCase(str: string): string {\r\n // Remove $ prefix for dynamic routes\r\n const cleanStr = str.replace(/^\\$/, \"\");\r\n\r\n return cleanStr\r\n .split(/[-_]/)\r\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\r\n .join(\"\");\r\n}\r\n\r\n/**\r\n * Generates the boilerplate code for a new route component\r\n */\r\nfunction generateBoilerplate(folderName: string, isDynamic: boolean): string {\r\n const componentName = toPascalCase(folderName);\r\n\r\n if (isDynamic) {\r\n // Dynamic route with useParams\r\n const paramName = folderName.replace(/^\\$/, \"\");\r\n return `import { useParams } from '../../route';\r\n\r\nexport default function ${componentName}() {\r\n const { ${paramName} } = useParams();\r\n return (\r\n <div>\r\n <h1>${componentName} Page</h1>\r\n <p>{${paramName}}</p>\r\n </div>\r\n );\r\n}\r\n`;\r\n }\r\n\r\n // Regular static route\r\n return `export default function ${componentName}() {\r\n return (\r\n <div>\r\n <h1>${componentName} Page</h1>\r\n <p>Welcome to ${componentName}</p>\r\n </div>\r\n );\r\n}\r\n`;\r\n}\r\n\r\nexport function autoGeneratePlugin(): Plugin {\r\n let srcDir: string;\r\n\r\n return {\r\n name: \"olova-auto-generate\",\r\n\r\n configResolved(config) {\r\n srcDir = path.resolve(config.root, \"src\");\r\n },\r\n\r\n configureServer(server) {\r\n console.log(\r\n \"\\x1b[36m[olova] Auto-generate plugin active - watching for new route files\\x1b[0m\"\r\n );\r\n\r\n // Watch for file creation events\r\n server.watcher.on(\"add\", (filePath: string) => {\r\n // Normalize path for Windows compatibility\r\n const normalizedPath = path.normalize(filePath);\r\n const normalizedSrcDir = path.normalize(srcDir);\r\n\r\n // Only process .tsx or .jsx files\r\n const ext = path.extname(normalizedPath);\r\n if (ext !== \".tsx\" && ext !== \".jsx\") {\r\n return;\r\n }\r\n\r\n // Check if file is inside src directory\r\n if (!normalizedPath.startsWith(normalizedSrcDir)) {\r\n return;\r\n }\r\n\r\n // Get the file name without extension\r\n const fileName = path.basename(normalizedPath, ext);\r\n\r\n // Only auto-generate for index files\r\n if (fileName !== \"index\") {\r\n return;\r\n }\r\n\r\n // Get the folder name\r\n const folderPath = path.dirname(normalizedPath);\r\n const folderName = path.basename(folderPath);\r\n\r\n // Skip root src folder and route groups (folders starting with parentheses)\r\n if (folderName === \"src\" || folderName.startsWith(\"(\")) {\r\n return;\r\n }\r\n\r\n // Check if file is empty or very small (just created)\r\n try {\r\n fs.statSync(normalizedPath);\r\n const content = fs.readFileSync(normalizedPath, \"utf-8\");\r\n\r\n // Only generate if file is empty or has minimal content\r\n if (content.trim().length > 10) {\r\n return;\r\n }\r\n } catch (err) {\r\n // File might not exist yet or other error, skip\r\n return;\r\n }\r\n\r\n // Check if it's a dynamic route (folder starts with $)\r\n const isDynamic = folderName.startsWith(\"$\");\r\n\r\n // Generate the boilerplate\r\n const boilerplate = generateBoilerplate(folderName, isDynamic);\r\n\r\n // Write the boilerplate to the file\r\n try {\r\n fs.writeFileSync(normalizedPath, boilerplate, \"utf-8\");\r\n console.log(\r\n `\\x1b[32m✓ [olova] Auto-generated: ${folderName}/index${ext}\\x1b[0m`\r\n );\r\n } catch (err) {\r\n console.error(\r\n `\\x1b[31m✗ [olova] Failed to write boilerplate:\\x1b[0m`,\r\n err\r\n );\r\n }\r\n });\r\n },\r\n };\r\n}\r\n","import { type Plugin, type ViteDevServer } from 'vite';\r\nimport path from 'path';\r\n\r\n// =============================================================================\r\n// PROACTIVE ERROR CHECKER - Validates all files on save like Next.js\r\n// This makes Vite's error overlay show instantly for ANY file with an error\r\n// =============================================================================\r\n\r\nexport function proactiveErrorPlugin(): Plugin {\r\n return {\r\n name: 'olova-proactive-error',\r\n enforce: 'post',\r\n\r\n configureServer(devServer: ViteDevServer) {\r\n const srcDir = path.resolve(process.cwd(), 'src');\r\n\r\n // Function to validate a file and send error to Vite's overlay\r\n const validateFile = async (filePath: string) => {\r\n if (!filePath.startsWith(srcDir)) return;\r\n if (!/\\.(tsx?|jsx?)$/.test(filePath)) return;\r\n\r\n const relativePath = path.relative(srcDir, filePath);\r\n console.log('\\x1b[36m[olova]\\x1b[0m Checking:', relativePath);\r\n\r\n try {\r\n // Convert file path to URL format for Vite\r\n const url = '/' + path.relative(process.cwd(), filePath).replace(/\\\\/g, '/');\r\n \r\n // Proactively transform the file\r\n await devServer.transformRequest(url);\r\n \r\n console.log('\\x1b[32m[olova]\\x1b[0m ✓', relativePath, 'OK');\r\n } catch (err: any) {\r\n console.log('\\x1b[31m[olova]\\x1b[0m ✗', relativePath);\r\n \r\n // Send error to Vite's error overlay via WebSocket\r\n // This is the official way Vite shows errors in the overlay\r\n devServer.ws.send({\r\n type: 'error',\r\n err: {\r\n message: err.message || String(err),\r\n stack: err.stack || '',\r\n id: err.id || filePath,\r\n frame: err.frame || '',\r\n plugin: err.plugin || 'olova',\r\n loc: err.loc || undefined,\r\n },\r\n });\r\n }\r\n };\r\n\r\n // Watch for file changes\r\n devServer.watcher.on('change', async (filePath: string) => {\r\n // Small delay to ensure file is fully written\r\n await new Promise(r => setTimeout(r, 50));\r\n await validateFile(filePath);\r\n });\r\n\r\n // Also check new files when they're added\r\n devServer.watcher.on('add', async (filePath: string) => {\r\n // Wait for file to be fully written\r\n await new Promise(r => setTimeout(r, 100));\r\n await validateFile(filePath);\r\n });\r\n },\r\n };\r\n}\r\n","import { type Plugin } from 'vite';\r\n\r\n// Import all plugins from separate files\r\nexport { configPlugin } from './config';\r\nexport { routerPlugin } from './router';\r\nexport { frameworkPlugin } from './framework';\r\nexport { virtualHtmlPlugin } from './virtual-html';\r\nexport { ssgPlugin } from './ssg';\r\nexport { cleanUrlPlugin } from './clean-url';\r\nexport { autoGeneratePlugin } from './auto-generate';\r\nexport { proactiveErrorPlugin } from './error-overlay';\r\n\r\n// Import all plugins for the combined array\r\nimport { configPlugin } from './config';\r\nimport { routerPlugin } from './router';\r\nimport { frameworkPlugin } from './framework';\r\nimport { virtualHtmlPlugin } from './virtual-html';\r\nimport { ssgPlugin } from './ssg';\r\nimport { cleanUrlPlugin } from './clean-url';\r\nimport { autoGeneratePlugin } from './auto-generate';\r\nimport { proactiveErrorPlugin } from './error-overlay';\r\n\r\n// =============================================================================\r\n// EXPORT ALL PLUGINS AS A SINGLE ARRAY\r\n// =============================================================================\r\nexport function olovaPlugins(): Plugin[] {\r\n return [\r\n configPlugin(), // Must be first - creates .olova folder and sets config\r\n routerPlugin(),\r\n frameworkPlugin(),\r\n virtualHtmlPlugin(),\r\n ssgPlugin(),\r\n cleanUrlPlugin(),\r\n autoGeneratePlugin(), // Auto-generates boilerplate for new route files\r\n proactiveErrorPlugin(), // Checks all files on save for instant error detection\r\n ];\r\n}\r\n","// =============================================================================\r\n// TERMINAL STYLING UTILITIES\r\n// Next.js-inspired console output for professional CLI experience\r\n// =============================================================================\r\n\r\n// ANSI color codes for terminal styling\r\nexport const colors = {\r\n // Reset\r\n reset: '\\x1b[0m',\r\n \r\n // Styles\r\n bold: '\\x1b[1m',\r\n dim: '\\x1b[2m',\r\n italic: '\\x1b[3m',\r\n underline: '\\x1b[4m',\r\n \r\n // Foreground colors\r\n black: '\\x1b[30m',\r\n red: '\\x1b[31m',\r\n green: '\\x1b[32m',\r\n yellow: '\\x1b[33m',\r\n blue: '\\x1b[34m',\r\n magenta: '\\x1b[35m',\r\n cyan: '\\x1b[36m',\r\n white: '\\x1b[37m',\r\n gray: '\\x1b[90m',\r\n \r\n // Background colors\r\n bgBlack: '\\x1b[40m',\r\n bgRed: '\\x1b[41m',\r\n bgGreen: '\\x1b[42m',\r\n bgYellow: '\\x1b[43m',\r\n bgBlue: '\\x1b[44m',\r\n bgMagenta: '\\x1b[45m',\r\n bgCyan: '\\x1b[46m',\r\n bgWhite: '\\x1b[47m',\r\n};\r\n\r\n// Symbols for terminal output\r\nexport const symbols = {\r\n success: '✓',\r\n error: '✗',\r\n warning: '⚠',\r\n info: 'ℹ',\r\n arrow: '→',\r\n arrowRight: '➜',\r\n bullet: '○',\r\n filled: '●',\r\n lambda: 'λ',\r\n triangle: '▲',\r\n square: '■',\r\n diamond: '◆',\r\n star: '★',\r\n check: '✔',\r\n cross: '✖',\r\n pointer: '❯',\r\n};\r\n\r\n// Format time in human readable format\r\nexport function formatTime(ms: number): string {\r\n if (ms < 1) return '<1ms';\r\n if (ms < 10) return `${ms.toFixed(1)}ms`;\r\n if (ms < 1000) return `${Math.round(ms)}ms`;\r\n if (ms < 60000) return `${(ms / 1000).toFixed(2)}s`;\r\n const mins = Math.floor(ms / 60000);\r\n const secs = Math.round((ms % 60000) / 1000);\r\n return `${mins}m ${secs}s`;\r\n}\r\n\r\n// Format bytes in human readable format\r\nexport function formatBytes(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'kB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;\r\n}\r\n\r\n// Logger utility with Next.js-style formatting\r\nexport const logger = {\r\n // Print banner\r\n banner: (name: string, version: string = '1.0.0') => {\r\n console.log('');\r\n console.log(` ${colors.bold}${colors.cyan}${symbols.triangle} ${name}${colors.reset} ${colors.dim}v${version}${colors.reset}`);\r\n console.log('');\r\n },\r\n \r\n // Print header\r\n header: (text: string) => {\r\n console.log(`\\n${colors.bold}${colors.white}${text}${colors.reset}`);\r\n },\r\n \r\n // Info message\r\n info: (text: string) => {\r\n console.log(`${colors.cyan}${symbols.info}${colors.reset} ${text}`);\r\n },\r\n \r\n // Success message\r\n success: (text: string, time?: number) => {\r\n const timeStr = time !== undefined ? ` ${colors.dim}${formatTime(time)}${colors.reset}` : '';\r\n console.log(`${colors.green}${symbols.success}${colors.reset} ${text}${timeStr}`);\r\n },\r\n \r\n // Error message\r\n error: (text: string) => {\r\n console.log(`${colors.red}${symbols.error}${colors.reset} ${colors.red}${text}${colors.reset}`);\r\n },\r\n \r\n // Warning message\r\n warn: (text: string) => {\r\n console.log(`${colors.yellow}${symbols.warning}${colors.reset} ${colors.yellow}${text}${colors.reset}`);\r\n },\r\n \r\n // Step in a process\r\n step: (text: string, time?: number) => {\r\n const timeStr = time !== undefined ? ` ${colors.gray}${formatTime(time)}${colors.reset}` : '';\r\n console.log(` ${colors.dim}${symbols.arrow}${colors.reset} ${text}${timeStr}`);\r\n },\r\n \r\n // Route log (for SSG)\r\n route: (route: string, type: 'static' | 'ssr' | 'isr', size?: number, time?: number) => {\r\n const symbol = type === 'static' ? symbols.bullet : type === 'ssr' ? symbols.filled : symbols.lambda;\r\n const color = type === 'static' ? colors.white : type === 'ssr' ? colors.magenta : colors.cyan;\r\n const sizeStr = size ? ` ${colors.dim}${formatBytes(size)}${colors.reset}` : '';\r\n const timeStr = time ? ` ${colors.gray}(${formatTime(time)})${colors.reset}` : '';\r\n console.log(`${color}${symbol}${colors.reset} ${route}${sizeStr}${timeStr}`);\r\n },\r\n \r\n // Indent text \r\n indent: (text: string, level: number = 1) => {\r\n console.log(`${' '.repeat(level)}${text}`);\r\n },\r\n \r\n // Empty line\r\n newline: () => console.log(''),\r\n \r\n // Dim text\r\n dim: (text: string) => `${colors.dim}${text}${colors.reset}`,\r\n \r\n // Bold text \r\n bold: (text: string) => `${colors.bold}${text}${colors.reset}`,\r\n \r\n // Colored text\r\n cyan: (text: string) => `${colors.cyan}${text}${colors.reset}`,\r\n green: (text: string) => `${colors.green}${text}${colors.reset}`,\r\n yellow: (text: string) => `${colors.yellow}${text}${colors.reset}`,\r\n red: (text: string) => `${colors.red}${text}${colors.reset}`,\r\n magenta: (text: string) => `${colors.magenta}${text}${colors.reset}`,\r\n};\r\n\r\n// Create a timer for measuring performance\r\nexport function createTimer() {\r\n const start = performance.now();\r\n return {\r\n elapsed: () => performance.now() - start,\r\n format: () => formatTime(performance.now() - start),\r\n };\r\n}\r\n"],"mappings":"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","names":["fs","path","fs","path","path","fs","fs","path","colors","fs","path","fs","path","indexPath","fs","path","path","colors","symbols","formatTime","formatBytes","logger"]}
|
|
1
|
+
{"version":3,"sources":["../src/plugins/config.ts","../src/plugins/router.ts","../src/plugins/framework.ts","../src/plugins/virtual-html.ts","../src/plugins/hydration.ts","../src/plugins/ssg.ts","../src/plugins/utils.ts","../src/plugins/clean-url.ts","../src/plugins/auto-generate.ts","../src/plugins/error-overlay.ts","../src/plugins/index.ts","../src/plugins/terminal.ts"],"sourcesContent":["import { type Plugin } from 'vite';\r\nimport fs from 'fs';\r\nimport path from 'path';\r\n\r\n// Terminal colors\r\nconst colors = {\r\n reset: '\\x1b[0m',\r\n bold: '\\x1b[1m',\r\n dim: '\\x1b[2m',\r\n cyan: '\\x1b[36m',\r\n green: '\\x1b[32m',\r\n white: '\\x1b[37m',\r\n};\r\n\r\n// =============================================================================\r\n// CONFIG PLUGIN - Creates .olova folder and configures Vite settings\r\n// =============================================================================\r\nexport function configPlugin(): Plugin {\r\n const olovaDir = path.resolve('.olova');\r\n \r\n return {\r\n name: 'olova-config',\r\n config(_config, { command }) {\r\n // Create .olova folder on startup\r\n if (!fs.existsSync(olovaDir)) {\r\n fs.mkdirSync(olovaDir, { recursive: true });\r\n }\r\n \r\n // Skip build config for SSG builds\r\n if (process.env.IS_SSG_BUILD) {\r\n return {\r\n appType: 'custom',\r\n cacheDir: './.olova/cache',\r\n };\r\n }\r\n \r\n // Show startup banner for dev mode\r\n if (command === 'serve') {\r\n console.log('');\r\n console.log(` ${colors.bold}${colors.cyan}▲ Olova${colors.reset} ${colors.dim}v1.0.0${colors.reset}`);\r\n console.log('');\r\n }\r\n \r\n return {\r\n appType: 'custom',\r\n cacheDir: './.olova/cache',\r\n build: {\r\n outDir: './.olova/dist',\r\n sourcemap: false,\r\n chunkSizeWarningLimit: 500,\r\n rollupOptions: {\r\n onwarn(warning, warn) {\r\n // Suppress \"dynamic import will not move module\" warnings\r\n if (warning.code === 'PLUGIN_WARNING' && warning.message?.includes('dynamic import will not move')) {\r\n return;\r\n }\r\n // Suppress \"static\" directive warnings (Olova uses this for static routes)\r\n if (warning.message?.includes('Module level directives') && warning.message?.includes('static')) {\r\n return;\r\n }\r\n // Suppress sourcemap warnings for static directive\r\n if (warning.message?.includes('sourcemap') && warning.message?.includes(\"Can't resolve original location\")) {\r\n return;\r\n }\r\n warn(warning);\r\n },\r\n output: {\r\n chunkFileNames: 'pro_olova_static/chunks/[name]-[hash].js',\r\n entryFileNames: 'pro_olova_static/olova-[hash].js',\r\n assetFileNames: 'pro_olova_static/[name]-[hash][extname]',\r\n manualChunks(id) {\r\n if (id.includes('node_modules')) {\r\n if (id.includes('react-dom')) {\r\n return 'vendor-react-dom';\r\n }\r\n if (id.includes('react')) {\r\n return 'vendor-react';\r\n }\r\n return 'vendor';\r\n }\r\n },\r\n },\r\n },\r\n },\r\n preview: {\r\n port: 4173,\r\n strictPort: false,\r\n },\r\n };\r\n },\r\n configureServer(server) {\r\n // Show ready message when server starts\r\n server.httpServer?.once('listening', () => {\r\n const address = server.httpServer?.address();\r\n const port = typeof address === 'object' && address ? address.port : 5173;\r\n \r\n setTimeout(() => {\r\n console.log(` ${colors.green}✓${colors.reset} Ready in ${colors.dim}${Math.round(performance.now())}ms${colors.reset}`);\r\n console.log('');\r\n console.log(` ${colors.dim}➜${colors.reset} ${colors.bold}Local:${colors.reset} ${colors.cyan}http://localhost:${port}/${colors.reset}`);\r\n console.log('');\r\n }, 100);\r\n });\r\n },\r\n };\r\n}\r\n","import { type Plugin, type ViteDevServer } from 'vite';\r\nimport fs from 'fs';\r\nimport path from 'path';\r\n\r\n// =============================================================================\r\n// ROUTER PLUGIN - File-system based routing with HMR support\r\n// =============================================================================\r\nexport function routerPlugin(): Plugin {\r\n const virtualModuleId = 'olova/routes';\r\n const resolvedVirtualModuleId = '\\0' + virtualModuleId;\r\n let server: ViteDevServer | null = null;\r\n\r\n // Helper function to invalidate the virtual module and trigger HMR\r\n const invalidateRoutes = () => {\r\n if (server) {\r\n const mod = server.moduleGraph.getModuleById(resolvedVirtualModuleId);\r\n if (mod) {\r\n server.moduleGraph.invalidateModule(mod);\r\n // Send HMR update to refresh the routes\r\n server.ws.send({\r\n type: 'full-reload',\r\n path: '*'\r\n });\r\n }\r\n }\r\n };\r\n\r\n return {\r\n name: 'olova-router',\r\n enforce: 'pre',\r\n \r\n // Configure dev server to watch for file changes\r\n configureServer(devServer) {\r\n server = devServer;\r\n const srcDir = path.resolve(process.cwd(), 'src');\r\n \r\n // Watch the src directory for file changes\r\n const watcher = devServer.watcher;\r\n \r\n // Handle file additions\r\n watcher.on('add', (filePath: string) => {\r\n if (filePath.startsWith(srcDir) && /\\.(tsx|jsx|html|md)$/.test(filePath)) {\r\n console.log('\\x1b[36m[olova]\\x1b[0m New route detected:', path.relative(srcDir, filePath));\r\n invalidateRoutes();\r\n }\r\n });\r\n \r\n // Handle file deletions\r\n watcher.on('unlink', (filePath: string) => {\r\n if (filePath.startsWith(srcDir) && /\\.(tsx|jsx|html|md)$/.test(filePath)) {\r\n console.log('\\x1b[36m[olova]\\x1b[0m Route removed:', path.relative(srcDir, filePath));\r\n invalidateRoutes();\r\n }\r\n });\r\n \r\n // Handle directory additions (new route folders)\r\n watcher.on('addDir', (dirPath: string) => {\r\n if (dirPath.startsWith(srcDir) && dirPath !== srcDir) {\r\n console.log('\\x1b[36m[olova]\\x1b[0m New route folder detected:', path.relative(srcDir, dirPath));\r\n // Don't invalidate immediately - wait for files to be added\r\n }\r\n });\r\n \r\n // Handle directory deletions\r\n watcher.on('unlinkDir', (dirPath: string) => {\r\n if (dirPath.startsWith(srcDir) && dirPath !== srcDir) {\r\n console.log('\\x1b[36m[olova]\\x1b[0m Route folder removed:', path.relative(srcDir, dirPath));\r\n invalidateRoutes();\r\n }\r\n });\r\n },\r\n \r\n resolveId(id) {\r\n if (id === virtualModuleId) {\r\n return resolvedVirtualModuleId;\r\n }\r\n },\r\n \r\n // Mark the virtual module as having side effects for proper HMR\r\n handleHotUpdate({ file, server: devServer }) {\r\n const srcDir = path.resolve(process.cwd(), 'src');\r\n \r\n // If a route file's content changes (like adding \"static\" directive), refresh routes\r\n if (file.startsWith(srcDir) && /\\.(tsx|jsx)$/.test(file)) {\r\n const mod = devServer.moduleGraph.getModuleById(resolvedVirtualModuleId);\r\n if (mod) {\r\n devServer.moduleGraph.invalidateModule(mod);\r\n }\r\n }\r\n },\r\n \r\n load(id) {\r\n if (id === resolvedVirtualModuleId) {\r\n const srcDir = path.resolve(process.cwd(), 'src');\r\n \r\n // Helper to scan directory recursively\r\n // Supports Next.js-style conventions:\r\n // - (folder) = Route Group (ignored in URL, for organization only)\r\n // - [folder] = Dynamic Route (captures URL parameter)\r\n const getRoutes = (dir: string, baseRoute: string = '', baseImportPath: string = ''): string[] => {\r\n const entries = fs.readdirSync(dir, { withFileTypes: true });\r\n let routes: string[] = [];\r\n\r\n for (const entry of entries) {\r\n const entryName = entry.name;\r\n const fullPath = path.join(dir, entryName);\r\n \r\n if (entry.isDirectory()) {\r\n // Check if it's a route group (folder wrapped in parentheses)\r\n const isRouteGroup = /^\\(.+\\)$/.test(entryName);\r\n \r\n if (isRouteGroup) {\r\n // Route groups: folder is ignored in URL path but kept in import path\r\n // e.g., (auth) folder -> URL stays same, import includes (auth)\r\n routes = routes.concat(getRoutes(\r\n fullPath, \r\n baseRoute, // URL path stays the same (group is ignored)\r\n `${baseImportPath}/${entryName}` // Import path includes the folder\r\n ));\r\n } else {\r\n // Regular folder or dynamic route folder\r\n routes = routes.concat(getRoutes(\r\n fullPath, \r\n `${baseRoute}/${entryName}`,\r\n `${baseImportPath}/${entryName}`\r\n ));\r\n }\r\n } else {\r\n // Support multiple file types: .tsx, .jsx, .html, .md\r\n const ext = path.extname(entryName);\r\n const supportedExts = ['.tsx', '.jsx', '.html', '.md'];\r\n \r\n if (supportedExts.includes(ext)) {\r\n const nameNoExt = entryName.replace(/\\.(tsx|jsx|html|md)$/, '');\r\n \r\n let routePath = baseRoute;\r\n if (nameNoExt !== 'index' && nameNoExt !== 'App') {\r\n routePath = `${baseRoute}/${nameNoExt}`;\r\n }\r\n \r\n if (routePath === '') routePath = '/';\r\n \r\n // Convert $param to :param for dynamic routes (Olova convention)\r\n const normalizedRoutePath = routePath\r\n .replace(/\\$(.+?)(?=\\/|$)/g, ':$1');\r\n \r\n // Path relative to project root for import\r\n const importPath = `/src${baseImportPath}/${entryName}`;\r\n \r\n if (ext === '.html') {\r\n // HTML files: create a wrapper that fetches and renders the HTML\r\n routes.push(` \"${normalizedRoutePath}\": () => import(\"${importPath}?raw\").then(m => ({ default: () => { const div = document.createElement('div'); div.innerHTML = m.default; return div.innerHTML; }, __isHtml: true, __isStatic: true, __rawHtml: m.default })),`);\r\n } else if (ext === '.md') {\r\n // MD files: import as raw and render as markdown\r\n routes.push(` \"${normalizedRoutePath}\": () => import(\"${importPath}?raw\").then(m => ({ default: m.default, __isMd: true, __isStatic: true })),`);\r\n } else {\r\n // TSX/JSX files: check for \"static\" directive\r\n const fileContent = fs.readFileSync(fullPath, 'utf-8');\r\n const firstLine = fileContent.trim().split('\\n')[0].trim();\r\n const hasStaticDirective = firstLine === '\"static\"' || firstLine === \"'static'\";\r\n \r\n if (hasStaticDirective) {\r\n // Static route: add __isStatic flag\r\n routes.push(` \"${normalizedRoutePath}\": () => import(\"${importPath}\").then(m => Object.assign({}, m, { __isStatic: true })),`);\r\n } else {\r\n // Client-only route: standard import\r\n routes.push(` \"${normalizedRoutePath}\": () => import(\"${importPath}\"),`);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return routes;\r\n };\r\n\r\n let routeLines: string[] = [];\r\n if (fs.existsSync(srcDir)) {\r\n routeLines = getRoutes(srcDir);\r\n }\r\n\r\n return `export const routes = {\r\n${routeLines.join('\\n')}\r\n};`;\r\n }\r\n },\r\n };\r\n}\r\n","import { type Plugin, transformWithEsbuild } from 'vite';\r\n\r\n// =============================================================================\r\n// FRAMEWORK PLUGIN - Virtual entry points for client and server\r\n// =============================================================================\r\nexport function frameworkPlugin(): Plugin {\r\n const virtualClientEntry = 'olova/client';\r\n const resolvedVirtualClientEntry = '\\0' + virtualClientEntry;\r\n const virtualServerEntry = 'olova/server';\r\n const resolvedVirtualServerEntry = '\\0' + virtualServerEntry;\r\n\r\n return {\r\n name: 'olova-framework',\r\n enforce: 'pre',\r\n resolveId(id: string) {\r\n if (id === virtualClientEntry || id === '/olova/client' || id === 'olova/client.tsx') return resolvedVirtualClientEntry;\r\n if (id === virtualServerEntry || id === '/olova/server' || id === 'olova/server.tsx') return resolvedVirtualServerEntry;\r\n },\r\n async load(id: string) {\r\n if (id === resolvedVirtualClientEntry) {\r\n const code = `\r\nimport React from 'react';\r\nimport { hydrateRoot, createRoot } from 'react-dom/client';\r\nimport Layout, { metadata as defaultMetadata } from '/src/root.tsx';\r\nimport { Router, loadRoute } from 'olova/router';\r\n\r\n// Helper to generate SEO meta tags\r\nfunction generateSeoTags(metadata) {\r\n const meta = { ...defaultMetadata, ...metadata };\r\n const tags = [];\r\n \r\n // Title\r\n if (meta.title) {\r\n document.title = meta.title;\r\n }\r\n \r\n // Description\r\n if (meta.description) {\r\n let tag = document.querySelector('meta[name=\"description\"]');\r\n if (!tag) {\r\n tag = document.createElement('meta');\r\n tag.setAttribute('name', 'description');\r\n document.head.appendChild(tag);\r\n }\r\n tag.setAttribute('content', meta.description);\r\n }\r\n \r\n // Keywords\r\n if (meta.keywords) {\r\n const content = Array.isArray(meta.keywords) ? meta.keywords.join(', ') : meta.keywords;\r\n let tag = document.querySelector('meta[name=\"keywords\"]');\r\n if (!tag) {\r\n tag = document.createElement('meta');\r\n tag.setAttribute('name', 'keywords');\r\n document.head.appendChild(tag);\r\n }\r\n tag.setAttribute('content', content);\r\n }\r\n \r\n // Open Graph\r\n if (meta.openGraph) {\r\n const og = meta.openGraph;\r\n const ogTags = [\r\n ['og:title', og.title || meta.title],\r\n ['og:description', og.description],\r\n ['og:url', og.url],\r\n ['og:site_name', og.siteName],\r\n ['og:type', og.type],\r\n ];\r\n ogTags.forEach(([prop, content]) => {\r\n if (content) {\r\n let tag = document.querySelector(\\`meta[property=\"\\${prop}\"]\\`);\r\n if (!tag) {\r\n tag = document.createElement('meta');\r\n tag.setAttribute('property', prop);\r\n document.head.appendChild(tag);\r\n }\r\n tag.setAttribute('content', content);\r\n }\r\n });\r\n }\r\n \r\n // Twitter Card\r\n if (meta.twitter) {\r\n const tw = meta.twitter;\r\n const twTags = [\r\n ['twitter:card', tw.card || 'summary'],\r\n ['twitter:site', tw.site],\r\n ['twitter:creator', tw.creator],\r\n ['twitter:title', tw.title || meta.title],\r\n ['twitter:description', tw.description],\r\n ];\r\n twTags.forEach(([name, content]) => {\r\n if (content) {\r\n let tag = document.querySelector(\\`meta[name=\"\\${name}\"]\\`);\r\n if (!tag) {\r\n tag = document.createElement('meta');\r\n tag.setAttribute('name', name);\r\n document.head.appendChild(tag);\r\n }\r\n tag.setAttribute('content', content);\r\n }\r\n });\r\n }\r\n}\r\n\r\nconst path = window.location.pathname;\r\nloadRoute(path).then((result) => {\r\n const Component = result ? result.module.default : () => <div>404 Not Found</div>;\r\n // @ts-ignore\r\n const serverData = window.__OLOVA_DATA__ || {};\r\n const params = serverData.params || (result ? result.params : {});\r\n const metadata = serverData.metadata || (result ? result.metadata : undefined);\r\n\r\n // Framework handles SEO automatically (like Next.js)\r\n generateSeoTags(metadata);\r\n\r\n const rootElement = document.getElementById('root');\r\n const app = (\r\n <React.StrictMode>\r\n <Layout>\r\n <Router url={path} initialComponent={Component} initialParams={params} onRouteChange={(newMetadata) => generateSeoTags(newMetadata)} />\r\n </Layout>\r\n </React.StrictMode>\r\n );\r\n\r\n if (rootElement && rootElement.innerHTML.trim() !== \"\") {\r\n console.log(\"[Olova] Hydrating pre-rendered content\");\r\n hydrateRoot(document, app);\r\n } else {\r\n console.log(\"[Olova] Rendering client-side (no SSR content found)\");\r\n createRoot(document).render(app);\r\n }\r\n});`;\r\n const result = await transformWithEsbuild(code, 'olova-client.tsx', {\r\n loader: 'tsx',\r\n jsx: 'automatic',\r\n });\r\n return result.code;\r\n }\r\n if (id === resolvedVirtualServerEntry) {\r\n const code = `\r\nimport React from 'react';\r\nimport { renderToString } from 'react-dom/server';\r\nimport Layout, { metadata as defaultMetadata } from '/src/root.tsx';\r\nimport { Router, loadRoute } from 'olova/router';\r\n\r\n// Generate SEO head content\r\nfunction generateSeoHead(metadata) {\r\n const meta = { ...defaultMetadata, ...metadata };\r\n let head = '';\r\n \r\n // Title\r\n if (meta.title) {\r\n head += \\`<title>\\${meta.title}</title>\\\\n\\`;\r\n }\r\n \r\n // Basic meta\r\n if (meta.description) {\r\n head += \\`<meta name=\"description\" content=\"\\${meta.description}\" />\\\\n\\`;\r\n }\r\n if (meta.keywords) {\r\n const content = Array.isArray(meta.keywords) ? meta.keywords.join(', ') : meta.keywords;\r\n head += \\`<meta name=\"keywords\" content=\"\\${content}\" />\\\\n\\`;\r\n }\r\n if (meta.robots) {\r\n head += \\`<meta name=\"robots\" content=\"\\${meta.robots}\" />\\\\n\\`;\r\n }\r\n if (meta.canonical) {\r\n head += \\`<link rel=\"canonical\" href=\"\\${meta.canonical}\" />\\\\n\\`;\r\n }\r\n \r\n // Open Graph\r\n if (meta.openGraph) {\r\n const og = meta.openGraph;\r\n head += \\`<meta property=\"og:title\" content=\"\\${og.title || meta.title}\" />\\\\n\\`;\r\n if (og.description) head += \\`<meta property=\"og:description\" content=\"\\${og.description}\" />\\\\n\\`;\r\n if (og.url) head += \\`<meta property=\"og:url\" content=\"\\${og.url}\" />\\\\n\\`;\r\n if (og.siteName) head += \\`<meta property=\"og:site_name\" content=\"\\${og.siteName}\" />\\\\n\\`;\r\n if (og.type) head += \\`<meta property=\"og:type\" content=\"\\${og.type}\" />\\\\n\\`;\r\n if (og.images) {\r\n og.images.forEach(img => {\r\n head += \\`<meta property=\"og:image\" content=\"\\${img.url}\" />\\\\n\\`;\r\n });\r\n }\r\n }\r\n \r\n // Twitter Card\r\n if (meta.twitter) {\r\n const tw = meta.twitter;\r\n head += \\`<meta name=\"twitter:card\" content=\"\\${tw.card || 'summary'}\" />\\\\n\\`;\r\n if (tw.site) head += \\`<meta name=\"twitter:site\" content=\"\\${tw.site}\" />\\\\n\\`;\r\n if (tw.creator) head += \\`<meta name=\"twitter:creator\" content=\"\\${tw.creator}\" />\\\\n\\`;\r\n head += \\`<meta name=\"twitter:title\" content=\"\\${tw.title || meta.title}\" />\\\\n\\`;\r\n if (tw.description) head += \\`<meta name=\"twitter:description\" content=\"\\${tw.description}\" />\\\\n\\`;\r\n if (tw.images) {\r\n tw.images.forEach(img => {\r\n head += \\`<meta name=\"twitter:image\" content=\"\\${img}\" />\\\\n\\`;\r\n });\r\n }\r\n }\r\n \r\n return head;\r\n}\r\n\r\nexport async function render(url) {\r\n const result = await loadRoute(url);\r\n const Component = result ? result.module.default : () => <div>404 Not Found</div>;\r\n const params = result ? result.params : {};\r\n const metadata = result ? result.metadata : undefined;\r\n \r\n // Generate the SEO head content\r\n const seoHead = generateSeoHead(metadata);\r\n \r\n let html = renderToString(\r\n <Layout>\r\n <Router url={url} initialComponent={Component} initialParams={params} />\r\n </Layout>\r\n );\r\n \r\n // Inject SEO tags into head (framework handles this automatically)\r\n if (html.includes('</head>')) {\r\n html = html.replace('</head>', seoHead + '</head>');\r\n }\r\n \r\n return { html, hydrationData: { params, metadata } };\r\n}\r\n\r\n// Render empty shell from Layout (for client-only pages)\r\nexport function renderShell() {\r\n const seoHead = generateSeoHead({});\r\n let html = renderToString(<Layout>{null}</Layout>);\r\n if (html.includes('</head>')) {\r\n html = html.replace('</head>', seoHead + '</head>');\r\n }\r\n return html;\r\n}\r\n\r\n// Render shell WITH metadata for client-only pages that have metadata exports\r\n// This enables SEO pre-rendering even for pages without \"static\" directive\r\nexport function renderShellWithMetadata(metadata) {\r\n const seoHead = generateSeoHead(metadata);\r\n let html = renderToString(<Layout>{null}</Layout>);\r\n if (html.includes('</head>')) {\r\n html = html.replace('</head>', seoHead + '</head>');\r\n }\r\n return html;\r\n}\r\n\r\n// Re-export loadRoute so it can be used during SSG to extract metadata from any route\r\nexport { loadRoute };`;\r\n const result = await transformWithEsbuild(code, 'olova-server.tsx', {\r\n loader: 'tsx',\r\n jsx: 'automatic',\r\n });\r\n return result.code;\r\n }\r\n }\r\n }\r\n}\r\n","import { type Plugin } from 'vite';\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport { generateOlovaHydration, generateJsonLd } from './hydration';\r\n\r\n// =============================================================================\r\n// VIRTUAL HTML PLUGIN - Generates HTML dynamically (no index.html needed)\r\n// =============================================================================\r\nexport function virtualHtmlPlugin(): Plugin {\r\n const htmlTemplate = `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n <title>My Framework</title>\r\n </head>\r\n <body>\r\n <div id=\"root\"></div>\r\n <script type=\"module\">\r\n import '/olova/client';\r\n </script>\r\n </body>\r\n</html>`;\r\n\r\n return {\r\n name: 'olova-virtual-html',\r\n enforce: 'pre',\r\n // Handle virtual index.html resolution for build\r\n resolveId(id: string) {\r\n if (id === 'index.html' || id === 'virtual:index.html' || id === 'olova.html') {\r\n return 'olova.html';\r\n }\r\n },\r\n load(id: string) {\r\n if (id === 'olova.html' || id === 'virtual:index.html') {\r\n return htmlTemplate;\r\n }\r\n },\r\n // Serve HTML for all routes in dev mode with SSR (like Next.js)\r\n configureServer(server) {\r\n // Helper to check if route file has \"static\" directive or is HTML/MD (always static)\r\n const isStaticRoute = (routePath: string): boolean => {\r\n const srcDir = path.resolve('src');\r\n // Convert route path to file path\r\n let filePath = routePath === '/' ? 'index' : routePath.slice(1);\r\n \r\n // Check for HTML and MD files first (always static)\r\n const staticPaths = [\r\n path.join(srcDir, filePath, 'index.html'),\r\n path.join(srcDir, filePath, 'index.md'),\r\n path.join(srcDir, filePath + '.html'),\r\n path.join(srcDir, filePath + '.md'),\r\n ];\r\n \r\n for (const p of staticPaths) {\r\n if (fs.existsSync(p)) {\r\n return true; // HTML and MD are always static\r\n }\r\n }\r\n \r\n // Check for TSX/JSX files with \"static\" directive\r\n const possiblePaths = [\r\n path.join(srcDir, filePath, 'index.tsx'),\r\n path.join(srcDir, filePath, 'index.jsx'),\r\n path.join(srcDir, filePath + '.tsx'),\r\n path.join(srcDir, filePath + '.jsx'),\r\n path.join(srcDir, 'App.tsx'),\r\n path.join(srcDir, 'App.jsx'),\r\n ];\r\n \r\n for (const p of possiblePaths) {\r\n if (fs.existsSync(p)) {\r\n const content = fs.readFileSync(p, 'utf-8');\r\n const firstLine = content.trim().split('\\n')[0].trim();\r\n return firstLine === '\"static\"' || firstLine === \"'static'\";\r\n }\r\n }\r\n return false;\r\n };\r\n \r\n // Return a function to run after other middlewares\r\n return () => {\r\n server.middlewares.use(async (req, res, next) => {\r\n const url = req.url || '/';\r\n \r\n // Only handle requests that accept HTML\r\n const accept = req.headers.accept || '';\r\n if (!accept.includes('text/html')) {\r\n return next();\r\n }\r\n \r\n // Skip Vite internal routes and assets\r\n if (url.startsWith('/@') || url.startsWith('/__') || url.startsWith('/node_modules')) {\r\n return next();\r\n }\r\n \r\n // Skip if it has a file extension (assets, scripts, etc.)\r\n if (/\\.\\w+$/.test(url) && !url.endsWith('.html')) {\r\n return next();\r\n }\r\n \r\n const routePath = url.split('?')[0];\r\n const shouldSSR = isStaticRoute(routePath);\r\n \r\n try {\r\n if (shouldSSR) {\r\n // SSR for static routes\r\n const { render } = await server.ssrLoadModule('olova/server');\r\n const { html: ssrHtml, hydrationData } = await render(routePath);\r\n \r\n let fullHtml = ssrHtml;\r\n \r\n // Add hydration data script\r\n const hydrationScript = `<script>window.__OLOVA_DATA__ = ${JSON.stringify(hydrationData)};</script>`;\r\n fullHtml = fullHtml.replace('</body>', `${hydrationScript}\\n</body>`);\r\n \r\n // Add client entry script for hydration\r\n const clientScript = `<script type=\"module\" src=\"/olova/client\"></script>`;\r\n fullHtml = fullHtml.replace('</body>', `${clientScript}\\n</body>`);\r\n \r\n // Add Olova Flight scripts (Next.js-style self.__olova_f)\r\n const devBuildId = 'dev-' + Date.now().toString(36);\r\n const flightScripts = generateOlovaHydration({\r\n route: routePath,\r\n metadata: hydrationData.metadata,\r\n params: hydrationData.params,\r\n chunks: []\r\n }, devBuildId);\r\n fullHtml = fullHtml.replace('</body>', `${flightScripts}</body>`);\r\n \r\n // Add JSON-LD structured data for SEO in dev mode\r\n const jsonLdScript = generateJsonLd({ route: routePath, metadata: hydrationData.metadata });\r\n fullHtml = fullHtml.replace('</head>', `${jsonLdScript}</head>`);\r\n \r\n // Transform through Vite's pipeline for HMR\r\n const html = await server.transformIndexHtml(url, fullHtml);\r\n \r\n res.setHeader('Content-Type', 'text/html');\r\n res.statusCode = 200;\r\n res.end(html);\r\n } else {\r\n // Client-only rendering WITH metadata pre-rendering for SEO\r\n // Even client-only pages should have their metadata in the HTML\r\n const { renderShellWithMetadata } = await server.ssrLoadModule('olova/server');\r\n const { loadRoute: clientLoadRoute } = await server.ssrLoadModule('olova/router');\r\n \r\n let pageMetadata = {};\r\n try {\r\n // Try to load the route to get metadata\r\n const result = await clientLoadRoute(routePath);\r\n if (result && result.metadata) {\r\n pageMetadata = result.metadata;\r\n }\r\n } catch (e) {\r\n // Continue with empty metadata if extraction fails\r\n }\r\n \r\n // Use shell with metadata for SEO\r\n let fullHtml = renderShellWithMetadata(pageMetadata);\r\n \r\n // Add client entry script\r\n const clientScript = `<script type=\"module\" src=\"/olova/client\"></script>`;\r\n fullHtml = fullHtml.replace('</body>', `${clientScript}\\n</body>`);\r\n \r\n // Add Olova Flight scripts (Next.js-style self.__olova_f)\r\n const devBuildId = 'dev-' + Date.now().toString(36);\r\n const flightScripts = generateOlovaHydration({\r\n route: routePath,\r\n metadata: pageMetadata,\r\n chunks: []\r\n }, devBuildId);\r\n fullHtml = fullHtml.replace('</body>', `${flightScripts}</body>`);\r\n \r\n // Add JSON-LD structured data for SEO in dev mode\r\n const jsonLdScript = generateJsonLd({ route: routePath, metadata: pageMetadata });\r\n fullHtml = fullHtml.replace('</head>', `${jsonLdScript}</head>`);\r\n \r\n const html = await server.transformIndexHtml(url, fullHtml);\r\n res.setHeader('Content-Type', 'text/html');\r\n res.statusCode = 200;\r\n res.end(html);\r\n }\r\n } catch (e) {\r\n console.error('[Olova] Error:', e);\r\n // Fallback to client-only rendering on error\r\n try {\r\n const html = await server.transformIndexHtml(url, htmlTemplate);\r\n res.setHeader('Content-Type', 'text/html');\r\n res.statusCode = 200;\r\n res.end(html);\r\n } catch (e2) {\r\n next(e2);\r\n }\r\n }\r\n });\r\n };\r\n }\r\n }\r\n}\r\n","// =============================================================================\r\n// OLOVA HYDRATION SYSTEM\r\n// Implements \"Flight\" format for efficient client hydration\r\n// \r\n\r\n\r\nexport interface OlovaHydrationData {\r\n route: string;\r\n metadata?: Record<string, unknown>;\r\n params?: Record<string, string>;\r\n chunks?: string[];\r\n isStatic?: boolean;\r\n}\r\n\r\n// Flight data types for streaming\r\ntype FlightDataType = \r\n | 'M' // Metadata\r\n | 'T' // Component Tree\r\n | 'R' // Route info\r\n | 'P' // Params\r\n | 'A' // Assets/Chunks\r\n | 'S' // State\r\n | 'D' // Structured Data (Schema.org/JSON-LD)\r\n | 'H' // Hints (prefetch, preload)\r\n | 'E'; // End marker\r\n\r\ninterface FlightChunk {\r\n type: FlightDataType;\r\n data: unknown;\r\n}\r\n\r\nexport function generateOlovaHydration(data: OlovaHydrationData, buildId: string): string {\r\n const meta = (data.metadata || {}) as Record<string, unknown>;\r\n const scripts: string[] = [];\r\n \r\n // Initialize the flight array (like Next.js's self.__next_f)\r\n scripts.push(`<script>self.__olova_f=self.__olova_f||[];function _oF(d){self.__olova_f.push(d)}</script>`);\r\n \r\n // ==========================================================================\r\n // CHUNK 0: Route Information (Critical for navigation)\r\n // ==========================================================================\r\n const routeChunk: FlightChunk = {\r\n type: 'R',\r\n data: {\r\n path: data.route,\r\n params: data.params || {},\r\n pattern: data.route === '/' ? '/' : data.route.replace(/\\/[^/]+$/, '/:slug'),\r\n isStatic: data.isStatic ?? true,\r\n buildId: buildId\r\n }\r\n };\r\n scripts.push(`<script>_oF([0,\"${routeChunk.type}\",${JSON.stringify(routeChunk.data)}])</script>`);\r\n \r\n // ==========================================================================\r\n // CHUNK 1: Metadata (SEO Critical - must be early)\r\n // ==========================================================================\r\n const metadataChunk: FlightChunk = {\r\n type: 'M',\r\n data: {\r\n title: meta.title || 'Olova App',\r\n description: meta.description || '',\r\n keywords: Array.isArray(meta.keywords) ? meta.keywords : [],\r\n robots: meta.robots || 'index, follow',\r\n canonical: meta.canonical || null,\r\n og: {\r\n type: 'website',\r\n locale: 'en_US',\r\n ...((meta.openGraph as object) || {})\r\n },\r\n twitter: {\r\n card: 'summary_large_image',\r\n ...((meta.twitter as object) || {})\r\n }\r\n }\r\n };\r\n scripts.push(`<script>_oF([1,\"${metadataChunk.type}\",${JSON.stringify(metadataChunk.data)}])</script>`);\r\n \r\n // ==========================================================================\r\n // CHUNK 2: Component Tree (For React reconciliation)\r\n // ==========================================================================\r\n const pageName = data.route === '/' \r\n ? 'HomePage' \r\n : data.route.slice(1).split('/').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('') + 'Page';\r\n \r\n const treeChunk: FlightChunk = {\r\n type: 'T',\r\n data: {\r\n layout: 'RootLayout',\r\n page: pageName,\r\n template: null,\r\n loading: null,\r\n error: null,\r\n notFound: null\r\n }\r\n };\r\n scripts.push(`<script>_oF([2,\"${treeChunk.type}\",${JSON.stringify(treeChunk.data)}])</script>`);\r\n \r\n // ==========================================================================\r\n // CHUNK 3: Structured Data (JSON-LD for SEO boost)\r\n // ==========================================================================\r\n const structuredData: FlightChunk = {\r\n type: 'D',\r\n data: [\r\n {\r\n '@context': 'https://schema.org',\r\n '@type': 'WebPage',\r\n name: meta.title || 'Olova App',\r\n description: meta.description || '',\r\n url: data.route\r\n },\r\n {\r\n '@context': 'https://schema.org',\r\n '@type': 'WebApplication',\r\n name: 'Olova',\r\n applicationCategory: 'WebApplication',\r\n operatingSystem: 'Any'\r\n }\r\n ]\r\n };\r\n scripts.push(`<script>_oF([3,\"${structuredData.type}\",${JSON.stringify(structuredData.data)}])</script>`);\r\n \r\n // ==========================================================================\r\n // CHUNK 4: Assets for prefetching (Performance optimization)\r\n // ==========================================================================\r\n const assetsChunk: FlightChunk = {\r\n type: 'A',\r\n data: {\r\n chunks: data.chunks || [],\r\n styles: [],\r\n // Prefetch hints for next likely navigations\r\n prefetch: (data.chunks || []).slice(0, 5)\r\n }\r\n };\r\n scripts.push(`<script>_oF([4,\"${assetsChunk.type}\",${JSON.stringify(assetsChunk.data)}])</script>`);\r\n \r\n // ==========================================================================\r\n // CHUNK 5: Resource Hints (Browser optimization)\r\n // ==========================================================================\r\n const hintsChunk: FlightChunk = {\r\n type: 'H',\r\n data: {\r\n dnsPrefetch: ['fonts.googleapis.com', 'fonts.gstatic.com'],\r\n preconnect: ['https://fonts.googleapis.com', 'https://fonts.gstatic.com'],\r\n modulePreload: (data.chunks || []).slice(0, 3)\r\n }\r\n };\r\n scripts.push(`<script>_oF([5,\"${hintsChunk.type}\",${JSON.stringify(hintsChunk.data)}])</script>`);\r\n \r\n // ==========================================================================\r\n // CHUNK 6: Hydration State (Final - marks ready)\r\n // ==========================================================================\r\n const stateChunk: FlightChunk = {\r\n type: 'S',\r\n data: {\r\n hydrated: false,\r\n streaming: false,\r\n ready: true,\r\n timestamp: Date.now(),\r\n version: '1.0.0',\r\n buildId: buildId\r\n }\r\n };\r\n scripts.push(`<script>_oF([6,\"${stateChunk.type}\",${JSON.stringify(stateChunk.data)}])</script>`);\r\n \r\n // ==========================================================================\r\n // END MARKER: Signals all chunks are delivered\r\n // ==========================================================================\r\n scripts.push(`<script>_oF([7,\"E\",null])</script>`);\r\n \r\n // ==========================================================================\r\n // GLOBAL $OLOVA OBJECT: Easy access to hydration data (backward compatible)\r\n // ==========================================================================\r\n const globalPayload = {\r\n $route: routeChunk.data,\r\n $meta: metadataChunk.data,\r\n $tree: treeChunk.data,\r\n $schema: structuredData.data,\r\n $assets: assetsChunk.data,\r\n $hints: hintsChunk.data,\r\n $state: stateChunk.data,\r\n $build: {\r\n id: buildId,\r\n version: '1.0.0',\r\n timestamp: Date.now(),\r\n env: 'production'\r\n }\r\n };\r\n scripts.push(`<script>$OLOVA=${JSON.stringify(globalPayload)}</script>`);\r\n \r\n return scripts.join('');\r\n}\r\n\r\n/**\r\n * Generate JSON-LD structured data script for SEO\r\n * This is injected into <head> for search engine crawlers\r\n */\r\nexport function generateJsonLd(data: OlovaHydrationData): string {\r\n const meta = (data.metadata || {}) as Record<string, unknown>;\r\n \r\n const jsonLd = {\r\n '@context': 'https://schema.org',\r\n '@graph': [\r\n {\r\n '@type': 'WebPage',\r\n '@id': data.route,\r\n name: meta.title || 'Olova App',\r\n description: meta.description || '',\r\n url: data.route,\r\n isPartOf: {\r\n '@type': 'WebSite',\r\n name: 'Olova App'\r\n }\r\n },\r\n {\r\n '@type': 'BreadcrumbList',\r\n itemListElement: data.route.split('/').filter(Boolean).map((segment, index, arr) => ({\r\n '@type': 'ListItem',\r\n position: index + 1,\r\n name: segment.charAt(0).toUpperCase() + segment.slice(1),\r\n item: '/' + arr.slice(0, index + 1).join('/')\r\n }))\r\n }\r\n ]\r\n };\r\n \r\n return `<script type=\"application/ld+json\">${JSON.stringify(jsonLd)}</script>`;\r\n}\r\n\r\n/**\r\n * Parse flight data from the page (client-side utility)\r\n * Use this to access hydration data in your components\r\n */\r\nexport function parseFlightData(): Record<string, unknown> | null {\r\n // Check if we're in a browser environment\r\n if (typeof globalThis === 'undefined' || typeof (globalThis as Record<string, unknown>).document === 'undefined') {\r\n return null;\r\n }\r\n \r\n const flightArray = ((globalThis as Record<string, unknown>).__olova_f) as unknown[] | undefined;\r\n if (!flightArray) return null;\r\n \r\n const result: Record<string, unknown> = {};\r\n const typeMap: Record<FlightDataType, string> = {\r\n 'M': '$meta',\r\n 'T': '$tree', \r\n 'R': '$route',\r\n 'P': '$params',\r\n 'A': '$assets',\r\n 'S': '$state',\r\n 'D': '$schema',\r\n 'H': '$hints',\r\n 'E': '$end'\r\n };\r\n \r\n for (const chunk of flightArray) {\r\n if (Array.isArray(chunk) && chunk.length >= 3) {\r\n const [_index, type, data] = chunk;\r\n const key = typeMap[type as FlightDataType];\r\n if (key && key !== '$end') {\r\n result[key] = data;\r\n }\r\n }\r\n }\r\n \r\n return result;\r\n}\r\n","import { type Plugin, build } from 'vite';\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport { pathToFileURL } from 'url';\r\nimport { \r\n minifyHtml, \r\n generateBuildId, \r\n generateResourceHints, \r\n generateCriticalCSS, \r\n generatePerformanceMeta, \r\n generateServiceWorkerScript, \r\n generateServiceWorkerContent \r\n} from './utils';\r\nimport { generateOlovaHydration, generateJsonLd } from './hydration';\r\n\r\n// =============================================================================\r\n// TERMINAL STYLING - Next.js-inspired console output\r\n// =============================================================================\r\nconst colors = {\r\n reset: '\\x1b[0m',\r\n bold: '\\x1b[1m',\r\n dim: '\\x1b[2m',\r\n green: '\\x1b[32m',\r\n cyan: '\\x1b[36m',\r\n yellow: '\\x1b[33m',\r\n magenta: '\\x1b[35m',\r\n blue: '\\x1b[34m',\r\n red: '\\x1b[31m',\r\n white: '\\x1b[37m',\r\n gray: '\\x1b[90m',\r\n bgGreen: '\\x1b[42m',\r\n bgCyan: '\\x1b[46m',\r\n bgMagenta: '\\x1b[45m',\r\n};\r\n\r\nconst symbols = {\r\n success: '✓',\r\n arrow: '→',\r\n bullet: '○',\r\n filled: '●',\r\n lambda: 'λ',\r\n static: '○',\r\n ssr: '●',\r\n info: 'ℹ',\r\n};\r\n\r\n// Format milliseconds to human readable\r\nfunction formatTime(ms: number): string {\r\n if (ms < 1) return '<1ms';\r\n if (ms < 10) return `${ms.toFixed(1)}ms`;\r\n if (ms < 1000) return `${Math.round(ms)}ms`;\r\n if (ms < 60000) return `${(ms / 1000).toFixed(2)}s`;\r\n const mins = Math.floor(ms / 60000);\r\n const secs = Math.round((ms % 60000) / 1000);\r\n return `${mins}m ${secs}s`;\r\n}\r\n\r\n// Format bytes to human readable\r\nfunction formatBytes(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} kB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\r\n}\r\n\r\n// Logger with Next.js-style formatting\r\nconst logger = {\r\n header: (text: string) => {\r\n console.log(`\\n${colors.bold}${colors.white}${text}${colors.reset}`);\r\n },\r\n \r\n info: (text: string) => {\r\n console.log(`${colors.cyan}${symbols.info}${colors.reset} ${text}`);\r\n },\r\n \r\n success: (text: string) => {\r\n console.log(`${colors.green}${symbols.success}${colors.reset} ${text}`);\r\n },\r\n \r\n route: (route: string, type: 'static' | 'ssr' | 'isr', size?: number, time?: number) => {\r\n const symbol = type === 'static' ? symbols.static : symbols.ssr;\r\n const color = type === 'static' ? colors.white : colors.magenta;\r\n const sizeStr = size ? ` ${colors.dim}${formatBytes(size)}${colors.reset}` : '';\r\n const timeStr = time ? ` ${colors.gray}(${formatTime(time)})${colors.reset}` : '';\r\n console.log(`${color}${symbol}${colors.reset} ${route}${sizeStr}${timeStr}`);\r\n },\r\n \r\n step: (step: string, time?: number) => {\r\n const timeStr = time ? ` ${colors.gray}${formatTime(time)}${colors.reset}` : '';\r\n console.log(` ${colors.dim}${symbols.arrow}${colors.reset} ${step}${timeStr}`);\r\n },\r\n \r\n buildComplete: (totalRoutes: number, staticRoutes: number, totalTime: number) => {\r\n console.log('');\r\n console.log(`${colors.bold}${colors.green}${symbols.success} Build completed!${colors.reset}`);\r\n console.log('');\r\n console.log(` ${colors.dim}Routes:${colors.reset} ${totalRoutes} total`);\r\n console.log(` ${colors.dim}Static:${colors.reset} ${staticRoutes} prerendered`);\r\n console.log(` ${colors.dim}Time:${colors.reset} ${formatTime(totalTime)}`);\r\n console.log('');\r\n },\r\n \r\n legend: () => {\r\n console.log(`${colors.dim}${symbols.static} Static${colors.reset} ${colors.dim}${symbols.ssr} SSR${colors.reset} ${colors.dim}λ ISR${colors.reset}`);\r\n },\r\n \r\n banner: (buildId: string) => {\r\n console.log('');\r\n console.log(`${colors.bold}${colors.cyan} ▲ Olova${colors.reset} ${colors.dim}Static Export${colors.reset}`);\r\n console.log(`${colors.dim} Build ID: ${buildId}${colors.reset}`);\r\n console.log('');\r\n },\r\n \r\n error: (text: string) => {\r\n console.log(`${colors.red}✗${colors.reset} ${colors.red}${text}${colors.reset}`);\r\n },\r\n \r\n warn: (text: string) => {\r\n console.log(`${colors.yellow}⚠${colors.reset} ${colors.yellow}${text}${colors.reset}`);\r\n },\r\n};\r\n\r\n// =============================================================================\r\n// SSG PLUGIN - Static Site Generation\r\n// =============================================================================\r\nexport function ssgPlugin(): Plugin {\r\n return {\r\n name: 'olova-ssg',\r\n apply: 'build',\r\n config() {\r\n if (process.env.IS_SSG_BUILD) {\r\n return {};\r\n }\r\n return {\r\n build: {\r\n manifest: true,\r\n rollupOptions: {\r\n input: 'index.html'\r\n }\r\n }\r\n }\r\n },\r\n async closeBundle() {\r\n if (process.env.IS_SSG_BUILD) return;\r\n process.env.IS_SSG_BUILD = 'true';\r\n \r\n const totalStartTime = performance.now();\r\n const buildId = generateBuildId();\r\n \r\n // Show banner\r\n logger.banner(buildId);\r\n \r\n // =========================================================\r\n // STEP 1: Build Server Entry\r\n // =========================================================\r\n logger.header('Generating static pages...');\r\n const serverBuildStart = performance.now();\r\n \r\n try {\r\n await build({\r\n configFile: './vite.config.ts',\r\n build: {\r\n ssr: true,\r\n outDir: '.olova/server',\r\n rollupOptions: {\r\n input: 'olova/server',\r\n },\r\n emptyOutDir: true,\r\n reportCompressedSize: false,\r\n },\r\n logLevel: 'silent',\r\n });\r\n logger.step('Server bundle compiled', performance.now() - serverBuildStart);\r\n } catch (e) {\r\n logger.error('SSG Build Failed');\r\n console.error(e);\r\n process.env.IS_SSG_BUILD = '';\r\n return;\r\n } finally {\r\n process.env.IS_SSG_BUILD = '';\r\n }\r\n\r\n // =========================================================\r\n // STEP 2: Scan Routes\r\n // =========================================================\r\n const scanStart = performance.now();\r\n const allRoutes: { route: string, isStatic: boolean, filePath: string }[] = [];\r\n \r\n const scan = (dir: string, base: string = '') => {\r\n if (!fs.existsSync(dir)) return;\r\n const entries = fs.readdirSync(dir, { withFileTypes: true });\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n if (entry.isDirectory()) {\r\n const isRouteGroup = /^\\(.+\\)$/.test(entry.name);\r\n if (isRouteGroup) {\r\n scan(fullPath, base);\r\n } else {\r\n scan(fullPath, `${base}/${entry.name}`);\r\n }\r\n } else {\r\n const ext = path.extname(entry.name);\r\n const supportedExts = ['.tsx', '.jsx', '.html', '.md'];\r\n \r\n if (supportedExts.includes(ext)) {\r\n const nameNoExt = entry.name.replace(/\\.(tsx|jsx|html|md)$/, '');\r\n let route = base;\r\n if (nameNoExt !== 'index' && nameNoExt !== 'App') {\r\n route = `${base}/${nameNoExt}`;\r\n }\r\n if (route === '') route = '/';\r\n if (route.includes('$')) continue;\r\n \r\n if (ext === '.html' || ext === '.md') {\r\n allRoutes.push({ route, isStatic: true, filePath: fullPath });\r\n } else {\r\n const fileContent = fs.readFileSync(fullPath, 'utf-8');\r\n const firstLine = fileContent.trim().split('\\n')[0].trim();\r\n const isStatic = firstLine === '\"static\"' || firstLine === \"'static'\";\r\n allRoutes.push({ route, isStatic, filePath: fullPath });\r\n }\r\n }\r\n }\r\n }\r\n };\r\n scan(path.resolve('src'));\r\n logger.step(`Found ${allRoutes.length} routes`, performance.now() - scanStart);\r\n\r\n // =========================================================\r\n // STEP 3: Load Server Entry\r\n // =========================================================\r\n const serverDir = path.resolve('.olova/server');\r\n let serverFile = fs.readdirSync(serverDir).find(f => \r\n (f === 'server.js' || f.includes('server-entry')) && f.endsWith('.js')\r\n );\r\n if (!serverFile) {\r\n logger.error('Could not find server build artifact');\r\n return;\r\n }\r\n const serverEntryPath = path.join(serverDir, serverFile);\r\n const { render, renderShell, renderShellWithMetadata, loadRoute } = await import(pathToFileURL(serverEntryPath).href);\r\n\r\n // =========================================================\r\n // STEP 4: Prepare Assets\r\n // =========================================================\r\n const assetsStart = performance.now();\r\n const distDir = path.resolve('.olova/dist');\r\n const clientHtmlPath = path.join(distDir, 'olova.html');\r\n \r\n let shellHtml = renderShell();\r\n if (!shellHtml.startsWith('<!DOCTYPE html>')) {\r\n shellHtml = `<!DOCTYPE html>\\n${shellHtml}`;\r\n }\r\n \r\n let template = '';\r\n if (fs.existsSync(clientHtmlPath)) {\r\n template = fs.readFileSync(clientHtmlPath, 'utf-8');\r\n }\r\n\r\n const scripts = template.match(/<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi) || [];\r\n const links = template.match(/<link[\\s\\S]*?>/gi) || [];\r\n \r\n const chunksDir = path.join(distDir, 'pro_olova_static', 'chunks');\r\n let preloadLinks: string[] = [];\r\n if (fs.existsSync(chunksDir)) {\r\n const chunks = fs.readdirSync(chunksDir).filter(f => f.endsWith('.js'));\r\n preloadLinks = chunks.map(chunk => \r\n `<link rel=\"modulepreload\" crossorigin href=\"/pro_olova_static/chunks/${chunk}\" />`\r\n );\r\n }\r\n \r\n const mainScriptMatch = template.match(/src=\"(\\/pro_olova_static\\/olova-[^\"]+\\.js)\"/);\r\n if (mainScriptMatch) {\r\n preloadLinks.unshift(`<link rel=\"modulepreload\" crossorigin href=\"${mainScriptMatch[1]}\" />`);\r\n }\r\n \r\n const chunkList: string[] = [];\r\n if (fs.existsSync(chunksDir)) {\r\n const chunks = fs.readdirSync(chunksDir).filter(f => f.endsWith('.js'));\r\n chunks.forEach(chunk => chunkList.push(`/pro_olova_static/chunks/${chunk}`));\r\n }\r\n \r\n // Performance optimizations\r\n const resourceHints = generateResourceHints();\r\n const criticalCSS = generateCriticalCSS();\r\n const performanceMeta = generatePerformanceMeta();\r\n const swScript = generateServiceWorkerScript();\r\n const performanceHead = [performanceMeta, resourceHints, criticalCSS].join('');\r\n \r\n // Service Worker\r\n const allAssetsForSW = [\r\n '/',\r\n '/index.html',\r\n ...chunkList,\r\n ...links.map(l => l.match(/href=\"([^\"]+)\"/)?.[1]).filter(Boolean) as string[]\r\n ];\r\n const swContent = generateServiceWorkerContent(buildId, allAssetsForSW);\r\n fs.writeFileSync(path.join(distDir, 'sw.js'), swContent);\r\n \r\n const assets = [performanceHead, ...links, ...preloadLinks, ...scripts, swScript].join('\\n');\r\n logger.step(`Assets optimized (${preloadLinks.length} preloads, SW ready)`, performance.now() - assetsStart);\r\n\r\n // =========================================================\r\n // STEP 5: Generate Routes\r\n // =========================================================\r\n console.log('');\r\n logger.header('Route');\r\n logger.legend();\r\n console.log('');\r\n \r\n let staticCount = 0;\r\n const routeResults: { route: string, type: 'static' | 'ssr', size: number, time: number }[] = [];\r\n \r\n for (const { route, isStatic } of allRoutes) {\r\n const routeStart = performance.now();\r\n let finalHtml = '';\r\n \r\n if (isStatic) {\r\n staticCount++;\r\n const { html, hydrationData } = await render(route);\r\n finalHtml = html;\r\n \r\n if (Object.keys(hydrationData.params || {}).length > 0) {\r\n const scriptTag = `<script>window.__OLOVA_DATA__ = ${JSON.stringify(hydrationData)};</script>`;\r\n if (finalHtml.includes('</body>')) {\r\n finalHtml = finalHtml.replace('</body>', `${scriptTag}\\n</body>`);\r\n } else {\r\n finalHtml += `\\n${scriptTag}`;\r\n }\r\n }\r\n\r\n const jsonLdScript = generateJsonLd({ route, metadata: hydrationData.metadata });\r\n \r\n if (finalHtml.includes('</head>')) {\r\n finalHtml = finalHtml.replace('</head>', `${jsonLdScript}${assets}\\n</head>`);\r\n } else {\r\n finalHtml = finalHtml.replace('</body>', `${assets}\\n</body>`);\r\n }\r\n if (!finalHtml.startsWith('<!DOCTYPE html>')) {\r\n finalHtml = `<!DOCTYPE html>\\n${finalHtml}`;\r\n }\r\n\r\n const flightScripts = generateOlovaHydration({\r\n route,\r\n metadata: hydrationData.metadata,\r\n params: hydrationData.params,\r\n chunks: chunkList,\r\n isStatic: true,\r\n }, buildId);\r\n if (finalHtml.includes('</body>')) {\r\n finalHtml = finalHtml.replace('</body>', `${flightScripts}</body>`);\r\n }\r\n\r\n finalHtml = minifyHtml(finalHtml);\r\n\r\n } else {\r\n let pageMetadata = {};\r\n try {\r\n const routeResult = await loadRoute(route);\r\n if (routeResult && routeResult.metadata) {\r\n pageMetadata = routeResult.metadata;\r\n }\r\n } catch (e) {\r\n // Continue with empty metadata\r\n }\r\n \r\n finalHtml = renderShellWithMetadata(pageMetadata);\r\n if (!finalHtml.startsWith('<!DOCTYPE html>')) {\r\n finalHtml = `<!DOCTYPE html>\\n${finalHtml}`;\r\n }\r\n \r\n const jsonLdScript = generateJsonLd({ route, metadata: pageMetadata });\r\n \r\n if (finalHtml.includes('</head>')) {\r\n finalHtml = finalHtml.replace('</head>', `${jsonLdScript}${assets}\\n</head>`);\r\n } else {\r\n finalHtml = finalHtml.replace('</body>', `${assets}\\n</body>`);\r\n }\r\n \r\n const flightScripts = generateOlovaHydration({\r\n route,\r\n metadata: pageMetadata,\r\n chunks: chunkList,\r\n isStatic: false,\r\n }, buildId);\r\n if (finalHtml.includes('</body>')) {\r\n finalHtml = finalHtml.replace('</body>', `${flightScripts}</body>`);\r\n }\r\n \r\n finalHtml = minifyHtml(finalHtml);\r\n }\r\n\r\n const outPath = path.join(distDir, route === '/' ? 'index.html' : `${route}/index.html`);\r\n fs.mkdirSync(path.dirname(outPath), { recursive: true });\r\n fs.writeFileSync(outPath, finalHtml);\r\n \r\n const routeTime = performance.now() - routeStart;\r\n const routeSize = Buffer.byteLength(finalHtml, 'utf8');\r\n routeResults.push({ route, type: isStatic ? 'static' : 'ssr', size: routeSize, time: routeTime });\r\n \r\n logger.route(route, isStatic ? 'static' : 'ssr', routeSize, routeTime);\r\n }\r\n\r\n // =========================================================\r\n // STEP 6: Generate 404.html\r\n // =========================================================\r\n const fallbackPath = path.join(distDir, '404.html');\r\n if (fs.existsSync(clientHtmlPath)) {\r\n fs.copyFileSync(clientHtmlPath, fallbackPath);\r\n }\r\n\r\n // =========================================================\r\n // Final Summary\r\n // =========================================================\r\n const totalTime = performance.now() - totalStartTime;\r\n logger.buildComplete(allRoutes.length, staticCount, totalTime);\r\n \r\n // Output directory info\r\n console.log(`${colors.dim} Output:${colors.reset} .olova/dist`);\r\n console.log('');\r\n }\r\n };\r\n}\r\n","// Helper function to minify HTML (Next.js-style compact output)\r\nexport function minifyHtml(html: string): string {\r\n return html\r\n // Remove HTML comments (but keep conditional comments)\r\n .replace(/<!--(?!\\[if).*?-->/gs, '')\r\n // Collapse multiple whitespace to single space\r\n .replace(/\\s+/g, ' ')\r\n // Remove whitespace between tags\r\n .replace(/> </g, '><')\r\n // Remove whitespace around tags\r\n .replace(/\\s*(<[^>]+>)\\s*/g, '$1')\r\n // Trim\r\n .trim();\r\n}\r\n\r\n// Generate unique build ID for cache busting (like Next.js buildId)\r\nexport function generateBuildId(): string {\r\n return Math.random().toString(36).substring(2, 15) + Date.now().toString(36);\r\n}\r\n\r\nexport function generateResourceHints(): string {\r\n return `\r\n <link rel=\"dns-prefetch\" href=\"//fonts.googleapis.com\">\r\n <link rel=\"dns-prefetch\" href=\"//fonts.gstatic.com\">\r\n <link rel=\"dns-prefetch\" href=\"//cdn.jsdelivr.net\">\r\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" crossorigin>\r\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\r\n `.trim().replace(/\\n\\s+/g, '');\r\n}\r\n\r\n// Generate critical CSS for above-the-fold content (inline in head)\r\nexport function generateCriticalCSS(): string {\r\n return `<style id=\"olova-critical\">\r\n *{box-sizing:border-box;margin:0;padding:0}\r\n html{-webkit-text-size-adjust:100%;line-height:1.5}\r\n body{font-family:system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif}\r\n img,video{max-width:100%;height:auto}\r\n [hidden]{display:none!important}\r\n </style>`.replace(/\\n\\s*/g, '');\r\n}\r\n\r\n// Generate service worker registration script\r\nexport function generateServiceWorkerScript(): string {\r\n return `<script>if('serviceWorker'in navigator){window.addEventListener('load',()=>{navigator.serviceWorker.register('/sw.js').catch(()=>{})})}</script>`;\r\n}\r\n\r\n// Generate service worker file content for offline caching\r\nexport function generateServiceWorkerContent(buildId: string, assets: string[]): string {\r\n return `// Olova Service Worker v${buildId}\r\nconst CACHE_NAME = 'olova-cache-${buildId}';\r\nconst ASSETS = ${JSON.stringify(assets)};\r\n\r\nself.addEventListener('install', (e) => {\r\n e.waitUntil(caches.open(CACHE_NAME).then(cache => cache.addAll(ASSETS)));\r\n self.skipWaiting();\r\n});\r\n\r\nself.addEventListener('activate', (e) => {\r\n e.waitUntil(caches.keys().then(keys => Promise.all(\r\n keys.filter(k => k !== CACHE_NAME).map(k => caches.delete(k))\r\n )));\r\n});\r\n\r\nself.addEventListener('fetch', (e) => {\r\n e.respondWith(caches.match(e.request).then(r => r || fetch(e.request)));\r\n});\r\n`;\r\n}\r\n\r\n// Generate performance meta tags\r\nexport function generatePerformanceMeta(): string {\r\n return `<meta http-equiv=\"x-dns-prefetch-control\" content=\"on\"><meta name=\"color-scheme\" content=\"light dark\">`;\r\n}\r\n","import { type Plugin } from 'vite';\r\nimport fs from 'fs';\r\nimport path from 'path';\r\n\r\n// =============================================================================\r\n// CLEAN URL PLUGIN - Handles clean URLs in preview mode\r\n// =============================================================================\r\nexport function cleanUrlPlugin(): Plugin {\r\n return {\r\n name: 'olova-clean-url',\r\n configurePreviewServer(server) {\r\n // Use middleware that runs BEFORE Vite's static serving\r\n server.middlewares.use((req, res, next) => {\r\n const urlPath = (req.url || '/').split('?')[0];\r\n const distDir = path.resolve('.olova/dist');\r\n \r\n // Handle root path\r\n if (urlPath === '/') {\r\n const indexPath = path.join(distDir, 'index.html');\r\n if (fs.existsSync(indexPath)) {\r\n const content = fs.readFileSync(indexPath, 'utf-8');\r\n res.setHeader('Content-Type', 'text/html');\r\n res.end(content);\r\n return;\r\n }\r\n }\r\n \r\n // Skip if it has a file extension (assets, scripts, etc.)\r\n if (urlPath.includes('.')) return next();\r\n \r\n // Check if /route/index.html exists (clean URLs)\r\n const indexPath = path.join(distDir, urlPath, 'index.html');\r\n if (fs.existsSync(indexPath)) {\r\n const content = fs.readFileSync(indexPath, 'utf-8');\r\n res.setHeader('Content-Type', 'text/html');\r\n res.end(content);\r\n return;\r\n }\r\n \r\n next();\r\n });\r\n }\r\n };\r\n}\r\n","import { type Plugin } from \"vite\";\r\nimport fs from \"fs\";\r\nimport path from \"path\";\r\n\r\n// =============================================================================\r\n// AUTO GENERATE PLUGIN - Auto-generates boilerplate code for new route files\r\n// =============================================================================\r\n\r\n/**\r\n * Converts a folder name to PascalCase for component naming\r\n */\r\nfunction toPascalCase(str: string): string {\r\n // Remove $ prefix for dynamic routes\r\n const cleanStr = str.replace(/^\\$/, \"\");\r\n\r\n return cleanStr\r\n .split(/[-_]/)\r\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\r\n .join(\"\");\r\n}\r\n\r\n/**\r\n * Generates the boilerplate code for a new route component\r\n */\r\nfunction generateBoilerplate(folderName: string, isDynamic: boolean): string {\r\n const componentName = toPascalCase(folderName);\r\n\r\n if (isDynamic) {\r\n // Dynamic route with useParams\r\n const paramName = folderName.replace(/^\\$/, \"\");\r\n return `import { useParams } from '../../route';\r\n\r\nexport default function ${componentName}() {\r\n const { ${paramName} } = useParams();\r\n return (\r\n <div>\r\n <h1>${componentName} Page</h1>\r\n <p>{${paramName}}</p>\r\n </div>\r\n );\r\n}\r\n`;\r\n }\r\n\r\n // Regular static route\r\n return `export default function ${componentName}() {\r\n return (\r\n <div>\r\n <h1>${componentName} Page</h1>\r\n <p>Welcome to ${componentName}</p>\r\n </div>\r\n );\r\n}\r\n`;\r\n}\r\n\r\nexport function autoGeneratePlugin(): Plugin {\r\n let srcDir: string;\r\n\r\n return {\r\n name: \"olova-auto-generate\",\r\n\r\n configResolved(config) {\r\n srcDir = path.resolve(config.root, \"src\");\r\n },\r\n\r\n configureServer(server) {\r\n console.log(\r\n \"\\x1b[36m[olova] Auto-generate plugin active - watching for new route files\\x1b[0m\"\r\n );\r\n\r\n // Watch for file creation events\r\n server.watcher.on(\"add\", (filePath: string) => {\r\n // Normalize path for Windows compatibility\r\n const normalizedPath = path.normalize(filePath);\r\n const normalizedSrcDir = path.normalize(srcDir);\r\n\r\n // Only process .tsx or .jsx files\r\n const ext = path.extname(normalizedPath);\r\n if (ext !== \".tsx\" && ext !== \".jsx\") {\r\n return;\r\n }\r\n\r\n // Check if file is inside src directory\r\n if (!normalizedPath.startsWith(normalizedSrcDir)) {\r\n return;\r\n }\r\n\r\n // Get the file name without extension\r\n const fileName = path.basename(normalizedPath, ext);\r\n\r\n // Only auto-generate for index files\r\n if (fileName !== \"index\") {\r\n return;\r\n }\r\n\r\n // Get the folder name\r\n const folderPath = path.dirname(normalizedPath);\r\n const folderName = path.basename(folderPath);\r\n\r\n // Skip root src folder and route groups (folders starting with parentheses)\r\n if (folderName === \"src\" || folderName.startsWith(\"(\")) {\r\n return;\r\n }\r\n\r\n // Check if file is empty or very small (just created)\r\n try {\r\n fs.statSync(normalizedPath);\r\n const content = fs.readFileSync(normalizedPath, \"utf-8\");\r\n\r\n // Only generate if file is empty or has minimal content\r\n if (content.trim().length > 10) {\r\n return;\r\n }\r\n } catch (err) {\r\n // File might not exist yet or other error, skip\r\n return;\r\n }\r\n\r\n // Check if it's a dynamic route (folder starts with $)\r\n const isDynamic = folderName.startsWith(\"$\");\r\n\r\n // Generate the boilerplate\r\n const boilerplate = generateBoilerplate(folderName, isDynamic);\r\n\r\n // Write the boilerplate to the file\r\n try {\r\n fs.writeFileSync(normalizedPath, boilerplate, \"utf-8\");\r\n console.log(\r\n `\\x1b[32m✓ [olova] Auto-generated: ${folderName}/index${ext}\\x1b[0m`\r\n );\r\n } catch (err) {\r\n console.error(\r\n `\\x1b[31m✗ [olova] Failed to write boilerplate:\\x1b[0m`,\r\n err\r\n );\r\n }\r\n });\r\n },\r\n };\r\n}\r\n","import { type Plugin, type ViteDevServer } from 'vite';\r\nimport path from 'path';\r\n\r\n// =============================================================================\r\n// PROACTIVE ERROR CHECKER - Validates all files on save like Next.js\r\n// This makes Vite's error overlay show instantly for ANY file with an error\r\n// =============================================================================\r\n\r\nexport function proactiveErrorPlugin(): Plugin {\r\n return {\r\n name: 'olova-proactive-error',\r\n enforce: 'post',\r\n\r\n configureServer(devServer: ViteDevServer) {\r\n const srcDir = path.resolve(process.cwd(), 'src');\r\n\r\n // Function to validate a file and send error to Vite's overlay\r\n const validateFile = async (filePath: string) => {\r\n if (!filePath.startsWith(srcDir)) return;\r\n if (!/\\.(tsx?|jsx?)$/.test(filePath)) return;\r\n\r\n const relativePath = path.relative(srcDir, filePath);\r\n console.log('\\x1b[36m[olova]\\x1b[0m Checking:', relativePath);\r\n\r\n try {\r\n // Convert file path to URL format for Vite\r\n const url = '/' + path.relative(process.cwd(), filePath).replace(/\\\\/g, '/');\r\n \r\n // Proactively transform the file\r\n await devServer.transformRequest(url);\r\n \r\n console.log('\\x1b[32m[olova]\\x1b[0m ✓', relativePath, 'OK');\r\n } catch (err: any) {\r\n console.log('\\x1b[31m[olova]\\x1b[0m ✗', relativePath);\r\n \r\n // Send error to Vite's error overlay via WebSocket\r\n // This is the official way Vite shows errors in the overlay\r\n devServer.ws.send({\r\n type: 'error',\r\n err: {\r\n message: err.message || String(err),\r\n stack: err.stack || '',\r\n id: err.id || filePath,\r\n frame: err.frame || '',\r\n plugin: err.plugin || 'olova',\r\n loc: err.loc || undefined,\r\n },\r\n });\r\n }\r\n };\r\n\r\n // Watch for file changes\r\n devServer.watcher.on('change', async (filePath: string) => {\r\n // Small delay to ensure file is fully written\r\n await new Promise(r => setTimeout(r, 50));\r\n await validateFile(filePath);\r\n });\r\n\r\n // Also check new files when they're added\r\n devServer.watcher.on('add', async (filePath: string) => {\r\n // Wait for file to be fully written\r\n await new Promise(r => setTimeout(r, 100));\r\n await validateFile(filePath);\r\n });\r\n },\r\n };\r\n}\r\n","import { type Plugin } from 'vite';\r\n\r\n// Import all plugins from separate files\r\nexport { configPlugin } from './config';\r\nexport { routerPlugin } from './router';\r\nexport { frameworkPlugin } from './framework';\r\nexport { virtualHtmlPlugin } from './virtual-html';\r\nexport { ssgPlugin } from './ssg';\r\nexport { cleanUrlPlugin } from './clean-url';\r\nexport { autoGeneratePlugin } from './auto-generate';\r\nexport { proactiveErrorPlugin } from './error-overlay';\r\n\r\n// Import all plugins for the combined array\r\nimport { configPlugin } from './config';\r\nimport { routerPlugin } from './router';\r\nimport { frameworkPlugin } from './framework';\r\nimport { virtualHtmlPlugin } from './virtual-html';\r\nimport { ssgPlugin } from './ssg';\r\nimport { cleanUrlPlugin } from './clean-url';\r\nimport { autoGeneratePlugin } from './auto-generate';\r\nimport { proactiveErrorPlugin } from './error-overlay';\r\n\r\n// =============================================================================\r\n// EXPORT ALL PLUGINS AS A SINGLE ARRAY\r\n// =============================================================================\r\nexport function olovaPlugins(): Plugin[] {\r\n return [\r\n configPlugin(), // Must be first - creates .olova folder and sets config\r\n routerPlugin(),\r\n frameworkPlugin(),\r\n virtualHtmlPlugin(),\r\n ssgPlugin(),\r\n cleanUrlPlugin(),\r\n autoGeneratePlugin(), // Auto-generates boilerplate for new route files\r\n proactiveErrorPlugin(), // Checks all files on save for instant error detection\r\n ];\r\n}\r\n","// =============================================================================\r\n// TERMINAL STYLING UTILITIES\r\n// Next.js-inspired console output for professional CLI experience\r\n// =============================================================================\r\n\r\n// ANSI color codes for terminal styling\r\nexport const colors = {\r\n // Reset\r\n reset: '\\x1b[0m',\r\n \r\n // Styles\r\n bold: '\\x1b[1m',\r\n dim: '\\x1b[2m',\r\n italic: '\\x1b[3m',\r\n underline: '\\x1b[4m',\r\n \r\n // Foreground colors\r\n black: '\\x1b[30m',\r\n red: '\\x1b[31m',\r\n green: '\\x1b[32m',\r\n yellow: '\\x1b[33m',\r\n blue: '\\x1b[34m',\r\n magenta: '\\x1b[35m',\r\n cyan: '\\x1b[36m',\r\n white: '\\x1b[37m',\r\n gray: '\\x1b[90m',\r\n \r\n // Background colors\r\n bgBlack: '\\x1b[40m',\r\n bgRed: '\\x1b[41m',\r\n bgGreen: '\\x1b[42m',\r\n bgYellow: '\\x1b[43m',\r\n bgBlue: '\\x1b[44m',\r\n bgMagenta: '\\x1b[45m',\r\n bgCyan: '\\x1b[46m',\r\n bgWhite: '\\x1b[47m',\r\n};\r\n\r\n// Symbols for terminal output\r\nexport const symbols = {\r\n success: '✓',\r\n error: '✗',\r\n warning: '⚠',\r\n info: 'ℹ',\r\n arrow: '→',\r\n arrowRight: '➜',\r\n bullet: '○',\r\n filled: '●',\r\n lambda: 'λ',\r\n triangle: '▲',\r\n square: '■',\r\n diamond: '◆',\r\n star: '★',\r\n check: '✔',\r\n cross: '✖',\r\n pointer: '❯',\r\n};\r\n\r\n// Format time in human readable format\r\nexport function formatTime(ms: number): string {\r\n if (ms < 1) return '<1ms';\r\n if (ms < 10) return `${ms.toFixed(1)}ms`;\r\n if (ms < 1000) return `${Math.round(ms)}ms`;\r\n if (ms < 60000) return `${(ms / 1000).toFixed(2)}s`;\r\n const mins = Math.floor(ms / 60000);\r\n const secs = Math.round((ms % 60000) / 1000);\r\n return `${mins}m ${secs}s`;\r\n}\r\n\r\n// Format bytes in human readable format\r\nexport function formatBytes(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'kB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;\r\n}\r\n\r\n// Logger utility with Next.js-style formatting\r\nexport const logger = {\r\n // Print banner\r\n banner: (name: string, version: string = '1.0.0') => {\r\n console.log('');\r\n console.log(` ${colors.bold}${colors.cyan}${symbols.triangle} ${name}${colors.reset} ${colors.dim}v${version}${colors.reset}`);\r\n console.log('');\r\n },\r\n \r\n // Print header\r\n header: (text: string) => {\r\n console.log(`\\n${colors.bold}${colors.white}${text}${colors.reset}`);\r\n },\r\n \r\n // Info message\r\n info: (text: string) => {\r\n console.log(`${colors.cyan}${symbols.info}${colors.reset} ${text}`);\r\n },\r\n \r\n // Success message\r\n success: (text: string, time?: number) => {\r\n const timeStr = time !== undefined ? ` ${colors.dim}${formatTime(time)}${colors.reset}` : '';\r\n console.log(`${colors.green}${symbols.success}${colors.reset} ${text}${timeStr}`);\r\n },\r\n \r\n // Error message\r\n error: (text: string) => {\r\n console.log(`${colors.red}${symbols.error}${colors.reset} ${colors.red}${text}${colors.reset}`);\r\n },\r\n \r\n // Warning message\r\n warn: (text: string) => {\r\n console.log(`${colors.yellow}${symbols.warning}${colors.reset} ${colors.yellow}${text}${colors.reset}`);\r\n },\r\n \r\n // Step in a process\r\n step: (text: string, time?: number) => {\r\n const timeStr = time !== undefined ? ` ${colors.gray}${formatTime(time)}${colors.reset}` : '';\r\n console.log(` ${colors.dim}${symbols.arrow}${colors.reset} ${text}${timeStr}`);\r\n },\r\n \r\n // Route log (for SSG)\r\n route: (route: string, type: 'static' | 'ssr' | 'isr', size?: number, time?: number) => {\r\n const symbol = type === 'static' ? symbols.bullet : type === 'ssr' ? symbols.filled : symbols.lambda;\r\n const color = type === 'static' ? colors.white : type === 'ssr' ? colors.magenta : colors.cyan;\r\n const sizeStr = size ? ` ${colors.dim}${formatBytes(size)}${colors.reset}` : '';\r\n const timeStr = time ? ` ${colors.gray}(${formatTime(time)})${colors.reset}` : '';\r\n console.log(`${color}${symbol}${colors.reset} ${route}${sizeStr}${timeStr}`);\r\n },\r\n \r\n // Indent text \r\n indent: (text: string, level: number = 1) => {\r\n console.log(`${' '.repeat(level)}${text}`);\r\n },\r\n \r\n // Empty line\r\n newline: () => console.log(''),\r\n \r\n // Dim text\r\n dim: (text: string) => `${colors.dim}${text}${colors.reset}`,\r\n \r\n // Bold text \r\n bold: (text: string) => `${colors.bold}${text}${colors.reset}`,\r\n \r\n // Colored text\r\n cyan: (text: string) => `${colors.cyan}${text}${colors.reset}`,\r\n green: (text: string) => `${colors.green}${text}${colors.reset}`,\r\n yellow: (text: string) => `${colors.yellow}${text}${colors.reset}`,\r\n red: (text: string) => `${colors.red}${text}${colors.reset}`,\r\n magenta: (text: string) => `${colors.magenta}${text}${colors.reset}`,\r\n};\r\n\r\n// Create a timer for measuring performance\r\nexport function createTimer() {\r\n const start = performance.now();\r\n return {\r\n elapsed: () => performance.now() - start,\r\n format: () => formatTime(performance.now() - start),\r\n };\r\n}\r\n"],"mappings":"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","names":["fs","path","fs","path","path","fs","fs","path","colors","fs","path","fs","path","indexPath","fs","path","path","colors","symbols","formatTime","formatBytes","logger"]}
|