olova 2.0.39 → 2.0.41

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 (156) hide show
  1. package/README.md +305 -12
  2. package/dist/client.d.ts +9 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +8 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/core/config.d.ts +179 -0
  7. package/dist/core/config.d.ts.map +1 -0
  8. package/dist/core/config.js +33 -0
  9. package/dist/core/config.js.map +1 -0
  10. package/dist/core/index.d.ts +8 -0
  11. package/dist/core/index.d.ts.map +1 -0
  12. package/dist/core/index.js +7 -0
  13. package/dist/core/index.js.map +1 -0
  14. package/dist/core/types.d.ts +16 -0
  15. package/dist/core/types.d.ts.map +1 -0
  16. package/dist/core/types.js +2 -0
  17. package/dist/core/types.js.map +1 -0
  18. package/dist/data/hooks.d.ts +5 -0
  19. package/dist/data/hooks.d.ts.map +1 -0
  20. package/dist/data/hooks.js +19 -0
  21. package/dist/data/hooks.js.map +1 -0
  22. package/dist/data/index.d.ts +9 -0
  23. package/dist/data/index.d.ts.map +1 -0
  24. package/dist/data/index.js +9 -0
  25. package/dist/data/index.js.map +1 -0
  26. package/dist/data/provider.d.ts +10 -0
  27. package/dist/data/provider.d.ts.map +1 -0
  28. package/dist/data/provider.js +10 -0
  29. package/dist/data/provider.js.map +1 -0
  30. package/dist/data/serialize.d.ts +10 -0
  31. package/dist/data/serialize.d.ts.map +1 -0
  32. package/dist/data/serialize.js +16 -0
  33. package/dist/data/serialize.js.map +1 -0
  34. package/dist/data/types.d.ts +9 -0
  35. package/dist/data/types.d.ts.map +1 -0
  36. package/dist/data/types.js +2 -0
  37. package/dist/data/types.js.map +1 -0
  38. package/dist/head/Head.d.ts +8 -0
  39. package/dist/head/Head.d.ts.map +1 -0
  40. package/dist/head/Head.js +56 -0
  41. package/dist/head/Head.js.map +1 -0
  42. package/dist/head/HeadProvider.d.ts +31 -0
  43. package/dist/head/HeadProvider.d.ts.map +1 -0
  44. package/dist/head/HeadProvider.js +17 -0
  45. package/dist/head/HeadProvider.js.map +1 -0
  46. package/dist/head/index.d.ts +8 -0
  47. package/dist/head/index.d.ts.map +1 -0
  48. package/dist/head/index.js +8 -0
  49. package/dist/head/index.js.map +1 -0
  50. package/dist/head/ssr.d.ts +9 -0
  51. package/dist/head/ssr.d.ts.map +1 -0
  52. package/dist/head/ssr.js +35 -0
  53. package/dist/head/ssr.js.map +1 -0
  54. package/dist/hydration/context.d.ts +14 -0
  55. package/dist/hydration/context.d.ts.map +1 -0
  56. package/dist/hydration/context.js +20 -0
  57. package/dist/hydration/context.js.map +1 -0
  58. package/dist/hydration/index.d.ts +15 -0
  59. package/dist/hydration/index.d.ts.map +1 -0
  60. package/dist/hydration/index.js +25 -0
  61. package/dist/hydration/index.js.map +1 -0
  62. package/dist/hydration/payload.d.ts +46 -0
  63. package/dist/hydration/payload.d.ts.map +1 -0
  64. package/dist/hydration/payload.js +99 -0
  65. package/dist/hydration/payload.js.map +1 -0
  66. package/dist/hydration/scheduler.d.ts +16 -0
  67. package/dist/hydration/scheduler.d.ts.map +1 -0
  68. package/dist/hydration/scheduler.js +83 -0
  69. package/dist/hydration/scheduler.js.map +1 -0
  70. package/dist/hydration/seo.d.ts +10 -0
  71. package/dist/hydration/seo.d.ts.map +1 -0
  72. package/dist/hydration/seo.js +110 -0
  73. package/dist/hydration/seo.js.map +1 -0
  74. package/dist/hydration/serialization.d.ts +30 -0
  75. package/dist/hydration/serialization.d.ts.map +1 -0
  76. package/dist/hydration/serialization.js +99 -0
  77. package/dist/hydration/serialization.js.map +1 -0
  78. package/dist/hydration/types.d.ts +104 -0
  79. package/dist/hydration/types.d.ts.map +1 -0
  80. package/dist/hydration/types.js +2 -0
  81. package/dist/hydration/types.js.map +1 -0
  82. package/dist/index.d.ts +15 -84
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +17 -0
  85. package/dist/index.js.map +1 -1
  86. package/dist/plugin/cache.d.ts +66 -0
  87. package/dist/plugin/cache.d.ts.map +1 -0
  88. package/dist/plugin/cache.js +129 -0
  89. package/dist/plugin/cache.js.map +1 -0
  90. package/dist/plugin/index.d.ts +8 -0
  91. package/dist/plugin/index.d.ts.map +1 -0
  92. package/dist/plugin/index.js +8 -0
  93. package/dist/plugin/index.js.map +1 -0
  94. package/dist/plugin/plugin.d.ts +25 -0
  95. package/dist/plugin/plugin.d.ts.map +1 -0
  96. package/dist/plugin/plugin.js +601 -0
  97. package/dist/plugin/plugin.js.map +1 -0
  98. package/dist/router/Link.d.ts +7 -0
  99. package/dist/router/Link.d.ts.map +1 -0
  100. package/dist/router/Link.js +53 -0
  101. package/dist/router/Link.js.map +1 -0
  102. package/dist/router/Router.d.ts +7 -0
  103. package/dist/router/Router.d.ts.map +1 -0
  104. package/dist/router/Router.js +263 -0
  105. package/dist/router/Router.js.map +1 -0
  106. package/dist/router/context.d.ts +13 -0
  107. package/dist/router/context.d.ts.map +1 -0
  108. package/dist/router/context.js +47 -0
  109. package/dist/router/context.js.map +1 -0
  110. package/dist/router/hooks.d.ts +30 -0
  111. package/dist/router/hooks.d.ts.map +1 -0
  112. package/dist/router/hooks.js +59 -0
  113. package/dist/router/hooks.js.map +1 -0
  114. package/dist/router/index.d.ts +13 -0
  115. package/dist/router/index.d.ts.map +1 -0
  116. package/dist/router/index.js +14 -0
  117. package/dist/router/index.js.map +1 -0
  118. package/dist/router/matching.d.ts +19 -0
  119. package/dist/router/matching.d.ts.map +1 -0
  120. package/dist/router/matching.js +115 -0
  121. package/dist/router/matching.js.map +1 -0
  122. package/dist/router/navigation.d.ts +26 -0
  123. package/dist/router/navigation.d.ts.map +1 -0
  124. package/dist/router/navigation.js +65 -0
  125. package/dist/router/navigation.js.map +1 -0
  126. package/dist/router/types.d.ts +61 -0
  127. package/dist/router/types.d.ts.map +1 -0
  128. package/dist/router/types.js +6 -0
  129. package/dist/router/types.js.map +1 -0
  130. package/dist/server.d.ts +10 -16
  131. package/dist/server.d.ts.map +1 -0
  132. package/dist/server.js +7 -19
  133. package/dist/server.js.map +1 -1
  134. package/dist/streaming/html.d.ts +29 -0
  135. package/dist/streaming/html.d.ts.map +1 -0
  136. package/dist/streaming/html.js +72 -0
  137. package/dist/streaming/html.js.map +1 -0
  138. package/dist/streaming/index.d.ts +7 -0
  139. package/dist/streaming/index.d.ts.map +1 -0
  140. package/dist/streaming/index.js +7 -0
  141. package/dist/streaming/index.js.map +1 -0
  142. package/dist/streaming/render.d.ts +32 -0
  143. package/dist/streaming/render.d.ts.map +1 -0
  144. package/dist/streaming/render.js +83 -0
  145. package/dist/streaming/render.js.map +1 -0
  146. package/dist/streaming/utils.d.ts +30 -0
  147. package/dist/streaming/utils.d.ts.map +1 -0
  148. package/dist/streaming/utils.js +61 -0
  149. package/dist/streaming/utils.js.map +1 -0
  150. package/package.json +43 -35
  151. package/dist/router.d.ts +0 -3
  152. package/dist/router.js +0 -229
  153. package/dist/router.js.map +0 -1
  154. package/dist/vite.d.ts +0 -98
  155. package/dist/vite.js +0 -1828
  156. package/dist/vite.js.map +0 -1
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Route Matching
3
+ * Route matching and prefetching logic
4
+ */
5
+ import { pageCache, prefetchPromises, metadataCache } from './context';
6
+ /**
7
+ * Match a route path against the current path
8
+ * Supports dynamic routes, catch-all, and optional catch-all patterns
9
+ */
10
+ export function matchRoute(routePath, currentPath) {
11
+ if (routePath === currentPath) {
12
+ return { matches: true, params: {}, score: 100 };
13
+ }
14
+ const routeSegments = routePath.split('/').filter(Boolean);
15
+ const pathSegments = currentPath.split('/').filter(Boolean);
16
+ const params = {};
17
+ let score = 0;
18
+ for (let i = 0; i < routeSegments.length; i++) {
19
+ const routeSegment = routeSegments[i];
20
+ const pathSegment = pathSegments[i];
21
+ // Optional catch-all: [[...slug]] - matches zero or more segments
22
+ if (routeSegment?.startsWith('*') && routeSegment?.endsWith('?')) {
23
+ const paramName = routeSegment.slice(1, -1);
24
+ const remainingPath = pathSegments.slice(i);
25
+ params[paramName] = remainingPath.length > 0 ? remainingPath : [];
26
+ score += 1;
27
+ return { matches: true, params, score };
28
+ }
29
+ // Catch-all: [...slug] or *slug - matches one or more segments
30
+ if (routeSegment?.startsWith('*')) {
31
+ const paramName = routeSegment.slice(1);
32
+ const remainingPath = pathSegments.slice(i);
33
+ if (remainingPath.length > 0) {
34
+ params[paramName] = remainingPath;
35
+ score += 2;
36
+ return { matches: true, params, score };
37
+ }
38
+ return { matches: false, params: {}, score: 0 };
39
+ }
40
+ // Dynamic param: [slug] or :slug
41
+ if (routeSegment?.startsWith(':') || (routeSegment?.startsWith('[') && routeSegment?.endsWith(']'))) {
42
+ if (!pathSegment) {
43
+ return { matches: false, params: {}, score: 0 };
44
+ }
45
+ const paramName = routeSegment.startsWith(':')
46
+ ? routeSegment.slice(1)
47
+ : routeSegment.slice(1, -1);
48
+ params[paramName] = pathSegment;
49
+ score += 5;
50
+ continue;
51
+ }
52
+ // Static segment
53
+ if (routeSegment !== pathSegment) {
54
+ return { matches: false, params: {}, score: 0 };
55
+ }
56
+ score += 10;
57
+ }
58
+ // Check if all path segments were consumed
59
+ if (routeSegments.length !== pathSegments.length) {
60
+ return { matches: false, params: {}, score: 0 };
61
+ }
62
+ return { matches: true, params, score };
63
+ }
64
+ /**
65
+ * Find the best matching route for a path
66
+ */
67
+ export function findRoute(routes, path) {
68
+ // Normalize path
69
+ const normalizedPath = path.endsWith('/') && path !== '/'
70
+ ? path.slice(0, -1)
71
+ : path;
72
+ // Try exact match first (highest priority)
73
+ const exactMatch = routes.find(r => r.path === normalizedPath);
74
+ if (exactMatch) {
75
+ return { route: exactMatch, params: {} };
76
+ }
77
+ // Try dynamic routes with scoring
78
+ let bestMatch = null;
79
+ for (const route of routes) {
80
+ const { matches, params, score } = matchRoute(route.path, normalizedPath);
81
+ if (matches && (!bestMatch || score > bestMatch.score)) {
82
+ bestMatch = { route, params, score };
83
+ }
84
+ }
85
+ if (bestMatch) {
86
+ return { route: bestMatch.route, params: bestMatch.params };
87
+ }
88
+ return { route: null, params: {} };
89
+ }
90
+ /**
91
+ * Prefetch a route's component
92
+ */
93
+ export async function prefetchRoute(routes, path) {
94
+ const normalizedPath = path.endsWith('/') && path !== '/'
95
+ ? path.slice(0, -1)
96
+ : path;
97
+ if (prefetchPromises.has(normalizedPath)) {
98
+ return prefetchPromises.get(normalizedPath);
99
+ }
100
+ const { route } = findRoute(routes, normalizedPath);
101
+ if (!route)
102
+ return;
103
+ const cacheKey = route.path;
104
+ if (pageCache.has(cacheKey))
105
+ return;
106
+ const promise = route.component().then(module => {
107
+ pageCache.set(cacheKey, module.default);
108
+ if (module.metadata) {
109
+ metadataCache.set(cacheKey, module.metadata);
110
+ }
111
+ }).catch(() => { });
112
+ prefetchPromises.set(normalizedPath, promise);
113
+ return promise;
114
+ }
115
+ //# sourceMappingURL=matching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matching.js","sourceRoot":"","sources":["../../src/router/matching.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Navigation Functions
3
+ * Programmatic navigation utilities
4
+ */
5
+ import type { NavigateOptions } from './types';
6
+ /**
7
+ * Navigate to a new URL (push to history)
8
+ */
9
+ export declare function navigate(to: string, options?: NavigateOptions): Promise<boolean>;
10
+ /**
11
+ * Replace current URL in history
12
+ */
13
+ export declare function replace(to: string, options?: NavigateOptions): Promise<boolean>;
14
+ /**
15
+ * Programmatic redirect (client-side)
16
+ */
17
+ export declare function redirect(url: string): never;
18
+ /**
19
+ * Permanent redirect (client-side)
20
+ */
21
+ export declare function permanentRedirect(url: string): never;
22
+ /**
23
+ * Throw 404 error
24
+ */
25
+ export declare function notFound(): never;
26
+ //# sourceMappingURL=navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/router/navigation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBpF;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBnF;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAK3C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAEpD;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,KAAK,CAEhC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Navigation Functions
3
+ * Programmatic navigation utilities
4
+ */
5
+ import { routerEvents, NAVIGATE_EVENT } from './context';
6
+ /**
7
+ * Navigate to a new URL (push to history)
8
+ */
9
+ export function navigate(to, options = {}) {
10
+ return new Promise((resolve) => {
11
+ const { scroll = true } = options;
12
+ routerEvents.emit('routeChangeStart', to, { shallow: options.shallow });
13
+ routerEvents.emit('beforeHistoryChange', to);
14
+ window.history.pushState({ scroll }, '', to);
15
+ window.dispatchEvent(new CustomEvent(NAVIGATE_EVENT, {
16
+ detail: { path: to, scroll }
17
+ }));
18
+ if (scroll) {
19
+ window.scrollTo(0, 0);
20
+ }
21
+ routerEvents.emit('routeChangeComplete', to, { shallow: options.shallow });
22
+ resolve(true);
23
+ });
24
+ }
25
+ /**
26
+ * Replace current URL in history
27
+ */
28
+ export function replace(to, options = {}) {
29
+ return new Promise((resolve) => {
30
+ const { scroll = false } = options;
31
+ routerEvents.emit('routeChangeStart', to, { shallow: options.shallow });
32
+ routerEvents.emit('beforeHistoryChange', to);
33
+ window.history.replaceState({ scroll }, '', to);
34
+ window.dispatchEvent(new CustomEvent(NAVIGATE_EVENT, {
35
+ detail: { path: to, scroll, replace: true }
36
+ }));
37
+ if (scroll) {
38
+ window.scrollTo(0, 0);
39
+ }
40
+ routerEvents.emit('routeChangeComplete', to, { shallow: options.shallow });
41
+ resolve(true);
42
+ });
43
+ }
44
+ /**
45
+ * Programmatic redirect (client-side)
46
+ */
47
+ export function redirect(url) {
48
+ if (typeof window !== 'undefined') {
49
+ window.location.href = url;
50
+ }
51
+ throw new Error('NEXT_REDIRECT');
52
+ }
53
+ /**
54
+ * Permanent redirect (client-side)
55
+ */
56
+ export function permanentRedirect(url) {
57
+ redirect(url);
58
+ }
59
+ /**
60
+ * Throw 404 error
61
+ */
62
+ export function notFound() {
63
+ throw new Error('NEXT_NOT_FOUND');
64
+ }
65
+ //# sourceMappingURL=navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/router/navigation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEzD;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAU,EAAE,UAA2B,EAAE;IAChE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QAElC,YAAY,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACxE,YAAY,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAE7C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,cAAc,EAAE;YACnD,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE;SAC7B,CAAC,CAAC,CAAC;QAEJ,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,EAAU,EAAE,UAA2B,EAAE;IAC/D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;QAEnC,YAAY,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACxE,YAAY,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAE7C,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,cAAc,EAAE;YACnD,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;SAC5C,CAAC,CAAC,CAAC;QAEJ,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC;IAC7B,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,QAAQ,CAAC,GAAG,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Router Types
3
+ * Type definitions for the Olova router system
4
+ */
5
+ import type { Route } from '../core/types';
6
+ export type { Route };
7
+ export interface RouterProps {
8
+ routes: Route[];
9
+ }
10
+ export interface NavigateOptions {
11
+ scroll?: boolean;
12
+ shallow?: boolean;
13
+ }
14
+ export interface RouterContextType {
15
+ pathname: string;
16
+ params: Record<string, string | string[]>;
17
+ query: Record<string, string | string[]>;
18
+ asPath: string;
19
+ push: (url: string, options?: NavigateOptions) => Promise<boolean>;
20
+ replace: (url: string, options?: NavigateOptions) => Promise<boolean>;
21
+ back: () => void;
22
+ forward: () => void;
23
+ prefetch: (url: string) => Promise<void>;
24
+ reload: () => void;
25
+ isReady: boolean;
26
+ isNavigating: boolean;
27
+ isFallback: boolean;
28
+ events: RouterEvents;
29
+ }
30
+ export interface RouterEvents {
31
+ on: (event: RouterEventType, handler: RouterEventHandler) => void;
32
+ off: (event: RouterEventType, handler: RouterEventHandler) => void;
33
+ emit: (event: RouterEventType, ...args: any[]) => void;
34
+ }
35
+ export type RouterEventType = 'routeChangeStart' | 'routeChangeComplete' | 'routeChangeError' | 'beforeHistoryChange' | 'hashChangeStart' | 'hashChangeComplete';
36
+ export type RouterEventHandler = (...args: any[]) => void;
37
+ export interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
38
+ href: string;
39
+ children: React.ReactNode;
40
+ prefetch?: boolean;
41
+ scroll?: boolean;
42
+ replace?: boolean;
43
+ shallow?: boolean;
44
+ passHref?: boolean;
45
+ locale?: string;
46
+ legacyBehavior?: boolean;
47
+ }
48
+ export interface RedirectProps {
49
+ to: string;
50
+ replace?: boolean;
51
+ }
52
+ export interface MatchResult {
53
+ matches: boolean;
54
+ params: Record<string, string | string[]>;
55
+ score: number;
56
+ }
57
+ export interface FindRouteResult {
58
+ route: Route | null;
59
+ params: Record<string, string | string[]>;
60
+ }
61
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Router Types
3
+ * Type definitions for the Olova router system
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
package/dist/server.d.ts CHANGED
@@ -1,16 +1,10 @@
1
- import { Metadata } from './index.js';
2
- import 'react/jsx-runtime';
3
- import 'react';
4
-
5
- declare function render(url: string): Promise<{
6
- html: string;
7
- hydrationData: {
8
- params: Record<string, string>;
9
- metadata?: Metadata;
10
- };
11
- }>;
12
- declare function renderShell(): string;
13
- declare function renderShellWithMetadata(metadata: Metadata): string;
14
- declare function loadRoute(path: string): Promise<any>;
15
-
16
- export { loadRoute, render, renderShell, renderShellWithMetadata };
1
+ /**
2
+ * Olova Framework - Server Entry Point
3
+ */
4
+ export { renderToStream, renderToStringWithFlight, generateHtmlShell, generateCompleteHtml, createFlightInjector, createSuspensePlaceholder, createSuspenseResolved, createStreamingHeaders, isStreaming, } from './streaming';
5
+ export type { StreamingOptions, StreamingResult, HtmlShellOptions, } from './streaming';
6
+ export { createFlightPayload, addFlightNode, addFlightData, addFlightChunk, addHydrationHint, generateFlightScript, resetFlightContext, setFlightContext, clearFlightContext, } from './hydration';
7
+ export type { FlightPayload, FlightNode, FlightChunk, HydrationHint, FlightContext, } from './hydration';
8
+ export { renderHeadToString } from './head';
9
+ export { serializePageData } from './data';
10
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,EACtB,sBAAsB,EACtB,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,aAAa,EACb,UAAU,EACV,WAAW,EACX,aAAa,EACb,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC"}
package/dist/server.js CHANGED
@@ -1,20 +1,8 @@
1
- // src/server.ts
2
- async function render(url) {
3
- throw new Error("olova/server should only be used via Vite SSR. The actual implementation is provided by the framework plugin at runtime.");
4
- }
5
- function renderShell() {
6
- throw new Error("olova/server should only be used via Vite SSR. The actual implementation is provided by the framework plugin at runtime.");
7
- }
8
- function renderShellWithMetadata(metadata) {
9
- throw new Error("olova/server should only be used via Vite SSR. The actual implementation is provided by the framework plugin at runtime.");
10
- }
11
- async function loadRoute(path) {
12
- throw new Error("olova/server should only be used via Vite SSR. The actual implementation is provided by the framework plugin at runtime.");
13
- }
14
- export {
15
- loadRoute,
16
- render,
17
- renderShell,
18
- renderShellWithMetadata
19
- };
1
+ /**
2
+ * Olova Framework - Server Entry Point
3
+ */
4
+ export { renderToStream, renderToStringWithFlight, generateHtmlShell, generateCompleteHtml, createFlightInjector, createSuspensePlaceholder, createSuspenseResolved, createStreamingHeaders, isStreaming, } from './streaming';
5
+ export { createFlightPayload, addFlightNode, addFlightData, addFlightChunk, addHydrationHint, generateFlightScript, resetFlightContext, setFlightContext, clearFlightContext, } from './hydration';
6
+ export { renderHeadToString } from './head';
7
+ export { serializePageData } from './data';
20
8
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts"],"sourcesContent":["// Server-side rendering entry point\r\n// This is a stub - the actual server module is generated as a virtual module by the framework plugin\r\n// These exports are for TypeScript types only\r\n\r\nimport type { Metadata } from './client/router';\r\n\r\nexport async function render(url: string): Promise<{ html: string; hydrationData: { params: Record<string, string>; metadata?: Metadata } }> {\r\n throw new Error('olova/server should only be used via Vite SSR. The actual implementation is provided by the framework plugin at runtime.');\r\n}\r\n\r\nexport function renderShell(): string {\r\n throw new Error('olova/server should only be used via Vite SSR. The actual implementation is provided by the framework plugin at runtime.');\r\n}\r\n\r\nexport function renderShellWithMetadata(metadata: Metadata): string {\r\n throw new Error('olova/server should only be used via Vite SSR. The actual implementation is provided by the framework plugin at runtime.');\r\n}\r\n\r\nexport async function loadRoute(path: string): Promise<any> {\r\n throw new Error('olova/server should only be used via Vite SSR. The actual implementation is provided by the framework plugin at runtime.');\r\n}\r\n"],"mappings":";AAMA,eAAsB,OAAO,KAAgH;AAC3I,QAAM,IAAI,MAAM,0HAA0H;AAC5I;AAEO,SAAS,cAAsB;AACpC,QAAM,IAAI,MAAM,0HAA0H;AAC5I;AAEO,SAAS,wBAAwB,UAA4B;AAClE,QAAM,IAAI,MAAM,0HAA0H;AAC5I;AAEA,eAAsB,UAAU,MAA4B;AAC1D,QAAM,IAAI,MAAM,0HAA0H;AAC5I;","names":[]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,EACtB,sBAAsB,EACtB,WAAW,GACZ,MAAM,aAAa,CAAC;AAQrB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAUrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { FlightPayload } from '../hydration/types';
2
+ export interface HtmlShellOptions {
3
+ title?: string;
4
+ description?: string;
5
+ head?: string;
6
+ styles?: string[];
7
+ criticalCss?: string;
8
+ scripts?: string[];
9
+ flightPayload?: FlightPayload;
10
+ pageData?: any;
11
+ lang?: string;
12
+ bodyClass?: string;
13
+ }
14
+ /**
15
+ * Generate HTML shell
16
+ */
17
+ export declare function generateHtmlShell(options?: HtmlShellOptions): {
18
+ head: string;
19
+ tail: string;
20
+ };
21
+ /**
22
+ * Generate complete HTML with content
23
+ */
24
+ export declare function generateCompleteHtml(content: string, options?: HtmlShellOptions): string;
25
+ /**
26
+ * Escape HTML special characters
27
+ */
28
+ export declare function escapeHtml(str: string): string;
29
+ //# sourceMappingURL=html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/streaming/html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOxD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,gBAAqB,GAAG;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAwEA;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO9C"}
@@ -0,0 +1,72 @@
1
+ import { generateSEOTags, generateResourceHintTags, generateFlightScript } from '../hydration';
2
+ /**
3
+ * Generate HTML shell
4
+ */
5
+ export function generateHtmlShell(options = {}) {
6
+ const { title = 'Olova App', description, head = '', styles = [], criticalCss, scripts = [], flightPayload, pageData, lang = 'en', bodyClass = '', } = options;
7
+ let headContent = `<!DOCTYPE html>
8
+ <html lang="${lang}">
9
+ <head>
10
+ <meta charset="UTF-8" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
12
+ <title>${escapeHtml(title)}</title>`;
13
+ if (description) {
14
+ headContent += `\n <meta name="description" content="${escapeHtml(description)}" />`;
15
+ }
16
+ if (flightPayload) {
17
+ headContent += `\n ${generateSEOTags(flightPayload)}`;
18
+ headContent += `\n ${generateResourceHintTags(flightPayload)}`;
19
+ }
20
+ if (criticalCss) {
21
+ headContent += `\n <style>${criticalCss}</style>`;
22
+ }
23
+ for (const style of styles) {
24
+ headContent += `\n <link rel="stylesheet" href="${style}" />`;
25
+ }
26
+ if (flightPayload) {
27
+ headContent += `\n ${generateFlightScript(flightPayload)}`;
28
+ }
29
+ if (pageData) {
30
+ const serialized = JSON.stringify(pageData)
31
+ .replace(/</g, '\\u003c')
32
+ .replace(/>/g, '\\u003e');
33
+ headContent += `\n <script>self.__PAGE_DATA__=${serialized}</script>`;
34
+ }
35
+ if (head) {
36
+ headContent += `\n ${head}`;
37
+ }
38
+ headContent += `
39
+ </head>
40
+ <body${bodyClass ? ` class="${bodyClass}"` : ''}>
41
+ <div id="root">`;
42
+ let tailContent = `</div>`;
43
+ for (const script of scripts) {
44
+ tailContent += `\n <script type="module" src="${script}"></script>`;
45
+ }
46
+ tailContent += `
47
+ </body>
48
+ </html>`;
49
+ return {
50
+ head: headContent,
51
+ tail: tailContent,
52
+ };
53
+ }
54
+ /**
55
+ * Generate complete HTML with content
56
+ */
57
+ export function generateCompleteHtml(content, options = {}) {
58
+ const { head, tail } = generateHtmlShell(options);
59
+ return head + content + tail;
60
+ }
61
+ /**
62
+ * Escape HTML special characters
63
+ */
64
+ export function escapeHtml(str) {
65
+ return str
66
+ .replace(/&/g, '&amp;')
67
+ .replace(/</g, '&lt;')
68
+ .replace(/>/g, '&gt;')
69
+ .replace(/"/g, '&quot;')
70
+ .replace(/'/g, '&#039;');
71
+ }
72
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/streaming/html.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,cAAc,CAAC;AAetB;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAA4B,EAAE;IAI9D,MAAM,EACJ,KAAK,GAAG,WAAW,EACnB,WAAW,EACX,IAAI,GAAG,EAAE,EACT,MAAM,GAAG,EAAE,EACX,WAAW,EACX,OAAO,GAAG,EAAE,EACZ,aAAa,EACb,QAAQ,EACR,IAAI,GAAG,IAAI,EACX,SAAS,GAAG,EAAE,GACf,GAAG,OAAO,CAAC;IAEZ,IAAI,WAAW,GAAG;cACN,IAAI;;;;WAIP,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC;IAErC,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,IAAI,yCAAyC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC;IACxF,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,WAAW,IAAI,OAAO,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC;QACvD,WAAW,IAAI,OAAO,wBAAwB,CAAC,aAAa,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,IAAI,cAAc,WAAW,UAAU,CAAC;IACrD,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,WAAW,IAAI,oCAAoC,KAAK,MAAM,CAAC;IACjE,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,WAAW,IAAI,OAAO,oBAAoB,CAAC,aAAa,CAAC,EAAE,CAAC;IAC9D,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;aACxC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;aACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC5B,WAAW,IAAI,kCAAkC,UAAU,WAAW,CAAC;IACzE,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,WAAW,IAAI,OAAO,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,WAAW,IAAI;;OAEV,SAAS,CAAC,CAAC,CAAC,WAAW,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE;kBAC7B,CAAC;IAEjB,IAAI,WAAW,GAAG,QAAQ,CAAC;IAE3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,WAAW,IAAI,kCAAkC,MAAM,aAAa,CAAC;IACvE,CAAC;IAED,WAAW,IAAI;;QAET,CAAC;IAEP,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,WAAW;KAClB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,UAA4B,EAAE;IAE9B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClD,OAAO,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Olova Streaming SSR Module
3
+ */
4
+ export * from './render';
5
+ export * from './html';
6
+ export * from './utils';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/streaming/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Olova Streaming SSR Module
3
+ */
4
+ export * from './render';
5
+ export * from './html';
6
+ export * from './utils';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/streaming/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+ import type { Writable } from 'stream';
3
+ import type { FlightPayload } from '../hydration/types';
4
+ export interface StreamingOptions {
5
+ bootstrapScripts?: string[];
6
+ bootstrapModules?: string[];
7
+ onShellReady?: () => void;
8
+ onShellError?: (error: Error) => void;
9
+ onAllReady?: () => void;
10
+ onError?: (error: Error) => void;
11
+ signal?: AbortSignal;
12
+ timeout?: number;
13
+ progressiveHydration?: boolean;
14
+ }
15
+ export interface StreamingResult {
16
+ pipe: (destination: Writable) => Writable;
17
+ abort: () => void;
18
+ payload: FlightPayload;
19
+ }
20
+ export interface RenderToStringResult {
21
+ html: string;
22
+ payload: FlightPayload;
23
+ }
24
+ /**
25
+ * Render React tree to a streaming response
26
+ */
27
+ export declare function renderToStream(element: React.ReactElement, route: string, options?: StreamingOptions): StreamingResult;
28
+ /**
29
+ * Render to string with Flight payload
30
+ */
31
+ export declare function renderToStringWithFlight(element: React.ReactElement, route: string): RenderToStringResult;
32
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/streaming/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQxD,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,CAAC,WAAW,EAAE,QAAQ,KAAK,QAAQ,CAAC;IAC1C,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,KAAK,CAAC,YAAY,EAC3B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,gBAAqB,GAC7B,eAAe,CAyEjB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,KAAK,CAAC,YAAY,EAC3B,KAAK,EAAE,MAAM,GACZ,oBAAoB,CAgBtB"}
@@ -0,0 +1,83 @@
1
+ import { renderToPipeableStream, renderToString } from 'react-dom/server';
2
+ import { createFlightPayload, resetFlightContext, setFlightContext, clearFlightContext, } from '../hydration';
3
+ /**
4
+ * Render React tree to a streaming response
5
+ */
6
+ export function renderToStream(element, route, options = {}) {
7
+ resetFlightContext();
8
+ const payload = createFlightPayload(route);
9
+ setFlightContext({
10
+ payload,
11
+ scheduler: null,
12
+ isStreaming: true,
13
+ onChunk: (chunk) => {
14
+ payload.chunks.push(chunk);
15
+ },
16
+ });
17
+ const { bootstrapScripts = [], bootstrapModules = [], onShellReady, onShellError, onAllReady, onError, signal, timeout = 30000, } = options;
18
+ const abortController = new AbortController();
19
+ let timeoutId = null;
20
+ if (timeout > 0) {
21
+ timeoutId = setTimeout(() => {
22
+ abortController.abort();
23
+ }, timeout);
24
+ }
25
+ if (signal) {
26
+ signal.addEventListener('abort', () => abortController.abort());
27
+ }
28
+ const { pipe, abort } = renderToPipeableStream(element, {
29
+ bootstrapScripts,
30
+ bootstrapModules,
31
+ onShellReady() {
32
+ if (timeoutId)
33
+ clearTimeout(timeoutId);
34
+ onShellReady?.();
35
+ },
36
+ onShellError(error) {
37
+ if (timeoutId)
38
+ clearTimeout(timeoutId);
39
+ clearFlightContext();
40
+ onShellError?.(error);
41
+ },
42
+ onAllReady() {
43
+ if (timeoutId)
44
+ clearTimeout(timeoutId);
45
+ clearFlightContext();
46
+ onAllReady?.();
47
+ },
48
+ onError(error) {
49
+ console.error('[Olova Streaming] Error:', error);
50
+ onError?.(error);
51
+ },
52
+ });
53
+ return {
54
+ pipe,
55
+ abort: () => {
56
+ if (timeoutId)
57
+ clearTimeout(timeoutId);
58
+ abort();
59
+ clearFlightContext();
60
+ },
61
+ payload,
62
+ };
63
+ }
64
+ /**
65
+ * Render to string with Flight payload
66
+ */
67
+ export function renderToStringWithFlight(element, route) {
68
+ resetFlightContext();
69
+ const payload = createFlightPayload(route);
70
+ setFlightContext({
71
+ payload,
72
+ scheduler: null,
73
+ isStreaming: false,
74
+ });
75
+ try {
76
+ const html = renderToString(element);
77
+ return { html, payload };
78
+ }
79
+ finally {
80
+ clearFlightContext();
81
+ }
82
+ }
83
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/streaming/render.ts"],"names":[],"mappings":"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"}