olova 2.0.61 → 2.0.63

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.
Files changed (80) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +42 -61
  3. package/dist/compiler.d.ts +44 -0
  4. package/dist/compiler.js +2139 -0
  5. package/dist/compiler.js.map +1 -0
  6. package/dist/core.d.ts +4 -0
  7. package/dist/core.js +859 -0
  8. package/dist/core.js.map +1 -0
  9. package/dist/global.d.ts +15 -0
  10. package/dist/global.js +226 -0
  11. package/dist/global.js.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.js +2302 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/runtime.d.ts +89 -0
  16. package/dist/runtime.js +633 -0
  17. package/dist/runtime.js.map +1 -0
  18. package/dist/signals-core-BdfWh1Yt.d.ts +43 -0
  19. package/dist/vite.d.ts +5 -0
  20. package/dist/vite.js +2302 -0
  21. package/dist/vite.js.map +1 -0
  22. package/package.json +83 -65
  23. package/dist/chunk-D7SIC5TC.js +0 -367
  24. package/dist/chunk-D7SIC5TC.js.map +0 -1
  25. package/dist/entry-server.cjs +0 -120
  26. package/dist/entry-server.cjs.map +0 -1
  27. package/dist/entry-server.js +0 -115
  28. package/dist/entry-server.js.map +0 -1
  29. package/dist/entry-worker.cjs +0 -133
  30. package/dist/entry-worker.cjs.map +0 -1
  31. package/dist/entry-worker.js +0 -127
  32. package/dist/entry-worker.js.map +0 -1
  33. package/dist/main.cjs +0 -18
  34. package/dist/main.cjs.map +0 -1
  35. package/dist/main.js +0 -16
  36. package/dist/main.js.map +0 -1
  37. package/dist/olova.cjs +0 -1680
  38. package/dist/olova.cjs.map +0 -1
  39. package/dist/olova.d.cts +0 -72
  40. package/dist/olova.d.ts +0 -72
  41. package/dist/olova.js +0 -1321
  42. package/dist/olova.js.map +0 -1
  43. package/dist/performance.cjs +0 -386
  44. package/dist/performance.cjs.map +0 -1
  45. package/dist/performance.js +0 -3
  46. package/dist/performance.js.map +0 -1
  47. package/dist/router.cjs +0 -646
  48. package/dist/router.cjs.map +0 -1
  49. package/dist/router.d.cts +0 -113
  50. package/dist/router.d.ts +0 -113
  51. package/dist/router.js +0 -632
  52. package/dist/router.js.map +0 -1
  53. package/main.tsx +0 -76
  54. package/olova.ts +0 -619
  55. package/src/entry-server.tsx +0 -165
  56. package/src/entry-worker.tsx +0 -201
  57. package/src/generator/index.ts +0 -409
  58. package/src/hydration/flight.ts +0 -320
  59. package/src/hydration/index.ts +0 -12
  60. package/src/hydration/types.ts +0 -225
  61. package/src/logger.ts +0 -182
  62. package/src/main.tsx +0 -24
  63. package/src/performance.ts +0 -488
  64. package/src/plugin/index.ts +0 -204
  65. package/src/router/ErrorBoundary.tsx +0 -145
  66. package/src/router/Link.tsx +0 -117
  67. package/src/router/OlovaRouter.tsx +0 -354
  68. package/src/router/Outlet.tsx +0 -8
  69. package/src/router/context.ts +0 -117
  70. package/src/router/index.ts +0 -29
  71. package/src/router/matching.ts +0 -63
  72. package/src/router/router.tsx +0 -23
  73. package/src/router/search-params.ts +0 -29
  74. package/src/scanner/index.ts +0 -114
  75. package/src/types/index.ts +0 -190
  76. package/src/utils/export.ts +0 -85
  77. package/src/utils/index.ts +0 -4
  78. package/src/utils/naming.ts +0 -54
  79. package/src/utils/path.ts +0 -45
  80. package/tsup.config.ts +0 -35
