olova 2.0.54 → 2.0.56

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 (96) hide show
  1. package/README.md +34 -283
  2. package/dist/chunk-23UAGQ6N.js +2208 -0
  3. package/dist/chunk-23UAGQ6N.js.map +1 -0
  4. package/dist/chunk-D7SIC5TC.js +367 -0
  5. package/dist/chunk-D7SIC5TC.js.map +1 -0
  6. package/dist/entry-server.cjs +2341 -0
  7. package/dist/entry-server.cjs.map +1 -0
  8. package/dist/entry-server.js +114 -0
  9. package/dist/entry-server.js.map +1 -0
  10. package/dist/entry-worker.cjs +2354 -0
  11. package/dist/entry-worker.cjs.map +1 -0
  12. package/dist/entry-worker.js +126 -0
  13. package/dist/entry-worker.js.map +1 -0
  14. package/dist/main.cjs +18 -0
  15. package/dist/main.cjs.map +1 -0
  16. package/dist/main.js +16 -0
  17. package/dist/main.js.map +1 -0
  18. package/dist/olova.cjs +1684 -0
  19. package/dist/olova.cjs.map +1 -0
  20. package/dist/olova.d.cts +72 -0
  21. package/dist/olova.d.ts +72 -0
  22. package/dist/olova.js +1325 -0
  23. package/dist/olova.js.map +1 -0
  24. package/dist/performance.cjs +386 -0
  25. package/dist/performance.cjs.map +1 -0
  26. package/dist/performance.js +3 -0
  27. package/dist/performance.js.map +1 -0
  28. package/dist/router.cjs +646 -0
  29. package/dist/router.cjs.map +1 -0
  30. package/dist/router.d.cts +113 -0
  31. package/dist/router.d.ts +113 -0
  32. package/dist/router.js +632 -0
  33. package/dist/router.js.map +1 -0
  34. package/main.tsx +76 -0
  35. package/olova.ts +619 -0
  36. package/package.json +37 -55
  37. package/src/entry-server.tsx +165 -0
  38. package/src/entry-worker.tsx +201 -0
  39. package/src/generator/index.ts +409 -0
  40. package/src/hydration/flight.ts +320 -0
  41. package/src/hydration/index.ts +12 -0
  42. package/src/hydration/types.ts +225 -0
  43. package/src/logger.ts +182 -0
  44. package/src/main.tsx +24 -0
  45. package/src/performance.ts +488 -0
  46. package/src/plugin/index.ts +204 -0
  47. package/src/router/ErrorBoundary.tsx +145 -0
  48. package/src/router/Link.tsx +117 -0
  49. package/src/router/OlovaRouter.tsx +354 -0
  50. package/src/router/Outlet.tsx +8 -0
  51. package/src/router/context.ts +117 -0
  52. package/src/router/index.ts +29 -0
  53. package/src/router/matching.ts +63 -0
  54. package/src/router/router.tsx +23 -0
  55. package/src/router/search-params.ts +29 -0
  56. package/src/scanner/index.ts +116 -0
  57. package/src/types/index.ts +191 -0
  58. package/src/utils/export.ts +85 -0
  59. package/src/utils/index.ts +4 -0
  60. package/src/utils/naming.ts +54 -0
  61. package/src/utils/path.ts +45 -0
  62. package/tsup.config.ts +35 -0
  63. package/dist/client-BBLXpllK.d.ts +0 -487
  64. package/dist/client-C0av_vTZ.d.cts +0 -487
  65. package/dist/client.cjs +0 -850
  66. package/dist/client.cjs.map +0 -1
  67. package/dist/client.d.cts +0 -5
  68. package/dist/client.d.ts +0 -5
  69. package/dist/client.js +0 -816
  70. package/dist/client.js.map +0 -1
  71. package/dist/image.cjs +0 -25
  72. package/dist/image.cjs.map +0 -1
  73. package/dist/image.d.cts +0 -1
  74. package/dist/image.d.ts +0 -1
  75. package/dist/image.js +0 -3
  76. package/dist/image.js.map +0 -1
  77. package/dist/index.cjs +0 -907
  78. package/dist/index.cjs.map +0 -1
  79. package/dist/index.d.cts +0 -31
  80. package/dist/index.d.ts +0 -31
  81. package/dist/index.js +0 -868
  82. package/dist/index.js.map +0 -1
  83. package/dist/plugin/index.cjs +0 -1550
  84. package/dist/plugin/index.cjs.map +0 -1
  85. package/dist/plugin/index.d.cts +0 -131
  86. package/dist/plugin/index.d.ts +0 -131
  87. package/dist/plugin/index.js +0 -1490
  88. package/dist/plugin/index.js.map +0 -1
  89. package/dist/serialization-xKcOESDh.d.cts +0 -122
  90. package/dist/serialization-xKcOESDh.d.ts +0 -122
  91. package/dist/server.cjs +0 -547
  92. package/dist/server.cjs.map +0 -1
  93. package/dist/server.d.cts +0 -148
  94. package/dist/server.d.ts +0 -148
  95. package/dist/server.js +0 -493
  96. package/dist/server.js.map +0 -1
