olova 2.0.30 → 2.0.32

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.d.ts CHANGED
@@ -1,6 +1,4 @@
1
- import { Plugin } from 'vite';
2
-
3
- declare function olovaPlugins(): Plugin[];
1
+ declare function olovaPlugins(): any[];
4
2
 
5
3
  declare function minifyHtml(html: string): string;
6
4
  declare function generateBuildId(): string;
package/dist/vite.js CHANGED
@@ -60,6 +60,9 @@ function configPlugin() {
60
60
  if (id.includes("react")) {
61
61
  return "vendor-react";
62
62
  }
63
+ if (id.includes("olova")) {
64
+ return void 0;
65
+ }
63
66
  return "vendor";
64
67
  }
65
68
  }
@@ -76,7 +79,7 @@ function configPlugin() {
76
79
  },
77
80
  // Also configure SSR to handle these modules
78
81
  ssr: {
79
- noExternal: ["olova"]
82
+ noExternal: ["olova", /^virtual:/]
80
83
  }
81
84
  };
82
85
  },
@@ -192,6 +195,7 @@ function routerPlugin() {
192
195
  const supportedExts = [".tsx", ".jsx", ".html", ".md"];
193
196
  if (supportedExts.includes(ext)) {
194
197
  const nameNoExt = entryName.replace(/\.(tsx|jsx|html|md)$/, "");
198
+ if (nameNoExt === "root") continue;
195
199
  let routePath = baseRoute;
196
200
  if (nameNoExt !== "index" && nameNoExt !== "App") {
197
201
  routePath = `${baseRoute}/${nameNoExt}`;
@@ -336,14 +340,13 @@ const path = window.location.pathname;
336
340
  loadRoute(path).then((result) => {
337
341
  const Component = result ? result.module.default : () => <div>404 Not Found</div>;
338
342
  // @ts-ignore
339
- const serverData = window.__OLOVA_DATA__ || {};
343
+ const serverData = window.__OLOVA_DATA__ || window.$OLOVA?.$route || {};
340
344
  const params = serverData.params || (result ? result.params : {});
341
345
  const metadata = serverData.metadata || (result ? result.metadata : undefined);
342
346
 
343
347
  // Framework handles SEO automatically (like Next.js)
344
348
  generateSeoTags(metadata);
345
349
 
346
- const rootElement = document.getElementById('root');
347
350
  const app = (
348
351
  <React.StrictMode>
349
352
  <Layout>
@@ -352,13 +355,17 @@ loadRoute(path).then((result) => {
352
355
  </React.StrictMode>
353
356
  );
354
357
 
355
- if (rootElement && rootElement.innerHTML.trim() !== "") {
356
- console.log("[Olova] Hydrating pre-rendered content");
357
- hydrateRoot(document, app);
358
+ // Always hydrate using the document as root since we always have a shell from SSG
359
+ console.log("[Olova] Hydrating document with component:", Component ? (Component.name || 'Anonymous') : "NULL");
360
+
361
+ // Debug loaded route result
362
+ if (result) {
363
+ console.log("[Olova] Route module keys:", Object.keys(result.module));
358
364
  } else {
359
- console.log("[Olova] Rendering client-side (no SSR content found)");
360
- createRoot(document).render(app);
365
+ console.warn("[Olova] Route result is null/undefined");
361
366
  }
367
+
368
+ hydrateRoot(document, app);
362
369
  });`;
363
370
  const result = await transformWithEsbuild(code, "olova-client.tsx", {
364
371
  loader: "tsx",
@@ -371,19 +378,135 @@ loadRoute(path).then((result) => {
371
378
  import React from 'react';
372
379
  import { renderToString } from 'react-dom/server';
373
380
  import Layout, { metadata as defaultMetadata } from '/src/root.tsx';
374
- import { Router, loadRoute } from 'olova/router';
381
+ import { routes } from 'virtual:olova-routes';
382
+
383
+ // =============================================================================
384
+ // INLINE ROUTER UTILITIES (to avoid external olova/router import)
385
+ // =============================================================================
386
+ const normalizePath = (path) => {
387
+ let p = path.split('?')[0].split('#')[0];
388
+ if (p.length > 1 && p.endsWith('/')) p = p.slice(0, -1);
389
+ return p || '/';
390
+ };
391
+
392
+ function matchRoute(path) {
393
+ const normalizedPath = normalizePath(path);
394
+ const routeKeys = Object.keys(routes);
395
+
396
+ for (const route of routeKeys) {
397
+ if (route === normalizedPath) {
398
+ return { loader: routes[route], params: {}, pattern: route };
399
+ }
400
+
401
+ const regexPath = route
402
+ .replace(/:[^\\/]+/g, '([^/]+)')
403
+ .replace(/\\$[^\\/]+/g, '([^/]+)');
404
+
405
+ const regex = new RegExp(\`^\${regexPath}$\`);
406
+ const match = normalizedPath.match(regex);
407
+
408
+ if (match) {
409
+ const params = {};
410
+ const paramNames = (route.match(/[:\\$][^\\/]+/g) || []).map(s => s.slice(1));
411
+ paramNames.forEach((name, i) => {
412
+ params[name] = match[i + 1];
413
+ });
414
+ return { loader: routes[route], params, pattern: route };
415
+ }
416
+ }
417
+ return null;
418
+ }
419
+
420
+ function parseMarkdown(md) {
421
+ return md
422
+ .replace(/^### (.*$)/gim, '<h3>$1</h3>')
423
+ .replace(/^## (.*$)/gim, '<h2>$1</h2>')
424
+ .replace(/^# (.*$)/gim, '<h1>$1</h1>')
425
+ .replace(/\\*\\*\\*(.*?)\\*\\*\\*/g, '<strong><em>$1</em></strong>')
426
+ .replace(/\\*\\*(.*?)\\*\\*/g, '<strong>$1</strong>')
427
+ .replace(/\\*(.*?)\\*/g, '<em>$1</em>')
428
+ .replace(/\`\`\`([\\s\\S]*?)\`\`\`/g, '<pre><code>$1</code></pre>')
429
+ .replace(/\`(.*?)\`/g, '<code>$1</code>')
430
+ .replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, '<a href="$2">$1</a>')
431
+ .replace(/\\n\\n/g, '</p><p>')
432
+ .replace(/\\n/g, '<br>')
433
+ .replace(/^(.*)$/, '<p>$1</p>');
434
+ }
435
+
436
+ function HtmlContent({ html }) {
437
+ return React.createElement('div', {
438
+ dangerouslySetInnerHTML: { __html: html },
439
+ className: 'olova-html-content'
440
+ });
441
+ }
442
+
443
+ function MarkdownContent({ markdown }) {
444
+ const html = parseMarkdown(markdown);
445
+ return React.createElement('article', {
446
+ dangerouslySetInnerHTML: { __html: html },
447
+ className: 'olova-markdown-content'
448
+ });
449
+ }
375
450
 
376
- // Generate SEO head content
451
+ async function loadRoute(path) {
452
+ const match = matchRoute(path);
453
+ if (match) {
454
+ const module = await match.loader();
455
+
456
+ if (module.__isHtml) {
457
+ return {
458
+ module: {
459
+ default: () => HtmlContent({ html: module.__rawHtml }),
460
+ },
461
+ params: match.params,
462
+ metadata: undefined
463
+ };
464
+ }
465
+
466
+ if (module.__isMd) {
467
+ return {
468
+ module: {
469
+ default: () => MarkdownContent({ markdown: module.default }),
470
+ },
471
+ params: match.params,
472
+ metadata: undefined
473
+ };
474
+ }
475
+
476
+ return {
477
+ module,
478
+ params: match.params,
479
+ metadata: module.metadata
480
+ };
481
+ }
482
+ return null;
483
+ }
484
+
485
+ const RouterContext = React.createContext({ params: {}, path: '/' });
486
+
487
+ function Router({ url, initialComponent, initialParams }) {
488
+ const Component = initialComponent || (() => <div>Loading...</div>);
489
+ const params = initialParams || {};
490
+ const path = normalizePath(url || '/');
491
+
492
+ return (
493
+ <RouterContext.Provider value={{ params, path }}>
494
+ <Component {...params} />
495
+ </RouterContext.Provider>
496
+ );
497
+ }
498
+
499
+ // =============================================================================
500
+ // SEO HEAD GENERATION
501
+ // =============================================================================
377
502
  function generateSeoHead(metadata) {
378
503
  const meta = { ...defaultMetadata, ...metadata };
379
504
  let head = '';
380
505
 
381
- // Title
382
506
  if (meta.title) {
383
507
  head += \`<title>\${meta.title}</title>\\n\`;
384
508
  }
385
509
 
386
- // Basic meta
387
510
  if (meta.description) {
388
511
  head += \`<meta name="description" content="\${meta.description}" />\\n\`;
389
512
  }
@@ -398,7 +521,6 @@ function generateSeoHead(metadata) {
398
521
  head += \`<link rel="canonical" href="\${meta.canonical}" />\\n\`;
399
522
  }
400
523
 
401
- // Open Graph
402
524
  if (meta.openGraph) {
403
525
  const og = meta.openGraph;
404
526
  head += \`<meta property="og:title" content="\${og.title || meta.title}" />\\n\`;
@@ -413,7 +535,6 @@ function generateSeoHead(metadata) {
413
535
  }
414
536
  }
415
537
 
416
- // Twitter Card
417
538
  if (meta.twitter) {
418
539
  const tw = meta.twitter;
419
540
  head += \`<meta name="twitter:card" content="\${tw.card || 'summary'}" />\\n\`;
@@ -431,13 +552,15 @@ function generateSeoHead(metadata) {
431
552
  return head;
432
553
  }
433
554
 
555
+ // =============================================================================
556
+ // SERVER RENDER FUNCTIONS
557
+ // =============================================================================
434
558
  export async function render(url) {
435
559
  const result = await loadRoute(url);
436
560
  const Component = result ? result.module.default : () => <div>404 Not Found</div>;
437
561
  const params = result ? result.params : {};
438
562
  const metadata = result ? result.metadata : undefined;
439
563
 
440
- // Generate the SEO head content
441
564
  const seoHead = generateSeoHead(metadata);
442
565
 
443
566
  let html = renderToString(
@@ -446,7 +569,6 @@ export async function render(url) {
446
569
  </Layout>
447
570
  );
448
571
 
449
- // Inject SEO tags into head (framework handles this automatically)
450
572
  if (html.includes('</head>')) {
451
573
  html = html.replace('</head>', seoHead + '</head>');
452
574
  }
@@ -454,7 +576,6 @@ export async function render(url) {
454
576
  return { html, hydrationData: { params, metadata } };
455
577
  }
456
578
 
457
- // Render empty shell from Layout (for client-only pages)
458
579
  export function renderShell() {
459
580
  const seoHead = generateSeoHead({});
460
581
  let html = renderToString(<Layout>{null}</Layout>);
@@ -464,8 +585,6 @@ export function renderShell() {
464
585
  return html;
465
586
  }
466
587
 
467
- // Render shell WITH metadata for client-only pages that have metadata exports
468
- // This enables SEO pre-rendering even for pages without "static" directive
469
588
  export function renderShellWithMetadata(metadata) {
470
589
  const seoHead = generateSeoHead(metadata);
471
590
  let html = renderToString(<Layout>{null}</Layout>);
@@ -475,7 +594,6 @@ export function renderShellWithMetadata(metadata) {
475
594
  return html;
476
595
  }
477
596
 
478
- // Re-export loadRoute so it can be used during SSG to extract metadata from any route
479
597
  export { loadRoute };`;
480
598
  const result = await transformWithEsbuild(code, "olova-server.tsx", {
481
599
  loader: "tsx",
@@ -690,12 +808,12 @@ function virtualHtmlPlugin() {
690
808
  enforce: "pre",
691
809
  // Handle virtual index.html resolution for build
692
810
  resolveId(id) {
693
- if (id === "index.html" || id === "virtual:index.html" || id === "olova.html") {
694
- return "olova.html";
811
+ if (id === "index.html" || id === "virtual:index.html") {
812
+ return "index.html";
695
813
  }
696
814
  },
697
815
  load(id) {
698
- if (id === "olova.html" || id === "virtual:index.html") {
816
+ if (id === "index.html" || id === "virtual:index.html") {
699
817
  return htmlTemplate;
700
818
  }
701
819
  },
@@ -1002,6 +1120,10 @@ function ssgPlugin() {
1002
1120
  emptyOutDir: true,
1003
1121
  reportCompressedSize: false
1004
1122
  },
1123
+ // Ensure virtual modules are bundled, not left as external imports
1124
+ ssr: {
1125
+ noExternal: true
1126
+ },
1005
1127
  logLevel: "silent"
1006
1128
  });
1007
1129
  logger.step("Server bundle compiled", performance.now() - serverBuildStart);
@@ -1032,6 +1154,7 @@ function ssgPlugin() {
1032
1154
  const supportedExts = [".tsx", ".jsx", ".html", ".md"];
1033
1155
  if (supportedExts.includes(ext)) {
1034
1156
  const nameNoExt = entry.name.replace(/\.(tsx|jsx|html|md)$/, "");
1157
+ if (nameNoExt === "root") continue;
1035
1158
  let route = base;
1036
1159
  if (nameNoExt !== "index" && nameNoExt !== "App") {
1037
1160
  route = `${base}/${nameNoExt}`;
@@ -1064,7 +1187,7 @@ function ssgPlugin() {
1064
1187
  const { render, renderShell, renderShellWithMetadata, loadRoute } = await import(pathToFileURL(serverEntryPath).href);
1065
1188
  const assetsStart = performance.now();
1066
1189
  const distDir = path4.resolve(".olova/dist");
1067
- const clientHtmlPath = path4.join(distDir, "olova.html");
1190
+ const clientHtmlPath = path4.join(distDir, "index.html");
1068
1191
  let shellHtml = renderShell();
1069
1192
  if (!shellHtml.startsWith("<!DOCTYPE html>")) {
1070
1193
  shellHtml = `<!DOCTYPE html>
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 // Exclude olova from dependency optimization so our virtual modules work\r\n optimizeDeps: {\r\n exclude: ['olova', 'olova/router'],\r\n },\r\n // Also configure SSR to handle these modules\r\n ssr: {\r\n noExternal: ['olova'],\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 = 'virtual: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"]}
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 // Keep olova separate so it properly depends on React\r\n if (id.includes('olova')) {\r\n return undefined; // Let Rollup handle it normally\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 // Exclude olova from dependency optimization so our virtual modules work\r\n optimizeDeps: {\r\n exclude: ['olova', 'olova/router'],\r\n },\r\n // Also configure SSR to handle these modules\r\n ssr: {\r\n noExternal: ['olova', /^virtual:/],\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 = 'virtual: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 if (nameNoExt === 'root') continue; \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__ || window.$OLOVA?.$route || {};\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 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 // Always hydrate using the document as root since we always have a shell from SSG\r\n console.log(\"[Olova] Hydrating document with component:\", Component ? (Component.name || 'Anonymous') : \"NULL\");\r\n \r\n // Debug loaded route result\r\n if (result) {\r\n console.log(\"[Olova] Route module keys:\", Object.keys(result.module));\r\n } else {\r\n console.warn(\"[Olova] Route result is null/undefined\");\r\n }\r\n\r\n hydrateRoot(document, app);\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 { routes } from 'virtual:olova-routes';\r\n\r\n// =============================================================================\r\n// INLINE ROUTER UTILITIES (to avoid external olova/router import)\r\n// =============================================================================\r\nconst normalizePath = (path) => {\r\n let p = path.split('?')[0].split('#')[0];\r\n if (p.length > 1 && p.endsWith('/')) p = p.slice(0, -1);\r\n return p || '/';\r\n};\r\n\r\nfunction matchRoute(path) {\r\n const normalizedPath = normalizePath(path);\r\n const routeKeys = Object.keys(routes);\r\n \r\n for (const route of routeKeys) {\r\n if (route === normalizedPath) {\r\n return { loader: routes[route], params: {}, pattern: route };\r\n }\r\n \r\n const regexPath = route\r\n .replace(/:[^\\\\/]+/g, '([^/]+)')\r\n .replace(/\\\\$[^\\\\/]+/g, '([^/]+)');\r\n \r\n const regex = new RegExp(\\`^\\${regexPath}$\\`);\r\n const match = normalizedPath.match(regex);\r\n \r\n if (match) {\r\n const params = {};\r\n const paramNames = (route.match(/[:\\\\$][^\\\\/]+/g) || []).map(s => s.slice(1));\r\n paramNames.forEach((name, i) => {\r\n params[name] = match[i + 1];\r\n });\r\n return { loader: routes[route], params, pattern: route };\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction parseMarkdown(md) {\r\n return md\r\n .replace(/^### (.*$)/gim, '<h3>$1</h3>')\r\n .replace(/^## (.*$)/gim, '<h2>$1</h2>')\r\n .replace(/^# (.*$)/gim, '<h1>$1</h1>')\r\n .replace(/\\\\*\\\\*\\\\*(.*?)\\\\*\\\\*\\\\*/g, '<strong><em>$1</em></strong>')\r\n .replace(/\\\\*\\\\*(.*?)\\\\*\\\\*/g, '<strong>$1</strong>')\r\n .replace(/\\\\*(.*?)\\\\*/g, '<em>$1</em>')\r\n .replace(/\\`\\`\\`([\\\\s\\\\S]*?)\\`\\`\\`/g, '<pre><code>$1</code></pre>')\r\n .replace(/\\`(.*?)\\`/g, '<code>$1</code>')\r\n .replace(/\\\\[([^\\\\]]+)\\\\]\\\\(([^)]+)\\\\)/g, '<a href=\"$2\">$1</a>')\r\n .replace(/\\\\n\\\\n/g, '</p><p>')\r\n .replace(/\\\\n/g, '<br>')\r\n .replace(/^(.*)$/, '<p>$1</p>');\r\n}\r\n\r\nfunction HtmlContent({ html }) {\r\n return React.createElement('div', { \r\n dangerouslySetInnerHTML: { __html: html },\r\n className: 'olova-html-content'\r\n });\r\n}\r\n\r\nfunction MarkdownContent({ markdown }) {\r\n const html = parseMarkdown(markdown);\r\n return React.createElement('article', { \r\n dangerouslySetInnerHTML: { __html: html },\r\n className: 'olova-markdown-content'\r\n });\r\n}\r\n\r\nasync function loadRoute(path) {\r\n const match = matchRoute(path);\r\n if (match) {\r\n const module = await match.loader();\r\n \r\n if (module.__isHtml) {\r\n return { \r\n module: {\r\n default: () => HtmlContent({ html: module.__rawHtml }),\r\n },\r\n params: match.params,\r\n metadata: undefined\r\n };\r\n }\r\n \r\n if (module.__isMd) {\r\n return { \r\n module: {\r\n default: () => MarkdownContent({ markdown: module.default }),\r\n },\r\n params: match.params,\r\n metadata: undefined\r\n };\r\n }\r\n \r\n return { \r\n module,\r\n params: match.params,\r\n metadata: module.metadata\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nconst RouterContext = React.createContext({ params: {}, path: '/' });\r\n\r\nfunction Router({ url, initialComponent, initialParams }) {\r\n const Component = initialComponent || (() => <div>Loading...</div>);\r\n const params = initialParams || {};\r\n const path = normalizePath(url || '/');\r\n \r\n return (\r\n <RouterContext.Provider value={{ params, path }}>\r\n <Component {...params} />\r\n </RouterContext.Provider>\r\n );\r\n}\r\n\r\n// =============================================================================\r\n// SEO HEAD GENERATION\r\n// =============================================================================\r\nfunction generateSeoHead(metadata) {\r\n const meta = { ...defaultMetadata, ...metadata };\r\n let head = '';\r\n \r\n if (meta.title) {\r\n head += \\`<title>\\${meta.title}</title>\\\\n\\`;\r\n }\r\n \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 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 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\n// =============================================================================\r\n// SERVER RENDER FUNCTIONS\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 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 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\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\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\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') {\r\n return 'index.html';\r\n }\r\n },\r\n load(id: string) {\r\n if (id === 'index.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 // Ensure virtual modules are bundled, not left as external imports\r\n ssr: {\r\n noExternal: true,\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 if (nameNoExt === 'root') continue;\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, 'index.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 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\n// Using 'any[]' return type to avoid Vite version conflicts between packages\r\n// This prevents TypeScript errors when consumer projects have different Vite versions\r\nexport function olovaPlugins(): any[] {\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "olova",
3
- "version": "2.0.30",
3
+ "version": "2.0.32",
4
4
  "description": "framework built with Vite - file-system routing, SSG, and SEO",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",