@@ -1,367 +0,0 @@
1
- import fs from 'fs/promises';
2
- import path from 'path';
3
- import { promisify } from 'util';
4
- import zlib from 'zlib';
5
- import pc from 'picocolors';
6
-
7
- // src/performance.ts
8
- var VERSION = "0.0.14";
9
- function printBanner() {
10
- console.log("");
11
- console.log(pc.cyan(` \u25B2 Olova`) + pc.dim(` ${VERSION}`));
12
- console.log("");
13
- }
14
- function printDevReady(url, networkUrl) {
15
- console.log("");
16
- console.log(` ${pc.green("\u2713")} ${pc.bold("Ready")} in ${pc.cyan("~1s")}`);
17
- console.log("");
18
- console.log(` ${pc.dim("Local:")} ${pc.cyan(url)}`);
19
- if (networkUrl) {
20
- console.log(` ${pc.dim("Network:")} ${pc.cyan(networkUrl)}`);
21
- }
22
- console.log("");
23
- }
24
- function printBuildStart() {
25
- console.log("");
26
- console.log(` ${pc.dim("Creating an optimized production build...")}`);
27
- console.log("");
28
- }
29
- function printSSGStart(buildId) {
30
- console.log("");
31
- console.log(pc.bold(pc.cyan(` \u2713 Compiled successfully`)));
32
- console.log("");
33
- console.log(` ${pc.dim("Build ID:")} ${pc.yellow(buildId)}`);
34
- console.log("");
35
- }
36
- function printRoutes(routes) {
37
- console.log(` ${pc.bold("Route")}${" ".repeat(32)}${pc.bold("Type")}`);
38
- console.log(` ${pc.dim("\u250C")}${pc.dim("\u2500".repeat(43))}${pc.dim("\u2510")}`);
39
- for (const route of routes) {
40
- const icon = route.type === "static" ? pc.green("\u25CB") : pc.magenta("\u03BB");
41
- const typeLabel = route.type === "static" ? pc.green("Static") : pc.magenta("Dynamic");
42
- const pathDisplay = route.path === "/" ? "/" : route.path;
43
- const padding = " ".repeat(Math.max(1, 35 - pathDisplay.length));
44
- console.log(` ${pc.dim("\u2502")} ${icon} ${pc.white(pathDisplay)}${padding}${typeLabel}`);
45
- }
46
- console.log(` ${pc.dim("\u2514")}${pc.dim("\u2500".repeat(43))}${pc.dim("\u2518")}`);
47
- console.log("");
48
- }
49
- function printPageGenerated(path2, hasFlightData = true) {
50
- const badge = hasFlightData ? pc.dim(pc.cyan(" [Flight]")) : "";
51
- console.log(` ${pc.dim("\u2713")} ${pc.dim("Generated")} ${pc.white(path2)}${badge}`);
52
- }
53
- function printPageError(path2, error2) {
54
- console.log(` ${pc.red("\u2717")} ${pc.red("Failed")} ${path2}`);
55
- console.log(` ${pc.dim(error2)}`);
56
- }
57
- function printSSGComplete(stats) {
58
- console.log("");
59
- console.log(` ${pc.dim("\u2500".repeat(45))}`);
60
- console.log("");
61
- if (stats.failedPages > 0) {
62
- console.log(` ${pc.yellow("\u26A0")} ${pc.yellow("Build completed with warnings")}`);
63
- } else {
64
- console.log(` ${pc.green("\u2713")} ${pc.green("Build completed successfully")}`);
65
- }
66
- console.log("");
67
- console.log(` ${pc.dim("Pages:")} ${pc.bold(stats.successPages.toString())} generated`);
68
- if (stats.failedPages > 0) {
69
- console.log(` ${pc.red(stats.failedPages.toString())} failed`);
70
- }
71
- console.log(` ${pc.dim("Time:")} ${pc.cyan(stats.buildTime + "ms")}`);
72
- console.log("");
73
- }
74
- function printFlightInfo() {
75
- console.log(` ${pc.cyan("\u25CB")} ${pc.dim("Flight hydration enabled")}`);
76
- console.log(` ${pc.dim("\u2022 JSON-LD structured data")}`);
77
- console.log(` ${pc.dim("\u2022 Resource hints")}`);
78
- console.log(` ${pc.dim("\u2022 $OLOVA global")}`);
79
- console.log("");
80
- }
81
- function info(message) {
82
- console.log(` ${pc.cyan("\u25CB")} ${message}`);
83
- }
84
- function success(message) {
85
- console.log(` ${pc.green("\u2713")} ${pc.green(message)}`);
86
- }
87
- function warn(message) {
88
- console.log(` ${pc.yellow("\u26A0")} ${pc.yellow(message)}`);
89
- }
90
- function error(message) {
91
- console.log(` ${pc.red("\u2717")} ${pc.red(message)}`);
92
- }
93
- function printSSRRender(path2) {
94
- console.log(` ${pc.cyan("\u2192")} ${pc.dim("SSR")} ${path2}`);
95
- }
96
- var logger_default = {
97
- printBanner,
98
- printDevReady,
99
- printBuildStart,
100
- printSSGStart,
101
- printRoutes,
102
- printPageGenerated,
103
- printPageError,
104
- printSSGComplete,
105
- printFlightInfo,
106
- printSSRRender,
107
- info,
108
- success,
109
- warn,
110
- error
111
- };
112
-
113
- // src/performance.ts
114
- var gzip = promisify(zlib.gzip);
115
- var brotliCompress = promisify(zlib.brotliCompress);
116
- function createManualChunks() {
117
- const seenModules = /* @__PURE__ */ new Map();
118
- return (id, { getModuleInfo }) => {
119
- if (id.includes("node_modules/react-dom")) {
120
- return "vendor-react-dom";
121
- }
122
- if (id.includes("node_modules/react")) {
123
- return "vendor-react";
124
- }
125
- if (id.includes("olova-router") || id.includes("olovastart/dist/router")) {
126
- return "framework-router";
127
- }
128
- if (id.includes("node_modules")) {
129
- const match = id.match(/node_modules[\\/]([^/\\]+)/);
130
- if (match) {
131
- const pkg = match[1];
132
- if (["scheduler", "object-assign", "prop-types"].includes(pkg)) {
133
- return "vendor-react";
134
- }
135
- if (["lodash", "moment", "axios", "date-fns"].includes(pkg)) {
136
- return `vendor-${pkg}`;
137
- }
138
- }
139
- return "vendor";
140
- }
141
- if (id.includes("/components/")) {
142
- return "common-components";
143
- }
144
- if (id.includes("/utils/") || id.includes("/lib/") || id.includes("/helpers/")) {
145
- return "common-utils";
146
- }
147
- if (id.endsWith(".css") || id.endsWith(".scss")) {
148
- return void 0;
149
- }
150
- if (id.includes("/(auth)/") || id.includes("\\(auth)\\") || id.includes("/search/") || id.includes("\\search\\")) {
151
- return "page-auth";
152
- }
153
- if (id.includes("/src/") && (id.endsWith("/index.tsx") || id.endsWith("/index.mdx"))) {
154
- const moduleInfo = getModuleInfo(id);
155
- if (moduleInfo) {
156
- for (const importer of moduleInfo.importers) {
157
- if (importer.includes("/src/") && importer.includes("/index.") && !importer.includes(id)) {
158
- return "common-routes";
159
- }
160
- }
161
- }
162
- const routeMatch = id.match(/[\\/]src[\\/](.+?)[\\/]index\.(tsx|mdx)$/);
163
- if (routeMatch) {
164
- const routePath = routeMatch[1].replace(/\([^)]+\)[\\/]/g, "").replace(/\[.*?\]/g, "dynamic").replace(/[\\/]/g, "-");
165
- const baseRoute = routePath.split("-")[0];
166
- if (seenModules.has(baseRoute)) {
167
- const existingChunk = seenModules.get(baseRoute);
168
- if (existingChunk.startsWith("page-")) {
169
- return existingChunk;
170
- }
171
- }
172
- const chunkName = `page-${routePath}`;
173
- seenModules.set(baseRoute, chunkName);
174
- return chunkName;
175
- }
176
- }
177
- return void 0;
178
- };
179
- }
180
- function compressionPlugin(options = {}) {
181
- const {
182
- gzip: enableGzip = true,
183
- brotli: enableBrotli = true,
184
- threshold = 1024,
185
- extensions = ["js", "css", "html", "json", "svg", "xml"]
186
- } = options;
187
- let config;
188
- return {
189
- name: "olova-compression",
190
- apply: "build",
191
- configResolved(resolvedConfig) {
192
- config = resolvedConfig;
193
- },
194
- async closeBundle() {
195
- if (config.command !== "build" || config.build.ssr) return;
196
- const outDir = config.build.outDir;
197
- const stats = { gzip: 0, brotli: 0, skipped: 0 };
198
- const files = await findFilesToCompress(outDir, extensions);
199
- for (const file of files) {
200
- const content = await fs.readFile(file);
201
- if (content.length < threshold) {
202
- stats.skipped++;
203
- continue;
204
- }
205
- if (enableGzip) {
206
- try {
207
- const compressed = await gzip(content, { level: 9 });
208
- await fs.writeFile(`${file}.gz`, compressed);
209
- stats.gzip++;
210
- } catch (e) {
211
- }
212
- }
213
- if (enableBrotli) {
214
- try {
215
- const compressed = await brotliCompress(content, {
216
- params: {
217
- [zlib.constants.BROTLI_PARAM_QUALITY]: 11
218
- }
219
- });
220
- await fs.writeFile(`${file}.br`, compressed);
221
- stats.brotli++;
222
- } catch (e) {
223
- }
224
- }
225
- }
226
- if (stats.gzip > 0 || stats.brotli > 0) {
227
- logger_default.info(`Compressed ${stats.gzip} files (gzip), ${stats.brotli} files (brotli)`);
228
- }
229
- }
230
- };
231
- }
232
- function chunkAnalysisPlugin(options = {}) {
233
- const {
234
- chunkSizeWarning = true,
235
- maxChunkSize = 250
236
- } = options;
237
- const chunks = [];
238
- return {
239
- name: "olova-chunk-analysis",
240
- apply: "build",
241
- generateBundle(_options, bundle) {
242
- for (const [fileName, chunk] of Object.entries(bundle)) {
243
- if (chunk.type === "chunk") {
244
- const sizeKB = Buffer.byteLength(chunk.code, "utf8") / 1024;
245
- let type = "other";
246
- if (fileName.includes("vendor")) type = "vendor";
247
- else if (fileName.includes("framework")) type = "framework";
248
- else if (fileName.includes("common")) type = "common";
249
- else if (fileName.includes("page-")) type = "route";
250
- chunks.push({
251
- name: fileName,
252
- size: Math.round(sizeKB * 100) / 100,
253
- isEntry: chunk.isEntry,
254
- type
255
- });
256
- if (chunkSizeWarning && sizeKB > maxChunkSize) {
257
- logger_default.warn(`Chunk "${fileName}" is ${sizeKB.toFixed(2)}KB (exceeds ${maxChunkSize}KB limit)`);
258
- }
259
- }
260
- }
261
- },
262
- closeBundle() {
263
- if (chunks.length === 0) return;
264
- chunks.sort((a, b) => b.size - a.size);
265
- console.log("");
266
- logger_default.info("Bundle Analysis:");
267
- const typeGroups = {};
268
- let totalSize = 0;
269
- for (const chunk of chunks) {
270
- typeGroups[chunk.type] = (typeGroups[chunk.type] || 0) + chunk.size;
271
- totalSize += chunk.size;
272
- }
273
- console.log(` Vendor: ${(typeGroups.vendor || 0).toFixed(2)} KB`);
274
- console.log(` Framework: ${(typeGroups.framework || 0).toFixed(2)} KB`);
275
- console.log(` Common: ${(typeGroups.common || 0).toFixed(2)} KB`);
276
- console.log(` Routes: ${(typeGroups.route || 0).toFixed(2)} KB`);
277
- console.log(` Other: ${(typeGroups.other || 0).toFixed(2)} KB`);
278
- console.log(` \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
279
- console.log(` Total: ${totalSize.toFixed(2)} KB`);
280
- console.log("");
281
- }
282
- };
283
- }
284
- function generatePreloadHints(chunks, entryChunk) {
285
- const hints = [];
286
- hints.push({
287
- href: `/${entryChunk}`,
288
- as: "script",
289
- priority: "critical"
290
- });
291
- for (const chunk of chunks) {
292
- if (chunk === entryChunk) continue;
293
- if (chunk.includes("vendor")) {
294
- hints.push({
295
- href: `/${chunk}`,
296
- as: "script",
297
- priority: "high"
298
- });
299
- } else if (chunk.includes("framework")) {
300
- hints.push({
301
- href: `/${chunk}`,
302
- as: "script",
303
- priority: "high"
304
- });
305
- } else if (chunk.includes("common")) {
306
- hints.push({
307
- href: `/${chunk}`,
308
- as: "script",
309
- priority: "high"
310
- });
311
- } else if (chunk.includes("page-")) {
312
- hints.push({
313
- href: `/${chunk}`,
314
- as: "script",
315
- priority: "low"
316
- });
317
- }
318
- }
319
- return hints;
320
- }
321
- function generatePreloadTags(hints) {
322
- return hints.map((hint) => {
323
- const rel = hint.priority === "low" ? "prefetch" : "modulepreload";
324
- const crossorigin = hint.crossorigin ? " crossorigin" : "";
325
- return `<link rel="${rel}" href="${hint.href}"${crossorigin}>`;
326
- }).join("");
327
- }
328
- async function findFilesToCompress(dir, extensions) {
329
- const files = [];
330
- try {
331
- const entries = await fs.readdir(dir, { withFileTypes: true });
332
- for (const entry of entries) {
333
- const fullPath = path.join(dir, entry.name);
334
- if (entry.isDirectory()) {
335
- files.push(...await findFilesToCompress(fullPath, extensions));
336
- } else if (entry.isFile()) {
337
- const ext = path.extname(entry.name).slice(1);
338
- if (extensions.includes(ext)) {
339
- files.push(fullPath);
340
- }
341
- }
342
- }
343
- } catch (e) {
344
- }
345
- return files;
346
- }
347
- async function getGzipSize(content) {
348
- const buffer = typeof content === "string" ? Buffer.from(content) : content;
349
- const compressed = await gzip(buffer);
350
- return compressed.length;
351
- }
352
- function formatBytes(bytes) {
353
- if (bytes < 1024) return `${bytes} B`;
354
- if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;
355
- return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
356
- }
357
- function olovaPerformance(options = {}) {
358
- return [
359
- chunkAnalysisPlugin(options),
360
- compressionPlugin(options)
361
- ];
362
- }
363
- var performance_default = olovaPerformance;
364
-
365
- export { chunkAnalysisPlugin, compressionPlugin, createManualChunks, formatBytes, generatePreloadHints, generatePreloadTags, getGzipSize, logger_default, olovaPerformance, performance_default };
366
- //# sourceMappingURL=chunk-D7SIC5TC.js.map
367
- //# sourceMappingURL=chunk-D7SIC5TC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/logger.ts","../src/performance.ts"],"names":["path","error"],"mappings":"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","file":"chunk-D7SIC5TC.js","sourcesContent":["/**\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// Olova version from package.json\r\nconst VERSION = '0.0.14';\r\n\r\n/**\r\n * Print the startup banner (minimal, like Next.js)\r\n */\r\nexport function printBanner() {\r\n console.log('');\r\n console.log(pc.cyan(` ▲ Olova`) + pc.dim(` ${VERSION}`));\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(` ${pc.green('✓')} ${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 (minimal)\r\n */\r\nexport function printBuildStart() {\r\n console.log('');\r\n console.log(` ${pc.dim('Creating an 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(` ✓ Compiled successfully`)));\r\n console.log('');\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 table (Next.js style)\r\n */\r\nexport function printRoutes(routes: { path: string; type: 'static' | 'dynamic' }[]) {\r\n // Header\r\n console.log(` ${pc.bold('Route')}${' '.repeat(32)}${pc.bold('Type')}`);\r\n console.log(` ${pc.dim('┌')}${pc.dim('─'.repeat(43))}${pc.dim('┐')}`);\r\n\r\n for (const route of routes) {\r\n const icon = route.type === 'static' ? pc.green('○') : pc.magenta('λ');\r\n const typeLabel = route.type === 'static'\r\n ? pc.green('Static')\r\n : pc.magenta('Dynamic');\r\n const pathDisplay = route.path === '/' ? '/' : route.path;\r\n const padding = ' '.repeat(Math.max(1, 35 - pathDisplay.length));\r\n console.log(` ${pc.dim('│')} ${icon} ${pc.white(pathDisplay)}${padding}${typeLabel}`);\r\n }\r\n\r\n // Footer\r\n console.log(` ${pc.dim('└')}${pc.dim('─'.repeat(43))}${pc.dim('┘')}`);\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 badge = hasFlightData ? pc.dim(pc.cyan(' [Flight]')) : '';\r\n console.log(` ${pc.dim('✓')} ${pc.dim('Generated')} ${pc.white(path)}${badge}`);\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(` ${pc.red('✗')} ${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(` ${pc.yellow('⚠')} ${pc.yellow('Build completed with warnings')}`);\r\n } else {\r\n console.log(` ${pc.green('✓')} ${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 (compact)\r\n */\r\nexport function printFlightInfo() {\r\n console.log(` ${pc.cyan('○')} ${pc.dim('Flight hydration enabled')}`);\r\n console.log(` ${pc.dim('• JSON-LD structured data')}`);\r\n console.log(` ${pc.dim('• Resource hints')}`);\r\n console.log(` ${pc.dim('• $OLOVA global')}`);\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(` ${pc.cyan('○')} ${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(` ${pc.green('✓')} ${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(` ${pc.yellow('⚠')} ${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(` ${pc.red('✗')} ${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(` ${pc.cyan('→')} ${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};\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') || id.includes('olovastart/dist/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"]}
@@ -1,120 +0,0 @@
1
- 'use strict';
2
-
3
- var react = require('react');
4
- var server = require('react-dom/server');
5
- var reactQuery = require('@tanstack/react-query');
6
- var virtual_olovaApp = require('virtual:olova-app');
7
- var jsxRuntime = require('react/jsx-runtime');
8
-
9
- // src/entry-server.tsx
10
- var wrappedLayouts = virtual_olovaApp.layouts.map((item) => ({
11
- ...item,
12
- layout: (props) => /* @__PURE__ */ jsxRuntime.jsx(item.layout, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx(virtual_olovaApp.Outlet, {}) })
13
- }));
14
- function matchRoute(url) {
15
- const pathname = url.split("?")[0];
16
- for (const route of virtual_olovaApp.routes) {
17
- if (route.path === pathname) {
18
- return { route, params: {} };
19
- }
20
- if (route.path.includes(":") || route.path.includes("*")) {
21
- const pattern = route.path.replace(/\*/g, "(.*)").replace(/:[^/]+/g, "([^/]+)");
22
- const regex = new RegExp(`^${pattern}$`);
23
- const match = pathname.match(regex);
24
- if (match) {
25
- const params = {};
26
- const paramNames = route.path.match(/:[^/]+|\*/g) || [];
27
- paramNames.forEach((name, i) => {
28
- if (name === "*") {
29
- params["*"] = match[i + 1];
30
- } else {
31
- params[name.slice(1)] = match[i + 1];
32
- }
33
- });
34
- return { route, params };
35
- }
36
- }
37
- }
38
- return null;
39
- }
40
- async function runLoader(url) {
41
- const match = matchRoute(url);
42
- if (!match || !match.route.loader) {
43
- return null;
44
- }
45
- try {
46
- const baseUrl = "http://localhost";
47
- const result = await match.route.loader({
48
- request: new Request(new URL(url, baseUrl)),
49
- params: match.params
50
- });
51
- if (result instanceof Response) {
52
- return null;
53
- }
54
- return result;
55
- } catch (error) {
56
- console.error(`[SSR] Loader error for ${url}:`, error);
57
- return null;
58
- }
59
- }
60
- async function render(url) {
61
- const globalAny = globalThis;
62
- globalAny.window = {
63
- location: { pathname: url, search: "", hash: "" },
64
- addEventListener: () => {
65
- },
66
- removeEventListener: () => {
67
- },
68
- history: {
69
- pushState: () => {
70
- },
71
- replaceState: () => {
72
- },
73
- location: { pathname: url, search: "", hash: "" }
74
- }
75
- };
76
- globalAny.location = globalAny.window.location;
77
- globalAny.document = {
78
- createElement: () => ({}),
79
- getElementsByTagName: () => [],
80
- getElementById: () => null,
81
- querySelector: () => null,
82
- title: "",
83
- location: globalAny.window.location
84
- };
85
- const loaderData = await runLoader(url);
86
- if (loaderData) {
87
- globalAny.window.__LOADER_DATA__ = loaderData;
88
- }
89
- const queryClient = new reactQuery.QueryClient({
90
- defaultOptions: {
91
- queries: {
92
- staleTime: Infinity,
93
- // Data is fresh during SSR
94
- gcTime: Infinity
95
- }
96
- }
97
- });
98
- if (loaderData) {
99
- Object.entries(loaderData).forEach(([key, value]) => {
100
- queryClient.setQueryData([key], value);
101
- });
102
- }
103
- const dehydratedState = reactQuery.dehydrate(queryClient);
104
- const html = server.renderToString(
105
- /* @__PURE__ */ jsxRuntime.jsx(react.StrictMode, { children: /* @__PURE__ */ jsxRuntime.jsx(reactQuery.QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsxRuntime.jsx(reactQuery.HydrationBoundary, { state: dehydratedState, children: /* @__PURE__ */ jsxRuntime.jsx(react.Suspense, { fallback: null, children: /* @__PURE__ */ jsxRuntime.jsx(virtual_olovaApp.OlovaRouter, { routes: virtual_olovaApp.routes, layouts: wrappedLayouts, notFoundPages: virtual_olovaApp.notFoundPages }) }) }) }) })
106
- );
107
- return {
108
- html,
109
- loaderData,
110
- queryState: dehydratedState
111
- };
112
- }
113
-
114
- Object.defineProperty(exports, "routes", {
115
- enumerable: true,
116
- get: function () { return virtual_olovaApp.routes; }
117
- });
118
- exports.render = render;
119
- //# sourceMappingURL=entry-server.cjs.map
120
- //# sourceMappingURL=entry-server.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/entry-server.tsx"],"names":["layouts","jsx","Outlet","routes","QueryClient","dehydrate","renderToString","StrictMode","QueryClientProvider","HydrationBoundary","Suspense","OlovaRouter","notFoundPages"],"mappings":"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","file":"entry-server.cjs","sourcesContent":["import { StrictMode, Suspense } from 'react';\r\nimport { renderToString } from 'react-dom/server';\r\nimport { QueryClient, QueryClientProvider, dehydrate, HydrationBoundary } from '@tanstack/react-query';\r\n// @ts-expect-error - Virtual module resolved by vite-plugin-olova\r\nimport { layouts, notFoundPages, OlovaRouter, Outlet, routes } from 'virtual:olova-app';\r\n\r\n// Wrapper to support \"children\" prop style layouts\r\nconst wrappedLayouts = layouts.map((item: any) => ({\r\n ...item,\r\n layout: (props: any) => (\r\n <item.layout {...props}>\r\n <Outlet />\r\n </item.layout>\r\n )\r\n}));\r\n\r\n/**\r\n * Find matching route and extract params\r\n */\r\nfunction matchRoute(url: string): { route: any; params: Record<string, string> } | null {\r\n const pathname = url.split('?')[0];\r\n \r\n for (const route of routes) {\r\n // Exact match\r\n if (route.path === pathname) {\r\n return { route, params: {} };\r\n }\r\n \r\n // Dynamic segments\r\n if (route.path.includes(':') || route.path.includes('*')) {\r\n const pattern = route.path\r\n .replace(/\\*/g, '(.*)')\r\n .replace(/:[^/]+/g, '([^/]+)');\r\n const regex = new RegExp(`^${pattern}$`);\r\n const match = pathname.match(regex);\r\n \r\n if (match) {\r\n const params: Record<string, string> = {};\r\n const paramNames = route.path.match(/:[^/]+|\\*/g) || [];\r\n \r\n paramNames.forEach((name: string, i: number) => {\r\n if (name === '*') {\r\n params['*'] = match[i + 1];\r\n } else {\r\n params[name.slice(1)] = match[i + 1];\r\n }\r\n });\r\n \r\n return { route, params };\r\n }\r\n }\r\n }\r\n \r\n return null;\r\n}\r\n\r\n/**\r\n * Run loader for SSG builds\r\n * Simplified: loader just returns data directly\r\n */\r\nasync function runLoader(url: string): Promise<Record<string, unknown> | null> {\r\n const match = matchRoute(url);\r\n \r\n if (!match || !match.route.loader) {\r\n return null;\r\n }\r\n \r\n try {\r\n // Simple call - loader returns data directly\r\n // Use a valid URL for Request (requires absolute URL)\r\n const baseUrl = 'http://localhost';\r\n const result = await match.route.loader({\r\n request: new Request(new URL(url, baseUrl)),\r\n params: match.params\r\n });\r\n \r\n // If it's a Response, skip\r\n if (result instanceof Response) {\r\n return null;\r\n }\r\n \r\n // Direct data return (simplified syntax)\r\n return result as Record<string, unknown>;\r\n } catch (error) {\r\n console.error(`[SSR] Loader error for ${url}:`, error);\r\n return null;\r\n }\r\n}\r\n\r\nexport async function render(url: string) {\r\n // Always recreate the window mock to ensure clean state for every SSG path\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 // Run loader for data-only SSR\r\n const loaderData = await runLoader(url);\r\n \r\n // Inject loader data into window for components to access\r\n if (loaderData) {\r\n globalAny.window.__LOADER_DATA__ = loaderData;\r\n }\r\n\r\n // Create QueryClient for SSR with pre-loaded data\r\n const queryClient = new QueryClient({\r\n defaultOptions: {\r\n queries: {\r\n staleTime: Infinity, // Data is fresh during SSR\r\n gcTime: Infinity,\r\n },\r\n },\r\n });\r\n\r\n // Pre-populate query client with loader data\r\n if (loaderData) {\r\n // Convert loader data to query state format\r\n // If loader returns { user: {...} }, we hydrate it\r\n Object.entries(loaderData).forEach(([key, value]) => {\r\n queryClient.setQueryData([key], value);\r\n });\r\n }\r\n\r\n // Get dehydrated state for client hydration\r\n const dehydratedState = dehydrate(queryClient);\r\n\r\n // Wrap in Suspense to handle lazy-loaded components\r\n const html = renderToString(\r\n <StrictMode>\r\n <QueryClientProvider client={queryClient}>\r\n <HydrationBoundary state={dehydratedState}>\r\n <Suspense fallback={null}>\r\n <OlovaRouter routes={routes} layouts={wrappedLayouts} notFoundPages={notFoundPages} />\r\n </Suspense>\r\n </HydrationBoundary>\r\n </QueryClientProvider>\r\n </StrictMode>\r\n );\r\n\r\n // Return both html and dehydrated state for flight serialization\r\n return { \r\n html, \r\n loaderData,\r\n queryState: dehydratedState \r\n };\r\n}\r\n\r\nexport { routes };\r\n\r\n"]}