olovastart 0.0.3 → 0.0.4
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/entry-server.cjs +64 -12
- package/dist/entry-server.cjs.map +1 -1
- package/dist/entry-server.js +65 -11
- package/dist/entry-server.js.map +1 -1
- package/dist/olova.cjs +1 -1
- package/dist/olova.cjs.map +1 -1
- package/package.json +1 -1
package/dist/entry-server.cjs
CHANGED
|
@@ -1,15 +1,68 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var router = require('olova-router/router');
|
|
3
4
|
var react = require('react');
|
|
4
5
|
var server = require('react-dom/server');
|
|
5
|
-
|
|
6
|
+
require('/src/index.css');
|
|
6
7
|
var jsxRuntime = require('react/jsx-runtime');
|
|
7
8
|
|
|
8
|
-
//
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
// entry-server.tsx
|
|
10
|
+
var routeModules = undefined([
|
|
11
|
+
"/src/**/index.tsx",
|
|
12
|
+
"/src/**/index.mdx",
|
|
13
|
+
"/src/App.tsx"
|
|
14
|
+
], { eager: true });
|
|
15
|
+
var layoutModules = undefined("/src/layout.tsx", { eager: true });
|
|
16
|
+
var notFoundModules = undefined("/src/404.tsx", { eager: true });
|
|
17
|
+
function buildRoutesFromGlob() {
|
|
18
|
+
const routes = [];
|
|
19
|
+
for (const [filePath, module] of Object.entries(routeModules)) {
|
|
20
|
+
let routePath = filePath.replace("/src", "").replace(/\/index\.(tsx|mdx)$/, "").replace(/\.tsx$/, "").replace(/\[([^\]\.]+)\]/g, ":$1").replace(/\[:\.\.\.([^\]]+)\]/g, "*").replace(/\/\([^)]+\)/g, "");
|
|
21
|
+
if (filePath.endsWith("/App.tsx")) {
|
|
22
|
+
routePath = "/";
|
|
23
|
+
}
|
|
24
|
+
if (!routePath.startsWith("/")) {
|
|
25
|
+
routePath = "/" + routePath;
|
|
26
|
+
}
|
|
27
|
+
if (routePath === "") {
|
|
28
|
+
routePath = "/";
|
|
29
|
+
}
|
|
30
|
+
routes.push({
|
|
31
|
+
path: routePath,
|
|
32
|
+
component: module.default,
|
|
33
|
+
metadata: module.metadata
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return routes.sort((a, b) => {
|
|
37
|
+
const aHasDynamic = a.path.includes(":") || a.path.includes("*");
|
|
38
|
+
const bHasDynamic = b.path.includes(":") || b.path.includes("*");
|
|
39
|
+
if (aHasDynamic && !bHasDynamic) return 1;
|
|
40
|
+
if (!aHasDynamic && bHasDynamic) return -1;
|
|
41
|
+
return a.path.localeCompare(b.path);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
var ssrRoutes = buildRoutesFromGlob();
|
|
45
|
+
var Layout = Object.values(layoutModules)[0]?.default;
|
|
46
|
+
var Page404 = Object.values(notFoundModules)[0]?.default;
|
|
47
|
+
var ssrNotFoundPages = Page404 ? [{ pathPrefix: "", component: Page404 }] : [];
|
|
48
|
+
var ssrLayouts = Layout ? [
|
|
49
|
+
{
|
|
50
|
+
path: "/",
|
|
51
|
+
layout: (props) => /* @__PURE__ */ jsxRuntime.jsx(Layout, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx(router.Outlet, {}) }),
|
|
52
|
+
children: []
|
|
53
|
+
}
|
|
54
|
+
] : [];
|
|
55
|
+
function getRouteMetadata(url) {
|
|
56
|
+
const route = ssrRoutes.find((r) => {
|
|
57
|
+
if (r.path === url) return true;
|
|
58
|
+
if (r.path.includes(":") || r.path.includes("*")) {
|
|
59
|
+
const pattern = r.path.replace(/\*/g, ".*").replace(/:[^/]+/g, "[^/]+");
|
|
60
|
+
return new RegExp(`^${pattern}$`).test(url);
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
});
|
|
64
|
+
return route?.metadata || {};
|
|
65
|
+
}
|
|
13
66
|
async function render(url) {
|
|
14
67
|
const globalAny = globalThis;
|
|
15
68
|
globalAny.window = {
|
|
@@ -36,16 +89,15 @@ async function render(url) {
|
|
|
36
89
|
location: globalAny.window.location
|
|
37
90
|
};
|
|
38
91
|
console.log(`[SSR] Rendering path: ${url}`);
|
|
92
|
+
console.log(`[SSR] Available routes:`, ssrRoutes.map((r) => r.path));
|
|
39
93
|
const html = server.renderToString(
|
|
40
|
-
/* @__PURE__ */ jsxRuntime.jsx(react.StrictMode, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
94
|
+
/* @__PURE__ */ jsxRuntime.jsx(react.StrictMode, { children: /* @__PURE__ */ jsxRuntime.jsx(router.OlovaRouter, { routes: ssrRoutes, layouts: ssrLayouts, notFoundPages: ssrNotFoundPages }) })
|
|
41
95
|
);
|
|
42
|
-
|
|
96
|
+
const metadata = getRouteMetadata(url);
|
|
97
|
+
return { html, metadata, route: url };
|
|
43
98
|
}
|
|
44
99
|
|
|
45
|
-
Object.defineProperty(exports, "routes", {
|
|
46
|
-
enumerable: true,
|
|
47
|
-
get: function () { return virtual_olovaApp.routes; }
|
|
48
|
-
});
|
|
49
100
|
exports.render = render;
|
|
101
|
+
exports.routes = ssrRoutes;
|
|
50
102
|
//# sourceMappingURL=entry-server.cjs.map
|
|
51
103
|
//# sourceMappingURL=entry-server.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../
|
|
1
|
+
{"version":3,"sources":["../entry-server.tsx"],"names":["jsx","Outlet","renderToString","StrictMode","OlovaRouter"],"mappings":"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","file":"entry-server.cjs","sourcesContent":["/**\r\n * Dynamic SSR Entry - No Manual Imports!\r\n * \r\n * Uses Vite's import.meta.glob to auto-discover all route files.\r\n * When you add a new route, it's automatically picked up - no manual imports needed.\r\n */\r\n\r\n/// <reference types=\"vite/client\" />\r\n\r\nimport { OlovaRouter, Outlet } from 'olova-router/router';\r\nimport type { ComponentType } from 'react';\r\nimport { StrictMode } from 'react';\r\nimport { renderToString } from 'react-dom/server';\r\nimport \"/src/index.css\";\r\n\r\n// =============================================================================\r\n// AUTO-DISCOVER ALL ROUTES using Vite's glob imports (eager = no lazy loading)\r\n// =============================================================================\r\n\r\n// Get all route index files\r\nconst routeModules = import.meta.glob<{\r\n default: ComponentType<any>;\r\n metadata?: Record<string, unknown>;\r\n}>([\r\n '/src/**/index.tsx',\r\n '/src/**/index.mdx',\r\n '/src/App.tsx',\r\n], { eager: true });\r\n\r\n// Get layout\r\nconst layoutModules = import.meta.glob<{\r\n default: ComponentType<any>;\r\n}>('/src/layout.tsx', { eager: true });\r\n\r\n// Get 404 page\r\nconst notFoundModules = import.meta.glob<{\r\n default: ComponentType<any>;\r\n}>('/src/404.tsx', { eager: true });\r\n\r\n// =============================================================================\r\n// BUILD ROUTES FROM GLOB RESULTS\r\n// =============================================================================\r\n\r\ninterface RouteConfig {\r\n path: string;\r\n component: ComponentType<any>;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nfunction buildRoutesFromGlob(): RouteConfig[] {\r\n const routes: RouteConfig[] = [];\r\n \r\n for (const [filePath, module] of Object.entries(routeModules)) {\r\n // Convert file path to route path\r\n // ../src/about/index.tsx -> /about\r\n // ../src/users/[id]/index.tsx -> /users/:id\r\n // ../src/blog/[...slug]/index.tsx -> /blog/*\r\n // ../src/(auth)/login/index.tsx -> /login\r\n // ../src/App.tsx -> /\r\n \r\n let routePath = filePath\r\n .replace('/src', '')\r\n .replace(/\\/index\\.(tsx|mdx)$/, '')\r\n .replace(/\\.tsx$/, '')\r\n // Convert [param] to :param\r\n .replace(/\\[([^\\]\\.]+)\\]/g, ':$1')\r\n // Convert [...slug] to *\r\n .replace(/\\[:\\.\\.\\.([^\\]]+)\\]/g, '*')\r\n // Remove route groups like (auth)\r\n .replace(/\\/\\([^)]+\\)/g, '');\r\n \r\n // Handle App.tsx as root\r\n if (filePath.endsWith('/App.tsx')) {\r\n routePath = '/';\r\n }\r\n \r\n // Ensure path starts with /\r\n if (!routePath.startsWith('/')) {\r\n routePath = '/' + routePath;\r\n }\r\n \r\n // Empty path becomes /\r\n if (routePath === '') {\r\n routePath = '/';\r\n }\r\n \r\n routes.push({\r\n path: routePath,\r\n component: module.default,\r\n metadata: module.metadata\r\n });\r\n }\r\n \r\n // Sort routes: specific paths before dynamic ones\r\n return routes.sort((a, b) => {\r\n const aHasDynamic = a.path.includes(':') || a.path.includes('*');\r\n const bHasDynamic = b.path.includes(':') || b.path.includes('*');\r\n if (aHasDynamic && !bHasDynamic) return 1;\r\n if (!aHasDynamic && bHasDynamic) return -1;\r\n return a.path.localeCompare(b.path);\r\n });\r\n}\r\n\r\nconst ssrRoutes = buildRoutesFromGlob();\r\n\r\n// Get layout component\r\nconst Layout = Object.values(layoutModules)[0]?.default;\r\n\r\n// Get 404 component \r\nconst Page404 = Object.values(notFoundModules)[0]?.default;\r\n\r\nconst ssrNotFoundPages = Page404 ? [{ pathPrefix: '', component: Page404 }] : [];\r\n\r\nconst ssrLayouts = Layout ? [\r\n { \r\n path: '/', \r\n layout: (props: any) => (\r\n <Layout {...props}>\r\n <Outlet />\r\n </Layout>\r\n ), \r\n children: [] \r\n }\r\n] : [];\r\n\r\n// =============================================================================\r\n// SSR RENDER FUNCTION\r\n// =============================================================================\r\n\r\nexport interface RenderResult {\r\n html: string;\r\n metadata: Record<string, unknown>;\r\n route: string;\r\n}\r\n\r\nfunction getRouteMetadata(url: string): Record<string, unknown> {\r\n const route = ssrRoutes.find(r => {\r\n if (r.path === url) return true;\r\n if (r.path.includes(':') || r.path.includes('*')) {\r\n const pattern = r.path\r\n .replace(/\\*/g, '.*')\r\n .replace(/:[^/]+/g, '[^/]+');\r\n return new RegExp(`^${pattern}$`).test(url);\r\n }\r\n return false;\r\n });\r\n return route?.metadata || {};\r\n}\r\n\r\nexport async function render(url: string): Promise<RenderResult> {\r\n const globalAny = globalThis as any;\r\n globalAny.window = {\r\n location: { pathname: url, search: '', hash: '' },\r\n addEventListener: () => {},\r\n removeEventListener: () => {},\r\n history: { \r\n pushState: () => {}, \r\n replaceState: () => {}, \r\n location: { pathname: url, search: '', hash: '' } \r\n }\r\n };\r\n globalAny.location = globalAny.window.location;\r\n globalAny.document = {\r\n createElement: () => ({}),\r\n getElementsByTagName: () => [],\r\n getElementById: () => null,\r\n querySelector: () => null,\r\n title: '',\r\n location: globalAny.window.location\r\n };\r\n \r\n console.log(`[SSR] Rendering path: ${url}`);\r\n console.log(`[SSR] Available routes:`, ssrRoutes.map(r => r.path));\r\n\r\n const html = renderToString(\r\n <StrictMode>\r\n <OlovaRouter routes={ssrRoutes} layouts={ssrLayouts} notFoundPages={ssrNotFoundPages} />\r\n </StrictMode>\r\n );\r\n\r\n const metadata = getRouteMetadata(url);\r\n\r\n return { html, metadata, route: url };\r\n}\r\n\r\nexport { ssrRoutes as routes };\r\n\r\n"]}
|
package/dist/entry-server.js
CHANGED
|
@@ -1,14 +1,66 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { OlovaRouter, Outlet } from 'olova-router/router';
|
|
2
|
+
import { StrictMode } from 'react';
|
|
2
3
|
import { renderToString } from 'react-dom/server';
|
|
3
|
-
import
|
|
4
|
-
export { routes } from 'virtual:olova-app';
|
|
4
|
+
import '/src/index.css';
|
|
5
5
|
import { jsx } from 'react/jsx-runtime';
|
|
6
6
|
|
|
7
|
-
//
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
// entry-server.tsx
|
|
8
|
+
var routeModules = import.meta.glob([
|
|
9
|
+
"/src/**/index.tsx",
|
|
10
|
+
"/src/**/index.mdx",
|
|
11
|
+
"/src/App.tsx"
|
|
12
|
+
], { eager: true });
|
|
13
|
+
var layoutModules = import.meta.glob("/src/layout.tsx", { eager: true });
|
|
14
|
+
var notFoundModules = import.meta.glob("/src/404.tsx", { eager: true });
|
|
15
|
+
function buildRoutesFromGlob() {
|
|
16
|
+
const routes = [];
|
|
17
|
+
for (const [filePath, module] of Object.entries(routeModules)) {
|
|
18
|
+
let routePath = filePath.replace("/src", "").replace(/\/index\.(tsx|mdx)$/, "").replace(/\.tsx$/, "").replace(/\[([^\]\.]+)\]/g, ":$1").replace(/\[:\.\.\.([^\]]+)\]/g, "*").replace(/\/\([^)]+\)/g, "");
|
|
19
|
+
if (filePath.endsWith("/App.tsx")) {
|
|
20
|
+
routePath = "/";
|
|
21
|
+
}
|
|
22
|
+
if (!routePath.startsWith("/")) {
|
|
23
|
+
routePath = "/" + routePath;
|
|
24
|
+
}
|
|
25
|
+
if (routePath === "") {
|
|
26
|
+
routePath = "/";
|
|
27
|
+
}
|
|
28
|
+
routes.push({
|
|
29
|
+
path: routePath,
|
|
30
|
+
component: module.default,
|
|
31
|
+
metadata: module.metadata
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return routes.sort((a, b) => {
|
|
35
|
+
const aHasDynamic = a.path.includes(":") || a.path.includes("*");
|
|
36
|
+
const bHasDynamic = b.path.includes(":") || b.path.includes("*");
|
|
37
|
+
if (aHasDynamic && !bHasDynamic) return 1;
|
|
38
|
+
if (!aHasDynamic && bHasDynamic) return -1;
|
|
39
|
+
return a.path.localeCompare(b.path);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
var ssrRoutes = buildRoutesFromGlob();
|
|
43
|
+
var Layout = Object.values(layoutModules)[0]?.default;
|
|
44
|
+
var Page404 = Object.values(notFoundModules)[0]?.default;
|
|
45
|
+
var ssrNotFoundPages = Page404 ? [{ pathPrefix: "", component: Page404 }] : [];
|
|
46
|
+
var ssrLayouts = Layout ? [
|
|
47
|
+
{
|
|
48
|
+
path: "/",
|
|
49
|
+
layout: (props) => /* @__PURE__ */ jsx(Layout, { ...props, children: /* @__PURE__ */ jsx(Outlet, {}) }),
|
|
50
|
+
children: []
|
|
51
|
+
}
|
|
52
|
+
] : [];
|
|
53
|
+
function getRouteMetadata(url) {
|
|
54
|
+
const route = ssrRoutes.find((r) => {
|
|
55
|
+
if (r.path === url) return true;
|
|
56
|
+
if (r.path.includes(":") || r.path.includes("*")) {
|
|
57
|
+
const pattern = r.path.replace(/\*/g, ".*").replace(/:[^/]+/g, "[^/]+");
|
|
58
|
+
return new RegExp(`^${pattern}$`).test(url);
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
});
|
|
62
|
+
return route?.metadata || {};
|
|
63
|
+
}
|
|
12
64
|
async function render(url) {
|
|
13
65
|
const globalAny = globalThis;
|
|
14
66
|
globalAny.window = {
|
|
@@ -35,12 +87,14 @@ async function render(url) {
|
|
|
35
87
|
location: globalAny.window.location
|
|
36
88
|
};
|
|
37
89
|
console.log(`[SSR] Rendering path: ${url}`);
|
|
90
|
+
console.log(`[SSR] Available routes:`, ssrRoutes.map((r) => r.path));
|
|
38
91
|
const html = renderToString(
|
|
39
|
-
/* @__PURE__ */ jsx(StrictMode, { children: /* @__PURE__ */ jsx(
|
|
92
|
+
/* @__PURE__ */ jsx(StrictMode, { children: /* @__PURE__ */ jsx(OlovaRouter, { routes: ssrRoutes, layouts: ssrLayouts, notFoundPages: ssrNotFoundPages }) })
|
|
40
93
|
);
|
|
41
|
-
|
|
94
|
+
const metadata = getRouteMetadata(url);
|
|
95
|
+
return { html, metadata, route: url };
|
|
42
96
|
}
|
|
43
97
|
|
|
44
|
-
export { render };
|
|
98
|
+
export { render, ssrRoutes as routes };
|
|
45
99
|
//# sourceMappingURL=entry-server.js.map
|
|
46
100
|
//# sourceMappingURL=entry-server.js.map
|
package/dist/entry-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../
|
|
1
|
+
{"version":3,"sources":["../entry-server.tsx"],"names":[],"mappings":"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","file":"entry-server.js","sourcesContent":["/**\r\n * Dynamic SSR Entry - No Manual Imports!\r\n * \r\n * Uses Vite's import.meta.glob to auto-discover all route files.\r\n * When you add a new route, it's automatically picked up - no manual imports needed.\r\n */\r\n\r\n/// <reference types=\"vite/client\" />\r\n\r\nimport { OlovaRouter, Outlet } from 'olova-router/router';\r\nimport type { ComponentType } from 'react';\r\nimport { StrictMode } from 'react';\r\nimport { renderToString } from 'react-dom/server';\r\nimport \"/src/index.css\";\r\n\r\n// =============================================================================\r\n// AUTO-DISCOVER ALL ROUTES using Vite's glob imports (eager = no lazy loading)\r\n// =============================================================================\r\n\r\n// Get all route index files\r\nconst routeModules = import.meta.glob<{\r\n default: ComponentType<any>;\r\n metadata?: Record<string, unknown>;\r\n}>([\r\n '/src/**/index.tsx',\r\n '/src/**/index.mdx',\r\n '/src/App.tsx',\r\n], { eager: true });\r\n\r\n// Get layout\r\nconst layoutModules = import.meta.glob<{\r\n default: ComponentType<any>;\r\n}>('/src/layout.tsx', { eager: true });\r\n\r\n// Get 404 page\r\nconst notFoundModules = import.meta.glob<{\r\n default: ComponentType<any>;\r\n}>('/src/404.tsx', { eager: true });\r\n\r\n// =============================================================================\r\n// BUILD ROUTES FROM GLOB RESULTS\r\n// =============================================================================\r\n\r\ninterface RouteConfig {\r\n path: string;\r\n component: ComponentType<any>;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nfunction buildRoutesFromGlob(): RouteConfig[] {\r\n const routes: RouteConfig[] = [];\r\n \r\n for (const [filePath, module] of Object.entries(routeModules)) {\r\n // Convert file path to route path\r\n // ../src/about/index.tsx -> /about\r\n // ../src/users/[id]/index.tsx -> /users/:id\r\n // ../src/blog/[...slug]/index.tsx -> /blog/*\r\n // ../src/(auth)/login/index.tsx -> /login\r\n // ../src/App.tsx -> /\r\n \r\n let routePath = filePath\r\n .replace('/src', '')\r\n .replace(/\\/index\\.(tsx|mdx)$/, '')\r\n .replace(/\\.tsx$/, '')\r\n // Convert [param] to :param\r\n .replace(/\\[([^\\]\\.]+)\\]/g, ':$1')\r\n // Convert [...slug] to *\r\n .replace(/\\[:\\.\\.\\.([^\\]]+)\\]/g, '*')\r\n // Remove route groups like (auth)\r\n .replace(/\\/\\([^)]+\\)/g, '');\r\n \r\n // Handle App.tsx as root\r\n if (filePath.endsWith('/App.tsx')) {\r\n routePath = '/';\r\n }\r\n \r\n // Ensure path starts with /\r\n if (!routePath.startsWith('/')) {\r\n routePath = '/' + routePath;\r\n }\r\n \r\n // Empty path becomes /\r\n if (routePath === '') {\r\n routePath = '/';\r\n }\r\n \r\n routes.push({\r\n path: routePath,\r\n component: module.default,\r\n metadata: module.metadata\r\n });\r\n }\r\n \r\n // Sort routes: specific paths before dynamic ones\r\n return routes.sort((a, b) => {\r\n const aHasDynamic = a.path.includes(':') || a.path.includes('*');\r\n const bHasDynamic = b.path.includes(':') || b.path.includes('*');\r\n if (aHasDynamic && !bHasDynamic) return 1;\r\n if (!aHasDynamic && bHasDynamic) return -1;\r\n return a.path.localeCompare(b.path);\r\n });\r\n}\r\n\r\nconst ssrRoutes = buildRoutesFromGlob();\r\n\r\n// Get layout component\r\nconst Layout = Object.values(layoutModules)[0]?.default;\r\n\r\n// Get 404 component \r\nconst Page404 = Object.values(notFoundModules)[0]?.default;\r\n\r\nconst ssrNotFoundPages = Page404 ? [{ pathPrefix: '', component: Page404 }] : [];\r\n\r\nconst ssrLayouts = Layout ? [\r\n { \r\n path: '/', \r\n layout: (props: any) => (\r\n <Layout {...props}>\r\n <Outlet />\r\n </Layout>\r\n ), \r\n children: [] \r\n }\r\n] : [];\r\n\r\n// =============================================================================\r\n// SSR RENDER FUNCTION\r\n// =============================================================================\r\n\r\nexport interface RenderResult {\r\n html: string;\r\n metadata: Record<string, unknown>;\r\n route: string;\r\n}\r\n\r\nfunction getRouteMetadata(url: string): Record<string, unknown> {\r\n const route = ssrRoutes.find(r => {\r\n if (r.path === url) return true;\r\n if (r.path.includes(':') || r.path.includes('*')) {\r\n const pattern = r.path\r\n .replace(/\\*/g, '.*')\r\n .replace(/:[^/]+/g, '[^/]+');\r\n return new RegExp(`^${pattern}$`).test(url);\r\n }\r\n return false;\r\n });\r\n return route?.metadata || {};\r\n}\r\n\r\nexport async function render(url: string): Promise<RenderResult> {\r\n const globalAny = globalThis as any;\r\n globalAny.window = {\r\n location: { pathname: url, search: '', hash: '' },\r\n addEventListener: () => {},\r\n removeEventListener: () => {},\r\n history: { \r\n pushState: () => {}, \r\n replaceState: () => {}, \r\n location: { pathname: url, search: '', hash: '' } \r\n }\r\n };\r\n globalAny.location = globalAny.window.location;\r\n globalAny.document = {\r\n createElement: () => ({}),\r\n getElementsByTagName: () => [],\r\n getElementById: () => null,\r\n querySelector: () => null,\r\n title: '',\r\n location: globalAny.window.location\r\n };\r\n \r\n console.log(`[SSR] Rendering path: ${url}`);\r\n console.log(`[SSR] Available routes:`, ssrRoutes.map(r => r.path));\r\n\r\n const html = renderToString(\r\n <StrictMode>\r\n <OlovaRouter routes={ssrRoutes} layouts={ssrLayouts} notFoundPages={ssrNotFoundPages} />\r\n </StrictMode>\r\n );\r\n\r\n const metadata = getRouteMetadata(url);\r\n\r\n return { html, metadata, route: url };\r\n}\r\n\r\nexport { ssrRoutes as routes };\r\n\r\n"]}
|
package/dist/olova.cjs
CHANGED
|
@@ -17,7 +17,7 @@ var path2__default = /*#__PURE__*/_interopDefault(path2);
|
|
|
17
17
|
var pc__default = /*#__PURE__*/_interopDefault(pc);
|
|
18
18
|
var zlib__default = /*#__PURE__*/_interopDefault(zlib);
|
|
19
19
|
|
|
20
|
-
// node_modules
|
|
20
|
+
// node_modules/tsup/assets/cjs_shims.js
|
|
21
21
|
var getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.tagName.toUpperCase() === "SCRIPT" ? document.currentScript.src : new URL("main.js", document.baseURI).href;
|
|
22
22
|
var importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
|
|
23
23
|
var SYMBOLS = {
|
package/dist/olova.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","../src/logger.ts","../src/performance.ts","../olova.ts"],"names":["pc","path","error","promisify","zlib","fs","olovaRouter","existsSync","fileURLToPath","build","pathToFileURL"],"mappings":"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","file":"olova.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/**\r\n * Olova Logger - Modern, styled terminal output\r\n * Inspired by Next.js console output\r\n */\r\n\r\nimport pc from 'picocolors';\r\n\r\n// Symbols\r\nconst SYMBOLS = {\r\n success: pc.green('✓'),\r\n error: pc.red('✗'),\r\n warning: pc.yellow('⚠'),\r\n info: pc.blue('○'),\r\n arrow: pc.cyan('→'),\r\n bullet: pc.dim('•'),\r\n rocket: '🚀',\r\n sparkles: '✨',\r\n package: '📦',\r\n route: pc.cyan('λ'),\r\n static: pc.green('○'),\r\n dynamic: pc.magenta('ƒ'),\r\n};\r\n\r\n// Olova brand colors\r\nconst brand = {\r\n name: pc.bold(pc.cyan('Olova')),\r\n version: pc.dim('v1.0.0'),\r\n tagline: pc.dim('Flight-powered SSG'),\r\n};\r\n\r\n/**\r\n * Print the startup banner\r\n */\r\nexport function printBanner() {\r\n console.log('');\r\n console.log(pc.cyan(` ${SYMBOLS.rocket} ${brand.name} ${brand.version}`));\r\n console.log(pc.dim(` ${brand.tagline}`));\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print dev server ready message\r\n */\r\nexport function printDevReady(url: string, networkUrl?: string) {\r\n console.log('');\r\n console.log(` ${SYMBOLS.success} ${pc.bold('Ready')} in ${pc.cyan('~1s')}`);\r\n console.log('');\r\n console.log(` ${pc.dim('Local:')} ${pc.cyan(url)}`);\r\n if (networkUrl) {\r\n console.log(` ${pc.dim('Network:')} ${pc.cyan(networkUrl)}`);\r\n }\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print SSG build start\r\n */\r\nexport function printBuildStart() {\r\n console.log('');\r\n console.log(` ${SYMBOLS.package} ${pc.bold('Creating optimized production build...')}`);\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print SSG build header\r\n */\r\nexport function printSSGStart(buildId: string) {\r\n console.log('');\r\n console.log(` ${pc.bold(pc.cyan('Static Site Generation'))}`);\r\n console.log(` ${pc.dim('Build ID:')} ${pc.yellow(buildId)}`);\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print route list in a nice table format\r\n */\r\nexport function printRoutes(routes: { path: string; type: 'static' | 'dynamic' }[]) {\r\n console.log(` ${pc.bold('Route')}${' '.repeat(30)}${pc.bold('Type')}`);\r\n console.log(` ${pc.dim('─'.repeat(45))}`);\r\n \r\n for (const route of routes) {\r\n const typeIcon = route.type === 'static' ? SYMBOLS.static : SYMBOLS.dynamic;\r\n const typeLabel = route.type === 'static' \r\n ? pc.green('Static') \r\n : pc.magenta('Dynamic');\r\n const padding = ' '.repeat(Math.max(2, 35 - route.path.length));\r\n console.log(` ${typeIcon} ${route.path}${padding}${typeLabel}`);\r\n }\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print single page generation\r\n */\r\nexport function printPageGenerated(path: string, hasFlightData = true) {\r\n const flightBadge = hasFlightData ? pc.dim(' [Flight]') : '';\r\n console.log(` ${SYMBOLS.success} ${pc.dim('Generated')} ${pc.white(path)}${flightBadge}`);\r\n}\r\n\r\n/**\r\n * Print page generation error\r\n */\r\nexport function printPageError(path: string, error: string) {\r\n console.log(` ${SYMBOLS.error} ${pc.red('Failed')} ${path}`);\r\n console.log(` ${pc.dim(error)}`);\r\n}\r\n\r\n/**\r\n * Print SSG completion summary\r\n */\r\nexport function printSSGComplete(stats: {\r\n totalPages: number;\r\n successPages: number;\r\n failedPages: number;\r\n buildTime: number;\r\n}) {\r\n console.log('');\r\n console.log(` ${pc.dim('─'.repeat(45))}`);\r\n console.log('');\r\n \r\n if (stats.failedPages > 0) {\r\n console.log(` ${SYMBOLS.warning} ${pc.yellow('Build completed with warnings')}`);\r\n } else {\r\n console.log(` ${SYMBOLS.sparkles} ${pc.green('Build completed successfully!')}`);\r\n }\r\n \r\n console.log('');\r\n console.log(` ${pc.dim('Pages:')} ${pc.bold(stats.successPages.toString())} generated`);\r\n if (stats.failedPages > 0) {\r\n console.log(` ${pc.red(stats.failedPages.toString())} failed`);\r\n }\r\n console.log(` ${pc.dim('Time:')} ${pc.cyan(stats.buildTime + 'ms')}`);\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print Flight hydration info\r\n */\r\nexport function printFlightInfo() {\r\n console.log(` ${SYMBOLS.info} ${pc.dim('Flight hydration enabled')}`);\r\n console.log(` ${pc.dim('•')} JSON-LD structured data`);\r\n console.log(` ${pc.dim('•')} Resource hints (preload, prefetch)`);\r\n console.log(` ${pc.dim('•')} $OLOVA global object`);\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print a simple info message\r\n */\r\nexport function info(message: string) {\r\n console.log(` ${SYMBOLS.info} ${message}`);\r\n}\r\n\r\n/**\r\n * Print a success message\r\n */\r\nexport function success(message: string) {\r\n console.log(` ${SYMBOLS.success} ${pc.green(message)}`);\r\n}\r\n\r\n/**\r\n * Print a warning message\r\n */\r\nexport function warn(message: string) {\r\n console.log(` ${SYMBOLS.warning} ${pc.yellow(message)}`);\r\n}\r\n\r\n/**\r\n * Print an error message\r\n */\r\nexport function error(message: string) {\r\n console.log(` ${SYMBOLS.error} ${pc.red(message)}`);\r\n}\r\n\r\n/**\r\n * Print SSR render info (dev mode)\r\n */\r\nexport function printSSRRender(path: string) {\r\n console.log(` ${SYMBOLS.arrow} ${pc.dim('SSR')} ${path}`);\r\n}\r\n\r\nexport default {\r\n printBanner,\r\n printDevReady,\r\n printBuildStart,\r\n printSSGStart,\r\n printRoutes,\r\n printPageGenerated,\r\n printPageError,\r\n printSSGComplete,\r\n printFlightInfo,\r\n printSSRRender,\r\n info,\r\n success,\r\n warn,\r\n error,\r\n SYMBOLS,\r\n};\r\n","/**\r\n * Olova Performance Optimizations Plugin\r\n * \r\n * Provides build-time optimizations for SSG:\r\n * - Code splitting strategies\r\n * - Asset compression (gzip/brotli)\r\n * - Chunk size analysis\r\n * - Resource prioritization\r\n */\r\n\r\nimport fs from 'node:fs/promises';\r\nimport path from 'node:path';\r\nimport { promisify } from 'node:util';\r\nimport zlib from 'node:zlib';\r\nimport type { Plugin, ResolvedConfig } from 'vite';\r\nimport logger from './logger';\r\n\r\n// Promisify zlib functions\r\nconst gzip = promisify(zlib.gzip);\r\nconst brotliCompress = promisify(zlib.brotliCompress);\r\n\r\n// =============================================================================\r\n// TYPES\r\n// =============================================================================\r\n\r\nexport interface PerformanceOptions {\r\n /**\r\n * Enable gzip compression for assets\r\n * @default true\r\n */\r\n gzip?: boolean;\r\n \r\n /**\r\n * Enable brotli compression for assets\r\n * @default true\r\n */\r\n brotli?: boolean;\r\n \r\n /**\r\n * Minimum file size (in bytes) to compress\r\n * @default 1024 (1KB)\r\n */\r\n threshold?: number;\r\n \r\n /**\r\n * File extensions to compress\r\n * @default ['js', 'css', 'html', 'json', 'svg', 'xml']\r\n */\r\n extensions?: string[];\r\n \r\n /**\r\n * Enable chunk size warnings\r\n * @default true\r\n */\r\n chunkSizeWarning?: boolean;\r\n \r\n /**\r\n * Maximum chunk size before warning (in KB)\r\n * @default 250\r\n */\r\n maxChunkSize?: number;\r\n \r\n /**\r\n * Enable route-based code splitting\r\n * @default true\r\n */\r\n routeCodeSplitting?: boolean;\r\n}\r\n\r\nexport interface ChunkInfo {\r\n name: string;\r\n size: number;\r\n gzipSize?: number;\r\n brotliSize?: number;\r\n isEntry: boolean;\r\n type: 'vendor' | 'framework' | 'common' | 'route' | 'other';\r\n}\r\n\r\n// =============================================================================\r\n// MANUAL CHUNKS CONFIGURATION\r\n// =============================================================================\r\n\r\n/**\r\n * Smart manual chunks configuration for optimal code splitting\r\n * Separates vendor, framework, and route-specific code\r\n * Avoids circular dependencies by grouping related routes\r\n */\r\nexport function createManualChunks() {\r\n // Track modules to detect potential circular dependencies\r\n const seenModules = new Map<string, string>();\r\n \r\n return (id: string, { getModuleInfo }: { getModuleInfo: (id: string) => { importers: readonly string[] } | null }): string | undefined => {\r\n // React and React DOM - cached separately\r\n if (id.includes('node_modules/react-dom')) {\r\n return 'vendor-react-dom';\r\n }\r\n if (id.includes('node_modules/react')) {\r\n return 'vendor-react';\r\n }\r\n \r\n // Olova Router - framework code\r\n if (id.includes('olova-router')) {\r\n return 'framework-router';\r\n }\r\n \r\n // Other node_modules - vendor bundle\r\n if (id.includes('node_modules')) {\r\n // Extract package name for better caching\r\n const match = id.match(/node_modules[\\\\/]([^/\\\\]+)/);\r\n if (match) {\r\n const pkg = match[1];\r\n // Group small packages together\r\n if (['scheduler', 'object-assign', 'prop-types'].includes(pkg)) {\r\n return 'vendor-react';\r\n }\r\n // Keep large packages separate\r\n if (['lodash', 'moment', 'axios', 'date-fns'].includes(pkg)) {\r\n return `vendor-${pkg}`;\r\n }\r\n }\r\n return 'vendor';\r\n }\r\n \r\n // Shared components - group together to avoid circular deps\r\n if (id.includes('/components/')) {\r\n return 'common-components';\r\n }\r\n \r\n // Shared utilities\r\n if (id.includes('/utils/') || id.includes('/lib/') || id.includes('/helpers/')) {\r\n return 'common-utils';\r\n }\r\n \r\n // CSS - let Vite handle\r\n if (id.endsWith('.css') || id.endsWith('.scss')) {\r\n return undefined;\r\n }\r\n \r\n // Auth pages + search - group together to avoid circular deps\r\n // (login <-> register <-> search often share components/navigation)\r\n if (id.includes('/(auth)/') || id.includes('\\\\(auth)\\\\') || \r\n id.includes('/search/') || id.includes('\\\\search\\\\')) {\r\n return 'page-auth';\r\n }\r\n \r\n // Route components - be conservative, only split truly isolated routes\r\n // Don't split if the module has cross-route imports\r\n if (id.includes('/src/') && (id.endsWith('/index.tsx') || id.endsWith('/index.mdx'))) {\r\n // Check if this module would cause circular dependencies\r\n const moduleInfo = getModuleInfo(id);\r\n if (moduleInfo) {\r\n // If imported by another route, group with common\r\n for (const importer of moduleInfo.importers) {\r\n if (importer.includes('/src/') && importer.includes('/index.') && !importer.includes(id)) {\r\n return 'common-routes';\r\n }\r\n }\r\n }\r\n \r\n const routeMatch = id.match(/[\\\\/]src[\\\\/](.+?)[\\\\/]index\\.(tsx|mdx)$/);\r\n if (routeMatch) {\r\n const routePath = routeMatch[1]\r\n .replace(/\\([^)]+\\)[\\\\/]/g, '') // Remove route groups\r\n .replace(/\\[.*?\\]/g, 'dynamic') // Replace dynamic segments\r\n .replace(/[\\\\/]/g, '-');\r\n \r\n // Skip if we've seen a chunk with same base that would cause circular\r\n const baseRoute = routePath.split('-')[0];\r\n if (seenModules.has(baseRoute)) {\r\n const existingChunk = seenModules.get(baseRoute)!;\r\n // If related routes, group them\r\n if (existingChunk.startsWith('page-')) {\r\n return existingChunk;\r\n }\r\n }\r\n \r\n const chunkName = `page-${routePath}`;\r\n seenModules.set(baseRoute, chunkName);\r\n return chunkName;\r\n }\r\n }\r\n \r\n return undefined;\r\n };\r\n}\r\n\r\n// =============================================================================\r\n// COMPRESSION PLUGIN\r\n// =============================================================================\r\n\r\n/**\r\n * Compression plugin for generating gzip and brotli compressed assets\r\n */\r\nexport function compressionPlugin(options: PerformanceOptions = {}): Plugin {\r\n const {\r\n gzip: enableGzip = true,\r\n brotli: enableBrotli = true,\r\n threshold = 1024,\r\n extensions = ['js', 'css', 'html', 'json', 'svg', 'xml'],\r\n } = options;\r\n \r\n let config: ResolvedConfig;\r\n \r\n return {\r\n name: 'olova-compression',\r\n apply: 'build',\r\n \r\n configResolved(resolvedConfig) {\r\n config = resolvedConfig;\r\n },\r\n \r\n async closeBundle() {\r\n if (config.command !== 'build' || config.build.ssr) return;\r\n \r\n const outDir = config.build.outDir;\r\n const stats = { gzip: 0, brotli: 0, skipped: 0 };\r\n \r\n // Find all files to compress\r\n const files = await findFilesToCompress(outDir, extensions);\r\n \r\n for (const file of files) {\r\n const content = await fs.readFile(file);\r\n \r\n // Skip small files\r\n if (content.length < threshold) {\r\n stats.skipped++;\r\n continue;\r\n }\r\n \r\n // Gzip compression\r\n if (enableGzip) {\r\n try {\r\n const compressed = await gzip(content, { level: 9 });\r\n await fs.writeFile(`${file}.gz`, compressed);\r\n stats.gzip++;\r\n } catch (e) {\r\n // Silently skip compression errors\r\n }\r\n }\r\n \r\n // Brotli compression\r\n if (enableBrotli) {\r\n try {\r\n const compressed = await brotliCompress(content, {\r\n params: {\r\n [zlib.constants.BROTLI_PARAM_QUALITY]: 11,\r\n },\r\n });\r\n await fs.writeFile(`${file}.br`, compressed);\r\n stats.brotli++;\r\n } catch (e) {\r\n // Silently skip compression errors\r\n }\r\n }\r\n }\r\n \r\n // Log compression stats\r\n if (stats.gzip > 0 || stats.brotli > 0) {\r\n logger.info(`Compressed ${stats.gzip} files (gzip), ${stats.brotli} files (brotli)`);\r\n }\r\n },\r\n };\r\n}\r\n\r\n// =============================================================================\r\n// CHUNK ANALYSIS PLUGIN\r\n// =============================================================================\r\n\r\n/**\r\n * Chunk analysis plugin for monitoring bundle sizes\r\n */\r\nexport function chunkAnalysisPlugin(options: PerformanceOptions = {}): Plugin {\r\n const {\r\n chunkSizeWarning = true,\r\n maxChunkSize = 250,\r\n } = options;\r\n \r\n const chunks: ChunkInfo[] = [];\r\n \r\n return {\r\n name: 'olova-chunk-analysis',\r\n apply: 'build',\r\n \r\n generateBundle(_options, bundle) {\r\n for (const [fileName, chunk] of Object.entries(bundle)) {\r\n if (chunk.type === 'chunk') {\r\n const sizeKB = Buffer.byteLength(chunk.code, 'utf8') / 1024;\r\n \r\n // Determine chunk type\r\n let type: ChunkInfo['type'] = 'other';\r\n if (fileName.includes('vendor')) type = 'vendor';\r\n else if (fileName.includes('framework')) type = 'framework';\r\n else if (fileName.includes('common')) type = 'common';\r\n else if (fileName.includes('page-')) type = 'route';\r\n \r\n chunks.push({\r\n name: fileName,\r\n size: Math.round(sizeKB * 100) / 100,\r\n isEntry: chunk.isEntry,\r\n type,\r\n });\r\n \r\n // Warn about large chunks\r\n if (chunkSizeWarning && sizeKB > maxChunkSize) {\r\n logger.warn(`Chunk \"${fileName}\" is ${sizeKB.toFixed(2)}KB (exceeds ${maxChunkSize}KB limit)`);\r\n }\r\n }\r\n }\r\n },\r\n \r\n closeBundle() {\r\n if (chunks.length === 0) return;\r\n \r\n // Sort by size descending\r\n chunks.sort((a, b) => b.size - a.size);\r\n \r\n // Print chunk summary\r\n console.log('');\r\n logger.info('Bundle Analysis:');\r\n \r\n const typeGroups: Record<string, number> = {};\r\n let totalSize = 0;\r\n \r\n for (const chunk of chunks) {\r\n typeGroups[chunk.type] = (typeGroups[chunk.type] || 0) + chunk.size;\r\n totalSize += chunk.size;\r\n }\r\n \r\n console.log(` Vendor: ${(typeGroups.vendor || 0).toFixed(2)} KB`);\r\n console.log(` Framework: ${(typeGroups.framework || 0).toFixed(2)} KB`);\r\n console.log(` Common: ${(typeGroups.common || 0).toFixed(2)} KB`);\r\n console.log(` Routes: ${(typeGroups.route || 0).toFixed(2)} KB`);\r\n console.log(` Other: ${(typeGroups.other || 0).toFixed(2)} KB`);\r\n console.log(` ─────────────────────`);\r\n console.log(` Total: ${totalSize.toFixed(2)} KB`);\r\n console.log('');\r\n },\r\n };\r\n}\r\n\r\n// =============================================================================\r\n// PRELOAD HINTS GENERATOR\r\n// =============================================================================\r\n\r\nexport interface PreloadHint {\r\n href: string;\r\n as: 'script' | 'style' | 'font' | 'image';\r\n priority: 'critical' | 'high' | 'low';\r\n crossorigin?: boolean;\r\n}\r\n\r\n/**\r\n * Generate optimized preload hints for chunks\r\n */\r\nexport function generatePreloadHints(\r\n chunks: string[],\r\n entryChunk: string\r\n): PreloadHint[] {\r\n const hints: PreloadHint[] = [];\r\n \r\n // Entry chunk - critical priority\r\n hints.push({\r\n href: `/${entryChunk}`,\r\n as: 'script',\r\n priority: 'critical',\r\n });\r\n \r\n for (const chunk of chunks) {\r\n if (chunk === entryChunk) continue;\r\n \r\n // Vendor chunks - high priority (needed for hydration)\r\n if (chunk.includes('vendor')) {\r\n hints.push({\r\n href: `/${chunk}`,\r\n as: 'script',\r\n priority: 'high',\r\n });\r\n }\r\n // Framework chunks - high priority\r\n else if (chunk.includes('framework')) {\r\n hints.push({\r\n href: `/${chunk}`,\r\n as: 'script',\r\n priority: 'high',\r\n });\r\n }\r\n // Common chunks - high priority\r\n else if (chunk.includes('common')) {\r\n hints.push({\r\n href: `/${chunk}`,\r\n as: 'script',\r\n priority: 'high',\r\n });\r\n }\r\n // Route chunks - low priority (prefetch for navigation)\r\n else if (chunk.includes('page-')) {\r\n hints.push({\r\n href: `/${chunk}`,\r\n as: 'script',\r\n priority: 'low',\r\n });\r\n }\r\n }\r\n \r\n return hints;\r\n}\r\n\r\n/**\r\n * Generate HTML preload/prefetch tags from hints\r\n */\r\nexport function generatePreloadTags(hints: PreloadHint[]): string {\r\n return hints\r\n .map((hint) => {\r\n const rel = hint.priority === 'low' ? 'prefetch' : 'modulepreload';\r\n const crossorigin = hint.crossorigin ? ' crossorigin' : '';\r\n return `<link rel=\"${rel}\" href=\"${hint.href}\"${crossorigin}>`;\r\n })\r\n .join('');\r\n}\r\n\r\n// =============================================================================\r\n// UTILITY FUNCTIONS\r\n// =============================================================================\r\n\r\n/**\r\n * Recursively find files to compress\r\n */\r\nasync function findFilesToCompress(\r\n dir: string,\r\n extensions: string[]\r\n): Promise<string[]> {\r\n const files: string[] = [];\r\n \r\n try {\r\n const entries = await fs.readdir(dir, { withFileTypes: true });\r\n \r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n files.push(...await findFilesToCompress(fullPath, extensions));\r\n } else if (entry.isFile()) {\r\n const ext = path.extname(entry.name).slice(1);\r\n if (extensions.includes(ext)) {\r\n files.push(fullPath);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n // Directory doesn't exist or can't be read\r\n }\r\n \r\n return files;\r\n}\r\n\r\n/**\r\n * Calculate gzip size of content\r\n */\r\nexport async function getGzipSize(content: string | Buffer): Promise<number> {\r\n const buffer = typeof content === 'string' ? Buffer.from(content) : content;\r\n const compressed = await gzip(buffer);\r\n return compressed.length;\r\n}\r\n\r\n/**\r\n * Format bytes to human readable size\r\n */\r\nexport function formatBytes(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\r\n}\r\n\r\n// =============================================================================\r\n// COMBINED PERFORMANCE PLUGIN\r\n// =============================================================================\r\n\r\n/**\r\n * Main performance plugin that combines all optimizations\r\n */\r\nexport function olovaPerformance(options: PerformanceOptions = {}): Plugin[] {\r\n return [\r\n chunkAnalysisPlugin(options),\r\n compressionPlugin(options),\r\n ];\r\n}\r\n\r\nexport default olovaPerformance;\r\n","import { existsSync } from \"node:fs\";\r\nimport fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\r\nimport { olovaRouter } from \"olova-router\";\r\nimport { build, type Plugin, type ResolvedConfig } from \"vite\";\r\nimport logger from \"./src/logger\";\r\nimport type { PerformanceOptions } from \"./src/performance\";\r\nimport {\r\n createManualChunks,\r\n generatePreloadHints,\r\n generatePreloadTags,\r\n olovaPerformance,\r\n} from \"./src/performance\";\r\n\r\n// =============================================================================\r\n// FLIGHT HYDRATION - Inline implementation for SSG\r\n// =============================================================================\r\n\r\ninterface OlovaHydrationData {\r\n route: string;\r\n params?: Record<string, string>;\r\n metadata?: Record<string, unknown>;\r\n chunks?: string[];\r\n isStatic?: boolean;\r\n}\r\n\r\nfunction safeStringify(data: unknown): string {\r\n return JSON.stringify(data).replace(/[<>\\/\\u2028\\u2029]/g, (char) => {\r\n switch (char) {\r\n case '<': return '\\\\u003c';\r\n case '>': return '\\\\u003e';\r\n case '/': return '\\\\u002f';\r\n case '\\u2028': return '\\\\u2028';\r\n case '\\u2029': return '\\\\u2029';\r\n default: return char;\r\n }\r\n });\r\n}\r\n\r\nfunction generateBuildId(): string {\r\n const timestamp = Date.now().toString(36);\r\n const random = Math.random().toString(36).substring(2, 8);\r\n return `${timestamp}-${random}`;\r\n}\r\n\r\nfunction generatePageName(route: string): string {\r\n if (route === '/') return 'HomePage';\r\n return route.slice(1).split('/').filter(Boolean)\r\n .map(s => s.charAt(0).toUpperCase() + s.slice(1).replace(/[^a-zA-Z0-9]/g, ''))\r\n .join('') + 'Page';\r\n}\r\n\r\nfunction 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 scripts.push(`<script>self.__olova_f=self.__olova_f||[];function _oF(d){self.__olova_f.push(d)}</script>`);\r\n\r\n // Route chunk\r\n const routeData = { path: data.route, params: data.params || {}, pattern: data.route, isStatic: data.isStatic ?? true, buildId };\r\n scripts.push(`<script>_oF([0,\"R\",${safeStringify(routeData)}])</script>`);\r\n\r\n // Metadata chunk\r\n const metaData = {\r\n title: (meta.title as string) || 'Olova App',\r\n description: (meta.description as string) || '',\r\n keywords: Array.isArray(meta.keywords) ? meta.keywords : [],\r\n robots: 'index, follow',\r\n og: { type: 'website', locale: 'en_US', ...((meta.openGraph as object) || {}) },\r\n twitter: { card: 'summary_large_image', ...((meta.twitter as object) || {}) }\r\n };\r\n scripts.push(`<script>_oF([1,\"M\",${safeStringify(metaData)}])</script>`);\r\n\r\n // Tree chunk\r\n const treeData = { layout: 'RootLayout', page: generatePageName(data.route), template: null, loading: null, error: null, notFound: null };\r\n scripts.push(`<script>_oF([2,\"T\",${safeStringify(treeData)}])</script>`);\r\n\r\n // Structured data chunk\r\n const schemaData = [\r\n { '@context': 'https://schema.org', '@type': 'WebPage', name: metaData.title, description: metaData.description, url: data.route },\r\n { '@context': 'https://schema.org', '@type': 'WebApplication', name: 'Olova', applicationCategory: 'WebApplication', operatingSystem: 'Any' }\r\n ];\r\n scripts.push(`<script>_oF([3,\"D\",${safeStringify(schemaData)}])</script>`);\r\n\r\n // Assets chunk\r\n const assetsData = { chunks: data.chunks || [], styles: [], prefetch: (data.chunks || []).slice(0, 5) };\r\n scripts.push(`<script>_oF([4,\"A\",${safeStringify(assetsData)}])</script>`);\r\n\r\n // Hints chunk\r\n const hintsData = { dnsPrefetch: ['fonts.googleapis.com'], preconnect: ['https://fonts.googleapis.com'], modulePreload: (data.chunks || []).slice(0, 3) };\r\n scripts.push(`<script>_oF([5,\"H\",${safeStringify(hintsData)}])</script>`);\r\n\r\n // State chunk\r\n const stateData = { hydrated: false, streaming: false, ready: true, timestamp: Date.now(), version: '1.0.0', buildId };\r\n scripts.push(`<script>_oF([6,\"S\",${safeStringify(stateData)}])</script>`);\r\n\r\n // End marker\r\n scripts.push(`<script>_oF([7,\"E\",null])</script>`);\r\n\r\n // Global $OLOVA object\r\n const globalPayload = {\r\n $route: routeData, $meta: metaData, $tree: treeData, $schema: schemaData,\r\n $assets: assetsData, $hints: hintsData, $state: stateData,\r\n $build: { id: buildId, version: '1.0.0', timestamp: Date.now(), env: 'production' }\r\n };\r\n scripts.push(`<script>$OLOVA=${safeStringify(globalPayload)}</script>`);\r\n\r\n return scripts.join('');\r\n}\r\n\r\nfunction generateJsonLd(data: OlovaHydrationData): string {\r\n const meta = (data.metadata || {}) as Record<string, unknown>;\r\n const jsonLd = {\r\n '@context': 'https://schema.org',\r\n '@graph': [\r\n { '@type': 'WebPage', '@id': data.route, name: (meta.title as string) || 'Olova App', description: (meta.description as string) || '', url: data.route, isPartOf: { '@type': 'WebSite', name: 'Olova App' } },\r\n { '@type': 'BreadcrumbList', itemListElement: data.route.split('/').filter(Boolean).map((segment, index, arr) => ({ '@type': 'ListItem', position: index + 1, name: segment.charAt(0).toUpperCase() + segment.slice(1), item: '/' + arr.slice(0, index + 1).join('/') })) }\r\n ]\r\n };\r\n return `<script type=\"application/ld+json\">${JSON.stringify(jsonLd)}</script>`;\r\n}\r\n\r\nfunction generateResourceHints(data: OlovaHydrationData): string {\r\n const hints: string[] = [];\r\n hints.push(`<link rel=\"dns-prefetch\" href=\"//fonts.googleapis.com\">`);\r\n hints.push(`<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" crossorigin>`);\r\n if (data.chunks) {\r\n for (const chunk of data.chunks.slice(0, 3)) {\r\n hints.push(`<link rel=\"modulepreload\" href=\"/${chunk}\">`);\r\n }\r\n }\r\n return hints.join('');\r\n}\r\n\r\n// =============================================================================\r\n// PLUGIN INTERFACE\r\n// =============================================================================\r\n\r\nexport interface OlovaOptions {\r\n /**\r\n * Static paths to pre-render at build time\r\n */\r\n staticPaths?: string[];\r\n \r\n /**\r\n * Performance optimization options\r\n */\r\n performance?: PerformanceOptions & {\r\n /**\r\n * Enable all performance optimizations\r\n * @default true\r\n */\r\n enabled?: boolean;\r\n };\r\n}\r\n\r\nexport function olova(options: OlovaOptions = {}): any {\r\n const virtualModuleId = \"virtual:olova-entry\";\r\n const serverVirtualModuleId = \"virtual:olova-server-entry\";\r\n const appVirtualModuleId = \"virtual:olova-app\";\r\n const resolvedAppVirtualModuleId = \"\\0\" + appVirtualModuleId;\r\n let config: ResolvedConfig;\r\n\r\n // Minimal shell - just the placeholder.\r\n // We'll prepend DOCTYPE manually to avoid duplication if app renders it (though app usually shouldn't).\r\n const htmlContent = `<!--app-html-->`;\r\n\r\n // Simple HTML minifier: removes whitespace between tags, trimming, and newlines\r\n const minifyHtml = (html: string) => {\r\n return html\r\n .replace(/>\\s+</g, \"><\")\r\n .replace(/\\s{2,}/g, \" \")\r\n .replace(/<!--[\\s\\S]*?-->/g, \"\") // remove comments\r\n .trim();\r\n };\r\n\r\n return [\r\n olovaRouter(),\r\n {\r\n name: \"vite-plugin-olova\",\r\n config(userConfig, { isSsrBuild }) {\r\n // All optimizations are enabled by default\r\n const perfEnabled = options.performance?.enabled !== false;\r\n \r\n // Skip performance optimizations for SSR builds\r\n if (isSsrBuild) {\r\n return {\r\n build: {\r\n rollupOptions: {\r\n input: userConfig.build?.rollupOptions?.input || virtualModuleId,\r\n output: {\r\n // Simple output for SSR\r\n entryFileNames: 'index.js',\r\n chunkFileNames: '[name].js',\r\n assetFileNames: '[name].[ext]',\r\n format: 'esm',\r\n manualChunks: undefined,\r\n },\r\n },\r\n },\r\n };\r\n }\r\n \r\n // Full optimization config for client builds (all automatic!)\r\n const buildConfig: any = {\r\n // Output directory for assets\r\n assetsDir: 'assets/_olova',\r\n // Report compressed size in build output\r\n reportCompressedSize: true,\r\n rollupOptions: {\r\n input: userConfig.build?.rollupOptions?.input || virtualModuleId,\r\n output: {\r\n // Optimized chunk naming for caching\r\n chunkFileNames: 'assets/_olova/[name]-[hash].js',\r\n entryFileNames: 'assets/_olova/[name]-[hash].js',\r\n assetFileNames: 'assets/_olova/[name]-[hash].[ext]',\r\n // Enable smart code splitting\r\n ...(perfEnabled && {\r\n manualChunks: createManualChunks(),\r\n }),\r\n },\r\n },\r\n // Increase warning limit since we're doing smart chunking\r\n chunkSizeWarningLimit: 500,\r\n // Inline small assets (< 4KB)\r\n assetsInlineLimit: 4096,\r\n // Enable terser minification for smaller bundles\r\n minify: 'terser',\r\n terserOptions: {\r\n compress: {\r\n // Aggressive optimizations for production\r\n drop_console: false, // Keep console for debugging\r\n drop_debugger: true,\r\n pure_funcs: ['console.debug'],\r\n passes: 2,\r\n },\r\n mangle: {\r\n properties: false,\r\n },\r\n format: {\r\n comments: false,\r\n },\r\n },\r\n // Disable source maps for smaller builds\r\n sourcemap: false,\r\n // CSS code splitting\r\n cssCodeSplit: true,\r\n // Target modern browsers (smaller bundles)\r\n target: 'es2020',\r\n };\r\n \r\n return {\r\n build: buildConfig,\r\n // Optimize deps for faster dev startup\r\n optimizeDeps: {\r\n include: ['react', 'react-dom'],\r\n },\r\n // esbuild optimizations\r\n esbuild: {\r\n treeShaking: true,\r\n legalComments: 'none',\r\n },\r\n // Preview server configuration (for testing production builds)\r\n preview: {\r\n headers: {\r\n // Long-term caching for static assets\r\n 'Cache-Control': 'public, max-age=31536000',\r\n },\r\n },\r\n };\r\n },\r\n async configResolved(resolvedConfig) {\r\n config = resolvedConfig;\r\n },\r\n resolveId(id) {\r\n if (id === virtualModuleId || id === serverVirtualModuleId) {\r\n const isServer = id === serverVirtualModuleId;\r\n const fileName = isServer ? \"entry-server\" : \"main\";\r\n \r\n // 1. Try to find local project override first\r\n const possibleLocalPaths = [\r\n path.resolve(config.root, `src/${fileName}.tsx`),\r\n path.resolve(config.root, `src/${fileName}.ts`),\r\n path.resolve(config.root, `${fileName}.tsx`),\r\n path.resolve(config.root, `plugins/${fileName}.tsx`), // for framework dev\r\n ];\r\n \r\n for (const p of possibleLocalPaths) {\r\n if (existsSync(p)) return p;\r\n }\r\n\r\n // 2. Fallback to package's own entry (bundled or source)\r\n const pkgDir = path.dirname(fileURLToPath(import.meta.url));\r\n const possiblePkgPaths = [\r\n path.resolve(pkgDir, `${fileName}.js`),\r\n path.resolve(pkgDir, `${fileName}.mjs`),\r\n path.resolve(pkgDir, `${fileName}.tsx`),\r\n path.resolve(pkgDir, `src/${fileName}.tsx`),\r\n ];\r\n \r\n for (const p of possiblePkgPaths) {\r\n if (existsSync(p)) return p;\r\n }\r\n }\r\n if (id === appVirtualModuleId) {\r\n return resolvedAppVirtualModuleId;\r\n }\r\n return null;\r\n },\r\n load(id) {\r\n if (id === resolvedAppVirtualModuleId) {\r\n // Generate virtual module that re-exports from the user's route.tree\r\n return `\r\n export { OlovaRouter, Outlet, routes, layouts, notFoundPages } from '@/route.tree';\r\n import '@/index.css';\r\n `;\r\n }\r\n return null;\r\n },\r\n configureServer(server) {\r\n // Generate a dev build ID that stays consistent during the dev session\r\n const devBuildId = generateBuildId();\r\n\r\n // Print startup banner\r\n logger.printBanner();\r\n\r\n // Print dev server info once ready\r\n\r\n \r\n // Delay printing to let Vite finish its own output first if needed, \r\n // or print immediately if we want to override. \r\n // Since Vite 7 prints its own banner, we might want to just print our info.\r\n // But user complained about the \"terminal looks bad\", so let's try to be clean.\r\n \r\n server.middlewares.use(async (req, res, next) => {\r\n const url = req.url?.split(\"?\")[0];\r\n if (\r\n url === \"/\" ||\r\n url === \"/index.html\" ||\r\n (req.headers.accept?.includes(\"text/html\") &&\r\n !url?.match(/\\.[a-z]+$/))\r\n ) {\r\n try {\r\n logger.printSSRRender(url || \"/\");\r\n let template = htmlContent;\r\n\r\n const { render } = await server.ssrLoadModule(\r\n serverVirtualModuleId,\r\n );\r\n const renderResult = await render(url || \"/\");\r\n // Handle both string return (legacy) and object return (new Flight format)\r\n const appHtml = typeof renderResult === 'string' ? renderResult : renderResult.html;\r\n const routeMetadata = typeof renderResult === 'string' ? {} : renderResult.metadata || {};\r\n\r\n let fullHtml = template.replace(\"<!--app-html-->\", appHtml);\r\n\r\n // =================================================================\r\n // Flight Hydration for Dev Server\r\n // =================================================================\r\n const hydrationData: OlovaHydrationData = {\r\n route: url || \"/\",\r\n params: {},\r\n metadata: routeMetadata,\r\n chunks: [], // Dev mode doesn't have pre-built chunks\r\n isStatic: false,\r\n };\r\n\r\n // Generate Flight hydration scripts\r\n const flightScripts = generateOlovaHydration(hydrationData, devBuildId);\r\n \r\n // Generate JSON-LD for SEO\r\n const jsonLdScript = generateJsonLd(hydrationData);\r\n \r\n // Generate resource hints (minimal in dev)\r\n const resourceHints = `<link rel=\"dns-prefetch\" href=\"//fonts.googleapis.com\"><link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" crossorigin>`;\r\n\r\n // Inject JSON-LD and resource hints in head\r\n if (fullHtml.includes(\"</head>\")) {\r\n fullHtml = fullHtml.replace(\"</head>\", `${jsonLdScript}${resourceHints}</head>`);\r\n }\r\n\r\n // Inject Flight scripts and entry script for hydration\r\n if (fullHtml.includes(\"</body>\")) {\r\n fullHtml = fullHtml.replace(\r\n \"</body>\",\r\n `${flightScripts}<script type=\"module\" src=\"/@id/${virtualModuleId}\"></script></body>`,\r\n );\r\n } else {\r\n fullHtml += `${flightScripts}<script type=\"module\" src=\"/@id/${virtualModuleId}\"></script>`;\r\n }\r\n\r\n // Now apply Vite transforms.\r\n fullHtml = await server.transformIndexHtml(url || \"/\", fullHtml);\r\n\r\n // Prepend DOCTYPE if missing\r\n if (!fullHtml.trim().toLowerCase().startsWith(\"<!doctype html>\")) {\r\n fullHtml = `<!DOCTYPE html>${fullHtml}`;\r\n }\r\n\r\n res.statusCode = 200;\r\n res.setHeader(\"Content-Type\", \"text/html\");\r\n res.end(minifyHtml(fullHtml));\r\n return;\r\n } catch (e) {\r\n server.ssrFixStacktrace(e as Error);\r\n console.error(e);\r\n res.statusCode = 500;\r\n res.end((e as Error).stack);\r\n return;\r\n }\r\n }\r\n next();\r\n });\r\n },\r\n async writeBundle(_options, bundle) {\r\n if (config.command === \"serve\" || config.build.ssr) return;\r\n\r\n const buildStartTime = Date.now();\r\n logger.printBuildStart();\r\n const outDir = config.build.outDir;\r\n const serverOutDir = path.resolve(outDir, \"server\");\r\n\r\n // Find client entry chunk\r\n const clientEntry = Object.values(bundle).find(\r\n (chunk) =>\r\n chunk.type === \"chunk\" &&\r\n chunk.isEntry &&\r\n (chunk.facadeModuleId?.includes(\"main\") ||\r\n chunk.name === \"main\"),\r\n );\r\n const clientEntryFileName = clientEntry\r\n ? clientEntry.fileName\r\n : \"assets/index.js\";\r\n\r\n // Find CSS assets\r\n const cssAssets = Object.values(bundle).filter(\r\n (chunk) => chunk.type === \"asset\" && chunk.fileName.endsWith(\".css\"),\r\n );\r\n const cssLinks = cssAssets\r\n .map(\r\n (css) =>\r\n `<link rel=\"stylesheet\" crossorigin href=\"/${css.fileName}\">`,\r\n )\r\n .join(\"\");\r\n\r\n // 1. Build Server Bundle\r\n // We use configFile to get MDX and other plugins, but override build settings for SSR\r\n await build({\r\n configFile: config.configFile,\r\n root: config.root,\r\n build: {\r\n ssr: true,\r\n emptyOutDir: false,\r\n outDir: serverOutDir,\r\n minify: false, // Keep readable for debugging\r\n rollupOptions: {\r\n input: { index: serverVirtualModuleId },\r\n output: {\r\n entryFileNames: \"index.js\",\r\n chunkFileNames: \"[name].js\",\r\n assetFileNames: \"[name].[ext]\",\r\n format: \"esm\",\r\n // Explicitly set to undefined to prevent client-side chunking config\r\n manualChunks: undefined,\r\n },\r\n },\r\n },\r\n logLevel: \"error\",\r\n });\r\n\r\n // 2. Load Server Entry to get routes\r\n const serverEntryPath = path.resolve(serverOutDir, \"index.js\");\r\n const serverEntryUrl = pathToFileURL(serverEntryPath).toString();\r\n // Initial import to get routes\r\n const { routes } = await import(serverEntryUrl);\r\n\r\n // 3. Generate Pages\r\n const paths = [\"/\"];\r\n\r\n function extractPaths(routesArr: any[]) {\r\n routesArr.forEach((r) => {\r\n if (r.path && !r.path.includes(\"*\") && !r.path.includes(\":\")) {\r\n paths.push(r.path);\r\n }\r\n });\r\n }\r\n if (Array.isArray(routes)) extractPaths(routes);\r\n\r\n // Add user-provided static paths\r\n if (options.staticPaths) {\r\n options.staticPaths.forEach((p) => paths.push(p));\r\n }\r\n\r\n const uniquePaths = [...new Set(paths)];\r\n \r\n // Generate a unique build ID for this build\r\n const buildId = generateBuildId();\r\n logger.printSSGStart(buildId);\r\n \r\n // Print route table\r\n const routeInfo = uniquePaths.map(p => ({\r\n path: p,\r\n type: (p.includes(':') || p.includes('*') ? 'dynamic' : 'static') as 'static' | 'dynamic'\r\n }));\r\n logger.printRoutes(routeInfo);\r\n \r\n logger.printFlightInfo();\r\n\r\n // Collect all JS chunks for prefetching\r\n const jsChunks = Object.values(bundle)\r\n .filter((chunk) => chunk.type === \"chunk\" && chunk.fileName.endsWith(\".js\"))\r\n .map((chunk) => chunk.fileName);\r\n\r\n for (const p of uniquePaths) {\r\n try {\r\n // Update window location for the fresh import to pick up\r\n if (typeof (globalThis as any).window !== \"undefined\") {\r\n (globalThis as any).window.location.pathname = p;\r\n }\r\n\r\n // FORCE RE-IMPORT for every page to ensure clean state (fresh Router/History instance)\r\n const cacheBuster = `?t=${Date.now()}-${Math.random()}`;\r\n // We destructured render from the fresh module\r\n const { render } = await import(serverEntryUrl + cacheBuster);\r\n\r\n // Render returns { html, metadata, route }\r\n const renderResult = await render(p);\r\n const appHtml = typeof renderResult === 'string' ? renderResult : renderResult.html;\r\n const routeMetadata = typeof renderResult === 'string' ? {} : renderResult.metadata || {};\r\n \r\n let html = htmlContent.replace(\"<!--app-html-->\", appHtml);\r\n\r\n // Generate smart preload hints based on chunk priority\r\n const preloadHints = generatePreloadHints(jsChunks, clientEntryFileName);\r\n const preloadTags = generatePreloadTags(preloadHints);\r\n\r\n // Prepare hydration data for this page\r\n const hydrationData: OlovaHydrationData = {\r\n route: p,\r\n params: {},\r\n metadata: routeMetadata,\r\n chunks: jsChunks,\r\n isStatic: true,\r\n };\r\n\r\n // Generate Flight hydration scripts\r\n const flightScripts = generateOlovaHydration(hydrationData, buildId);\r\n \r\n // Generate JSON-LD for SEO\r\n const jsonLdScript = generateJsonLd(hydrationData);\r\n \r\n // Generate resource hints (DNS prefetch, preconnect)\r\n const resourceHints = generateResourceHints(hydrationData);\r\n\r\n // Inject JSON-LD, resource hints, CSS, and smart preload tags at end of head\r\n if (html.includes(\"</head>\")) {\r\n html = html.replace(\"</head>\", `${jsonLdScript}${resourceHints}${cssLinks}${preloadTags}</head>`);\r\n }\r\n\r\n // Inject Flight scripts and main script at end of body\r\n if (html.includes(\"</body>\")) {\r\n html = html.replace(\r\n \"</body>\",\r\n `${flightScripts}<script type=\"module\" src=\"/${clientEntryFileName}\"></script></body>`,\r\n );\r\n } else {\r\n // Fallback if no body tag found\r\n html += `${flightScripts}<script type=\"module\" src=\"/${clientEntryFileName}\"></script>`;\r\n }\r\n\r\n // Prepend DOCTYPE if missing\r\n if (!html.trim().toLowerCase().startsWith(\"<!doctype html>\")) {\r\n html = `<!DOCTYPE html>${html}`;\r\n }\r\n\r\n const itemPath =\r\n p === \"/\" ? \"index.html\" : `${p.substring(1)}/index.html`;\r\n const finalPath = path.resolve(outDir, itemPath);\r\n await fs.mkdir(path.dirname(finalPath), { recursive: true });\r\n await fs.writeFile(finalPath, minifyHtml(html));\r\n logger.printPageGenerated(itemPath, true);\r\n } catch (e) {\r\n logger.printPageError(p, (e as Error).message);\r\n }\r\n }\r\n\r\n // Cleanup server bundle (not needed for static serving)\r\n await fs.rm(serverOutDir, { recursive: true, force: true });\r\n\r\n const buildTime = Date.now() - buildStartTime;\r\n logger.printSSGComplete({\r\n totalPages: uniquePaths.length,\r\n successPages: uniquePaths.length, // TODO: track actual success count\r\n failedPages: 0,\r\n buildTime\r\n });\r\n },\r\n } as Plugin,\r\n // Add performance optimization plugins\r\n ...(options.performance?.enabled !== false ? olovaPerformance(options.performance) : []),\r\n ];\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/logger.ts","../src/performance.ts","../olova.ts"],"names":["pc","path","error","promisify","zlib","fs","olovaRouter","existsSync","fileURLToPath","build","pathToFileURL"],"mappings":"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","file":"olova.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/**\r\n * Olova Logger - Modern, styled terminal output\r\n * Inspired by Next.js console output\r\n */\r\n\r\nimport pc from 'picocolors';\r\n\r\n// Symbols\r\nconst SYMBOLS = {\r\n success: pc.green('✓'),\r\n error: pc.red('✗'),\r\n warning: pc.yellow('⚠'),\r\n info: pc.blue('○'),\r\n arrow: pc.cyan('→'),\r\n bullet: pc.dim('•'),\r\n rocket: '🚀',\r\n sparkles: '✨',\r\n package: '📦',\r\n route: pc.cyan('λ'),\r\n static: pc.green('○'),\r\n dynamic: pc.magenta('ƒ'),\r\n};\r\n\r\n// Olova brand colors\r\nconst brand = {\r\n name: pc.bold(pc.cyan('Olova')),\r\n version: pc.dim('v1.0.0'),\r\n tagline: pc.dim('Flight-powered SSG'),\r\n};\r\n\r\n/**\r\n * Print the startup banner\r\n */\r\nexport function printBanner() {\r\n console.log('');\r\n console.log(pc.cyan(` ${SYMBOLS.rocket} ${brand.name} ${brand.version}`));\r\n console.log(pc.dim(` ${brand.tagline}`));\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print dev server ready message\r\n */\r\nexport function printDevReady(url: string, networkUrl?: string) {\r\n console.log('');\r\n console.log(` ${SYMBOLS.success} ${pc.bold('Ready')} in ${pc.cyan('~1s')}`);\r\n console.log('');\r\n console.log(` ${pc.dim('Local:')} ${pc.cyan(url)}`);\r\n if (networkUrl) {\r\n console.log(` ${pc.dim('Network:')} ${pc.cyan(networkUrl)}`);\r\n }\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print SSG build start\r\n */\r\nexport function printBuildStart() {\r\n console.log('');\r\n console.log(` ${SYMBOLS.package} ${pc.bold('Creating optimized production build...')}`);\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print SSG build header\r\n */\r\nexport function printSSGStart(buildId: string) {\r\n console.log('');\r\n console.log(` ${pc.bold(pc.cyan('Static Site Generation'))}`);\r\n console.log(` ${pc.dim('Build ID:')} ${pc.yellow(buildId)}`);\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print route list in a nice table format\r\n */\r\nexport function printRoutes(routes: { path: string; type: 'static' | 'dynamic' }[]) {\r\n console.log(` ${pc.bold('Route')}${' '.repeat(30)}${pc.bold('Type')}`);\r\n console.log(` ${pc.dim('─'.repeat(45))}`);\r\n \r\n for (const route of routes) {\r\n const typeIcon = route.type === 'static' ? SYMBOLS.static : SYMBOLS.dynamic;\r\n const typeLabel = route.type === 'static' \r\n ? pc.green('Static') \r\n : pc.magenta('Dynamic');\r\n const padding = ' '.repeat(Math.max(2, 35 - route.path.length));\r\n console.log(` ${typeIcon} ${route.path}${padding}${typeLabel}`);\r\n }\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print single page generation\r\n */\r\nexport function printPageGenerated(path: string, hasFlightData = true) {\r\n const flightBadge = hasFlightData ? pc.dim(' [Flight]') : '';\r\n console.log(` ${SYMBOLS.success} ${pc.dim('Generated')} ${pc.white(path)}${flightBadge}`);\r\n}\r\n\r\n/**\r\n * Print page generation error\r\n */\r\nexport function printPageError(path: string, error: string) {\r\n console.log(` ${SYMBOLS.error} ${pc.red('Failed')} ${path}`);\r\n console.log(` ${pc.dim(error)}`);\r\n}\r\n\r\n/**\r\n * Print SSG completion summary\r\n */\r\nexport function printSSGComplete(stats: {\r\n totalPages: number;\r\n successPages: number;\r\n failedPages: number;\r\n buildTime: number;\r\n}) {\r\n console.log('');\r\n console.log(` ${pc.dim('─'.repeat(45))}`);\r\n console.log('');\r\n \r\n if (stats.failedPages > 0) {\r\n console.log(` ${SYMBOLS.warning} ${pc.yellow('Build completed with warnings')}`);\r\n } else {\r\n console.log(` ${SYMBOLS.sparkles} ${pc.green('Build completed successfully!')}`);\r\n }\r\n \r\n console.log('');\r\n console.log(` ${pc.dim('Pages:')} ${pc.bold(stats.successPages.toString())} generated`);\r\n if (stats.failedPages > 0) {\r\n console.log(` ${pc.red(stats.failedPages.toString())} failed`);\r\n }\r\n console.log(` ${pc.dim('Time:')} ${pc.cyan(stats.buildTime + 'ms')}`);\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print Flight hydration info\r\n */\r\nexport function printFlightInfo() {\r\n console.log(` ${SYMBOLS.info} ${pc.dim('Flight hydration enabled')}`);\r\n console.log(` ${pc.dim('•')} JSON-LD structured data`);\r\n console.log(` ${pc.dim('•')} Resource hints (preload, prefetch)`);\r\n console.log(` ${pc.dim('•')} $OLOVA global object`);\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print a simple info message\r\n */\r\nexport function info(message: string) {\r\n console.log(` ${SYMBOLS.info} ${message}`);\r\n}\r\n\r\n/**\r\n * Print a success message\r\n */\r\nexport function success(message: string) {\r\n console.log(` ${SYMBOLS.success} ${pc.green(message)}`);\r\n}\r\n\r\n/**\r\n * Print a warning message\r\n */\r\nexport function warn(message: string) {\r\n console.log(` ${SYMBOLS.warning} ${pc.yellow(message)}`);\r\n}\r\n\r\n/**\r\n * Print an error message\r\n */\r\nexport function error(message: string) {\r\n console.log(` ${SYMBOLS.error} ${pc.red(message)}`);\r\n}\r\n\r\n/**\r\n * Print SSR render info (dev mode)\r\n */\r\nexport function printSSRRender(path: string) {\r\n console.log(` ${SYMBOLS.arrow} ${pc.dim('SSR')} ${path}`);\r\n}\r\n\r\nexport default {\r\n printBanner,\r\n printDevReady,\r\n printBuildStart,\r\n printSSGStart,\r\n printRoutes,\r\n printPageGenerated,\r\n printPageError,\r\n printSSGComplete,\r\n printFlightInfo,\r\n printSSRRender,\r\n info,\r\n success,\r\n warn,\r\n error,\r\n SYMBOLS,\r\n};\r\n","/**\r\n * Olova Performance Optimizations Plugin\r\n * \r\n * Provides build-time optimizations for SSG:\r\n * - Code splitting strategies\r\n * - Asset compression (gzip/brotli)\r\n * - Chunk size analysis\r\n * - Resource prioritization\r\n */\r\n\r\nimport fs from 'node:fs/promises';\r\nimport path from 'node:path';\r\nimport { promisify } from 'node:util';\r\nimport zlib from 'node:zlib';\r\nimport type { Plugin, ResolvedConfig } from 'vite';\r\nimport logger from './logger';\r\n\r\n// Promisify zlib functions\r\nconst gzip = promisify(zlib.gzip);\r\nconst brotliCompress = promisify(zlib.brotliCompress);\r\n\r\n// =============================================================================\r\n// TYPES\r\n// =============================================================================\r\n\r\nexport interface PerformanceOptions {\r\n /**\r\n * Enable gzip compression for assets\r\n * @default true\r\n */\r\n gzip?: boolean;\r\n \r\n /**\r\n * Enable brotli compression for assets\r\n * @default true\r\n */\r\n brotli?: boolean;\r\n \r\n /**\r\n * Minimum file size (in bytes) to compress\r\n * @default 1024 (1KB)\r\n */\r\n threshold?: number;\r\n \r\n /**\r\n * File extensions to compress\r\n * @default ['js', 'css', 'html', 'json', 'svg', 'xml']\r\n */\r\n extensions?: string[];\r\n \r\n /**\r\n * Enable chunk size warnings\r\n * @default true\r\n */\r\n chunkSizeWarning?: boolean;\r\n \r\n /**\r\n * Maximum chunk size before warning (in KB)\r\n * @default 250\r\n */\r\n maxChunkSize?: number;\r\n \r\n /**\r\n * Enable route-based code splitting\r\n * @default true\r\n */\r\n routeCodeSplitting?: boolean;\r\n}\r\n\r\nexport interface ChunkInfo {\r\n name: string;\r\n size: number;\r\n gzipSize?: number;\r\n brotliSize?: number;\r\n isEntry: boolean;\r\n type: 'vendor' | 'framework' | 'common' | 'route' | 'other';\r\n}\r\n\r\n// =============================================================================\r\n// MANUAL CHUNKS CONFIGURATION\r\n// =============================================================================\r\n\r\n/**\r\n * Smart manual chunks configuration for optimal code splitting\r\n * Separates vendor, framework, and route-specific code\r\n * Avoids circular dependencies by grouping related routes\r\n */\r\nexport function createManualChunks() {\r\n // Track modules to detect potential circular dependencies\r\n const seenModules = new Map<string, string>();\r\n \r\n return (id: string, { getModuleInfo }: { getModuleInfo: (id: string) => { importers: readonly string[] } | null }): string | undefined => {\r\n // React and React DOM - cached separately\r\n if (id.includes('node_modules/react-dom')) {\r\n return 'vendor-react-dom';\r\n }\r\n if (id.includes('node_modules/react')) {\r\n return 'vendor-react';\r\n }\r\n \r\n // Olova Router - framework code\r\n if (id.includes('olova-router')) {\r\n return 'framework-router';\r\n }\r\n \r\n // Other node_modules - vendor bundle\r\n if (id.includes('node_modules')) {\r\n // Extract package name for better caching\r\n const match = id.match(/node_modules[\\\\/]([^/\\\\]+)/);\r\n if (match) {\r\n const pkg = match[1];\r\n // Group small packages together\r\n if (['scheduler', 'object-assign', 'prop-types'].includes(pkg)) {\r\n return 'vendor-react';\r\n }\r\n // Keep large packages separate\r\n if (['lodash', 'moment', 'axios', 'date-fns'].includes(pkg)) {\r\n return `vendor-${pkg}`;\r\n }\r\n }\r\n return 'vendor';\r\n }\r\n \r\n // Shared components - group together to avoid circular deps\r\n if (id.includes('/components/')) {\r\n return 'common-components';\r\n }\r\n \r\n // Shared utilities\r\n if (id.includes('/utils/') || id.includes('/lib/') || id.includes('/helpers/')) {\r\n return 'common-utils';\r\n }\r\n \r\n // CSS - let Vite handle\r\n if (id.endsWith('.css') || id.endsWith('.scss')) {\r\n return undefined;\r\n }\r\n \r\n // Auth pages + search - group together to avoid circular deps\r\n // (login <-> register <-> search often share components/navigation)\r\n if (id.includes('/(auth)/') || id.includes('\\\\(auth)\\\\') || \r\n id.includes('/search/') || id.includes('\\\\search\\\\')) {\r\n return 'page-auth';\r\n }\r\n \r\n // Route components - be conservative, only split truly isolated routes\r\n // Don't split if the module has cross-route imports\r\n if (id.includes('/src/') && (id.endsWith('/index.tsx') || id.endsWith('/index.mdx'))) {\r\n // Check if this module would cause circular dependencies\r\n const moduleInfo = getModuleInfo(id);\r\n if (moduleInfo) {\r\n // If imported by another route, group with common\r\n for (const importer of moduleInfo.importers) {\r\n if (importer.includes('/src/') && importer.includes('/index.') && !importer.includes(id)) {\r\n return 'common-routes';\r\n }\r\n }\r\n }\r\n \r\n const routeMatch = id.match(/[\\\\/]src[\\\\/](.+?)[\\\\/]index\\.(tsx|mdx)$/);\r\n if (routeMatch) {\r\n const routePath = routeMatch[1]\r\n .replace(/\\([^)]+\\)[\\\\/]/g, '') // Remove route groups\r\n .replace(/\\[.*?\\]/g, 'dynamic') // Replace dynamic segments\r\n .replace(/[\\\\/]/g, '-');\r\n \r\n // Skip if we've seen a chunk with same base that would cause circular\r\n const baseRoute = routePath.split('-')[0];\r\n if (seenModules.has(baseRoute)) {\r\n const existingChunk = seenModules.get(baseRoute)!;\r\n // If related routes, group them\r\n if (existingChunk.startsWith('page-')) {\r\n return existingChunk;\r\n }\r\n }\r\n \r\n const chunkName = `page-${routePath}`;\r\n seenModules.set(baseRoute, chunkName);\r\n return chunkName;\r\n }\r\n }\r\n \r\n return undefined;\r\n };\r\n}\r\n\r\n// =============================================================================\r\n// COMPRESSION PLUGIN\r\n// =============================================================================\r\n\r\n/**\r\n * Compression plugin for generating gzip and brotli compressed assets\r\n */\r\nexport function compressionPlugin(options: PerformanceOptions = {}): Plugin {\r\n const {\r\n gzip: enableGzip = true,\r\n brotli: enableBrotli = true,\r\n threshold = 1024,\r\n extensions = ['js', 'css', 'html', 'json', 'svg', 'xml'],\r\n } = options;\r\n \r\n let config: ResolvedConfig;\r\n \r\n return {\r\n name: 'olova-compression',\r\n apply: 'build',\r\n \r\n configResolved(resolvedConfig) {\r\n config = resolvedConfig;\r\n },\r\n \r\n async closeBundle() {\r\n if (config.command !== 'build' || config.build.ssr) return;\r\n \r\n const outDir = config.build.outDir;\r\n const stats = { gzip: 0, brotli: 0, skipped: 0 };\r\n \r\n // Find all files to compress\r\n const files = await findFilesToCompress(outDir, extensions);\r\n \r\n for (const file of files) {\r\n const content = await fs.readFile(file);\r\n \r\n // Skip small files\r\n if (content.length < threshold) {\r\n stats.skipped++;\r\n continue;\r\n }\r\n \r\n // Gzip compression\r\n if (enableGzip) {\r\n try {\r\n const compressed = await gzip(content, { level: 9 });\r\n await fs.writeFile(`${file}.gz`, compressed);\r\n stats.gzip++;\r\n } catch (e) {\r\n // Silently skip compression errors\r\n }\r\n }\r\n \r\n // Brotli compression\r\n if (enableBrotli) {\r\n try {\r\n const compressed = await brotliCompress(content, {\r\n params: {\r\n [zlib.constants.BROTLI_PARAM_QUALITY]: 11,\r\n },\r\n });\r\n await fs.writeFile(`${file}.br`, compressed);\r\n stats.brotli++;\r\n } catch (e) {\r\n // Silently skip compression errors\r\n }\r\n }\r\n }\r\n \r\n // Log compression stats\r\n if (stats.gzip > 0 || stats.brotli > 0) {\r\n logger.info(`Compressed ${stats.gzip} files (gzip), ${stats.brotli} files (brotli)`);\r\n }\r\n },\r\n };\r\n}\r\n\r\n// =============================================================================\r\n// CHUNK ANALYSIS PLUGIN\r\n// =============================================================================\r\n\r\n/**\r\n * Chunk analysis plugin for monitoring bundle sizes\r\n */\r\nexport function chunkAnalysisPlugin(options: PerformanceOptions = {}): Plugin {\r\n const {\r\n chunkSizeWarning = true,\r\n maxChunkSize = 250,\r\n } = options;\r\n \r\n const chunks: ChunkInfo[] = [];\r\n \r\n return {\r\n name: 'olova-chunk-analysis',\r\n apply: 'build',\r\n \r\n generateBundle(_options, bundle) {\r\n for (const [fileName, chunk] of Object.entries(bundle)) {\r\n if (chunk.type === 'chunk') {\r\n const sizeKB = Buffer.byteLength(chunk.code, 'utf8') / 1024;\r\n \r\n // Determine chunk type\r\n let type: ChunkInfo['type'] = 'other';\r\n if (fileName.includes('vendor')) type = 'vendor';\r\n else if (fileName.includes('framework')) type = 'framework';\r\n else if (fileName.includes('common')) type = 'common';\r\n else if (fileName.includes('page-')) type = 'route';\r\n \r\n chunks.push({\r\n name: fileName,\r\n size: Math.round(sizeKB * 100) / 100,\r\n isEntry: chunk.isEntry,\r\n type,\r\n });\r\n \r\n // Warn about large chunks\r\n if (chunkSizeWarning && sizeKB > maxChunkSize) {\r\n logger.warn(`Chunk \"${fileName}\" is ${sizeKB.toFixed(2)}KB (exceeds ${maxChunkSize}KB limit)`);\r\n }\r\n }\r\n }\r\n },\r\n \r\n closeBundle() {\r\n if (chunks.length === 0) return;\r\n \r\n // Sort by size descending\r\n chunks.sort((a, b) => b.size - a.size);\r\n \r\n // Print chunk summary\r\n console.log('');\r\n logger.info('Bundle Analysis:');\r\n \r\n const typeGroups: Record<string, number> = {};\r\n let totalSize = 0;\r\n \r\n for (const chunk of chunks) {\r\n typeGroups[chunk.type] = (typeGroups[chunk.type] || 0) + chunk.size;\r\n totalSize += chunk.size;\r\n }\r\n \r\n console.log(` Vendor: ${(typeGroups.vendor || 0).toFixed(2)} KB`);\r\n console.log(` Framework: ${(typeGroups.framework || 0).toFixed(2)} KB`);\r\n console.log(` Common: ${(typeGroups.common || 0).toFixed(2)} KB`);\r\n console.log(` Routes: ${(typeGroups.route || 0).toFixed(2)} KB`);\r\n console.log(` Other: ${(typeGroups.other || 0).toFixed(2)} KB`);\r\n console.log(` ─────────────────────`);\r\n console.log(` Total: ${totalSize.toFixed(2)} KB`);\r\n console.log('');\r\n },\r\n };\r\n}\r\n\r\n// =============================================================================\r\n// PRELOAD HINTS GENERATOR\r\n// =============================================================================\r\n\r\nexport interface PreloadHint {\r\n href: string;\r\n as: 'script' | 'style' | 'font' | 'image';\r\n priority: 'critical' | 'high' | 'low';\r\n crossorigin?: boolean;\r\n}\r\n\r\n/**\r\n * Generate optimized preload hints for chunks\r\n */\r\nexport function generatePreloadHints(\r\n chunks: string[],\r\n entryChunk: string\r\n): PreloadHint[] {\r\n const hints: PreloadHint[] = [];\r\n \r\n // Entry chunk - critical priority\r\n hints.push({\r\n href: `/${entryChunk}`,\r\n as: 'script',\r\n priority: 'critical',\r\n });\r\n \r\n for (const chunk of chunks) {\r\n if (chunk === entryChunk) continue;\r\n \r\n // Vendor chunks - high priority (needed for hydration)\r\n if (chunk.includes('vendor')) {\r\n hints.push({\r\n href: `/${chunk}`,\r\n as: 'script',\r\n priority: 'high',\r\n });\r\n }\r\n // Framework chunks - high priority\r\n else if (chunk.includes('framework')) {\r\n hints.push({\r\n href: `/${chunk}`,\r\n as: 'script',\r\n priority: 'high',\r\n });\r\n }\r\n // Common chunks - high priority\r\n else if (chunk.includes('common')) {\r\n hints.push({\r\n href: `/${chunk}`,\r\n as: 'script',\r\n priority: 'high',\r\n });\r\n }\r\n // Route chunks - low priority (prefetch for navigation)\r\n else if (chunk.includes('page-')) {\r\n hints.push({\r\n href: `/${chunk}`,\r\n as: 'script',\r\n priority: 'low',\r\n });\r\n }\r\n }\r\n \r\n return hints;\r\n}\r\n\r\n/**\r\n * Generate HTML preload/prefetch tags from hints\r\n */\r\nexport function generatePreloadTags(hints: PreloadHint[]): string {\r\n return hints\r\n .map((hint) => {\r\n const rel = hint.priority === 'low' ? 'prefetch' : 'modulepreload';\r\n const crossorigin = hint.crossorigin ? ' crossorigin' : '';\r\n return `<link rel=\"${rel}\" href=\"${hint.href}\"${crossorigin}>`;\r\n })\r\n .join('');\r\n}\r\n\r\n// =============================================================================\r\n// UTILITY FUNCTIONS\r\n// =============================================================================\r\n\r\n/**\r\n * Recursively find files to compress\r\n */\r\nasync function findFilesToCompress(\r\n dir: string,\r\n extensions: string[]\r\n): Promise<string[]> {\r\n const files: string[] = [];\r\n \r\n try {\r\n const entries = await fs.readdir(dir, { withFileTypes: true });\r\n \r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n files.push(...await findFilesToCompress(fullPath, extensions));\r\n } else if (entry.isFile()) {\r\n const ext = path.extname(entry.name).slice(1);\r\n if (extensions.includes(ext)) {\r\n files.push(fullPath);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n // Directory doesn't exist or can't be read\r\n }\r\n \r\n return files;\r\n}\r\n\r\n/**\r\n * Calculate gzip size of content\r\n */\r\nexport async function getGzipSize(content: string | Buffer): Promise<number> {\r\n const buffer = typeof content === 'string' ? Buffer.from(content) : content;\r\n const compressed = await gzip(buffer);\r\n return compressed.length;\r\n}\r\n\r\n/**\r\n * Format bytes to human readable size\r\n */\r\nexport function formatBytes(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\r\n}\r\n\r\n// =============================================================================\r\n// COMBINED PERFORMANCE PLUGIN\r\n// =============================================================================\r\n\r\n/**\r\n * Main performance plugin that combines all optimizations\r\n */\r\nexport function olovaPerformance(options: PerformanceOptions = {}): Plugin[] {\r\n return [\r\n chunkAnalysisPlugin(options),\r\n compressionPlugin(options),\r\n ];\r\n}\r\n\r\nexport default olovaPerformance;\r\n","import { existsSync } from \"node:fs\";\r\nimport fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\r\nimport { olovaRouter } from \"olova-router\";\r\nimport { build, type Plugin, type ResolvedConfig } from \"vite\";\r\nimport logger from \"./src/logger\";\r\nimport type { PerformanceOptions } from \"./src/performance\";\r\nimport {\r\n createManualChunks,\r\n generatePreloadHints,\r\n generatePreloadTags,\r\n olovaPerformance,\r\n} from \"./src/performance\";\r\n\r\n// =============================================================================\r\n// FLIGHT HYDRATION - Inline implementation for SSG\r\n// =============================================================================\r\n\r\ninterface OlovaHydrationData {\r\n route: string;\r\n params?: Record<string, string>;\r\n metadata?: Record<string, unknown>;\r\n chunks?: string[];\r\n isStatic?: boolean;\r\n}\r\n\r\nfunction safeStringify(data: unknown): string {\r\n return JSON.stringify(data).replace(/[<>\\/\\u2028\\u2029]/g, (char) => {\r\n switch (char) {\r\n case '<': return '\\\\u003c';\r\n case '>': return '\\\\u003e';\r\n case '/': return '\\\\u002f';\r\n case '\\u2028': return '\\\\u2028';\r\n case '\\u2029': return '\\\\u2029';\r\n default: return char;\r\n }\r\n });\r\n}\r\n\r\nfunction generateBuildId(): string {\r\n const timestamp = Date.now().toString(36);\r\n const random = Math.random().toString(36).substring(2, 8);\r\n return `${timestamp}-${random}`;\r\n}\r\n\r\nfunction generatePageName(route: string): string {\r\n if (route === '/') return 'HomePage';\r\n return route.slice(1).split('/').filter(Boolean)\r\n .map(s => s.charAt(0).toUpperCase() + s.slice(1).replace(/[^a-zA-Z0-9]/g, ''))\r\n .join('') + 'Page';\r\n}\r\n\r\nfunction 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 scripts.push(`<script>self.__olova_f=self.__olova_f||[];function _oF(d){self.__olova_f.push(d)}</script>`);\r\n\r\n // Route chunk\r\n const routeData = { path: data.route, params: data.params || {}, pattern: data.route, isStatic: data.isStatic ?? true, buildId };\r\n scripts.push(`<script>_oF([0,\"R\",${safeStringify(routeData)}])</script>`);\r\n\r\n // Metadata chunk\r\n const metaData = {\r\n title: (meta.title as string) || 'Olova App',\r\n description: (meta.description as string) || '',\r\n keywords: Array.isArray(meta.keywords) ? meta.keywords : [],\r\n robots: 'index, follow',\r\n og: { type: 'website', locale: 'en_US', ...((meta.openGraph as object) || {}) },\r\n twitter: { card: 'summary_large_image', ...((meta.twitter as object) || {}) }\r\n };\r\n scripts.push(`<script>_oF([1,\"M\",${safeStringify(metaData)}])</script>`);\r\n\r\n // Tree chunk\r\n const treeData = { layout: 'RootLayout', page: generatePageName(data.route), template: null, loading: null, error: null, notFound: null };\r\n scripts.push(`<script>_oF([2,\"T\",${safeStringify(treeData)}])</script>`);\r\n\r\n // Structured data chunk\r\n const schemaData = [\r\n { '@context': 'https://schema.org', '@type': 'WebPage', name: metaData.title, description: metaData.description, url: data.route },\r\n { '@context': 'https://schema.org', '@type': 'WebApplication', name: 'Olova', applicationCategory: 'WebApplication', operatingSystem: 'Any' }\r\n ];\r\n scripts.push(`<script>_oF([3,\"D\",${safeStringify(schemaData)}])</script>`);\r\n\r\n // Assets chunk\r\n const assetsData = { chunks: data.chunks || [], styles: [], prefetch: (data.chunks || []).slice(0, 5) };\r\n scripts.push(`<script>_oF([4,\"A\",${safeStringify(assetsData)}])</script>`);\r\n\r\n // Hints chunk\r\n const hintsData = { dnsPrefetch: ['fonts.googleapis.com'], preconnect: ['https://fonts.googleapis.com'], modulePreload: (data.chunks || []).slice(0, 3) };\r\n scripts.push(`<script>_oF([5,\"H\",${safeStringify(hintsData)}])</script>`);\r\n\r\n // State chunk\r\n const stateData = { hydrated: false, streaming: false, ready: true, timestamp: Date.now(), version: '1.0.0', buildId };\r\n scripts.push(`<script>_oF([6,\"S\",${safeStringify(stateData)}])</script>`);\r\n\r\n // End marker\r\n scripts.push(`<script>_oF([7,\"E\",null])</script>`);\r\n\r\n // Global $OLOVA object\r\n const globalPayload = {\r\n $route: routeData, $meta: metaData, $tree: treeData, $schema: schemaData,\r\n $assets: assetsData, $hints: hintsData, $state: stateData,\r\n $build: { id: buildId, version: '1.0.0', timestamp: Date.now(), env: 'production' }\r\n };\r\n scripts.push(`<script>$OLOVA=${safeStringify(globalPayload)}</script>`);\r\n\r\n return scripts.join('');\r\n}\r\n\r\nfunction generateJsonLd(data: OlovaHydrationData): string {\r\n const meta = (data.metadata || {}) as Record<string, unknown>;\r\n const jsonLd = {\r\n '@context': 'https://schema.org',\r\n '@graph': [\r\n { '@type': 'WebPage', '@id': data.route, name: (meta.title as string) || 'Olova App', description: (meta.description as string) || '', url: data.route, isPartOf: { '@type': 'WebSite', name: 'Olova App' } },\r\n { '@type': 'BreadcrumbList', itemListElement: data.route.split('/').filter(Boolean).map((segment, index, arr) => ({ '@type': 'ListItem', position: index + 1, name: segment.charAt(0).toUpperCase() + segment.slice(1), item: '/' + arr.slice(0, index + 1).join('/') })) }\r\n ]\r\n };\r\n return `<script type=\"application/ld+json\">${JSON.stringify(jsonLd)}</script>`;\r\n}\r\n\r\nfunction generateResourceHints(data: OlovaHydrationData): string {\r\n const hints: string[] = [];\r\n hints.push(`<link rel=\"dns-prefetch\" href=\"//fonts.googleapis.com\">`);\r\n hints.push(`<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" crossorigin>`);\r\n if (data.chunks) {\r\n for (const chunk of data.chunks.slice(0, 3)) {\r\n hints.push(`<link rel=\"modulepreload\" href=\"/${chunk}\">`);\r\n }\r\n }\r\n return hints.join('');\r\n}\r\n\r\n// =============================================================================\r\n// PLUGIN INTERFACE\r\n// =============================================================================\r\n\r\nexport interface OlovaOptions {\r\n /**\r\n * Static paths to pre-render at build time\r\n */\r\n staticPaths?: string[];\r\n \r\n /**\r\n * Performance optimization options\r\n */\r\n performance?: PerformanceOptions & {\r\n /**\r\n * Enable all performance optimizations\r\n * @default true\r\n */\r\n enabled?: boolean;\r\n };\r\n}\r\n\r\nexport function olova(options: OlovaOptions = {}): any {\r\n const virtualModuleId = \"virtual:olova-entry\";\r\n const serverVirtualModuleId = \"virtual:olova-server-entry\";\r\n const appVirtualModuleId = \"virtual:olova-app\";\r\n const resolvedAppVirtualModuleId = \"\\0\" + appVirtualModuleId;\r\n let config: ResolvedConfig;\r\n\r\n // Minimal shell - just the placeholder.\r\n // We'll prepend DOCTYPE manually to avoid duplication if app renders it (though app usually shouldn't).\r\n const htmlContent = `<!--app-html-->`;\r\n\r\n // Simple HTML minifier: removes whitespace between tags, trimming, and newlines\r\n const minifyHtml = (html: string) => {\r\n return html\r\n .replace(/>\\s+</g, \"><\")\r\n .replace(/\\s{2,}/g, \" \")\r\n .replace(/<!--[\\s\\S]*?-->/g, \"\") // remove comments\r\n .trim();\r\n };\r\n\r\n return [\r\n olovaRouter(),\r\n {\r\n name: \"vite-plugin-olova\",\r\n config(userConfig, { isSsrBuild }) {\r\n // All optimizations are enabled by default\r\n const perfEnabled = options.performance?.enabled !== false;\r\n \r\n // Skip performance optimizations for SSR builds\r\n if (isSsrBuild) {\r\n return {\r\n build: {\r\n rollupOptions: {\r\n input: userConfig.build?.rollupOptions?.input || virtualModuleId,\r\n output: {\r\n // Simple output for SSR\r\n entryFileNames: 'index.js',\r\n chunkFileNames: '[name].js',\r\n assetFileNames: '[name].[ext]',\r\n format: 'esm',\r\n manualChunks: undefined,\r\n },\r\n },\r\n },\r\n };\r\n }\r\n \r\n // Full optimization config for client builds (all automatic!)\r\n const buildConfig: any = {\r\n // Output directory for assets\r\n assetsDir: 'assets/_olova',\r\n // Report compressed size in build output\r\n reportCompressedSize: true,\r\n rollupOptions: {\r\n input: userConfig.build?.rollupOptions?.input || virtualModuleId,\r\n output: {\r\n // Optimized chunk naming for caching\r\n chunkFileNames: 'assets/_olova/[name]-[hash].js',\r\n entryFileNames: 'assets/_olova/[name]-[hash].js',\r\n assetFileNames: 'assets/_olova/[name]-[hash].[ext]',\r\n // Enable smart code splitting\r\n ...(perfEnabled && {\r\n manualChunks: createManualChunks(),\r\n }),\r\n },\r\n },\r\n // Increase warning limit since we're doing smart chunking\r\n chunkSizeWarningLimit: 500,\r\n // Inline small assets (< 4KB)\r\n assetsInlineLimit: 4096,\r\n // Enable terser minification for smaller bundles\r\n minify: 'terser',\r\n terserOptions: {\r\n compress: {\r\n // Aggressive optimizations for production\r\n drop_console: false, // Keep console for debugging\r\n drop_debugger: true,\r\n pure_funcs: ['console.debug'],\r\n passes: 2,\r\n },\r\n mangle: {\r\n properties: false,\r\n },\r\n format: {\r\n comments: false,\r\n },\r\n },\r\n // Disable source maps for smaller builds\r\n sourcemap: false,\r\n // CSS code splitting\r\n cssCodeSplit: true,\r\n // Target modern browsers (smaller bundles)\r\n target: 'es2020',\r\n };\r\n \r\n return {\r\n build: buildConfig,\r\n // Optimize deps for faster dev startup\r\n optimizeDeps: {\r\n include: ['react', 'react-dom'],\r\n },\r\n // esbuild optimizations\r\n esbuild: {\r\n treeShaking: true,\r\n legalComments: 'none',\r\n },\r\n // Preview server configuration (for testing production builds)\r\n preview: {\r\n headers: {\r\n // Long-term caching for static assets\r\n 'Cache-Control': 'public, max-age=31536000',\r\n },\r\n },\r\n };\r\n },\r\n async configResolved(resolvedConfig) {\r\n config = resolvedConfig;\r\n },\r\n resolveId(id) {\r\n if (id === virtualModuleId || id === serverVirtualModuleId) {\r\n const isServer = id === serverVirtualModuleId;\r\n const fileName = isServer ? \"entry-server\" : \"main\";\r\n \r\n // 1. Try to find local project override first\r\n const possibleLocalPaths = [\r\n path.resolve(config.root, `src/${fileName}.tsx`),\r\n path.resolve(config.root, `src/${fileName}.ts`),\r\n path.resolve(config.root, `${fileName}.tsx`),\r\n path.resolve(config.root, `plugins/${fileName}.tsx`), // for framework dev\r\n ];\r\n \r\n for (const p of possibleLocalPaths) {\r\n if (existsSync(p)) return p;\r\n }\r\n\r\n // 2. Fallback to package's own entry (bundled or source)\r\n const pkgDir = path.dirname(fileURLToPath(import.meta.url));\r\n const possiblePkgPaths = [\r\n path.resolve(pkgDir, `${fileName}.js`),\r\n path.resolve(pkgDir, `${fileName}.mjs`),\r\n path.resolve(pkgDir, `${fileName}.tsx`),\r\n path.resolve(pkgDir, `src/${fileName}.tsx`),\r\n ];\r\n \r\n for (const p of possiblePkgPaths) {\r\n if (existsSync(p)) return p;\r\n }\r\n }\r\n if (id === appVirtualModuleId) {\r\n return resolvedAppVirtualModuleId;\r\n }\r\n return null;\r\n },\r\n load(id) {\r\n if (id === resolvedAppVirtualModuleId) {\r\n // Generate virtual module that re-exports from the user's route.tree\r\n return `\r\n export { OlovaRouter, Outlet, routes, layouts, notFoundPages } from '@/route.tree';\r\n import '@/index.css';\r\n `;\r\n }\r\n return null;\r\n },\r\n configureServer(server) {\r\n // Generate a dev build ID that stays consistent during the dev session\r\n const devBuildId = generateBuildId();\r\n\r\n // Print startup banner\r\n logger.printBanner();\r\n\r\n // Print dev server info once ready\r\n\r\n \r\n // Delay printing to let Vite finish its own output first if needed, \r\n // or print immediately if we want to override. \r\n // Since Vite 7 prints its own banner, we might want to just print our info.\r\n // But user complained about the \"terminal looks bad\", so let's try to be clean.\r\n \r\n server.middlewares.use(async (req, res, next) => {\r\n const url = req.url?.split(\"?\")[0];\r\n if (\r\n url === \"/\" ||\r\n url === \"/index.html\" ||\r\n (req.headers.accept?.includes(\"text/html\") &&\r\n !url?.match(/\\.[a-z]+$/))\r\n ) {\r\n try {\r\n logger.printSSRRender(url || \"/\");\r\n let template = htmlContent;\r\n\r\n const { render } = await server.ssrLoadModule(\r\n serverVirtualModuleId,\r\n );\r\n const renderResult = await render(url || \"/\");\r\n // Handle both string return (legacy) and object return (new Flight format)\r\n const appHtml = typeof renderResult === 'string' ? renderResult : renderResult.html;\r\n const routeMetadata = typeof renderResult === 'string' ? {} : renderResult.metadata || {};\r\n\r\n let fullHtml = template.replace(\"<!--app-html-->\", appHtml);\r\n\r\n // =================================================================\r\n // Flight Hydration for Dev Server\r\n // =================================================================\r\n const hydrationData: OlovaHydrationData = {\r\n route: url || \"/\",\r\n params: {},\r\n metadata: routeMetadata,\r\n chunks: [], // Dev mode doesn't have pre-built chunks\r\n isStatic: false,\r\n };\r\n\r\n // Generate Flight hydration scripts\r\n const flightScripts = generateOlovaHydration(hydrationData, devBuildId);\r\n \r\n // Generate JSON-LD for SEO\r\n const jsonLdScript = generateJsonLd(hydrationData);\r\n \r\n // Generate resource hints (minimal in dev)\r\n const resourceHints = `<link rel=\"dns-prefetch\" href=\"//fonts.googleapis.com\"><link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" crossorigin>`;\r\n\r\n // Inject JSON-LD and resource hints in head\r\n if (fullHtml.includes(\"</head>\")) {\r\n fullHtml = fullHtml.replace(\"</head>\", `${jsonLdScript}${resourceHints}</head>`);\r\n }\r\n\r\n // Inject Flight scripts and entry script for hydration\r\n if (fullHtml.includes(\"</body>\")) {\r\n fullHtml = fullHtml.replace(\r\n \"</body>\",\r\n `${flightScripts}<script type=\"module\" src=\"/@id/${virtualModuleId}\"></script></body>`,\r\n );\r\n } else {\r\n fullHtml += `${flightScripts}<script type=\"module\" src=\"/@id/${virtualModuleId}\"></script>`;\r\n }\r\n\r\n // Now apply Vite transforms.\r\n fullHtml = await server.transformIndexHtml(url || \"/\", fullHtml);\r\n\r\n // Prepend DOCTYPE if missing\r\n if (!fullHtml.trim().toLowerCase().startsWith(\"<!doctype html>\")) {\r\n fullHtml = `<!DOCTYPE html>${fullHtml}`;\r\n }\r\n\r\n res.statusCode = 200;\r\n res.setHeader(\"Content-Type\", \"text/html\");\r\n res.end(minifyHtml(fullHtml));\r\n return;\r\n } catch (e) {\r\n server.ssrFixStacktrace(e as Error);\r\n console.error(e);\r\n res.statusCode = 500;\r\n res.end((e as Error).stack);\r\n return;\r\n }\r\n }\r\n next();\r\n });\r\n },\r\n async writeBundle(_options, bundle) {\r\n if (config.command === \"serve\" || config.build.ssr) return;\r\n\r\n const buildStartTime = Date.now();\r\n logger.printBuildStart();\r\n const outDir = config.build.outDir;\r\n const serverOutDir = path.resolve(outDir, \"server\");\r\n\r\n // Find client entry chunk\r\n const clientEntry = Object.values(bundle).find(\r\n (chunk) =>\r\n chunk.type === \"chunk\" &&\r\n chunk.isEntry &&\r\n (chunk.facadeModuleId?.includes(\"main\") ||\r\n chunk.name === \"main\"),\r\n );\r\n const clientEntryFileName = clientEntry\r\n ? clientEntry.fileName\r\n : \"assets/index.js\";\r\n\r\n // Find CSS assets\r\n const cssAssets = Object.values(bundle).filter(\r\n (chunk) => chunk.type === \"asset\" && chunk.fileName.endsWith(\".css\"),\r\n );\r\n const cssLinks = cssAssets\r\n .map(\r\n (css) =>\r\n `<link rel=\"stylesheet\" crossorigin href=\"/${css.fileName}\">`,\r\n )\r\n .join(\"\");\r\n\r\n // 1. Build Server Bundle\r\n // We use configFile to get MDX and other plugins, but override build settings for SSR\r\n await build({\r\n configFile: config.configFile,\r\n root: config.root,\r\n build: {\r\n ssr: true,\r\n emptyOutDir: false,\r\n outDir: serverOutDir,\r\n minify: false, // Keep readable for debugging\r\n rollupOptions: {\r\n input: { index: serverVirtualModuleId },\r\n output: {\r\n entryFileNames: \"index.js\",\r\n chunkFileNames: \"[name].js\",\r\n assetFileNames: \"[name].[ext]\",\r\n format: \"esm\",\r\n // Explicitly set to undefined to prevent client-side chunking config\r\n manualChunks: undefined,\r\n },\r\n },\r\n },\r\n logLevel: \"error\",\r\n });\r\n\r\n // 2. Load Server Entry to get routes\r\n const serverEntryPath = path.resolve(serverOutDir, \"index.js\");\r\n const serverEntryUrl = pathToFileURL(serverEntryPath).toString();\r\n // Initial import to get routes\r\n const { routes } = await import(serverEntryUrl);\r\n\r\n // 3. Generate Pages\r\n const paths = [\"/\"];\r\n\r\n function extractPaths(routesArr: any[]) {\r\n routesArr.forEach((r) => {\r\n if (r.path && !r.path.includes(\"*\") && !r.path.includes(\":\")) {\r\n paths.push(r.path);\r\n }\r\n });\r\n }\r\n if (Array.isArray(routes)) extractPaths(routes);\r\n\r\n // Add user-provided static paths\r\n if (options.staticPaths) {\r\n options.staticPaths.forEach((p) => paths.push(p));\r\n }\r\n\r\n const uniquePaths = [...new Set(paths)];\r\n \r\n // Generate a unique build ID for this build\r\n const buildId = generateBuildId();\r\n logger.printSSGStart(buildId);\r\n \r\n // Print route table\r\n const routeInfo = uniquePaths.map(p => ({\r\n path: p,\r\n type: (p.includes(':') || p.includes('*') ? 'dynamic' : 'static') as 'static' | 'dynamic'\r\n }));\r\n logger.printRoutes(routeInfo);\r\n \r\n logger.printFlightInfo();\r\n\r\n // Collect all JS chunks for prefetching\r\n const jsChunks = Object.values(bundle)\r\n .filter((chunk) => chunk.type === \"chunk\" && chunk.fileName.endsWith(\".js\"))\r\n .map((chunk) => chunk.fileName);\r\n\r\n for (const p of uniquePaths) {\r\n try {\r\n // Update window location for the fresh import to pick up\r\n if (typeof (globalThis as any).window !== \"undefined\") {\r\n (globalThis as any).window.location.pathname = p;\r\n }\r\n\r\n // FORCE RE-IMPORT for every page to ensure clean state (fresh Router/History instance)\r\n const cacheBuster = `?t=${Date.now()}-${Math.random()}`;\r\n // We destructured render from the fresh module\r\n const { render } = await import(serverEntryUrl + cacheBuster);\r\n\r\n // Render returns { html, metadata, route }\r\n const renderResult = await render(p);\r\n const appHtml = typeof renderResult === 'string' ? renderResult : renderResult.html;\r\n const routeMetadata = typeof renderResult === 'string' ? {} : renderResult.metadata || {};\r\n \r\n let html = htmlContent.replace(\"<!--app-html-->\", appHtml);\r\n\r\n // Generate smart preload hints based on chunk priority\r\n const preloadHints = generatePreloadHints(jsChunks, clientEntryFileName);\r\n const preloadTags = generatePreloadTags(preloadHints);\r\n\r\n // Prepare hydration data for this page\r\n const hydrationData: OlovaHydrationData = {\r\n route: p,\r\n params: {},\r\n metadata: routeMetadata,\r\n chunks: jsChunks,\r\n isStatic: true,\r\n };\r\n\r\n // Generate Flight hydration scripts\r\n const flightScripts = generateOlovaHydration(hydrationData, buildId);\r\n \r\n // Generate JSON-LD for SEO\r\n const jsonLdScript = generateJsonLd(hydrationData);\r\n \r\n // Generate resource hints (DNS prefetch, preconnect)\r\n const resourceHints = generateResourceHints(hydrationData);\r\n\r\n // Inject JSON-LD, resource hints, CSS, and smart preload tags at end of head\r\n if (html.includes(\"</head>\")) {\r\n html = html.replace(\"</head>\", `${jsonLdScript}${resourceHints}${cssLinks}${preloadTags}</head>`);\r\n }\r\n\r\n // Inject Flight scripts and main script at end of body\r\n if (html.includes(\"</body>\")) {\r\n html = html.replace(\r\n \"</body>\",\r\n `${flightScripts}<script type=\"module\" src=\"/${clientEntryFileName}\"></script></body>`,\r\n );\r\n } else {\r\n // Fallback if no body tag found\r\n html += `${flightScripts}<script type=\"module\" src=\"/${clientEntryFileName}\"></script>`;\r\n }\r\n\r\n // Prepend DOCTYPE if missing\r\n if (!html.trim().toLowerCase().startsWith(\"<!doctype html>\")) {\r\n html = `<!DOCTYPE html>${html}`;\r\n }\r\n\r\n const itemPath =\r\n p === \"/\" ? \"index.html\" : `${p.substring(1)}/index.html`;\r\n const finalPath = path.resolve(outDir, itemPath);\r\n await fs.mkdir(path.dirname(finalPath), { recursive: true });\r\n await fs.writeFile(finalPath, minifyHtml(html));\r\n logger.printPageGenerated(itemPath, true);\r\n } catch (e) {\r\n logger.printPageError(p, (e as Error).message);\r\n }\r\n }\r\n\r\n // Cleanup server bundle (not needed for static serving)\r\n await fs.rm(serverOutDir, { recursive: true, force: true });\r\n\r\n const buildTime = Date.now() - buildStartTime;\r\n logger.printSSGComplete({\r\n totalPages: uniquePaths.length,\r\n successPages: uniquePaths.length, // TODO: track actual success count\r\n failedPages: 0,\r\n buildTime\r\n });\r\n },\r\n } as Plugin,\r\n // Add performance optimization plugins\r\n ...(options.performance?.enabled !== false ? olovaPerformance(options.performance) : []),\r\n ];\r\n}\r\n"]}
|