@emkodev/emroute 1.7.3 → 1.8.0-beta.2

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 (238) hide show
  1. package/README.md +1 -1
  2. package/core/component/abstract.component.ts +74 -0
  3. package/{src → core}/component/page.component.ts +3 -61
  4. package/core/component/widget.component.ts +54 -0
  5. package/core/pipeline/pipeline.ts +224 -0
  6. package/{src/renderer/ssr → core/renderer}/html.renderer.ts +26 -47
  7. package/{src/renderer/ssr → core/renderer}/md.renderer.ts +22 -41
  8. package/{src/renderer/ssr → core/renderer}/ssr.renderer.ts +44 -58
  9. package/{src/route → core/router}/route.resolver.ts +1 -10
  10. package/core/router/route.trie.ts +175 -0
  11. package/core/runtime/abstract.runtime.ts +47 -0
  12. package/core/server/emroute.server.ts +324 -0
  13. package/core/type/component.type.ts +39 -0
  14. package/core/type/element.type.ts +10 -0
  15. package/core/type/logger.type.ts +20 -0
  16. package/core/type/markdown.type.ts +8 -0
  17. package/core/type/route-tree.type.ts +28 -0
  18. package/core/type/route.type.ts +75 -0
  19. package/core/type/widget.type.ts +27 -0
  20. package/core/util/html.util.ts +50 -0
  21. package/{src → core}/util/md.util.ts +3 -5
  22. package/{src/route → core/util}/route-tree.util.ts +0 -2
  23. package/{src → core}/util/widget-resolve.util.ts +15 -46
  24. package/{src → core}/widget/widget.parser.ts +2 -23
  25. package/core/widget/widget.registry.ts +36 -0
  26. package/dist/core/component/abstract.component.d.ts +48 -0
  27. package/dist/core/component/abstract.component.js +42 -0
  28. package/dist/core/component/abstract.component.js.map +1 -0
  29. package/dist/core/component/page.component.d.ts +23 -0
  30. package/dist/core/component/page.component.js +49 -0
  31. package/dist/core/component/page.component.js.map +1 -0
  32. package/dist/core/component/widget.component.d.ts +17 -0
  33. package/dist/core/component/widget.component.js +37 -0
  34. package/dist/core/component/widget.component.js.map +1 -0
  35. package/dist/core/pipeline/pipeline.d.ts +61 -0
  36. package/dist/core/pipeline/pipeline.js +189 -0
  37. package/dist/core/pipeline/pipeline.js.map +1 -0
  38. package/dist/{src/renderer/ssr → core/renderer}/html.renderer.d.ts +8 -24
  39. package/dist/{src/renderer/ssr → core/renderer}/html.renderer.js +20 -35
  40. package/dist/core/renderer/html.renderer.js.map +1 -0
  41. package/dist/{src/renderer/ssr → core/renderer}/md.renderer.d.ts +6 -21
  42. package/dist/{src/renderer/ssr → core/renderer}/md.renderer.js +16 -32
  43. package/dist/core/renderer/md.renderer.js.map +1 -0
  44. package/dist/{src/renderer/ssr → core/renderer}/ssr.renderer.d.ts +11 -27
  45. package/dist/{src/renderer/ssr → core/renderer}/ssr.renderer.js +33 -37
  46. package/dist/core/renderer/ssr.renderer.js.map +1 -0
  47. package/dist/{src/route → core/router}/route.resolver.d.ts +1 -8
  48. package/dist/{src/route → core/router}/route.resolver.js +0 -1
  49. package/dist/core/router/route.resolver.js.map +1 -0
  50. package/dist/core/router/route.trie.d.ts +32 -0
  51. package/dist/core/router/route.trie.js +152 -0
  52. package/dist/core/router/route.trie.js.map +1 -0
  53. package/dist/core/runtime/abstract.runtime.d.ts +32 -0
  54. package/dist/core/runtime/abstract.runtime.js +26 -0
  55. package/dist/core/runtime/abstract.runtime.js.map +1 -0
  56. package/dist/core/server/emroute.server.d.ts +48 -0
  57. package/dist/core/server/emroute.server.js +239 -0
  58. package/dist/core/server/emroute.server.js.map +1 -0
  59. package/dist/core/server/server.type.d.ts +45 -0
  60. package/dist/core/server/server.type.js +11 -0
  61. package/dist/core/server/server.type.js.map +1 -0
  62. package/dist/core/type/component.type.d.ts +37 -0
  63. package/dist/core/type/component.type.js +7 -0
  64. package/dist/core/type/component.type.js.map +1 -0
  65. package/dist/core/type/element.type.d.ts +9 -0
  66. package/dist/core/type/element.type.js +5 -0
  67. package/dist/core/type/element.type.js.map +1 -0
  68. package/dist/core/type/logger.type.d.ts +14 -0
  69. package/dist/core/type/logger.type.js +8 -0
  70. package/dist/core/type/logger.type.js.map +1 -0
  71. package/dist/core/type/markdown.type.d.ts +7 -0
  72. package/dist/core/type/markdown.type.js +5 -0
  73. package/dist/core/type/markdown.type.js.map +1 -0
  74. package/dist/{src → core}/type/route-tree.type.d.ts +0 -12
  75. package/dist/{src → core}/type/route-tree.type.js +0 -1
  76. package/dist/core/type/route-tree.type.js.map +1 -0
  77. package/dist/core/type/route.type.d.ts +62 -0
  78. package/dist/core/type/route.type.js +7 -0
  79. package/dist/core/type/route.type.js.map +1 -0
  80. package/dist/core/type/widget.type.d.ts +27 -0
  81. package/dist/core/type/widget.type.js +5 -0
  82. package/dist/core/type/widget.type.js.map +1 -0
  83. package/dist/core/util/html.util.d.ts +14 -0
  84. package/dist/core/util/html.util.js +43 -0
  85. package/dist/core/util/html.util.js.map +1 -0
  86. package/dist/{src → core}/util/md.util.d.ts +0 -1
  87. package/dist/{src → core}/util/md.util.js +0 -2
  88. package/dist/core/util/md.util.js.map +1 -0
  89. package/dist/{src/route → core/util}/route-tree.util.js +0 -2
  90. package/dist/core/util/route-tree.util.js.map +1 -0
  91. package/dist/core/util/widget-resolve.util.d.ts +28 -0
  92. package/dist/{src → core}/util/widget-resolve.util.js +12 -42
  93. package/dist/core/util/widget-resolve.util.js.map +1 -0
  94. package/dist/{src → core}/widget/widget.parser.d.ts +0 -13
  95. package/dist/{src → core}/widget/widget.parser.js +1 -22
  96. package/dist/core/widget/widget.parser.js.map +1 -0
  97. package/dist/core/widget/widget.registry.d.ts +14 -0
  98. package/dist/core/widget/widget.registry.js +26 -0
  99. package/dist/core/widget/widget.registry.js.map +1 -0
  100. package/dist/emroute.js +1092 -1220
  101. package/dist/emroute.js.map +36 -5
  102. package/dist/runtime/abstract.runtime.d.ts +41 -7
  103. package/dist/runtime/abstract.runtime.js +404 -9
  104. package/dist/runtime/abstract.runtime.js.map +1 -1
  105. package/dist/runtime/bun/fs/bun-fs.runtime.d.ts +1 -0
  106. package/dist/runtime/bun/fs/bun-fs.runtime.js +15 -1
  107. package/dist/runtime/bun/fs/bun-fs.runtime.js.map +1 -1
  108. package/dist/runtime/bun/sqlite/bun-sqlite.runtime.d.ts +2 -0
  109. package/dist/runtime/bun/sqlite/bun-sqlite.runtime.js +8 -0
  110. package/dist/runtime/bun/sqlite/bun-sqlite.runtime.js.map +1 -1
  111. package/dist/runtime/fetch.runtime.d.ts +3 -3
  112. package/dist/runtime/fetch.runtime.js +3 -3
  113. package/dist/runtime/sitemap.generator.d.ts +1 -1
  114. package/dist/runtime/sitemap.generator.js +1 -1
  115. package/dist/runtime/sitemap.generator.js.map +1 -1
  116. package/dist/runtime/universal/fs/universal-fs.runtime.d.ts +1 -0
  117. package/dist/runtime/universal/fs/universal-fs.runtime.js +15 -1
  118. package/dist/runtime/universal/fs/universal-fs.runtime.js.map +1 -1
  119. package/dist/server/build.util.d.ts +9 -10
  120. package/dist/server/build.util.js +11 -31
  121. package/dist/server/build.util.js.map +1 -1
  122. package/dist/server/codegen.util.d.ts +1 -1
  123. package/dist/server/emroute.server.d.ts +8 -35
  124. package/dist/server/emroute.server.js +7 -351
  125. package/dist/server/emroute.server.js.map +1 -1
  126. package/dist/server/esbuild-manifest.plugin.js +1 -1
  127. package/dist/server/esbuild-manifest.plugin.js.map +1 -1
  128. package/dist/server/server-api.type.d.ts +3 -71
  129. package/dist/server/server-api.type.js +1 -8
  130. package/dist/server/server-api.type.js.map +1 -1
  131. package/dist/src/element/component.element.d.ts +6 -14
  132. package/dist/src/element/component.element.js +13 -40
  133. package/dist/src/element/component.element.js.map +1 -1
  134. package/dist/src/element/markdown.element.d.ts +2 -2
  135. package/dist/src/element/markdown.element.js +3 -2
  136. package/dist/src/element/markdown.element.js.map +1 -1
  137. package/dist/src/index.d.ts +15 -14
  138. package/dist/src/index.js +8 -8
  139. package/dist/src/index.js.map +1 -1
  140. package/dist/src/renderer/spa/emroute.app.d.ts +50 -0
  141. package/dist/src/renderer/spa/emroute.app.js +246 -0
  142. package/dist/src/renderer/spa/emroute.app.js.map +1 -0
  143. package/dist/src/renderer/spa/mod.d.ts +17 -16
  144. package/dist/src/renderer/spa/mod.js +9 -9
  145. package/dist/src/renderer/spa/mod.js.map +1 -1
  146. package/dist/src/renderer/spa/thin-client.d.ts +3 -3
  147. package/dist/src/renderer/spa/thin-client.js +7 -7
  148. package/dist/src/renderer/spa/thin-client.js.map +1 -1
  149. package/dist/src/route/route.core.d.ts +3 -3
  150. package/dist/src/util/html.util.d.ts +5 -22
  151. package/dist/src/util/html.util.js +8 -56
  152. package/dist/src/util/html.util.js.map +1 -1
  153. package/dist/src/widget/breadcrumb.widget.d.ts +2 -2
  154. package/dist/src/widget/breadcrumb.widget.js +2 -2
  155. package/dist/src/widget/breadcrumb.widget.js.map +1 -1
  156. package/dist/src/widget/page-title.widget.d.ts +1 -1
  157. package/dist/src/widget/page-title.widget.js +1 -1
  158. package/dist/src/widget/page-title.widget.js.map +1 -1
  159. package/package.json +8 -8
  160. package/runtime/abstract.runtime.ts +433 -17
  161. package/runtime/bun/fs/bun-fs.runtime.ts +15 -1
  162. package/runtime/bun/sqlite/bun-sqlite.runtime.ts +9 -0
  163. package/runtime/fetch.runtime.ts +3 -3
  164. package/runtime/sitemap.generator.ts +2 -2
  165. package/runtime/universal/fs/universal-fs.runtime.ts +15 -1
  166. package/server/build.util.ts +17 -43
  167. package/server/codegen.util.ts +1 -1
  168. package/server/emroute.server.ts +12 -426
  169. package/src/element/component.element.ts +14 -54
  170. package/src/element/markdown.element.ts +4 -3
  171. package/src/index.ts +22 -19
  172. package/src/renderer/spa/{thin-client.ts → emroute.app.ts} +19 -20
  173. package/src/renderer/spa/mod.ts +22 -22
  174. package/src/util/html.util.ts +16 -61
  175. package/src/widget/breadcrumb.widget.ts +3 -3
  176. package/src/widget/page-title.widget.ts +1 -1
  177. package/dist/src/component/abstract.component.d.ts +0 -199
  178. package/dist/src/component/abstract.component.js +0 -84
  179. package/dist/src/component/abstract.component.js.map +0 -1
  180. package/dist/src/component/page.component.d.ts +0 -74
  181. package/dist/src/component/page.component.js +0 -107
  182. package/dist/src/component/page.component.js.map +0 -1
  183. package/dist/src/component/widget.component.d.ts +0 -47
  184. package/dist/src/component/widget.component.js +0 -69
  185. package/dist/src/component/widget.component.js.map +0 -1
  186. package/dist/src/renderer/ssr/html.renderer.js.map +0 -1
  187. package/dist/src/renderer/ssr/md.renderer.js.map +0 -1
  188. package/dist/src/renderer/ssr/ssr.renderer.js.map +0 -1
  189. package/dist/src/route/route-tree.util.js.map +0 -1
  190. package/dist/src/route/route.matcher.d.ts +0 -86
  191. package/dist/src/route/route.matcher.js +0 -214
  192. package/dist/src/route/route.matcher.js.map +0 -1
  193. package/dist/src/route/route.resolver.js.map +0 -1
  194. package/dist/src/route/route.trie.d.ts +0 -38
  195. package/dist/src/route/route.trie.js +0 -206
  196. package/dist/src/route/route.trie.js.map +0 -1
  197. package/dist/src/type/element.type.d.ts +0 -19
  198. package/dist/src/type/element.type.js +0 -9
  199. package/dist/src/type/element.type.js.map +0 -1
  200. package/dist/src/type/logger.type.d.ts +0 -17
  201. package/dist/src/type/logger.type.js +0 -9
  202. package/dist/src/type/logger.type.js.map +0 -1
  203. package/dist/src/type/markdown.type.d.ts +0 -20
  204. package/dist/src/type/markdown.type.js +0 -2
  205. package/dist/src/type/markdown.type.js.map +0 -1
  206. package/dist/src/type/route-tree.type.js.map +0 -1
  207. package/dist/src/type/route.type.d.ts +0 -94
  208. package/dist/src/type/route.type.js +0 -8
  209. package/dist/src/type/route.type.js.map +0 -1
  210. package/dist/src/type/widget.type.d.ts +0 -55
  211. package/dist/src/type/widget.type.js +0 -10
  212. package/dist/src/type/widget.type.js.map +0 -1
  213. package/dist/src/util/logger.util.d.ts +0 -26
  214. package/dist/src/util/logger.util.js +0 -80
  215. package/dist/src/util/logger.util.js.map +0 -1
  216. package/dist/src/util/md.util.js.map +0 -1
  217. package/dist/src/util/widget-resolve.util.d.ts +0 -52
  218. package/dist/src/util/widget-resolve.util.js.map +0 -1
  219. package/dist/src/widget/widget.parser.js.map +0 -1
  220. package/dist/src/widget/widget.registry.d.ts +0 -23
  221. package/dist/src/widget/widget.registry.js +0 -42
  222. package/dist/src/widget/widget.registry.js.map +0 -1
  223. package/runtime/bun/esbuild-runtime-loader.plugin.ts +0 -112
  224. package/server/esbuild-manifest.plugin.ts +0 -209
  225. package/server/server-api.type.ts +0 -101
  226. package/src/component/abstract.component.ts +0 -231
  227. package/src/component/widget.component.ts +0 -85
  228. package/src/route/route.core.ts +0 -371
  229. package/src/route/route.trie.ts +0 -265
  230. package/src/type/element.type.ts +0 -22
  231. package/src/type/logger.type.ts +0 -24
  232. package/src/type/markdown.type.ts +0 -21
  233. package/src/type/route-tree.type.ts +0 -51
  234. package/src/type/route.type.ts +0 -124
  235. package/src/type/widget.type.ts +0 -65
  236. package/src/util/logger.util.ts +0 -83
  237. package/src/widget/widget.registry.ts +0 -51
  238. /package/dist/{src/route → core/util}/route-tree.util.d.ts +0 -0
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Pipeline
3
+ *
4
+ * Orchestration layer between Router, Runtime, and Component.
5
+ *
6
+ * Owns:
7
+ * - Route matching (reads manifest from Runtime, walks RouteNode tree)
8
+ * - Module loading (delegates to Runtime)
9
+ * - Companion file reading (delegates to Runtime)
10
+ * - ComponentContext building
11
+ * - Route hierarchy construction
12
+ *
13
+ * Does NOT own:
14
+ * - Rendering (that's Renderer)
15
+ * - HTTP routing / base paths (that's Server)
16
+ * - Storage I/O (that's Runtime)
17
+ * - Navigation events (that's the browser adapter)
18
+ */
19
+ import { RouteTrie } from "../router/route.trie.js";
20
+ import { ROUTES_MANIFEST_PATH } from "../runtime/abstract.runtime.js";
21
+ import { defaultLogger } from "../type/logger.type.js";
22
+ /** Default root route — renders a slot for child routes. */
23
+ export const DEFAULT_ROOT_ROUTE = {
24
+ pattern: '/',
25
+ type: 'page',
26
+ modulePath: '__default_root__',
27
+ };
28
+ /** Synthesize a RouteConfig from matched route data. */
29
+ function toRouteConfig(node, pattern) {
30
+ return {
31
+ pattern,
32
+ type: node.redirect ? 'redirect' : 'page',
33
+ modulePath: node.redirect ?? node.files?.ts ?? node.files?.js ?? node.files?.html ?? node.files?.md ?? '',
34
+ ...(node.files ? { files: node.files } : {}),
35
+ };
36
+ }
37
+ export class Pipeline {
38
+ runtime;
39
+ contextProvider;
40
+ logger;
41
+ moduleLoaders;
42
+ constructor(options) {
43
+ this.runtime = options.runtime;
44
+ this.contextProvider = options.contextProvider;
45
+ this.logger = options.logger ?? defaultLogger;
46
+ this.moduleLoaders = options.moduleLoaders ?? {};
47
+ }
48
+ // ── Route resolver (from Runtime) ───────────────────────────────────
49
+ async getResolver() {
50
+ const response = await this.runtime.query(ROUTES_MANIFEST_PATH);
51
+ const tree = response.status === 404 ? {} : await response.json();
52
+ return new RouteTrie(tree);
53
+ }
54
+ // ── Matching ────────────────────────────────────────────────────────
55
+ async match(url) {
56
+ const resolver = await this.getResolver();
57
+ const resolved = resolver.match(url.pathname);
58
+ if (resolved) {
59
+ return { route: toRouteConfig(resolved.node, resolved.pattern), params: resolved.params };
60
+ }
61
+ if (url.pathname === '/' || url.pathname === '') {
62
+ return { route: DEFAULT_ROOT_ROUTE, params: {} };
63
+ }
64
+ return undefined;
65
+ }
66
+ async findRoute(pattern) {
67
+ const resolver = await this.getResolver();
68
+ const node = resolver.findRoute(pattern);
69
+ if (!node)
70
+ return undefined;
71
+ return toRouteConfig(node, pattern);
72
+ }
73
+ async findErrorBoundary(pathname) {
74
+ const resolver = await this.getResolver();
75
+ const modulePath = resolver.findErrorBoundary(pathname);
76
+ if (!modulePath)
77
+ return undefined;
78
+ return { pattern: pathname, modulePath };
79
+ }
80
+ async getStatusPage(status) {
81
+ const resolver = await this.getResolver();
82
+ const node = resolver.findRoute(`/${status}`);
83
+ if (!node)
84
+ return undefined;
85
+ return toRouteConfig(node, `/${status}`);
86
+ }
87
+ async getErrorHandler() {
88
+ const resolver = await this.getResolver();
89
+ const modulePath = resolver.findErrorBoundary('/');
90
+ if (!modulePath)
91
+ return undefined;
92
+ return { pattern: '/', type: 'error', modulePath };
93
+ }
94
+ // ── Route hierarchy ────────────────────────────────────────────────
95
+ buildRouteHierarchy(pattern) {
96
+ if (pattern === '/')
97
+ return ['/'];
98
+ const segments = pattern.split('/').filter(Boolean);
99
+ const hierarchy = ['/'];
100
+ let current = '';
101
+ for (const segment of segments) {
102
+ current += '/' + segment;
103
+ hierarchy.push(current);
104
+ }
105
+ return hierarchy;
106
+ }
107
+ // ── Module loading ─────────────────────────────────────────────────
108
+ async loadModule(modulePath) {
109
+ const loader = this.moduleLoaders[modulePath];
110
+ if (loader) {
111
+ return await loader();
112
+ }
113
+ const abs = modulePath.startsWith('/') ? modulePath : '/' + modulePath;
114
+ return await this.runtime.loadModule(abs);
115
+ }
116
+ /**
117
+ * Get inlined `__files` from a loaded module (merged module pattern).
118
+ */
119
+ getModuleFiles(mod) {
120
+ if (!mod || typeof mod !== 'object')
121
+ return undefined;
122
+ const files = mod.__files;
123
+ if (!files || typeof files !== 'object')
124
+ return undefined;
125
+ return files;
126
+ }
127
+ // ── File loading ───────────────────────────────────────────────────
128
+ async loadFiles(files) {
129
+ const load = async (path) => {
130
+ const abs = path.startsWith('/') ? path : '/' + path;
131
+ try {
132
+ return await this.runtime.query(abs, { as: 'text' });
133
+ }
134
+ catch (e) {
135
+ console.warn(`[Pipeline] Failed to load file ${path}:`, e instanceof Error ? e.message : e);
136
+ return undefined;
137
+ }
138
+ };
139
+ const [html, md, css] = await Promise.all([
140
+ files.html ? load(files.html) : undefined,
141
+ files.md ? load(files.md) : undefined,
142
+ files.css ? load(files.css) : undefined,
143
+ ]);
144
+ const result = {};
145
+ if (html !== undefined)
146
+ result.html = html;
147
+ if (md !== undefined)
148
+ result.md = md;
149
+ if (css !== undefined)
150
+ result.css = css;
151
+ return result;
152
+ }
153
+ // ── Context building ───────────────────────────────────────────────
154
+ toRouteInfo(matched, url) {
155
+ return { url, params: matched.params };
156
+ }
157
+ async buildContext(routeInfo, route, signal, isLeaf, loadedModule) {
158
+ const rf = route.files;
159
+ // Try inlined __files from merged module first
160
+ const inlined = loadedModule ? this.getModuleFiles(loadedModule) : undefined;
161
+ let files;
162
+ if (inlined) {
163
+ files = inlined;
164
+ }
165
+ else if (rf) {
166
+ const filePaths = {};
167
+ if (rf.html)
168
+ filePaths.html = rf.html;
169
+ if (rf.md)
170
+ filePaths.md = rf.md;
171
+ if (rf.css)
172
+ filePaths.css = rf.css;
173
+ files = await this.loadFiles(filePaths);
174
+ }
175
+ else {
176
+ files = {};
177
+ }
178
+ const base = {
179
+ ...routeInfo,
180
+ pathname: routeInfo.url.pathname,
181
+ searchParams: routeInfo.url.searchParams,
182
+ files,
183
+ ...(signal ? { signal } : {}),
184
+ ...(isLeaf !== undefined ? { isLeaf } : {}),
185
+ };
186
+ return this.contextProvider ? this.contextProvider(base) : base;
187
+ }
188
+ }
189
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../core/pipeline/pipeline.ts"],"names":[],"mappings":"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"}
@@ -5,29 +5,22 @@
5
5
  * Generates complete HTML strings without DOM manipulation.
6
6
  * Expands <mark-down> tags server-side when a markdown renderer is provided.
7
7
  */
8
- import type { RouteConfig, RouteInfo } from '../../type/route.type.ts';
9
- import type { RouteResolver } from '../../route/route.resolver.ts';
10
- import type { MarkdownRenderer } from '../../type/markdown.type.ts';
11
- import type { PageComponent } from '../../component/page.component.ts';
8
+ import type { RouteConfig, RouteInfo } from '../type/route.type.ts';
9
+ import type { MarkdownRenderer } from '../type/markdown.type.ts';
10
+ import type { PageComponent } from '../component/page.component.ts';
11
+ import type { Pipeline } from '../pipeline/pipeline.ts';
12
12
  import { SsrRenderer, type SsrRendererOptions } from './ssr.renderer.ts';
13
- /** Options for SSR HTML Router */
14
- export interface SsrHtmlRouterOptions extends SsrRendererOptions {
15
- /** Markdown renderer for server-side <mark-down> expansion */
13
+ /** Options for SSR HTML Renderer. */
14
+ export interface SsrHtmlRendererOptions extends SsrRendererOptions {
16
15
  markdownRenderer?: MarkdownRenderer;
17
16
  }
18
- /**
19
- * SSR HTML Router for server-side rendering.
20
- */
21
- export declare class SsrHtmlRouter extends SsrRenderer {
17
+ export declare class SsrHtmlRenderer extends SsrRenderer {
22
18
  protected readonly label = "SSR HTML";
23
19
  private markdownRenderer;
24
20
  private markdownReady;
25
- constructor(resolver: RouteResolver, options?: SsrHtmlRouterOptions);
21
+ constructor(pipeline: Pipeline, options?: SsrHtmlRendererOptions);
26
22
  protected injectSlot(parent: string, child: string, parentPattern: string): string;
27
23
  protected stripSlots(result: string): string;
28
- /**
29
- * Render a single route's content.
30
- */
31
24
  protected renderRouteContent(routeInfo: RouteInfo, route: RouteConfig, isLeaf?: boolean, signal?: AbortSignal): Promise<{
32
25
  content: string;
33
26
  title?: string;
@@ -36,15 +29,6 @@ export declare class SsrHtmlRouter extends SsrRenderer {
36
29
  protected renderRedirect(to: string): string;
37
30
  protected renderStatusPage(status: number, url: URL): string;
38
31
  protected renderErrorPage(error: unknown, url: URL): string;
39
- /** Add pattern attribute to bare <router-slot> tags. */
40
32
  private attributeSlots;
41
- /**
42
- * Expand <mark-down> tags by rendering markdown to HTML server-side.
43
- * Leaves content unchanged if no markdown renderer is configured.
44
- */
45
33
  private expandMarkdown;
46
34
  }
47
- /**
48
- * Create SSR HTML router.
49
- */
50
- export declare function createSsrHtmlRouter(resolver: RouteResolver, options?: SsrHtmlRouterOptions): SsrHtmlRouter;
@@ -5,19 +5,16 @@
5
5
  * Generates complete HTML strings without DOM manipulation.
6
6
  * Expands <mark-down> tags server-side when a markdown renderer is provided.
7
7
  */
8
- import { DEFAULT_ROOT_ROUTE } from "../../route/route.core.js";
9
- import { escapeHtml, STATUS_MESSAGES, unescapeHtml } from "../../util/html.util.js";
10
- import { resolveWidgetTags } from "../../util/widget-resolve.util.js";
8
+ import { DEFAULT_ROOT_ROUTE } from "../pipeline/pipeline.js";
9
+ import { escapeHtml, STATUS_MESSAGES, unescapeHtml } from "../util/html.util.js";
10
+ import { resolveWidgetTags } from "../util/widget-resolve.util.js";
11
11
  import { SsrRenderer } from "./ssr.renderer.js";
12
- /**
13
- * SSR HTML Router for server-side rendering.
14
- */
15
- export class SsrHtmlRouter extends SsrRenderer {
12
+ export class SsrHtmlRenderer extends SsrRenderer {
16
13
  label = 'SSR HTML';
17
14
  markdownRenderer;
18
15
  markdownReady = null;
19
- constructor(resolver, options = {}) {
20
- super(resolver, options);
16
+ constructor(pipeline, options = {}) {
17
+ super(pipeline, options);
21
18
  this.markdownRenderer = options.markdownRenderer ?? null;
22
19
  if (this.markdownRenderer?.init) {
23
20
  this.markdownReady = this.markdownRenderer.init();
@@ -30,28 +27,29 @@ export class SsrHtmlRouter extends SsrRenderer {
30
27
  stripSlots(result) {
31
28
  return result.replace(/<router-slot[^>]*><\/router-slot>/g, '');
32
29
  }
33
- /**
34
- * Render a single route's content.
35
- */
36
30
  async renderRouteContent(routeInfo, route, isLeaf, signal) {
37
31
  if (route.modulePath === DEFAULT_ROOT_ROUTE.modulePath) {
38
32
  return { content: `<router-slot pattern="${route.pattern}"></router-slot>` };
39
33
  }
40
34
  const { content: rawContent, title } = await this.loadRouteContent(routeInfo, route, isLeaf, signal);
41
35
  let content = rawContent;
42
- // Expand <mark-down> tags server-side
43
36
  content = await this.expandMarkdown(content);
44
- // Attribute bare <router-slot> tags with this route's pattern (before widget
45
- // resolution so widget-internal slots inside <template> are not affected)
37
+ // Attribute bare <router-slot> tags with this route's pattern
46
38
  content = this.attributeSlots(content, route.pattern);
47
- // Resolve <widget-*> tags: call getData() + renderHTML(), inject ssr attribute
39
+ // Resolve <widget-*> tags
48
40
  if (this.widgets) {
49
- content = await resolveWidgetTags(content, this.widgets, routeInfo, (name, declared) => {
50
- const files = this.widgetFiles[name] ?? declared;
51
- return files ? this.core.loadWidgetFiles(files) : Promise.resolve({});
52
- }, this.core.contextProvider);
41
+ content = await resolveWidgetTags(content, this.widgets, routeInfo, async (name) => {
42
+ const modulePath = this.widgets.getModulePath(name);
43
+ if (modulePath) {
44
+ const mod = await this.pipeline.loadModule(modulePath);
45
+ const inlined = this.pipeline.getModuleFiles(mod);
46
+ if (inlined)
47
+ return inlined;
48
+ }
49
+ return {};
50
+ }, this.pipeline.contextProvider, this.logger);
53
51
  }
54
- return { content, ...(title != null ? { title } : {}) };
52
+ return { content, ...(title !== undefined ? { title } : {}) };
55
53
  }
56
54
  renderContent(component, args) {
57
55
  return component.renderHTML(args);
@@ -73,14 +71,9 @@ export class SsrHtmlRouter extends SsrRenderer {
73
71
  <p>${escapeHtml(message)}</p>
74
72
  `;
75
73
  }
76
- /** Add pattern attribute to bare <router-slot> tags. */
77
74
  attributeSlots(content, routePattern) {
78
75
  return content.replace(/<router-slot(?![^>]*\bpattern=)([^>]*)><\/router-slot>/g, `<router-slot pattern="${routePattern}"$1></router-slot>`);
79
76
  }
80
- /**
81
- * Expand <mark-down> tags by rendering markdown to HTML server-side.
82
- * Leaves content unchanged if no markdown renderer is configured.
83
- */
84
77
  async expandMarkdown(content) {
85
78
  if (!this.markdownRenderer)
86
79
  return content;
@@ -90,19 +83,11 @@ export class SsrHtmlRouter extends SsrRenderer {
90
83
  await this.markdownReady;
91
84
  }
92
85
  const renderer = this.markdownRenderer;
93
- // Match <mark-down>escaped content</mark-down>
94
86
  const pattern = /<mark-down>([\s\S]*?)<\/mark-down>/g;
95
87
  return content.replace(pattern, (_match, escaped) => {
96
88
  const markdown = unescapeHtml(escaped);
97
- const rendered = renderer.render(markdown);
98
- return rendered;
89
+ return renderer.render(markdown);
99
90
  });
100
91
  }
101
92
  }
102
- /**
103
- * Create SSR HTML router.
104
- */
105
- export function createSsrHtmlRouter(resolver, options) {
106
- return new SsrHtmlRouter(resolver, options);
107
- }
108
93
  //# sourceMappingURL=html.renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.renderer.js","sourceRoot":"","sources":["../../../core/renderer/html.renderer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,WAAW,EAA2B,MAAM,mBAAmB,CAAC;AAOzE,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAClB,KAAK,GAAG,UAAU,CAAC;IACvC,gBAAgB,CAA0B;IAC1C,aAAa,GAAyB,IAAI,CAAC;IAEnD,YAAY,QAAkB,EAAE,UAAkC,EAAE;QAClE,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzB,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC;QAEzD,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;IAEkB,UAAU,CAAC,MAAc,EAAE,KAAa,EAAE,aAAqB;QAChF,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QACrE,OAAO,MAAM,CAAC,OAAO,CACnB,IAAI,MAAM,CAAC,mCAAmC,OAAO,uBAAuB,CAAC,EAC7E,KAAK,CACN,CAAC;IACJ,CAAC;IAEkB,UAAU,CAAC,MAAc;QAC1C,OAAO,MAAM,CAAC,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IAEkB,KAAK,CAAC,kBAAkB,CACzC,SAAoB,EACpB,KAAkB,EAClB,MAAgB,EAChB,MAAoB;QAEpB,IAAI,KAAK,CAAC,UAAU,KAAK,kBAAkB,CAAC,UAAU,EAAE,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,yBAAyB,KAAK,CAAC,OAAO,kBAAkB,EAAE,CAAC;QAC/E,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACrG,IAAI,OAAO,GAAG,UAAU,CAAC;QAEzB,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAE7C,8DAA8D;QAC9D,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAEtD,0BAA0B;QAC1B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,GAAG,MAAM,iBAAiB,CAC/B,OAAO,EACP,IAAI,CAAC,OAAO,EACZ,SAAS,EACT,KAAK,EAAE,IAAI,EAAE,EAAE;gBACb,MAAM,UAAU,GAAG,IAAI,CAAC,OAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBACrD,IAAI,UAAU,EAAE,CAAC;oBACf,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;oBACvD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;oBAClD,IAAI,OAAO;wBAAE,OAAO,OAAO,CAAC;gBAC9B,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,EACD,IAAI,CAAC,QAAQ,CAAC,eAAe,EAC7B,IAAI,CAAC,MAAM,CACZ,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChE,CAAC;IAEkB,aAAa,CAC9B,SAAwB,EACxB,IAAiC;QAEjC,OAAO,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAEkB,cAAc,CAAC,EAAU;QAC1C,OAAO,6CAA6C,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC;IACzE,CAAC;IAEkB,gBAAgB,CAAC,MAAc,EAAE,GAAQ;QAC1D,OAAO;YACC,eAAe,CAAC,MAAM,CAAC,IAAI,OAAO;iBAC7B,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;KACpC,CAAC;IACJ,CAAC;IAEkB,eAAe,CAAC,KAAc,EAAE,GAAQ;QACzD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO;;iBAEM,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;WAC9B,UAAU,CAAC,OAAO,CAAC;KACzB,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,OAAe,EAAE,YAAoB;QAC1D,OAAO,OAAO,CAAC,OAAO,CACpB,yDAAyD,EACzD,yBAAyB,YAAY,oBAAoB,CAC1D,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,OAAe;QAC1C,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO,OAAO,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;YAAE,OAAO,OAAO,CAAC;QAErD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,aAAa,CAAC;QAC3B,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACvC,MAAM,OAAO,GAAG,qCAAqC,CAAC;QAEtD,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAe,EAAE,EAAE;YAC1D,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACvC,OAAO,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -4,23 +4,16 @@
4
4
  * Server-side Markdown rendering.
5
5
  * Generates Markdown strings for LLM consumption, text clients, curl.
6
6
  */
7
- import type { RouteConfig, RouteInfo } from '../../type/route.type.ts';
8
- import type { RouteResolver } from '../../route/route.resolver.ts';
9
- import type { PageComponent } from '../../component/page.component.ts';
7
+ import type { RouteConfig, RouteInfo } from '../type/route.type.ts';
8
+ import type { PageComponent } from '../component/page.component.ts';
9
+ import type { Pipeline } from '../pipeline/pipeline.ts';
10
10
  import { SsrRenderer, type SsrRendererOptions } from './ssr.renderer.ts';
11
- /** Options for SSR Markdown Router */
12
- export type SsrMdRouterOptions = SsrRendererOptions;
13
- /**
14
- * SSR Markdown Router for server-side markdown rendering.
15
- */
16
- export declare class SsrMdRouter extends SsrRenderer {
11
+ export type SsrMdRendererOptions = SsrRendererOptions;
12
+ export declare class SsrMdRenderer extends SsrRenderer {
17
13
  protected readonly label = "SSR MD";
18
- constructor(resolver: RouteResolver, options?: SsrMdRouterOptions);
14
+ constructor(pipeline: Pipeline, options?: SsrMdRendererOptions);
19
15
  protected injectSlot(parent: string, child: string, parentPattern: string): string;
20
16
  protected stripSlots(result: string): string;
21
- /**
22
- * Render a single route's content to Markdown.
23
- */
24
17
  protected renderRouteContent(routeInfo: RouteInfo, route: RouteConfig, isLeaf?: boolean, signal?: AbortSignal): Promise<{
25
18
  content: string;
26
19
  title?: string;
@@ -29,13 +22,5 @@ export declare class SsrMdRouter extends SsrRenderer {
29
22
  protected renderRedirect(to: string): string;
30
23
  protected renderStatusPage(status: number, url: URL): string;
31
24
  protected renderErrorPage(_error: unknown, url: URL): string;
32
- /**
33
- * Resolve fenced widget blocks in markdown content.
34
- * Replaces ```widget:name blocks with rendered markdown output.
35
- */
36
25
  private resolveWidgets;
37
26
  }
38
- /**
39
- * Create SSR Markdown router.
40
- */
41
- export declare function createSsrMdRouter(resolver: RouteResolver, options?: SsrMdRouterOptions): SsrMdRouter;
@@ -4,22 +4,19 @@
4
4
  * Server-side Markdown rendering.
5
5
  * Generates Markdown strings for LLM consumption, text clients, curl.
6
6
  */
7
- import { DEFAULT_ROOT_ROUTE } from "../../route/route.core.js";
8
- import { STATUS_MESSAGES } from "../../util/html.util.js";
9
- import { resolveRecursively } from "../../util/widget-resolve.util.js";
10
- import { parseWidgetBlocks, replaceWidgetBlocks } from "../../widget/widget.parser.js";
7
+ import { DEFAULT_ROOT_ROUTE } from "../pipeline/pipeline.js";
8
+ import { STATUS_MESSAGES } from "../util/html.util.js";
9
+ import { resolveRecursively } from "../util/widget-resolve.util.js";
10
+ import { parseWidgetBlocks, replaceWidgetBlocks } from "../widget/widget.parser.js";
11
11
  import { SsrRenderer } from "./ssr.renderer.js";
12
12
  const BARE_SLOT_BLOCK = '```router-slot\n```';
13
13
  function routerSlotBlock(pattern) {
14
14
  return `\`\`\`router-slot\n{"pattern":"${pattern}"}\n\`\`\``;
15
15
  }
16
- /**
17
- * SSR Markdown Router for server-side markdown rendering.
18
- */
19
- export class SsrMdRouter extends SsrRenderer {
16
+ export class SsrMdRenderer extends SsrRenderer {
20
17
  label = 'SSR MD';
21
- constructor(resolver, options = {}) {
22
- super(resolver, options);
18
+ constructor(pipeline, options = {}) {
19
+ super(pipeline, options);
23
20
  }
24
21
  injectSlot(parent, child, parentPattern) {
25
22
  return parent.replace(routerSlotBlock(parentPattern), child);
@@ -29,9 +26,6 @@ export class SsrMdRouter extends SsrRenderer {
29
26
  .replace(/```router-slot\n(?:\{[^}]*\}\n)?```/g, '')
30
27
  .trim();
31
28
  }
32
- /**
33
- * Render a single route's content to Markdown.
34
- */
35
29
  async renderRouteContent(routeInfo, route, isLeaf, signal) {
36
30
  if (route.modulePath === DEFAULT_ROOT_ROUTE.modulePath) {
37
31
  return { content: routerSlotBlock(route.pattern) };
@@ -39,13 +33,12 @@ export class SsrMdRouter extends SsrRenderer {
39
33
  const { content: rawContent, title } = await this.loadRouteContent(routeInfo, route, isLeaf, signal);
40
34
  let content = rawContent;
41
35
  // Attribute bare router-slot blocks with this route's pattern
42
- // (before widget resolution so widget-internal blocks are not affected)
43
36
  content = content.replaceAll(BARE_SLOT_BLOCK, routerSlotBlock(route.pattern));
44
- // Resolve fenced widget blocks: call getData() + renderMarkdown()
37
+ // Resolve fenced widget blocks
45
38
  if (this.widgets) {
46
39
  content = await this.resolveWidgets(content, routeInfo);
47
40
  }
48
- return { content, ...(title != null ? { title } : {}) };
41
+ return { content, ...(title !== undefined ? { title } : {}) };
49
42
  }
50
43
  renderContent(component, args) {
51
44
  return component.renderMarkdown(args);
@@ -59,10 +52,6 @@ export class SsrMdRouter extends SsrRenderer {
59
52
  renderErrorPage(_error, url) {
60
53
  return `# Internal Server Error\n\nPath: \`${url.pathname}\``;
61
54
  }
62
- /**
63
- * Resolve fenced widget blocks in markdown content.
64
- * Replaces ```widget:name blocks with rendered markdown output.
65
- */
66
55
  resolveWidgets(content, routeInfo) {
67
56
  return resolveRecursively(content, parseWidgetBlocks, async (block) => {
68
57
  if (block.parseError || !block.params) {
@@ -74,9 +63,10 @@ export class SsrMdRouter extends SsrRenderer {
74
63
  }
75
64
  try {
76
65
  let files;
77
- const filePaths = this.widgetFiles[block.widgetName] ?? widget.files;
78
- if (filePaths) {
79
- files = await this.core.loadWidgetFiles(filePaths);
66
+ const modulePath = this.widgets.getModulePath(block.widgetName);
67
+ if (modulePath) {
68
+ const mod = await this.pipeline.loadModule(modulePath);
69
+ files = this.pipeline.getModuleFiles(mod);
80
70
  }
81
71
  const baseContext = {
82
72
  ...routeInfo,
@@ -84,8 +74,8 @@ export class SsrMdRouter extends SsrRenderer {
84
74
  searchParams: routeInfo.url.searchParams,
85
75
  ...(files ? { files } : {}),
86
76
  };
87
- const context = this.core.contextProvider
88
- ? this.core.contextProvider(baseContext)
77
+ const context = this.pipeline.contextProvider
78
+ ? this.pipeline.contextProvider(baseContext)
89
79
  : baseContext;
90
80
  const data = await widget.getData({ params: block.params, context });
91
81
  return widget.renderMarkdown({ data, params: block.params, context });
@@ -93,13 +83,7 @@ export class SsrMdRouter extends SsrRenderer {
93
83
  catch (e) {
94
84
  return widget.renderMarkdownError(e);
95
85
  }
96
- }, replaceWidgetBlocks);
86
+ }, replaceWidgetBlocks, 0, this.logger);
97
87
  }
98
88
  }
99
- /**
100
- * Create SSR Markdown router.
101
- */
102
- export function createSsrMdRouter(resolver, options) {
103
- return new SsrMdRouter(resolver, options);
104
- }
105
89
  //# sourceMappingURL=md.renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md.renderer.js","sourceRoot":"","sources":["../../../core/renderer/md.renderer.ts"],"names":[],"mappings":"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"}
@@ -4,36 +4,25 @@
4
4
  * Abstract base class for server-side renderers.
5
5
  * Provides the shared render() pipeline; subclasses supply format-specific rendering.
6
6
  */
7
- import type { MatchedRoute, RouteConfig, RouteInfo } from '../../type/route.type.ts';
8
- import type { ComponentContext } from '../../component/abstract.component.ts';
9
- import { type PageComponent } from '../../component/page.component.ts';
10
- import { RouteCore, type RouteCoreOptions } from '../../route/route.core.ts';
11
- import type { RouteResolver } from '../../route/route.resolver.ts';
12
- import type { WidgetRegistry } from '../../widget/widget.registry.ts';
13
- /** Base options for SSR renderers */
14
- export interface SsrRendererOptions extends RouteCoreOptions {
15
- /** Widget registry for server-side widget rendering */
7
+ import type { MatchedRoute, RouteConfig, RouteInfo } from '../type/route.type.ts';
8
+ import type { ComponentContext } from '../type/component.type.ts';
9
+ import type { Logger } from '../type/logger.type.ts';
10
+ import { type PageComponent } from '../component/page.component.ts';
11
+ import { type Pipeline } from '../pipeline/pipeline.ts';
12
+ import type { WidgetRegistry } from '../widget/widget.registry.ts';
13
+ /** Options for SSR renderers. */
14
+ export interface SsrRendererOptions {
16
15
  widgets?: WidgetRegistry;
17
- /** Widget companion file paths, keyed by widget name */
18
- widgetFiles?: Record<string, {
19
- html?: string;
20
- md?: string;
21
- css?: string;
22
- }>;
23
16
  }
24
17
  /**
25
18
  * Abstract SSR renderer with shared routing pipeline.
26
19
  */
27
20
  export declare abstract class SsrRenderer {
28
- protected core: RouteCore;
21
+ protected readonly pipeline: Pipeline;
29
22
  protected widgets: WidgetRegistry | null;
30
- protected widgetFiles: Record<string, {
31
- html?: string;
32
- md?: string;
33
- css?: string;
34
- }>;
35
23
  protected abstract readonly label: string;
36
- constructor(resolver: RouteResolver, options?: SsrRendererOptions);
24
+ protected readonly logger: Logger;
25
+ constructor(pipeline: Pipeline, options?: SsrRendererOptions);
37
26
  /**
38
27
  * Render a URL to a content string.
39
28
  */
@@ -59,18 +48,13 @@ export declare abstract class SsrRenderer {
59
48
  content: string;
60
49
  title?: string;
61
50
  }>;
62
- /** Render a component to the output format (HTML or Markdown). */
63
51
  protected abstract renderContent(component: PageComponent, args: PageComponent['RenderArgs']): string;
64
- /** Render a component for error boundary/handler with minimal context. */
65
52
  protected renderComponent(component: PageComponent, data: unknown, context: ComponentContext): string;
66
53
  private static readonly EMPTY_URL;
67
- /** Try to load and render an error boundary or handler module. Returns null on failure. */
68
54
  private tryRenderErrorModule;
69
55
  protected abstract renderRedirect(to: string): string;
70
56
  protected abstract renderStatusPage(status: number, url: URL): string;
71
57
  protected abstract renderErrorPage(error: unknown, url: URL): string;
72
- /** Inject child content into the slot owned by parentPattern. */
73
58
  protected abstract injectSlot(parent: string, child: string, parentPattern: string): string;
74
- /** Strip all unconsumed slot placeholders from the final result. */
75
59
  protected abstract stripSlots(result: string): string;
76
60
  }