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 +1 -3
- package/dist/vite.js +147 -24
- package/dist/vite.js.map +1 -1
- package/package.json +1 -1
package/dist/vite.d.ts
CHANGED
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
|
-
|
|
356
|
-
|
|
357
|
-
|
|
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.
|
|
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 {
|
|
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
|
-
|
|
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"
|
|
694
|
-
return "
|
|
811
|
+
if (id === "index.html" || id === "virtual:index.html") {
|
|
812
|
+
return "index.html";
|
|
695
813
|
}
|
|
696
814
|
},
|
|
697
815
|
load(id) {
|
|
698
|
-
if (id === "
|
|
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, "
|
|
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"]}
|