@emkodev/emroute 1.6.2 → 1.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.md +6 -6
  2. package/dist/runtime/abstract.runtime.d.ts +94 -0
  3. package/dist/runtime/abstract.runtime.js +339 -0
  4. package/dist/runtime/abstract.runtime.js.map +1 -0
  5. package/dist/runtime/bun/esbuild-runtime-loader.plugin.d.ts +25 -0
  6. package/dist/runtime/bun/esbuild-runtime-loader.plugin.js +72 -0
  7. package/dist/runtime/bun/esbuild-runtime-loader.plugin.js.map +1 -0
  8. package/dist/runtime/bun/fs/bun-fs.runtime.d.ts +21 -0
  9. package/dist/runtime/bun/fs/bun-fs.runtime.js +205 -0
  10. package/dist/runtime/bun/fs/bun-fs.runtime.js.map +1 -0
  11. package/dist/runtime/bun/sqlite/bun-sqlite.runtime.d.ts +27 -0
  12. package/dist/runtime/bun/sqlite/bun-sqlite.runtime.js +234 -0
  13. package/dist/runtime/bun/sqlite/bun-sqlite.runtime.js.map +1 -0
  14. package/dist/runtime/sitemap.generator.d.ts +58 -0
  15. package/dist/runtime/sitemap.generator.js +107 -0
  16. package/dist/runtime/sitemap.generator.js.map +1 -0
  17. package/dist/runtime/universal/fs/universal-fs.runtime.d.ts +29 -0
  18. package/dist/runtime/universal/fs/universal-fs.runtime.js +213 -0
  19. package/dist/runtime/universal/fs/universal-fs.runtime.js.map +1 -0
  20. package/dist/server/codegen.util.d.ts +16 -0
  21. package/dist/server/codegen.util.js +46 -0
  22. package/dist/server/codegen.util.js.map +1 -0
  23. package/dist/server/emroute.server.d.ts +37 -0
  24. package/dist/server/emroute.server.js +314 -0
  25. package/dist/server/emroute.server.js.map +1 -0
  26. package/dist/server/esbuild-manifest.plugin.d.ts +26 -0
  27. package/dist/server/esbuild-manifest.plugin.js +187 -0
  28. package/dist/server/esbuild-manifest.plugin.js.map +1 -0
  29. package/dist/server/scanner.util.d.ts +22 -0
  30. package/dist/server/scanner.util.js +194 -0
  31. package/dist/server/scanner.util.js.map +1 -0
  32. package/dist/server/server-api.type.d.ts +71 -0
  33. package/dist/server/server-api.type.js +9 -0
  34. package/dist/server/server-api.type.js.map +1 -0
  35. package/dist/src/component/abstract.component.d.ts +197 -0
  36. package/dist/src/component/abstract.component.js +84 -0
  37. package/dist/src/component/abstract.component.js.map +1 -0
  38. package/dist/src/component/page.component.d.ts +74 -0
  39. package/dist/src/component/page.component.js +107 -0
  40. package/dist/src/component/page.component.js.map +1 -0
  41. package/dist/src/component/widget.component.d.ts +47 -0
  42. package/dist/src/component/widget.component.js +69 -0
  43. package/dist/src/component/widget.component.js.map +1 -0
  44. package/dist/src/element/component.element.d.ts +79 -0
  45. package/dist/src/element/component.element.js +293 -0
  46. package/dist/src/element/component.element.js.map +1 -0
  47. package/dist/src/element/markdown.element.d.ts +36 -0
  48. package/dist/src/element/markdown.element.js +93 -0
  49. package/dist/src/element/markdown.element.js.map +1 -0
  50. package/dist/src/element/slot.element.d.ts +30 -0
  51. package/dist/src/element/slot.element.js +31 -0
  52. package/dist/src/element/slot.element.js.map +1 -0
  53. package/dist/src/index.d.ts +23 -0
  54. package/dist/src/index.js +24 -0
  55. package/dist/src/index.js.map +1 -0
  56. package/dist/src/overlay/mod.d.ts +9 -0
  57. package/dist/src/overlay/mod.js +9 -0
  58. package/dist/src/overlay/mod.js.map +1 -0
  59. package/dist/src/overlay/overlay.css.d.ts +8 -0
  60. package/dist/src/overlay/overlay.css.js +170 -0
  61. package/dist/src/overlay/overlay.css.js.map +1 -0
  62. package/dist/src/overlay/overlay.service.d.ts +14 -0
  63. package/dist/src/overlay/overlay.service.js +307 -0
  64. package/dist/src/overlay/overlay.service.js.map +1 -0
  65. package/dist/src/overlay/overlay.type.d.ts +33 -0
  66. package/dist/src/overlay/overlay.type.js +11 -0
  67. package/dist/src/overlay/overlay.type.js.map +1 -0
  68. package/dist/src/renderer/spa/base.renderer.d.ts +39 -0
  69. package/dist/src/renderer/spa/base.renderer.js +149 -0
  70. package/dist/src/renderer/spa/base.renderer.js.map +1 -0
  71. package/dist/src/renderer/spa/hash.renderer.d.ts +78 -0
  72. package/dist/src/renderer/spa/hash.renderer.js +162 -0
  73. package/dist/src/renderer/spa/hash.renderer.js.map +1 -0
  74. package/dist/src/renderer/spa/html.renderer.d.ts +81 -0
  75. package/dist/src/renderer/spa/html.renderer.js +304 -0
  76. package/dist/src/renderer/spa/html.renderer.js.map +1 -0
  77. package/dist/src/renderer/spa/mod.d.ts +30 -0
  78. package/dist/src/renderer/spa/mod.js +35 -0
  79. package/dist/src/renderer/spa/mod.js.map +1 -0
  80. package/dist/src/renderer/ssr/html.renderer.d.ts +49 -0
  81. package/dist/src/renderer/ssr/html.renderer.js +108 -0
  82. package/dist/src/renderer/ssr/html.renderer.js.map +1 -0
  83. package/dist/src/renderer/ssr/md.renderer.d.ts +40 -0
  84. package/dist/src/renderer/ssr/md.renderer.js +100 -0
  85. package/dist/src/renderer/ssr/md.renderer.js.map +1 -0
  86. package/dist/src/renderer/ssr/ssr.renderer.d.ts +74 -0
  87. package/dist/src/renderer/ssr/ssr.renderer.js +185 -0
  88. package/dist/src/renderer/ssr/ssr.renderer.js.map +1 -0
  89. package/dist/src/route/route.core.d.ts +129 -0
  90. package/dist/src/route/route.core.js +255 -0
  91. package/dist/src/route/route.core.js.map +1 -0
  92. package/dist/src/route/route.matcher.d.ts +86 -0
  93. package/dist/src/route/route.matcher.js +214 -0
  94. package/dist/src/route/route.matcher.js.map +1 -0
  95. package/dist/src/type/logger.type.d.ts +17 -0
  96. package/dist/src/type/logger.type.js +9 -0
  97. package/dist/src/type/logger.type.js.map +1 -0
  98. package/dist/src/type/markdown.type.d.ts +20 -0
  99. package/dist/src/type/markdown.type.js +2 -0
  100. package/dist/src/type/markdown.type.js.map +1 -0
  101. package/dist/src/type/route.type.d.ts +112 -0
  102. package/dist/src/type/route.type.js +8 -0
  103. package/dist/src/type/route.type.js.map +1 -0
  104. package/dist/src/type/widget.type.d.ts +55 -0
  105. package/dist/src/type/widget.type.js +10 -0
  106. package/dist/src/type/widget.type.js.map +1 -0
  107. package/dist/src/util/html.util.d.ts +29 -0
  108. package/dist/src/util/html.util.js +158 -0
  109. package/dist/src/util/html.util.js.map +1 -0
  110. package/dist/src/util/logger.util.d.ts +26 -0
  111. package/dist/src/util/logger.util.js +80 -0
  112. package/dist/src/util/logger.util.js.map +1 -0
  113. package/dist/src/util/widget-resolve.util.d.ts +52 -0
  114. package/dist/src/util/widget-resolve.util.js +149 -0
  115. package/dist/src/util/widget-resolve.util.js.map +1 -0
  116. package/dist/src/widget/breadcrumb.widget.d.ts +48 -0
  117. package/dist/src/widget/breadcrumb.widget.js +72 -0
  118. package/dist/src/widget/breadcrumb.widget.js.map +1 -0
  119. package/dist/src/widget/page-title.widget.d.ts +33 -0
  120. package/dist/src/widget/page-title.widget.js +33 -0
  121. package/dist/src/widget/page-title.widget.js.map +1 -0
  122. package/dist/src/widget/widget.parser.d.ts +26 -0
  123. package/dist/src/widget/widget.parser.js +76 -0
  124. package/dist/src/widget/widget.parser.js.map +1 -0
  125. package/dist/src/widget/widget.registry.d.ts +23 -0
  126. package/dist/src/widget/widget.registry.js +42 -0
  127. package/dist/src/widget/widget.registry.js.map +1 -0
  128. package/package.json +63 -13