package/dist/server.cjs DELETED
@@ -1,547 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __esm = (fn, res) => function __init() {
9
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
- };
11
- var __export = (target, all) => {
12
- for (var name in all)
13
- __defProp(target, name, { get: all[name], enumerable: true });
14
- };
15
- var __copyProps = (to, from, except, desc) => {
16
- if (from && typeof from === "object" || typeof from === "function") {
17
- for (let key of __getOwnPropNames(from))
18
- if (!__hasOwnProp.call(to, key) && key !== except)
19
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
- }
21
- return to;
22
- };
23
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
24
- // If the importer is in node compatibility mode or this is not an ESM
25
- // file that has been converted to a CommonJS file using a Babel-
26
- // compatible transform (i.e. "__esModule" has not been set), then set
27
- // "default" to the CommonJS "module.exports" for node compatibility.
28
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
29
- mod
30
- ));
31
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
32
-
33
- // src/hydration/scheduler.ts
34
- var init_scheduler = __esm({
35
- "src/hydration/scheduler.ts"() {
36
- "use strict";
37
- }
38
- });
39
-
40
- // src/server.ts
41
- var server_exports = {};
42
- __export(server_exports, {
43
- addFlightChunk: () => addFlightChunk,
44
- addFlightData: () => addFlightData,
45
- addFlightNode: () => addFlightNode,
46
- addHydrationHint: () => addHydrationHint,
47
- clearFlightContext: () => clearFlightContext,
48
- createFlightInjector: () => createFlightInjector,
49
- createFlightPayload: () => createFlightPayload,
50
- createStreamingHeaders: () => createStreamingHeaders,
51
- createSuspensePlaceholder: () => createSuspensePlaceholder,
52
- createSuspenseResolved: () => createSuspenseResolved,
53
- generateCompleteHtml: () => generateCompleteHtml,
54
- generateFlightScript: () => generateFlightScript,
55
- generateHtmlShell: () => generateHtmlShell,
56
- isStreaming: () => isStreaming,
57
- renderHeadToString: () => renderHeadToString,
58
- renderToStream: () => renderToStream,
59
- renderToStringWithFlight: () => renderToStringWithFlight,
60
- resetFlightContext: () => resetFlightContext,
61
- serializePageData: () => serializePageData,
62
- setFlightContext: () => setFlightContext
63
- });
64
- module.exports = __toCommonJS(server_exports);
65
-
66
- // src/streaming/render.ts
67
- var import_server = require("react-dom/server");
68
-
69
- // src/hydration/serialization.ts
70
- function serializeProps(props) {
71
- const serialized = {};
72
- for (const [key, value] of Object.entries(props)) {
73
- if (key === "children") continue;
74
- if (typeof value === "function") continue;
75
- if (value instanceof Date) {
76
- serialized[key] = { __type: "Date", value: value.toISOString() };
77
- } else if (value instanceof Map) {
78
- serialized[key] = { __type: "Map", value: Array.from(value.entries()) };
79
- } else if (value instanceof Set) {
80
- serialized[key] = { __type: "Set", value: Array.from(value) };
81
- } else if (typeof value === "object" && value !== null) {
82
- serialized[key] = serializeProps(value);
83
- } else {
84
- serialized[key] = value;
85
- }
86
- }
87
- return serialized;
88
- }
89
- function serializeFlightPayload(payload) {
90
- return JSON.stringify(payload);
91
- }
92
- function generateFlightScript(payload) {
93
- const serialized = serializeFlightPayload(payload);
94
- const escaped = serialized.replace(/</g, "\\u003c").replace(/>/g, "\\u003e").replace(/&/g, "\\u0026");
95
- return `<script>self.__FLIGHT__=${escaped}</script>`;
96
- }
97
- function generateChunkScript(chunk) {
98
- const serialized = JSON.stringify(chunk).replace(/</g, "\\u003c").replace(/>/g, "\\u003e");
99
- return `<script>self.__FLIGHT_CHUNK__(${serialized})</script>`;
100
- }
101
-
102
- // src/hydration/payload.ts
103
- var nodeIdCounter = 0;
104
- function generateNodeId() {
105
- return `o${(++nodeIdCounter).toString(36)}`;
106
- }
107
- function resetFlightContext() {
108
- nodeIdCounter = 0;
109
- }
110
- function createFlightPayload(route, options) {
111
- return {
112
- v: 1,
113
- ts: Date.now(),
114
- route,
115
- tree: [],
116
- data: {},
117
- chunks: [],
118
- hints: [],
119
- styles: [],
120
- meta: options?.meta,
121
- seo: options?.seo,
122
- islands: [],
123
- resourceHints: [],
124
- build: options?.buildId ? {
125
- id: options.buildId,
126
- time: Date.now()
127
- } : void 0
128
- };
129
- }
130
- function addFlightNode(payload, type, props, options = {}) {
131
- const id = generateNodeId();
132
- payload.tree.push({
133
- id,
134
- type,
135
- props: serializeProps(props),
136
- children: options.children || [],
137
- hydrate: options.hydrate ?? false,
138
- suspense: options.suspense
139
- });
140
- return id;
141
- }
142
- function addFlightData(payload, key, data) {
143
- payload.data[key] = data;
144
- }
145
- function addFlightChunk(payload, id, html, data) {
146
- payload.chunks.push({
147
- id,
148
- html,
149
- ready: true,
150
- data,
151
- order: payload.chunks.length
152
- });
153
- }
154
- function addHydrationHint(payload, hint) {
155
- payload.hints.push(hint);
156
- }
157
-
158
- // src/hydration/index.ts
159
- init_scheduler();
160
-
161
- // src/hydration/context.ts
162
- var currentFlightContext = null;
163
- function setFlightContext(context) {
164
- currentFlightContext = context;
165
- }
166
- function getFlightContext() {
167
- return currentFlightContext;
168
- }
169
- function clearFlightContext() {
170
- currentFlightContext = null;
171
- }
172
-
173
- // src/hydration/seo.ts
174
- function generateSEOTags(payload) {
175
- const { meta, seo } = payload;
176
- let tags = "";
177
- if (meta?.title) {
178
- tags += `<title>${escapeHtmlAttr(meta.title)}</title>
179
- `;
180
- }
181
- if (meta?.description) {
182
- tags += `<meta name="description" content="${escapeHtmlAttr(meta.description)}" />
183
- `;
184
- }
185
- if (seo) {
186
- if (seo.canonical) {
187
- tags += `<link rel="canonical" href="${escapeHtmlAttr(seo.canonical)}" />
188
- `;
189
- }
190
- if (seo.robots) {
191
- tags += `<meta name="robots" content="${escapeHtmlAttr(seo.robots)}" />
192
- `;
193
- }
194
- if (seo.openGraph) {
195
- const og = seo.openGraph;
196
- if (og.title) tags += `<meta property="og:title" content="${escapeHtmlAttr(og.title)}" />
197
- `;
198
- if (og.description) tags += `<meta property="og:description" content="${escapeHtmlAttr(og.description)}" />
199
- `;
200
- if (og.type) tags += `<meta property="og:type" content="${escapeHtmlAttr(og.type)}" />
201
- `;
202
- if (og.url) tags += `<meta property="og:url" content="${escapeHtmlAttr(og.url)}" />
203
- `;
204
- if (og.image) tags += `<meta property="og:image" content="${escapeHtmlAttr(og.image)}" />
205
- `;
206
- if (og.siteName) tags += `<meta property="og:site_name" content="${escapeHtmlAttr(og.siteName)}" />
207
- `;
208
- }
209
- if (seo.twitter) {
210
- const tw = seo.twitter;
211
- if (tw.card) tags += `<meta name="twitter:card" content="${escapeHtmlAttr(tw.card)}" />
212
- `;
213
- if (tw.site) tags += `<meta name="twitter:site" content="${escapeHtmlAttr(tw.site)}" />
214
- `;
215
- if (tw.creator) tags += `<meta name="twitter:creator" content="${escapeHtmlAttr(tw.creator)}" />
216
- `;
217
- if (tw.title) tags += `<meta name="twitter:title" content="${escapeHtmlAttr(tw.title)}" />
218
- `;
219
- if (tw.description) tags += `<meta name="twitter:description" content="${escapeHtmlAttr(tw.description)}" />
220
- `;
221
- if (tw.image) tags += `<meta name="twitter:image" content="${escapeHtmlAttr(tw.image)}" />
222
- `;
223
- }
224
- if (seo.alternates) {
225
- for (const alt of seo.alternates) {
226
- tags += `<link rel="alternate" hreflang="${alt.hreflang}" href="${escapeHtmlAttr(alt.href)}" />
227
- `;
228
- }
229
- }
230
- if (seo.preconnect) {
231
- for (const domain of seo.preconnect) {
232
- tags += `<link rel="preconnect" href="${escapeHtmlAttr(domain)}" />
233
- `;
234
- }
235
- }
236
- if (seo.jsonLd) {
237
- const jsonLdArray = Array.isArray(seo.jsonLd) ? seo.jsonLd : [seo.jsonLd];
238
- for (const schema of jsonLdArray) {
239
- tags += `<script type="application/ld+json">${JSON.stringify(schema)}</script>
240
- `;
241
- }
242
- }
243
- }
244
- return tags;
245
- }
246
- function generateResourceHintTags(payload) {
247
- if (!payload.resourceHints?.length) return "";
248
- let tags = "";
249
- for (const hint of payload.resourceHints) {
250
- let tag = `<link rel="${hint.rel}" href="${escapeHtmlAttr(hint.href)}"`;
251
- if (hint.as) tag += ` as="${hint.as}"`;
252
- if (hint.type) tag += ` type="${hint.type}"`;
253
- if (hint.crossorigin) tag += ` crossorigin="${hint.crossorigin}"`;
254
- if (hint.fetchpriority) tag += ` fetchpriority="${hint.fetchpriority}"`;
255
- tag += " />\n";
256
- tags += tag;
257
- }
258
- return tags;
259
- }
260
- function escapeHtmlAttr(str) {
261
- return str.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
262
- }
263
-
264
- // src/streaming/render.ts
265
- function renderToStream(element, route, options = {}) {
266
- resetFlightContext();
267
- const payload = createFlightPayload(route);
268
- setFlightContext({
269
- payload,
270
- scheduler: null,
271
- isStreaming: true,
272
- onChunk: (chunk) => {
273
- payload.chunks.push(chunk);
274
- }
275
- });
276
- const {
277
- bootstrapScripts = [],
278
- bootstrapModules = [],
279
- onShellReady,
280
- onShellError,
281
- onAllReady,
282
- onError,
283
- signal,
284
- timeout = 3e4
285
- } = options;
286
- const abortController = new AbortController();
287
- let timeoutId = null;
288
- if (timeout > 0) {
289
- timeoutId = setTimeout(() => {
290
- abortController.abort();
291
- }, timeout);
292
- }
293
- if (signal) {
294
- signal.addEventListener("abort", () => abortController.abort());
295
- }
296
- const { pipe, abort } = (0, import_server.renderToPipeableStream)(element, {
297
- bootstrapScripts,
298
- bootstrapModules,
299
- onShellReady() {
300
- if (timeoutId) clearTimeout(timeoutId);
301
- onShellReady?.();
302
- },
303
- onShellError(error) {
304
- if (timeoutId) clearTimeout(timeoutId);
305
- clearFlightContext();
306
- onShellError?.(error);
307
- },
308
- onAllReady() {
309
- if (timeoutId) clearTimeout(timeoutId);
310
- clearFlightContext();
311
- onAllReady?.();
312
- },
313
- onError(error) {
314
- console.error("[Olova Streaming] Error:", error);
315
- onError?.(error);
316
- }
317
- });
318
- return {
319
- pipe,
320
- abort: () => {
321
- if (timeoutId) clearTimeout(timeoutId);
322
- abort();
323
- clearFlightContext();
324
- },
325
- payload
326
- };
327
- }
328
- function renderToStringWithFlight(element, route) {
329
- resetFlightContext();
330
- const payload = createFlightPayload(route);
331
- setFlightContext({
332
- payload,
333
- scheduler: null,
334
- isStreaming: false
335
- });
336
- try {
337
- const html = (0, import_server.renderToString)(element);
338
- return { html, payload };
339
- } finally {
340
- clearFlightContext();
341
- }
342
- }
343
-
344
- // src/streaming/html.ts
345
- function generateHtmlShell(options = {}) {
346
- const {
347
- title = "Olova App",
348
- description,
349
- head = "",
350
- styles = [],
351
- criticalCss,
352
- globalCss = [],
353
- cssModules = [],
354
- scripts = [],
355
- flightPayload,
356
- pageData,
357
- lang = "en",
358
- bodyClass = ""
359
- } = options;
360
- let headContent = `<!DOCTYPE html>
361
- <html lang="${lang}">
362
- <head>
363
- <meta charset="UTF-8" />
364
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
365
- <title>${escapeHtml(title)}</title>`;
366
- if (description) {
367
- headContent += `
368
- <meta name="description" content="${escapeHtml(description)}" />`;
369
- }
370
- if (flightPayload) {
371
- headContent += `
372
- ${generateSEOTags(flightPayload)}`;
373
- headContent += `
374
- ${generateResourceHintTags(flightPayload)}`;
375
- }
376
- if (criticalCss) {
377
- headContent += `
378
- <style>${criticalCss}</style>`;
379
- }
380
- for (const css of globalCss) {
381
- headContent += `
382
- <link rel="stylesheet" href="${css}" />`;
383
- }
384
- for (const css of cssModules) {
385
- headContent += `
386
- <link rel="stylesheet" href="${css}" />`;
387
- }
388
- for (const style of styles) {
389
- headContent += `
390
- <link rel="stylesheet" href="${style}" />`;
391
- }
392
- if (flightPayload) {
393
- headContent += `
394
- ${generateFlightScript(flightPayload)}`;
395
- }
396
- if (pageData) {
397
- const serialized = JSON.stringify(pageData).replace(/</g, "\\u003c").replace(/>/g, "\\u003e");
398
- headContent += `
399
- <script>self.__PAGE_DATA__=${serialized}</script>`;
400
- }
401
- if (head) {
402
- headContent += `
403
- ${head}`;
404
- }
405
- headContent += `
406
- </head>
407
- <body${bodyClass ? ` class="${bodyClass}"` : ""}>
408
- <div id="root">`;
409
- let tailContent = `</div>`;
410
- for (const script of scripts) {
411
- tailContent += `
412
- <script type="module" src="${script}"></script>`;
413
- }
414
- tailContent += `
415
- </body>
416
- </html>`;
417
- return {
418
- head: headContent,
419
- tail: tailContent
420
- };
421
- }
422
- function generateCompleteHtml(content, options = {}) {
423
- const { head, tail } = generateHtmlShell(options);
424
- return head + content + tail;
425
- }
426
- function escapeHtml(str) {
427
- return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
428
- }
429
-
430
- // src/streaming/utils.ts
431
- function createFlightInjector(payload) {
432
- const chunks = [];
433
- let chunkOrder = 0;
434
- return {
435
- addChunk(id, html, data) {
436
- const chunk = {
437
- id,
438
- html,
439
- ready: true,
440
- data,
441
- order: chunkOrder++
442
- };
443
- chunks.push(chunk);
444
- addFlightChunk(payload, id, html, data);
445
- },
446
- flush() {
447
- if (chunks.length === 0) return "";
448
- const scripts = chunks.map((chunk) => generateChunkScript(chunk)).join("\n");
449
- chunks.length = 0;
450
- return scripts;
451
- }
452
- };
453
- }
454
- function createSuspensePlaceholder(id) {
455
- return `<template data-flight-id="${id}" data-suspense="pending"></template>`;
456
- }
457
- function createSuspenseResolved(id, html) {
458
- return `<!--$?--><template data-flight-id="${id}" data-suspense="resolved">${html}</template><!--/$-->`;
459
- }
460
- function isStreaming() {
461
- if (typeof window !== "undefined") return false;
462
- const context = getFlightContext();
463
- return context?.isStreaming ?? false;
464
- }
465
- function createStreamingHeaders(options = {}) {
466
- return {
467
- "Content-Type": "text/html; charset=utf-8",
468
- "Transfer-Encoding": "chunked",
469
- "X-Content-Type-Options": "nosniff",
470
- ...options.headers
471
- };
472
- }
473
-
474
- // src/head/Head.tsx
475
- var import_react2 = __toESM(require("react"), 1);
476
-
477
- // src/head/HeadProvider.tsx
478
- var import_react = require("react");
479
- var import_jsx_runtime = require("react/jsx-runtime");
480
- var HeadContext = (0, import_react.createContext)(null);
481
-
482
- // src/head/ssr.ts
483
- var import_react3 = __toESM(require("react"), 1);
484
- function renderHeadToString(children) {
485
- let title = "Olova App";
486
- let metas = "";
487
- import_react3.default.Children.forEach(children, (child) => {
488
- if (!import_react3.default.isValidElement(child)) return;
489
- const { type, props } = child;
490
- if (type === "title") {
491
- const titleProps = props;
492
- if (typeof titleProps.children === "string") {
493
- title = titleProps.children;
494
- }
495
- }
496
- if (type === "meta") {
497
- const metaProps = props;
498
- const attrs = Object.entries(metaProps).map(([k, v]) => `${k}="${v}"`).join(" ");
499
- metas += ` <meta ${attrs} />
500
- `;
501
- }
502
- if (type === "link") {
503
- const linkProps = props;
504
- const attrs = Object.entries(linkProps).map(([k, v]) => `${k}="${v}"`).join(" ");
505
- metas += ` <link ${attrs} />
506
- `;
507
- }
508
- });
509
- return { title, metas };
510
- }
511
-
512
- // src/data/provider.tsx
513
- var import_react4 = require("react");
514
- var import_jsx_runtime2 = require("react/jsx-runtime");
515
- var PageDataContext = (0, import_react4.createContext)(null);
516
-
517
- // src/data/hooks.ts
518
- var import_react5 = require("react");
519
-
520
- // src/data/serialize.ts
521
- function serializePageData(data) {
522
- return `<script>window.__OLOVA_PAGE_DATA__ = ${JSON.stringify(data)};</script>`;
523
- }
524
- // Annotate the CommonJS export names for ESM import in node:
525
- 0 && (module.exports = {
526
- addFlightChunk,
527
- addFlightData,
528
- addFlightNode,
529
- addHydrationHint,
530
- clearFlightContext,
531
- createFlightInjector,
532
- createFlightPayload,
533
- createStreamingHeaders,
534
- createSuspensePlaceholder,
535
- createSuspenseResolved,
536
- generateCompleteHtml,
537
- generateFlightScript,
538
- generateHtmlShell,
539
- isStreaming,
540
- renderHeadToString,
541
- renderToStream,
542
- renderToStringWithFlight,
543
- resetFlightContext,
544
- serializePageData,
545
- setFlightContext
546
- });
547
- //# sourceMappingURL=server.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hydration/scheduler.ts","../src/server.ts","../src/streaming/render.ts","../src/hydration/serialization.ts","../src/hydration/payload.ts","../src/hydration/index.ts","../src/hydration/context.ts","../src/hydration/seo.ts","../src/streaming/html.ts","../src/streaming/utils.ts","../src/head/Head.tsx","../src/head/HeadProvider.tsx","../src/head/ssr.ts","../src/data/provider.tsx","../src/data/hooks.ts","../src/data/serialize.ts"],"sourcesContent":["import type { HydrationState, FlightChunk, HydrationHint } from './types.js';\r\n\r\n/**\r\n * Hydration scheduler - Prioritizes component hydration\r\n */\r\nexport class HydrationScheduler {\r\n private queue: Array<{ id: string; priority: number; task: () => void }> = [];\r\n private isProcessing = false;\r\n private state: HydrationState = 'idle';\r\n \r\n constructor() {\r\n if (typeof window !== 'undefined') {\r\n (window as any).__FLIGHT_CHUNK__ = this.receiveChunk.bind(this);\r\n }\r\n }\r\n \r\n getState(): HydrationState {\r\n return this.state;\r\n }\r\n \r\n schedule(id: string, priority: HydrationHint['priority'], task: () => void): void {\r\n const priorityValue = {\r\n critical: 0,\r\n high: 1,\r\n low: 2,\r\n idle: 3,\r\n }[priority];\r\n \r\n this.queue.push({ id, priority: priorityValue, task });\r\n this.queue.sort((a, b) => a.priority - b.priority);\r\n \r\n if (!this.isProcessing) {\r\n this.processQueue();\r\n }\r\n }\r\n \r\n private async processQueue(): Promise<void> {\r\n this.isProcessing = true;\r\n this.state = 'hydrating';\r\n \r\n while (this.queue.length > 0) {\r\n const item = this.queue.shift()!;\r\n \r\n try {\r\n if (item.priority >= 2 && 'requestIdleCallback' in window) {\r\n await new Promise<void>(resolve => {\r\n (window as any).requestIdleCallback(() => {\r\n item.task();\r\n resolve();\r\n });\r\n });\r\n } else {\r\n await Promise.resolve().then(item.task);\r\n }\r\n } catch (error) {\r\n console.error(`[Olova] Hydration failed for ${item.id}:`, error);\r\n }\r\n \r\n await new Promise(r => setTimeout(r, 0));\r\n }\r\n \r\n this.isProcessing = false;\r\n this.state = 'complete';\r\n \r\n if (typeof window !== 'undefined') {\r\n window.dispatchEvent(new CustomEvent('olova:hydration-complete'));\r\n }\r\n }\r\n \r\n private receiveChunk(chunk: FlightChunk): void {\r\n this.state = 'streaming';\r\n \r\n const placeholder = document.querySelector(`[data-flight-id=\"${chunk.id}\"]`);\r\n if (placeholder) {\r\n const temp = document.createElement('div');\r\n temp.innerHTML = chunk.html;\r\n \r\n while (temp.firstChild) {\r\n placeholder.parentNode?.insertBefore(temp.firstChild, placeholder);\r\n }\r\n placeholder.remove();\r\n \r\n if (chunk.data) {\r\n this.schedule(chunk.id, 'high', () => {\r\n this.hydrateNode(chunk.id, chunk.data);\r\n });\r\n }\r\n }\r\n }\r\n \r\n private hydrateNode(id: string, data: any): void {\r\n const element = document.querySelector(`[data-flight-id=\"${id}\"]`);\r\n if (element) {\r\n element.setAttribute('data-hydrated', 'true');\r\n (element as any).__FLIGHT_DATA__ = data;\r\n }\r\n }\r\n}\r\n","/**\r\n * Olova Framework - Server Entry Point\r\n */\r\n\r\nexport {\r\n renderToStream,\r\n renderToStringWithFlight,\r\n generateHtmlShell,\r\n generateCompleteHtml,\r\n createFlightInjector,\r\n createSuspensePlaceholder,\r\n createSuspenseResolved,\r\n createStreamingHeaders,\r\n isStreaming,\r\n} from './streaming/index.js';\r\n\r\nexport type {\r\n StreamingOptions,\r\n StreamingResult,\r\n HtmlShellOptions,\r\n} from './streaming/index.js';\r\n\r\nexport {\r\n createFlightPayload,\r\n addFlightNode,\r\n addFlightData,\r\n addFlightChunk,\r\n addHydrationHint,\r\n generateFlightScript,\r\n resetFlightContext,\r\n setFlightContext,\r\n clearFlightContext,\r\n} from './hydration/index.js';\r\n\r\nexport type {\r\n FlightPayload,\r\n FlightNode,\r\n FlightChunk,\r\n HydrationHint,\r\n FlightContext,\r\n} from './hydration/index.js';\r\n\r\nexport { renderHeadToString } from './head/index.js';\r\nexport { serializePageData } from './data/index.js';\r\n","import React from 'react';\r\nimport { renderToPipeableStream, renderToString } from 'react-dom/server';\r\nimport type { Writable } from 'stream';\r\nimport type { FlightPayload } from '../hydration/types.js';\r\nimport {\r\n createFlightPayload,\r\n resetFlightContext,\r\n setFlightContext,\r\n clearFlightContext,\r\n} from '../hydration/index.js';\r\n\r\nexport interface StreamingOptions {\r\n bootstrapScripts?: string[];\r\n bootstrapModules?: string[];\r\n onShellReady?: () => void;\r\n onShellError?: (error: Error) => void;\r\n onAllReady?: () => void;\r\n onError?: (error: Error) => void;\r\n signal?: AbortSignal;\r\n timeout?: number;\r\n progressiveHydration?: boolean;\r\n}\r\n\r\nexport interface StreamingResult {\r\n pipe: (destination: Writable) => Writable;\r\n abort: () => void;\r\n payload: FlightPayload;\r\n}\r\n\r\nexport interface RenderToStringResult {\r\n html: string;\r\n payload: FlightPayload;\r\n}\r\n\r\n/**\r\n * Render React tree to a streaming response\r\n */\r\nexport function renderToStream(\r\n element: React.ReactElement,\r\n route: string,\r\n options: StreamingOptions = {}\r\n): StreamingResult {\r\n resetFlightContext();\r\n const payload = createFlightPayload(route);\r\n \r\n setFlightContext({\r\n payload,\r\n scheduler: null,\r\n isStreaming: true,\r\n onChunk: (chunk) => {\r\n payload.chunks.push(chunk);\r\n },\r\n });\r\n \r\n const {\r\n bootstrapScripts = [],\r\n bootstrapModules = [],\r\n onShellReady,\r\n onShellError,\r\n onAllReady,\r\n onError,\r\n signal,\r\n timeout = 30000,\r\n } = options;\r\n \r\n const abortController = new AbortController();\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n \r\n if (timeout > 0) {\r\n timeoutId = setTimeout(() => {\r\n abortController.abort();\r\n }, timeout);\r\n }\r\n \r\n if (signal) {\r\n signal.addEventListener('abort', () => abortController.abort());\r\n }\r\n \r\n const { pipe, abort } = renderToPipeableStream(element, {\r\n bootstrapScripts,\r\n bootstrapModules,\r\n \r\n onShellReady() {\r\n if (timeoutId) clearTimeout(timeoutId);\r\n onShellReady?.();\r\n },\r\n \r\n onShellError(error: unknown) {\r\n if (timeoutId) clearTimeout(timeoutId);\r\n clearFlightContext();\r\n onShellError?.(error as Error);\r\n },\r\n \r\n onAllReady() {\r\n if (timeoutId) clearTimeout(timeoutId);\r\n clearFlightContext();\r\n onAllReady?.();\r\n },\r\n \r\n onError(error: unknown) {\r\n console.error('[Olova Streaming] Error:', error);\r\n onError?.(error as Error);\r\n },\r\n });\r\n \r\n return {\r\n pipe,\r\n abort: () => {\r\n if (timeoutId) clearTimeout(timeoutId);\r\n abort();\r\n clearFlightContext();\r\n },\r\n payload,\r\n };\r\n}\r\n\r\n/**\r\n * Render to string with Flight payload\r\n */\r\nexport function renderToStringWithFlight(\r\n element: React.ReactElement,\r\n route: string\r\n): RenderToStringResult {\r\n resetFlightContext();\r\n const payload = createFlightPayload(route);\r\n \r\n setFlightContext({\r\n payload,\r\n scheduler: null,\r\n isStreaming: false,\r\n });\r\n \r\n try {\r\n const html = renderToString(element);\r\n return { html, payload };\r\n } finally {\r\n clearFlightContext();\r\n }\r\n}\r\n","import type { FlightPayload, FlightChunk } from './types.js';\r\n\r\n/**\r\n * Safely stringify JSON for embedding in script tags\r\n * Escapes <, >, /, \\u2028, and \\u2029 to prevent XSS and syntax errors\r\n */\r\nexport function 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\n/**\r\n * Serialize props for transfer (remove functions, handle special types)\r\n */\r\nexport function serializeProps(props: Record<string, any>): Record<string, any> {\r\n const serialized: Record<string, any> = {};\r\n \r\n for (const [key, value] of Object.entries(props)) {\r\n if (key === 'children') continue;\r\n if (typeof value === 'function') continue;\r\n \r\n if (value instanceof Date) {\r\n serialized[key] = { __type: 'Date', value: value.toISOString() };\r\n } else if (value instanceof Map) {\r\n serialized[key] = { __type: 'Map', value: Array.from(value.entries()) };\r\n } else if (value instanceof Set) {\r\n serialized[key] = { __type: 'Set', value: Array.from(value) };\r\n } else if (typeof value === 'object' && value !== null) {\r\n serialized[key] = serializeProps(value);\r\n } else {\r\n serialized[key] = value;\r\n }\r\n }\r\n \r\n return serialized;\r\n}\r\n\r\n/**\r\n * Deserialize props from Flight format\r\n */\r\nexport function deserializeProps(props: Record<string, any>): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n \r\n for (const [key, value] of Object.entries(props)) {\r\n if (value && typeof value === 'object') {\r\n if (value.__type === 'Date') {\r\n result[key] = new Date(value.value);\r\n } else if (value.__type === 'Map') {\r\n result[key] = new Map(value.value);\r\n } else if (value.__type === 'Set') {\r\n result[key] = new Set(value.value);\r\n } else {\r\n result[key] = deserializeProps(value);\r\n }\r\n } else {\r\n result[key] = value;\r\n }\r\n }\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * Serialize Flight payload to string\r\n */\r\nexport function serializeFlightPayload(payload: FlightPayload): string {\r\n return JSON.stringify(payload);\r\n}\r\n\r\n/**\r\n * Generate script tag for embedding Flight payload\r\n */\r\nexport function generateFlightScript(payload: FlightPayload): string {\r\n const serialized = serializeFlightPayload(payload);\r\n const escaped = serialized\r\n .replace(/</g, '\\\\u003c')\r\n .replace(/>/g, '\\\\u003e')\r\n .replace(/&/g, '\\\\u0026');\r\n \r\n return `<script>self.__FLIGHT__=${escaped}</script>`;\r\n}\r\n\r\n/**\r\n * Generate streaming chunk script\r\n */\r\nexport function generateChunkScript(chunk: FlightChunk): string {\r\n const serialized = JSON.stringify(chunk)\r\n .replace(/</g, '\\\\u003c')\r\n .replace(/>/g, '\\\\u003e');\r\n \r\n return `<script>self.__FLIGHT_CHUNK__(${serialized})</script>`;\r\n}\r\n\r\n/**\r\n * Parse Flight payload from window\r\n */\r\nexport function parseFlightPayload(): FlightPayload | null {\r\n if (typeof window === 'undefined') return null;\r\n const flight = (window as any).__FLIGHT__;\r\n return (flight as FlightPayload) || null;\r\n}\r\n\r\n/**\r\n * Get component data from Flight payload\r\n */\r\nexport function getFlightData<T = any>(key: string): T | null {\r\n const payload = parseFlightPayload();\r\n if (!payload) return null;\r\n return payload.data[key] ?? null;\r\n}\r\n","import type { \r\n FlightPayload, \r\n FlightSEO, \r\n FlightMeta, \r\n HydrationHint, \r\n HydrationIsland, \r\n ResourceHint \r\n} from './types.js';\r\nimport { serializeProps } from './serialization.js';\r\n\r\nlet nodeIdCounter = 0;\r\n\r\n/**\r\n * Generate unique node ID\r\n */\r\nfunction generateNodeId(): string {\r\n return `o${(++nodeIdCounter).toString(36)}`;\r\n}\r\n\r\n/**\r\n * Reset node ID counter\r\n */\r\nexport function resetFlightContext(): void {\r\n nodeIdCounter = 0;\r\n}\r\n\r\n/**\r\n * Create an empty Flight payload\r\n */\r\nexport function createFlightPayload(route: string, options?: {\r\n seo?: FlightSEO;\r\n meta?: FlightMeta;\r\n buildId?: string;\r\n}): FlightPayload {\r\n return {\r\n v: 1,\r\n ts: Date.now(),\r\n route,\r\n tree: [],\r\n data: {},\r\n chunks: [],\r\n hints: [],\r\n styles: [],\r\n meta: options?.meta,\r\n seo: options?.seo,\r\n islands: [],\r\n resourceHints: [],\r\n build: options?.buildId ? {\r\n id: options.buildId,\r\n time: Date.now(),\r\n } : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Add a node to the Flight payload\r\n */\r\nexport function addFlightNode(\r\n payload: FlightPayload,\r\n type: string,\r\n props: Record<string, any>,\r\n options: {\r\n hydrate?: boolean;\r\n suspense?: boolean;\r\n children?: string[];\r\n } = {}\r\n): string {\r\n const id = generateNodeId();\r\n \r\n payload.tree.push({\r\n id,\r\n type,\r\n props: serializeProps(props),\r\n children: options.children || [],\r\n hydrate: options.hydrate ?? false,\r\n suspense: options.suspense,\r\n });\r\n \r\n return id;\r\n}\r\n\r\n/**\r\n * Add component data to payload\r\n */\r\nexport function addFlightData(\r\n payload: FlightPayload,\r\n key: string,\r\n data: any\r\n): void {\r\n payload.data[key] = data;\r\n}\r\n\r\n/**\r\n * Add a streaming chunk\r\n */\r\nexport function addFlightChunk(\r\n payload: FlightPayload,\r\n id: string,\r\n html: string,\r\n data?: any\r\n): void {\r\n payload.chunks.push({\r\n id,\r\n html,\r\n ready: true,\r\n data,\r\n order: payload.chunks.length,\r\n });\r\n}\r\n\r\n/**\r\n * Add hydration hint\r\n */\r\nexport function addHydrationHint(\r\n payload: FlightPayload,\r\n hint: HydrationHint\r\n): void {\r\n payload.hints.push(hint);\r\n}\r\n\r\n/**\r\n * Add hydration island for selective hydration\r\n */\r\nexport function addHydrationIsland(\r\n payload: FlightPayload,\r\n island: HydrationIsland\r\n): void {\r\n if (!payload.islands) payload.islands = [];\r\n payload.islands.push(island);\r\n}\r\n\r\n/**\r\n * Add resource hint for preloading\r\n */\r\nexport function addResourceHint(\r\n payload: FlightPayload,\r\n hint: ResourceHint\r\n): void {\r\n if (!payload.resourceHints) payload.resourceHints = [];\r\n payload.resourceHints.push(hint);\r\n}\r\n\r\n/**\r\n * Set SEO data on Flight payload\r\n */\r\nexport function setFlightSEO(\r\n payload: FlightPayload,\r\n seo: FlightSEO\r\n): void {\r\n payload.seo = seo;\r\n}\r\n","/**\r\n * Olova Hydration Module\r\n * Implements \"Flight\" format for efficient client hydration\r\n */\r\n\r\nexport * from './types.js';\r\nexport * from './payload.js';\r\nexport * from './serialization.js';\r\nexport * from './scheduler.js';\r\nexport * from './context.js';\r\nexport * from './seo.js';\r\nexport * from './generation.js';\r\nexport * from './client-utils.js';\r\n\r\n// Global singleton instance for the client\r\nlet clientScheduler: any = null;\r\n\r\n/**\r\n * Get the global hydration scheduler instance\r\n */\r\nexport function getHydrationScheduler() {\r\n if (typeof window === 'undefined') return null;\r\n if (!clientScheduler) {\r\n const { HydrationScheduler } = require('./scheduler.js');\r\n clientScheduler = new HydrationScheduler();\r\n }\r\n return clientScheduler;\r\n}\r\n","import type { FlightContext } from './types.js';\r\n\r\nlet currentFlightContext: FlightContext | null = null;\r\n\r\n/**\r\n * Set current Flight context (server-side)\r\n */\r\nexport function setFlightContext(context: FlightContext): void {\r\n currentFlightContext = context;\r\n}\r\n\r\n/**\r\n * Get current Flight context\r\n */\r\nexport function getFlightContext(): FlightContext | null {\r\n return currentFlightContext;\r\n}\r\n\r\n/**\r\n * Clear Flight context\r\n */\r\nexport function clearFlightContext(): void {\r\n currentFlightContext = null;\r\n}\r\n","import type { FlightPayload } from './types.js';\r\n\r\n/**\r\n * Generate SEO meta tags HTML from Flight payload\r\n */\r\nexport function generateSEOTags(payload: FlightPayload): string {\r\n const { meta, seo } = payload;\r\n let tags = '';\r\n \r\n // Basic meta tags\r\n if (meta?.title) {\r\n tags += `<title>${escapeHtmlAttr(meta.title)}</title>\\n`;\r\n }\r\n if (meta?.description) {\r\n tags += `<meta name=\"description\" content=\"${escapeHtmlAttr(meta.description)}\" />\\n`;\r\n }\r\n \r\n // Enhanced SEO tags\r\n if (seo) {\r\n // Canonical\r\n if (seo.canonical) {\r\n tags += `<link rel=\"canonical\" href=\"${escapeHtmlAttr(seo.canonical)}\" />\\n`;\r\n }\r\n \r\n // Robots\r\n if (seo.robots) {\r\n tags += `<meta name=\"robots\" content=\"${escapeHtmlAttr(seo.robots)}\" />\\n`;\r\n }\r\n \r\n // Open Graph\r\n if (seo.openGraph) {\r\n const og = seo.openGraph;\r\n if (og.title) tags += `<meta property=\"og:title\" content=\"${escapeHtmlAttr(og.title)}\" />\\n`;\r\n if (og.description) tags += `<meta property=\"og:description\" content=\"${escapeHtmlAttr(og.description)}\" />\\n`;\r\n if (og.type) tags += `<meta property=\"og:type\" content=\"${escapeHtmlAttr(og.type)}\" />\\n`;\r\n if (og.url) tags += `<meta property=\"og:url\" content=\"${escapeHtmlAttr(og.url)}\" />\\n`;\r\n if (og.image) tags += `<meta property=\"og:image\" content=\"${escapeHtmlAttr(og.image)}\" />\\n`;\r\n if (og.siteName) tags += `<meta property=\"og:site_name\" content=\"${escapeHtmlAttr(og.siteName)}\" />\\n`;\r\n }\r\n \r\n // Twitter Card\r\n if (seo.twitter) {\r\n const tw = seo.twitter;\r\n if (tw.card) tags += `<meta name=\"twitter:card\" content=\"${escapeHtmlAttr(tw.card)}\" />\\n`;\r\n if (tw.site) tags += `<meta name=\"twitter:site\" content=\"${escapeHtmlAttr(tw.site)}\" />\\n`;\r\n if (tw.creator) tags += `<meta name=\"twitter:creator\" content=\"${escapeHtmlAttr(tw.creator)}\" />\\n`;\r\n if (tw.title) tags += `<meta name=\"twitter:title\" content=\"${escapeHtmlAttr(tw.title)}\" />\\n`;\r\n if (tw.description) tags += `<meta name=\"twitter:description\" content=\"${escapeHtmlAttr(tw.description)}\" />\\n`;\r\n if (tw.image) tags += `<meta name=\"twitter:image\" content=\"${escapeHtmlAttr(tw.image)}\" />\\n`;\r\n }\r\n \r\n // Alternate languages\r\n if (seo.alternates) {\r\n for (const alt of seo.alternates) {\r\n tags += `<link rel=\"alternate\" hreflang=\"${alt.hreflang}\" href=\"${escapeHtmlAttr(alt.href)}\" />\\n`;\r\n }\r\n }\r\n \r\n // Preconnect hints\r\n if (seo.preconnect) {\r\n for (const domain of seo.preconnect) {\r\n tags += `<link rel=\"preconnect\" href=\"${escapeHtmlAttr(domain)}\" />\\n`;\r\n }\r\n }\r\n \r\n // JSON-LD structured data\r\n if (seo.jsonLd) {\r\n const jsonLdArray = Array.isArray(seo.jsonLd) ? seo.jsonLd : [seo.jsonLd];\r\n for (const schema of jsonLdArray) {\r\n tags += `<script type=\"application/ld+json\">${JSON.stringify(schema)}</script>\\n`;\r\n }\r\n }\r\n }\r\n \r\n return tags;\r\n}\r\n\r\n/**\r\n * Generate resource hint tags\r\n */\r\nexport function generateResourceHintTags(payload: FlightPayload): string {\r\n if (!payload.resourceHints?.length) return '';\r\n \r\n let tags = '';\r\n for (const hint of payload.resourceHints) {\r\n let tag = `<link rel=\"${hint.rel}\" href=\"${escapeHtmlAttr(hint.href)}\"`;\r\n if (hint.as) tag += ` as=\"${hint.as}\"`;\r\n if (hint.type) tag += ` type=\"${hint.type}\"`;\r\n if (hint.crossorigin) tag += ` crossorigin=\"${hint.crossorigin}\"`;\r\n if (hint.fetchpriority) tag += ` fetchpriority=\"${hint.fetchpriority}\"`;\r\n tag += ' />\\n';\r\n tags += tag;\r\n }\r\n return tags;\r\n}\r\n\r\n/**\r\n * Escape HTML attribute value\r\n */\r\nfunction escapeHtmlAttr(str: string): string {\r\n return str\r\n .replace(/&/g, '&amp;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;');\r\n}\r\n","import type { FlightPayload } from '../hydration/types.js';\r\nimport { \r\n generateSEOTags, \r\n generateResourceHintTags, \r\n generateFlightScript \r\n} from '../hydration/index.js';\r\n\r\nexport interface HtmlShellOptions {\r\n title?: string;\r\n description?: string;\r\n head?: string;\r\n /** Array of stylesheet URLs to include */\r\n styles?: string[];\r\n /** Critical CSS to inline in the head for above-the-fold content */\r\n criticalCss?: string;\r\n /** Global CSS file URLs (injected before other styles) */\r\n globalCss?: string[];\r\n /** CSS Module file URLs */\r\n cssModules?: string[];\r\n scripts?: string[];\r\n flightPayload?: FlightPayload;\r\n pageData?: any;\r\n lang?: string;\r\n bodyClass?: string;\r\n}\r\n\r\n/**\r\n * Generate HTML shell\r\n */\r\nexport function generateHtmlShell(options: HtmlShellOptions = {}): {\r\n head: string;\r\n tail: string;\r\n} {\r\n const {\r\n title = 'Olova App',\r\n description,\r\n head = '',\r\n styles = [],\r\n criticalCss,\r\n globalCss = [],\r\n cssModules = [],\r\n scripts = [],\r\n flightPayload,\r\n pageData,\r\n lang = 'en',\r\n bodyClass = '',\r\n } = options;\r\n \r\n let headContent = `<!DOCTYPE html>\r\n<html lang=\"${lang}\">\r\n<head>\r\n <meta charset=\"UTF-8\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n <title>${escapeHtml(title)}</title>`;\r\n \r\n if (description) {\r\n headContent += `\\n <meta name=\"description\" content=\"${escapeHtml(description)}\" />`;\r\n }\r\n\r\n if (flightPayload) {\r\n headContent += `\\n ${generateSEOTags(flightPayload)}`;\r\n headContent += `\\n ${generateResourceHintTags(flightPayload)}`;\r\n }\r\n \r\n // Critical CSS first (inline for above-the-fold)\r\n if (criticalCss) {\r\n headContent += `\\n <style>${criticalCss}</style>`;\r\n }\r\n\r\n // Global CSS files (highest priority)\r\n for (const css of globalCss) {\r\n headContent += `\\n <link rel=\"stylesheet\" href=\"${css}\" />`;\r\n }\r\n \r\n // CSS Modules\r\n for (const css of cssModules) {\r\n headContent += `\\n <link rel=\"stylesheet\" href=\"${css}\" />`;\r\n }\r\n \r\n // Additional styles\r\n for (const style of styles) {\r\n headContent += `\\n <link rel=\"stylesheet\" href=\"${style}\" />`;\r\n }\r\n \r\n if (flightPayload) {\r\n headContent += `\\n ${generateFlightScript(flightPayload)}`;\r\n }\r\n \r\n if (pageData) {\r\n const serialized = JSON.stringify(pageData)\r\n .replace(/</g, '\\\\u003c')\r\n .replace(/>/g, '\\\\u003e');\r\n headContent += `\\n <script>self.__PAGE_DATA__=${serialized}</script>`;\r\n }\r\n \r\n if (head) {\r\n headContent += `\\n ${head}`;\r\n }\r\n \r\n headContent += `\r\n</head>\r\n<body${bodyClass ? ` class=\"${bodyClass}\"` : ''}>\r\n <div id=\"root\">`;\r\n \r\n let tailContent = `</div>`;\r\n \r\n for (const script of scripts) {\r\n tailContent += `\\n <script type=\"module\" src=\"${script}\"></script>`;\r\n }\r\n \r\n tailContent += `\r\n</body>\r\n</html>`;\r\n \r\n return {\r\n head: headContent,\r\n tail: tailContent,\r\n };\r\n}\r\n\r\n/**\r\n * Generate complete HTML with content\r\n */\r\nexport function generateCompleteHtml(\r\n content: string,\r\n options: HtmlShellOptions = {}\r\n): string {\r\n const { head, tail } = generateHtmlShell(options);\r\n return head + content + tail;\r\n}\r\n\r\n/**\r\n * Escape HTML special characters\r\n */\r\nexport function escapeHtml(str: string): string {\r\n return str\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#039;');\r\n}\r\n","import type { FlightPayload, FlightChunk } from '../hydration/types.js';\r\nimport { addFlightChunk, generateChunkScript, getFlightContext } from '../hydration/index.js';\r\nimport type { StreamingOptions } from './render.js';\r\n\r\nexport interface StreamingResponseOptions extends StreamingOptions {\r\n status?: number;\r\n headers?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Create a Transform stream that injects Flight chunks\r\n */\r\nexport function createFlightInjector(payload: FlightPayload) {\r\n const chunks: FlightChunk[] = [];\r\n let chunkOrder = 0;\r\n \r\n return {\r\n addChunk(id: string, html: string, data?: any): void {\r\n const chunk: FlightChunk = {\r\n id,\r\n html,\r\n ready: true,\r\n data,\r\n order: chunkOrder++,\r\n };\r\n chunks.push(chunk);\r\n addFlightChunk(payload, id, html, data);\r\n },\r\n \r\n flush(): string {\r\n if (chunks.length === 0) return '';\r\n const scripts = chunks.map(chunk => generateChunkScript(chunk)).join('\\n');\r\n chunks.length = 0;\r\n return scripts;\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Create a Suspense fallback placeholder\r\n */\r\nexport function createSuspensePlaceholder(id: string): string {\r\n return `<template data-flight-id=\"${id}\" data-suspense=\"pending\"></template>`;\r\n}\r\n\r\n/**\r\n * Create resolved Suspense content\r\n */\r\nexport function createSuspenseResolved(id: string, html: string): string {\r\n return `<!--$?--><template data-flight-id=\"${id}\" data-suspense=\"resolved\">${html}</template><!--/$-->`;\r\n}\r\n\r\n/**\r\n * Check if we're in a streaming context\r\n */\r\nexport function isStreaming(): boolean {\r\n if (typeof window !== 'undefined') return false;\r\n const context = getFlightContext();\r\n return context?.isStreaming ?? false;\r\n}\r\n\r\n/**\r\n * Create headers for streaming response\r\n */\r\nexport function createStreamingHeaders(options: StreamingResponseOptions = {}): Record<string, string> {\r\n return {\r\n 'Content-Type': 'text/html; charset=utf-8',\r\n 'Transfer-Encoding': 'chunked',\r\n 'X-Content-Type-Options': 'nosniff',\r\n ...options.headers,\r\n };\r\n}\r\n","import React, { useEffect, useContext } from 'react';\r\nimport { HeadContext, type TitleProps, type MetaProps, type HeadLinkProps } from './HeadProvider.js';\r\n\r\n/**\r\n * Head component - client-side document head management\r\n */\r\nexport function Head({ children }: { children: React.ReactNode }) {\r\n const context = useContext(HeadContext);\r\n\r\n useEffect(() => {\r\n React.Children.forEach(children, (child) => {\r\n if (!React.isValidElement(child)) return;\r\n\r\n const { type, props } = child as React.ReactElement<any>;\r\n\r\n if (type === 'title') {\r\n const titleProps = props as TitleProps;\r\n if (typeof titleProps.children === 'string') {\r\n document.title = titleProps.children;\r\n context?.update({ title: titleProps.children });\r\n }\r\n }\r\n\r\n if (type === 'meta') {\r\n const metaProps = props as MetaProps;\r\n const key = metaProps.name || metaProps.property || metaProps.httpEquiv;\r\n if (key) {\r\n let meta = document.querySelector(`meta[name=\"${key}\"], meta[property=\"${key}\"]`);\r\n if (!meta) {\r\n meta = document.createElement('meta');\r\n if (metaProps.name) meta.setAttribute('name', metaProps.name);\r\n if (metaProps.property) meta.setAttribute('property', metaProps.property);\r\n document.head.appendChild(meta);\r\n }\r\n meta.setAttribute('content', metaProps.content);\r\n }\r\n }\r\n\r\n if (type === 'link') {\r\n const linkProps = props as HeadLinkProps;\r\n const key = linkProps.href;\r\n let link = document.querySelector(`link[href=\"${key}\"]`);\r\n if (!link) {\r\n link = document.createElement('link');\r\n link.setAttribute('rel', linkProps.rel);\r\n link.setAttribute('href', linkProps.href);\r\n if (linkProps.as) link.setAttribute('as', linkProps.as);\r\n document.head.appendChild(link);\r\n }\r\n }\r\n });\r\n\r\n return () => {\r\n // Cleanup could go here if needed\r\n };\r\n }, [children, context]);\r\n\r\n return null;\r\n}\r\n","import React, { createContext, useState } from 'react';\r\n\r\nexport interface MetaProps {\r\n name?: string;\r\n property?: string;\r\n httpEquiv?: string;\r\n content: string;\r\n}\r\n\r\nexport interface HeadLinkProps {\r\n rel: string;\r\n href: string;\r\n as?: string;\r\n}\r\n\r\nexport interface TitleProps {\r\n children: string;\r\n}\r\n\r\nexport interface HeadState {\r\n title?: string;\r\n metas: Map<string, MetaProps>;\r\n links: Map<string, HeadLinkProps>;\r\n}\r\n\r\nexport const HeadContext = createContext<{\r\n state: HeadState;\r\n update: (updates: Partial<HeadState>) => void;\r\n} | null>(null);\r\n\r\n/**\r\n * Provider for Head state management\r\n */\r\nexport function HeadProvider({ children }: { children: React.ReactNode }) {\r\n const [state, setState] = useState<HeadState>({\r\n metas: new Map(),\r\n links: new Map(),\r\n });\r\n\r\n const update = (updates: Partial<HeadState>) => {\r\n setState(prev => ({ ...prev, ...updates }));\r\n };\r\n\r\n return (\r\n <HeadContext.Provider value={{ state, update }}>\r\n {children}\r\n </HeadContext.Provider>\r\n );\r\n}\r\n","import React from 'react';\r\nimport { type TitleProps, type MetaProps, type HeadLinkProps } from './HeadProvider.js';\r\n\r\n/**\r\n * For SSR/SSG - extract head elements to string\r\n */\r\nexport function renderHeadToString(children: React.ReactNode): { title: string; metas: string } {\r\n let title = 'Olova App';\r\n let metas = '';\r\n\r\n React.Children.forEach(children, (child) => {\r\n if (!React.isValidElement(child)) return;\r\n\r\n const { type, props } = child as React.ReactElement<any>;\r\n\r\n if (type === 'title') {\r\n const titleProps = props as TitleProps;\r\n if (typeof titleProps.children === 'string') {\r\n title = titleProps.children;\r\n }\r\n }\r\n\r\n if (type === 'meta') {\r\n const metaProps = props as MetaProps;\r\n const attrs = Object.entries(metaProps)\r\n .map(([k, v]) => `${k}=\"${v}\"`)\r\n .join(' ');\r\n metas += ` <meta ${attrs} />\\n`;\r\n }\r\n\r\n if (type === 'link') {\r\n const linkProps = props as HeadLinkProps;\r\n const attrs = Object.entries(linkProps)\r\n .map(([k, v]) => `${k}=\"${v}\"`)\r\n .join(' ');\r\n metas += ` <link ${attrs} />\\n`;\r\n }\r\n });\r\n\r\n return { title, metas };\r\n}\r\n","import React, { createContext } from 'react';\r\n\r\nexport const PageDataContext = createContext<any>(null);\r\n\r\n/**\r\n * Provider for page data\r\n */\r\nexport function PageDataProvider({ \r\n children, \r\n data \r\n}: { \r\n children: React.ReactNode; \r\n data: any;\r\n}) {\r\n return (\r\n <PageDataContext.Provider value={data}>\r\n {children}\r\n </PageDataContext.Provider>\r\n );\r\n}\r\n","import { useState, useEffect, useContext } from 'react';\r\nimport { PageDataContext } from './provider.js';\r\n\r\n/**\r\n * Hook to access page data (like getStaticProps props)\r\n */\r\nexport function usePageData<T = any>(): T | null {\r\n const context = useContext(PageDataContext);\r\n const [data, setData] = useState<T | null>(context);\r\n\r\n useEffect(() => {\r\n // Check for hydrated data from SSG\r\n // @ts-ignore\r\n if (typeof window !== 'undefined' && window.__OLOVA_PAGE_DATA__) {\r\n // @ts-ignore\r\n setData(window.__OLOVA_PAGE_DATA__);\r\n }\r\n }, []);\r\n\r\n return data;\r\n}\r\n","import type { GetStaticProps } from './types.js';\r\n\r\n/**\r\n * For extracting getStaticProps from a module\r\n */\r\nexport function extractGetStaticProps(module: any): GetStaticProps | null {\r\n if (module.getStaticProps && typeof module.getStaticProps === 'function') {\r\n return module.getStaticProps;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Serialize data for injection into HTML\r\n */\r\nexport function serializePageData(data: any): string {\r\n return `<script>window.__OLOVA_PAGE_DATA__ = ${JSON.stringify(data)};</script>`;\r\n}\r\n"],"mappings":"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","names":["import_react","import_react","React","import_react","import_jsx_runtime","import_react"]}