@@ -0,0 +1,49 @@
1
+ /**
2
+ * SSR HTML Renderer
3
+ *
4
+ * Server-side HTML rendering.
5
+ * Generates complete HTML strings without DOM manipulation.
6
+ * Expands <mark-down> tags server-side when a markdown renderer is provided.
7
+ */
8
+ import type { RouteConfig, RouteInfo, RoutesManifest } 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 { SsrRenderer, type SsrRendererOptions } from './ssr.renderer.ts';
12
+ /** Options for SSR HTML Router */
13
+ export interface SsrHtmlRouterOptions extends SsrRendererOptions {
14
+ /** Markdown renderer for server-side <mark-down> expansion */
15
+ markdownRenderer?: MarkdownRenderer;
16
+ }
17
+ /**
18
+ * SSR HTML Router for server-side rendering.
19
+ */
20
+ export declare class SsrHtmlRouter extends SsrRenderer {
21
+ protected readonly label = "SSR HTML";
22
+ private markdownRenderer;
23
+ private markdownReady;
24
+ constructor(manifest: RoutesManifest, options?: SsrHtmlRouterOptions);
25
+ protected injectSlot(parent: string, child: string, parentPattern: string): string;
26
+ protected stripSlots(result: string): string;
27
+ /**
28
+ * Render a single route's content.
29
+ */
30
+ protected renderRouteContent(routeInfo: RouteInfo, route: RouteConfig, isLeaf?: boolean): Promise<{
31
+ content: string;
32
+ title?: string;
33
+ }>;
34
+ protected renderContent(component: PageComponent, args: PageComponent['RenderArgs']): string;
35
+ protected renderRedirect(to: string): string;
36
+ protected renderStatusPage(status: number, pathname: string): string;
37
+ protected renderErrorPage(error: unknown, pathname: string): string;
38
+ /** Add pattern attribute to bare <router-slot> tags. */
39
+ private attributeSlots;
40
+ /**
41
+ * Expand <mark-down> tags by rendering markdown to HTML server-side.
42
+ * Leaves content unchanged if no markdown renderer is configured.
43
+ */
44
+ private expandMarkdown;
45
+ }
46
+ /**
47
+ * Create SSR HTML router.
48
+ */
49
+ export declare function createSsrHtmlRouter(manifest: RoutesManifest, options?: SsrHtmlRouterOptions): SsrHtmlRouter;
@@ -0,0 +1,108 @@
1
+ /**
2
+ * SSR HTML Renderer
3
+ *
4
+ * Server-side HTML rendering.
5
+ * Generates complete HTML strings without DOM manipulation.
6
+ * Expands <mark-down> tags server-side when a markdown renderer is provided.
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";
11
+ import { SsrRenderer } from "./ssr.renderer.js";
12
+ /**
13
+ * SSR HTML Router for server-side rendering.
14
+ */
15
+ export class SsrHtmlRouter extends SsrRenderer {
16
+ label = 'SSR HTML';
17
+ markdownRenderer;
18
+ markdownReady = null;
19
+ constructor(manifest, options = {}) {
20
+ super(manifest, options);
21
+ this.markdownRenderer = options.markdownRenderer ?? null;
22
+ if (this.markdownRenderer?.init) {
23
+ this.markdownReady = this.markdownRenderer.init();
24
+ }
25
+ }
26
+ injectSlot(parent, child, parentPattern) {
27
+ const escaped = parentPattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
28
+ return parent.replace(new RegExp(`<router-slot\\b[^>]*\\bpattern="${escaped}"[^>]*></router-slot>`), child);
29
+ }
30
+ stripSlots(result) {
31
+ return result.replace(/<router-slot[^>]*><\/router-slot>/g, '');
32
+ }
33
+ /**
34
+ * Render a single route's content.
35
+ */
36
+ async renderRouteContent(routeInfo, route, isLeaf) {
37
+ if (route.modulePath === DEFAULT_ROOT_ROUTE.modulePath) {
38
+ return { content: `<router-slot pattern="${route.pattern}"></router-slot>` };
39
+ }
40
+ const { content: rawContent, title } = await this.loadRouteContent(routeInfo, route, isLeaf);
41
+ let content = rawContent;
42
+ // Expand <mark-down> tags server-side
43
+ 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)
46
+ content = this.attributeSlots(content, route.pattern);
47
+ // Resolve <widget-*> tags: call getData() + renderHTML(), inject ssr attribute
48
+ 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);
53
+ }
54
+ return { content, title };
55
+ }
56
+ renderContent(component, args) {
57
+ return component.renderHTML(args);
58
+ }
59
+ renderRedirect(to) {
60
+ return `<meta http-equiv="refresh" content="0;url=${escapeHtml(to)}">`;
61
+ }
62
+ renderStatusPage(status, pathname) {
63
+ return `
64
+ <h1>${STATUS_MESSAGES[status] ?? 'Error'}</h1>
65
+ <p>Path: ${escapeHtml(pathname)}</p>
66
+ `;
67
+ }
68
+ renderErrorPage(error, pathname) {
69
+ const message = error instanceof Error ? error.message : String(error);
70
+ return `
71
+ <h1>Error</h1>
72
+ <p>Path: ${escapeHtml(pathname)}</p>
73
+ <p>${escapeHtml(message)}</p>
74
+ `;
75
+ }
76
+ /** Add pattern attribute to bare <router-slot> tags. */
77
+ attributeSlots(content, routePattern) {
78
+ return content.replace(/<router-slot(?![^>]*\bpattern=)([^>]*)><\/router-slot>/g, `<router-slot pattern="${routePattern}"$1></router-slot>`);
79
+ }
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
+ async expandMarkdown(content) {
85
+ if (!this.markdownRenderer)
86
+ return content;
87
+ if (!content.includes('<mark-down>'))
88
+ return content;
89
+ if (this.markdownReady) {
90
+ await this.markdownReady;
91
+ }
92
+ const renderer = this.markdownRenderer;
93
+ // Match <mark-down>escaped content</mark-down>
94
+ const pattern = /<mark-down>([\s\S]*?)<\/mark-down>/g;
95
+ return content.replace(pattern, (_match, escaped) => {
96
+ const markdown = unescapeHtml(escaped);
97
+ const rendered = renderer.render(markdown);
98
+ return rendered;
99
+ });
100
+ }
101
+ }
102
+ /**
103
+ * Create SSR HTML router.
104
+ */
105
+ export function createSsrHtmlRouter(manifest, options) {
106
+ return new SsrHtmlRouter(manifest, options);
107
+ }
108
+ //# sourceMappingURL=html.renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.renderer.js","sourceRoot":"","sources":["../../../../src/renderer/ssr/html.renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * SSR Markdown Renderer
3
+ *
4
+ * Server-side Markdown rendering.
5
+ * Generates Markdown strings for LLM consumption, text clients, curl.
6
+ */
7
+ import type { RouteConfig, RouteInfo, RoutesManifest } from '../../type/route.type.ts';
8
+ import type { PageComponent } from '../../component/page.component.ts';
9
+ import { SsrRenderer, type SsrRendererOptions } from './ssr.renderer.ts';
10
+ /** Options for SSR Markdown Router */
11
+ export type SsrMdRouterOptions = SsrRendererOptions;
12
+ /**
13
+ * SSR Markdown Router for server-side markdown rendering.
14
+ */
15
+ export declare class SsrMdRouter extends SsrRenderer {
16
+ protected readonly label = "SSR MD";
17
+ constructor(manifest: RoutesManifest, options?: SsrMdRouterOptions);
18
+ protected injectSlot(parent: string, child: string, parentPattern: string): string;
19
+ protected stripSlots(result: string): string;
20
+ /**
21
+ * Render a single route's content to Markdown.
22
+ */
23
+ protected renderRouteContent(routeInfo: RouteInfo, route: RouteConfig, isLeaf?: boolean): Promise<{
24
+ content: string;
25
+ title?: string;
26
+ }>;
27
+ protected renderContent(component: PageComponent, args: PageComponent['RenderArgs']): string;
28
+ protected renderRedirect(to: string): string;
29
+ protected renderStatusPage(status: number, pathname: string): string;
30
+ protected renderErrorPage(_error: unknown, pathname: string): string;
31
+ /**
32
+ * Resolve fenced widget blocks in markdown content.
33
+ * Replaces ```widget:name blocks with rendered markdown output.
34
+ */
35
+ private resolveWidgets;
36
+ }
37
+ /**
38
+ * Create SSR Markdown router.
39
+ */
40
+ export declare function createSsrMdRouter(manifest: RoutesManifest, options?: SsrMdRouterOptions): SsrMdRouter;
@@ -0,0 +1,100 @@
1
+ /**
2
+ * SSR Markdown Renderer
3
+ *
4
+ * Server-side Markdown rendering.
5
+ * Generates Markdown strings for LLM consumption, text clients, curl.
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";
11
+ import { SsrRenderer } from "./ssr.renderer.js";
12
+ const BARE_SLOT_BLOCK = '```router-slot\n```';
13
+ function routerSlotBlock(pattern) {
14
+ return `\`\`\`router-slot\n{"pattern":"${pattern}"}\n\`\`\``;
15
+ }
16
+ /**
17
+ * SSR Markdown Router for server-side markdown rendering.
18
+ */
19
+ export class SsrMdRouter extends SsrRenderer {
20
+ label = 'SSR MD';
21
+ constructor(manifest, options = {}) {
22
+ super(manifest, options);
23
+ }
24
+ injectSlot(parent, child, parentPattern) {
25
+ return parent.replace(routerSlotBlock(parentPattern), child);
26
+ }
27
+ stripSlots(result) {
28
+ return result
29
+ .replace(/```router-slot\n(?:\{[^}]*\}\n)?```/g, '')
30
+ .trim();
31
+ }
32
+ /**
33
+ * Render a single route's content to Markdown.
34
+ */
35
+ async renderRouteContent(routeInfo, route, isLeaf) {
36
+ if (route.modulePath === DEFAULT_ROOT_ROUTE.modulePath) {
37
+ return { content: routerSlotBlock(route.pattern) };
38
+ }
39
+ const { content: rawContent, title } = await this.loadRouteContent(routeInfo, route, isLeaf);
40
+ let content = rawContent;
41
+ // Attribute bare router-slot blocks with this route's pattern
42
+ // (before widget resolution so widget-internal blocks are not affected)
43
+ content = content.replaceAll(BARE_SLOT_BLOCK, routerSlotBlock(route.pattern));
44
+ // Resolve fenced widget blocks: call getData() + renderMarkdown()
45
+ if (this.widgets) {
46
+ content = await this.resolveWidgets(content, routeInfo);
47
+ }
48
+ return { content, title };
49
+ }
50
+ renderContent(component, args) {
51
+ return component.renderMarkdown(args);
52
+ }
53
+ renderRedirect(to) {
54
+ return `Redirect to: ${to}`;
55
+ }
56
+ renderStatusPage(status, pathname) {
57
+ return `# ${STATUS_MESSAGES[status] ?? 'Error'}\n\nPath: \`${pathname}\``;
58
+ }
59
+ renderErrorPage(_error, pathname) {
60
+ return `# Internal Server Error\n\nPath: \`${pathname}\``;
61
+ }
62
+ /**
63
+ * Resolve fenced widget blocks in markdown content.
64
+ * Replaces ```widget:name blocks with rendered markdown output.
65
+ */
66
+ resolveWidgets(content, routeInfo) {
67
+ return resolveRecursively(content, parseWidgetBlocks, async (block) => {
68
+ if (block.parseError || !block.params) {
69
+ return `> **Error** (\`${block.widgetName}\`): ${block.parseError}`;
70
+ }
71
+ const widget = this.widgets.get(block.widgetName);
72
+ if (!widget) {
73
+ return `> **Error**: Unknown widget \`${block.widgetName}\``;
74
+ }
75
+ try {
76
+ let files;
77
+ const filePaths = this.widgetFiles[block.widgetName] ?? widget.files;
78
+ if (filePaths) {
79
+ files = await this.core.loadWidgetFiles(filePaths);
80
+ }
81
+ const baseContext = { ...routeInfo, files };
82
+ const context = this.core.contextProvider
83
+ ? this.core.contextProvider(baseContext)
84
+ : baseContext;
85
+ const data = await widget.getData({ params: block.params, context });
86
+ return widget.renderMarkdown({ data, params: block.params, context });
87
+ }
88
+ catch (e) {
89
+ return widget.renderMarkdownError(e);
90
+ }
91
+ }, replaceWidgetBlocks);
92
+ }
93
+ }
94
+ /**
95
+ * Create SSR Markdown router.
96
+ */
97
+ export function createSsrMdRouter(manifest, options) {
98
+ return new SsrMdRouter(manifest, options);
99
+ }
100
+ //# sourceMappingURL=md.renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md.renderer.js","sourceRoot":"","sources":["../../../../src/renderer/ssr/md.renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * SSR Renderer Base
3
+ *
4
+ * Abstract base class for server-side renderers.
5
+ * Provides the shared render() pipeline; subclasses supply format-specific rendering.
6
+ */
7
+ import type { MatchedRoute, RouteConfig, RouteInfo, RoutesManifest } 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 { WidgetRegistry } from '../../widget/widget.registry.ts';
12
+ /** Base options for SSR renderers */
13
+ export interface SsrRendererOptions extends RouteCoreOptions {
14
+ /** Widget registry for server-side widget rendering */
15
+ widgets?: WidgetRegistry;
16
+ /** Widget companion file paths, keyed by widget name */
17
+ widgetFiles?: Record<string, {
18
+ html?: string;
19
+ md?: string;
20
+ css?: string;
21
+ }>;
22
+ }
23
+ /**
24
+ * Abstract SSR renderer with shared routing pipeline.
25
+ */
26
+ export declare abstract class SsrRenderer {
27
+ protected core: RouteCore;
28
+ protected widgets: WidgetRegistry | null;
29
+ protected widgetFiles: Record<string, {
30
+ html?: string;
31
+ md?: string;
32
+ css?: string;
33
+ }>;
34
+ protected abstract readonly label: string;
35
+ constructor(manifest: RoutesManifest, options?: SsrRendererOptions);
36
+ /**
37
+ * Render a URL to a content string.
38
+ */
39
+ render(url: string): Promise<{
40
+ content: string;
41
+ status: number;
42
+ title?: string;
43
+ redirect?: string;
44
+ }>;
45
+ /**
46
+ * Render a matched page by composing the route hierarchy.
47
+ */
48
+ protected renderPage(routeInfo: RouteInfo, matched: MatchedRoute): Promise<{
49
+ content: string;
50
+ title?: string;
51
+ }>;
52
+ protected abstract renderRouteContent(routeInfo: RouteInfo, route: RouteConfig, isLeaf?: boolean): Promise<{
53
+ content: string;
54
+ title?: string;
55
+ }>;
56
+ /** Load component, build context, get data, render content, get title. */
57
+ protected loadRouteContent(routeInfo: RouteInfo, route: RouteConfig, isLeaf?: boolean): Promise<{
58
+ content: string;
59
+ title?: string;
60
+ }>;
61
+ /** Render a component to the output format (HTML or Markdown). */
62
+ protected abstract renderContent(component: PageComponent, args: PageComponent['RenderArgs']): string;
63
+ /** Render a component for error boundary/handler with minimal context. */
64
+ protected renderComponent(component: PageComponent, data: unknown, context: ComponentContext): string;
65
+ /** Try to load and render an error boundary or handler module. Returns null on failure. */
66
+ private tryRenderErrorModule;
67
+ protected abstract renderRedirect(to: string): string;
68
+ protected abstract renderStatusPage(status: number, pathname: string): string;
69
+ protected abstract renderErrorPage(error: unknown, pathname: string): string;
70
+ /** Inject child content into the slot owned by parentPattern. */
71
+ protected abstract injectSlot(parent: string, child: string, parentPattern: string): string;
72
+ /** Strip all unconsumed slot placeholders from the final result. */
73
+ protected abstract stripSlots(result: string): string;
74
+ }
@@ -0,0 +1,185 @@
1
+ /**
2
+ * SSR Renderer Base
3
+ *
4
+ * Abstract base class for server-side renderers.
5
+ * Provides the shared render() pipeline; subclasses supply format-specific rendering.
6
+ */
7
+ import { logger } from "../../type/logger.type.js";
8
+ import defaultPageComponent from "../../component/page.component.js";
9
+ import { assertSafeRedirect, DEFAULT_ROOT_ROUTE, RouteCore, } from "../../route/route.core.js";
10
+ import { toUrl } from "../../route/route.matcher.js";
11
+ /**
12
+ * Abstract SSR renderer with shared routing pipeline.
13
+ */
14
+ export class SsrRenderer {
15
+ core;
16
+ widgets;
17
+ widgetFiles;
18
+ constructor(manifest, options = {}) {
19
+ this.core = new RouteCore(manifest, options);
20
+ this.widgets = options.widgets ?? null;
21
+ this.widgetFiles = options.widgetFiles ?? {};
22
+ }
23
+ /**
24
+ * Render a URL to a content string.
25
+ */
26
+ async render(url) {
27
+ const urlObj = toUrl(url);
28
+ const pathname = urlObj.pathname;
29
+ // Redirect trailing-slash URLs to canonical form (301)
30
+ const normalized = this.core.normalizeUrl(pathname);
31
+ if (normalized !== pathname) {
32
+ const query = urlObj.search || '';
33
+ return { content: '', status: 301, redirect: normalized + query };
34
+ }
35
+ const matched = this.core.match(urlObj);
36
+ const searchParams = urlObj.searchParams ?? new URLSearchParams();
37
+ if (!matched) {
38
+ const statusPage = this.core.matcher.getStatusPage(404);
39
+ if (statusPage) {
40
+ try {
41
+ const ri = { pathname, pattern: statusPage.pattern, params: {}, searchParams };
42
+ const result = await this.renderRouteContent(ri, statusPage);
43
+ return { content: this.stripSlots(result.content), status: 404, title: result.title };
44
+ }
45
+ catch (e) {
46
+ logger.error(`[${this.label}] Failed to render 404 status page for ${pathname}`, e instanceof Error ? e : undefined);
47
+ }
48
+ }
49
+ return { content: this.renderStatusPage(404, pathname), status: 404 };
50
+ }
51
+ // Handle redirect
52
+ if (matched.route.type === 'redirect') {
53
+ const module = await this.core.loadModule(matched.route.modulePath);
54
+ const redirectConfig = module.default;
55
+ assertSafeRedirect(redirectConfig.to);
56
+ return {
57
+ content: this.renderRedirect(redirectConfig.to),
58
+ status: redirectConfig.status ?? 301,
59
+ };
60
+ }
61
+ const routeInfo = this.core.toRouteInfo(matched, pathname);
62
+ try {
63
+ const { content, title } = await this.renderPage(routeInfo, matched);
64
+ return { content, status: 200, title };
65
+ }
66
+ catch (error) {
67
+ if (error instanceof Response) {
68
+ const statusPage = this.core.matcher.getStatusPage(error.status);
69
+ if (statusPage) {
70
+ try {
71
+ const ri = {
72
+ pathname,
73
+ pattern: statusPage.pattern,
74
+ params: {},
75
+ searchParams,
76
+ };
77
+ const result = await this.renderRouteContent(ri, statusPage);
78
+ return {
79
+ content: this.stripSlots(result.content),
80
+ status: error.status,
81
+ title: result.title,
82
+ };
83
+ }
84
+ catch (e) {
85
+ logger.error(`[${this.label}] Failed to render ${error.status} status page for ${pathname}`, e instanceof Error ? e : undefined);
86
+ }
87
+ }
88
+ return { content: this.renderStatusPage(error.status, pathname), status: error.status };
89
+ }
90
+ logger.error(`[${this.label}] Error rendering ${pathname}:`, error instanceof Error ? error : undefined);
91
+ const boundary = this.core.matcher.findErrorBoundary(pathname);
92
+ if (boundary) {
93
+ const result = await this.tryRenderErrorModule(boundary.modulePath, pathname, 'boundary');
94
+ if (result)
95
+ return result;
96
+ }
97
+ const errorHandler = this.core.matcher.getErrorHandler();
98
+ if (errorHandler) {
99
+ const result = await this.tryRenderErrorModule(errorHandler.modulePath, pathname, 'handler');
100
+ if (result)
101
+ return result;
102
+ }
103
+ return { content: this.renderErrorPage(error, pathname), status: 500 };
104
+ }
105
+ }
106
+ /**
107
+ * Render a matched page by composing the route hierarchy.
108
+ */
109
+ async renderPage(routeInfo, matched) {
110
+ const hierarchy = this.core.buildRouteHierarchy(routeInfo.pattern);
111
+ let result = '';
112
+ let pageTitle;
113
+ let lastRenderedPattern = '';
114
+ for (let i = 0; i < hierarchy.length; i++) {
115
+ const routePattern = hierarchy[i];
116
+ let route = this.core.matcher.findRoute(routePattern);
117
+ if (!route && routePattern === this.core.root) {
118
+ route = { ...DEFAULT_ROOT_ROUTE, pattern: this.core.root };
119
+ }
120
+ if (!route)
121
+ continue;
122
+ // Skip wildcard route appearing as its own parent (prevents double-render)
123
+ if (route === matched.route && routePattern !== matched.route.pattern)
124
+ continue;
125
+ const isLeaf = i === hierarchy.length - 1;
126
+ const { content, title } = await this.renderRouteContent(routeInfo, route, isLeaf);
127
+ if (title) {
128
+ pageTitle = title;
129
+ }
130
+ if (result === '') {
131
+ result = content;
132
+ }
133
+ else {
134
+ const injected = this.injectSlot(result, content, lastRenderedPattern);
135
+ if (injected === result) {
136
+ logger.warn(`[${this.label}] Route "${lastRenderedPattern}" has no <router-slot> ` +
137
+ `for child route "${routePattern}" to render into. ` +
138
+ `Add <router-slot></router-slot> to the parent template.`);
139
+ }
140
+ result = injected;
141
+ }
142
+ lastRenderedPattern = route.pattern;
143
+ }
144
+ result = this.stripSlots(result);
145
+ return { content: result, title: pageTitle };
146
+ }
147
+ /** Load component, build context, get data, render content, get title. */
148
+ async loadRouteContent(routeInfo, route, isLeaf) {
149
+ const files = route.files ?? {};
150
+ const tsModule = files.ts;
151
+ const component = tsModule
152
+ ? (await this.core.loadModule(tsModule)).default
153
+ : defaultPageComponent;
154
+ const context = await this.core.buildComponentContext(routeInfo, route, undefined, isLeaf);
155
+ const data = await component.getData({ params: routeInfo.params, context });
156
+ const content = this.renderContent(component, { data, params: routeInfo.params, context });
157
+ const title = component.getTitle({ data, params: routeInfo.params, context });
158
+ return { content, title };
159
+ }
160
+ /** Render a component for error boundary/handler with minimal context. */
161
+ renderComponent(component, data, context) {
162
+ return this.renderContent(component, { data, params: {}, context });
163
+ }
164
+ /** Try to load and render an error boundary or handler module. Returns null on failure. */
165
+ async tryRenderErrorModule(modulePath, pathname, kind) {
166
+ try {
167
+ const module = await this.core.loadModule(modulePath);
168
+ const component = module.default;
169
+ const minCtx = {
170
+ pathname: '',
171
+ pattern: '',
172
+ params: {},
173
+ searchParams: new URLSearchParams(),
174
+ };
175
+ const data = await component.getData({ params: {}, context: minCtx });
176
+ const content = this.renderComponent(component, data, minCtx);
177
+ return { content, status: 500 };
178
+ }
179
+ catch (e) {
180
+ logger.error(`[${this.label}] Error ${kind} failed for ${pathname}`, e instanceof Error ? e : undefined);
181
+ return null;
182
+ }
183
+ }
184
+ }
185
+ //# sourceMappingURL=ssr.renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssr.renderer.js","sourceRoot":"","sources":["../../../../src/renderer/ssr/ssr.renderer.ts"],"names":[],"mappings":"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"}