@emkodev/emroute 1.6.6-beta.2 → 1.6.6-beta.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.
- package/dist/emroute.js +2757 -0
- package/dist/emroute.js.map +7 -0
- package/dist/runtime/abstract.runtime.d.ts +0 -28
- package/dist/runtime/abstract.runtime.js +10 -58
- package/dist/runtime/abstract.runtime.js.map +1 -1
- package/dist/runtime/bun/esbuild-runtime-loader.plugin.js +3 -0
- package/dist/runtime/bun/esbuild-runtime-loader.plugin.js.map +1 -1
- package/dist/runtime/bun/fs/bun-fs.runtime.d.ts +0 -5
- package/dist/runtime/bun/fs/bun-fs.runtime.js +1 -95
- package/dist/runtime/bun/fs/bun-fs.runtime.js.map +1 -1
- package/dist/runtime/bun/sqlite/bun-sqlite.runtime.d.ts +0 -5
- package/dist/runtime/bun/sqlite/bun-sqlite.runtime.js +2 -96
- package/dist/runtime/bun/sqlite/bun-sqlite.runtime.js.map +1 -1
- package/dist/runtime/fetch.runtime.d.ts +26 -0
- package/dist/runtime/fetch.runtime.js +55 -0
- package/dist/runtime/fetch.runtime.js.map +1 -0
- package/dist/runtime/sitemap.generator.d.ts +4 -4
- package/dist/runtime/sitemap.generator.js +32 -11
- package/dist/runtime/sitemap.generator.js.map +1 -1
- package/dist/runtime/universal/fs/universal-fs.runtime.d.ts +0 -5
- package/dist/runtime/universal/fs/universal-fs.runtime.js +1 -95
- package/dist/runtime/universal/fs/universal-fs.runtime.js.map +1 -1
- package/dist/server/build.util.d.ts +38 -0
- package/dist/server/build.util.js +133 -0
- package/dist/server/build.util.js.map +1 -0
- package/dist/server/codegen.util.d.ts +3 -0
- package/dist/server/codegen.util.js +28 -10
- package/dist/server/codegen.util.js.map +1 -1
- package/dist/server/emroute.server.js +53 -29
- package/dist/server/emroute.server.js.map +1 -1
- package/dist/server/esbuild-manifest.plugin.js +6 -4
- package/dist/server/esbuild-manifest.plugin.js.map +1 -1
- package/dist/server/server-api.type.d.ts +6 -0
- package/dist/src/component/abstract.component.d.ts +5 -3
- package/dist/src/component/abstract.component.js.map +1 -1
- package/dist/src/element/component.element.js +5 -4
- package/dist/src/element/component.element.js.map +1 -1
- package/dist/src/renderer/spa/mod.d.ts +2 -3
- package/dist/src/renderer/spa/mod.js +2 -3
- package/dist/src/renderer/spa/mod.js.map +1 -1
- package/dist/src/renderer/spa/thin-client.d.ts +34 -0
- package/dist/src/renderer/spa/thin-client.js +138 -0
- package/dist/src/renderer/spa/thin-client.js.map +1 -0
- package/dist/src/renderer/ssr/html.renderer.d.ts +3 -3
- package/dist/src/renderer/ssr/html.renderer.js +6 -6
- package/dist/src/renderer/ssr/html.renderer.js.map +1 -1
- package/dist/src/renderer/ssr/md.renderer.d.ts +3 -3
- package/dist/src/renderer/ssr/md.renderer.js +12 -7
- package/dist/src/renderer/ssr/md.renderer.js.map +1 -1
- package/dist/src/renderer/ssr/ssr.renderer.d.ts +7 -6
- package/dist/src/renderer/ssr/ssr.renderer.js +42 -44
- package/dist/src/renderer/ssr/ssr.renderer.js.map +1 -1
- package/dist/src/route/route.core.d.ts +16 -6
- package/dist/src/route/route.core.js +44 -23
- package/dist/src/route/route.core.js.map +1 -1
- package/dist/src/type/route-tree.type.d.ts +2 -0
- package/dist/src/type/route.type.d.ts +6 -24
- package/dist/src/util/md.util.d.ts +8 -0
- package/dist/src/util/md.util.js +28 -0
- package/dist/src/util/md.util.js.map +1 -0
- package/dist/src/util/widget-resolve.util.js +6 -1
- package/dist/src/util/widget-resolve.util.js.map +1 -1
- package/dist/src/widget/breadcrumb.widget.d.ts +0 -1
- package/dist/src/widget/breadcrumb.widget.js +4 -15
- package/dist/src/widget/breadcrumb.widget.js.map +1 -1
- package/package.json +13 -2
- package/runtime/abstract.runtime.ts +9 -82
- package/runtime/bun/esbuild-runtime-loader.plugin.ts +2 -0
- package/runtime/bun/fs/bun-fs.runtime.ts +0 -109
- package/runtime/bun/sqlite/bun-sqlite.runtime.ts +1 -112
- package/runtime/fetch.runtime.ts +70 -0
- package/runtime/sitemap.generator.ts +37 -12
- package/runtime/universal/fs/universal-fs.runtime.ts +0 -109
- package/server/build.util.ts +168 -0
- package/server/codegen.util.ts +29 -11
- package/server/emroute.server.ts +50 -30
- package/server/esbuild-manifest.plugin.ts +5 -3
- package/server/server-api.type.ts +7 -0
- package/src/component/abstract.component.ts +5 -3
- package/src/element/component.element.ts +5 -4
- package/src/renderer/spa/mod.ts +2 -8
- package/src/renderer/spa/thin-client.ts +165 -0
- package/src/renderer/ssr/html.renderer.ts +6 -5
- package/src/renderer/ssr/md.renderer.ts +12 -6
- package/src/renderer/ssr/ssr.renderer.ts +54 -48
- package/src/route/route.core.ts +49 -28
- package/src/type/route-tree.type.ts +2 -0
- package/src/type/route.type.ts +7 -32
- package/src/util/md.util.ts +31 -0
- package/src/util/widget-resolve.util.ts +6 -1
- package/src/widget/breadcrumb.widget.ts +4 -16
- package/server/scanner.util.ts +0 -243
- package/src/renderer/spa/base.renderer.ts +0 -186
- package/src/renderer/spa/hash.renderer.ts +0 -238
- package/src/renderer/spa/html.renderer.ts +0 -399
- package/src/route/route.matcher.ts +0 -260
- package/src/web-doc/index.md +0 -15
|
@@ -16,9 +16,8 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
|
|
|
16
16
|
}
|
|
17
17
|
return path;
|
|
18
18
|
};
|
|
19
|
-
import { toUrl } from "./route.matcher.js";
|
|
20
19
|
/** Default base paths — backward compatible with existing /html/ and /md/ prefixes. */
|
|
21
|
-
export const DEFAULT_BASE_PATH = { html: '/html', md: '/md' };
|
|
20
|
+
export const DEFAULT_BASE_PATH = { html: '/html', md: '/md', app: '/app' };
|
|
22
21
|
const BLOCKED_PROTOCOLS = /^(javascript|data|vbscript):/i;
|
|
23
22
|
/** Throw if a redirect URL uses a dangerous protocol. */
|
|
24
23
|
export function assertSafeRedirect(url) {
|
|
@@ -38,7 +37,7 @@ function toRouteConfig(resolved) {
|
|
|
38
37
|
return {
|
|
39
38
|
pattern: resolved.pattern,
|
|
40
39
|
type: node.redirect ? 'redirect' : 'page',
|
|
41
|
-
modulePath: node.redirect ?? node.files?.ts ?? node.files?.html ?? node.files?.md ?? '',
|
|
40
|
+
modulePath: node.redirect ?? node.files?.ts ?? node.files?.js ?? node.files?.html ?? node.files?.md ?? '',
|
|
42
41
|
files: node.files,
|
|
43
42
|
};
|
|
44
43
|
}
|
|
@@ -49,8 +48,6 @@ export class RouteCore {
|
|
|
49
48
|
resolver;
|
|
50
49
|
/** Registered context provider (if any). Exposed so renderers can apply it to inline contexts. */
|
|
51
50
|
contextProvider;
|
|
52
|
-
/** Base path for URL matching (e.g. '/html'). Empty string when no basePath. */
|
|
53
|
-
basePath;
|
|
54
51
|
listeners = new Set();
|
|
55
52
|
moduleCache = new Map();
|
|
56
53
|
widgetFileCache = new Map();
|
|
@@ -59,7 +56,6 @@ export class RouteCore {
|
|
|
59
56
|
readFile;
|
|
60
57
|
constructor(resolver, options = {}) {
|
|
61
58
|
this.resolver = resolver;
|
|
62
|
-
this.basePath = options.basePath ?? '';
|
|
63
59
|
this.readFile = options.fileReader ??
|
|
64
60
|
((path) => fetch(path, { headers: { Accept: 'text/plain' } }).then((r) => r.text()));
|
|
65
61
|
this.contextProvider = options.extendContext;
|
|
@@ -96,21 +92,18 @@ export class RouteCore {
|
|
|
96
92
|
* Falls back to the default root route for '/'.
|
|
97
93
|
*/
|
|
98
94
|
match(url) {
|
|
99
|
-
const
|
|
100
|
-
const pathname = urlObj.pathname;
|
|
95
|
+
const pathname = url.pathname;
|
|
101
96
|
const resolved = this.resolver.match(pathname);
|
|
102
97
|
if (resolved) {
|
|
103
98
|
return {
|
|
104
99
|
route: toRouteConfig(resolved),
|
|
105
100
|
params: resolved.params,
|
|
106
|
-
searchParams: urlObj.searchParams,
|
|
107
101
|
};
|
|
108
102
|
}
|
|
109
103
|
if (pathname === '/' || pathname === '') {
|
|
110
104
|
return {
|
|
111
105
|
route: DEFAULT_ROOT_ROUTE,
|
|
112
106
|
params: {},
|
|
113
|
-
searchParams: urlObj.searchParams,
|
|
114
107
|
};
|
|
115
108
|
}
|
|
116
109
|
return undefined;
|
|
@@ -123,7 +116,7 @@ export class RouteCore {
|
|
|
123
116
|
return {
|
|
124
117
|
pattern: `/${status}`,
|
|
125
118
|
type: 'page',
|
|
126
|
-
modulePath: node.files?.ts ?? node.files?.html ?? node.files?.md ?? '',
|
|
119
|
+
modulePath: node.files?.ts ?? node.files?.js ?? node.files?.html ?? node.files?.md ?? '',
|
|
127
120
|
files: node.files,
|
|
128
121
|
};
|
|
129
122
|
}
|
|
@@ -156,7 +149,7 @@ export class RouteCore {
|
|
|
156
149
|
return {
|
|
157
150
|
pattern,
|
|
158
151
|
type: node.redirect ? 'redirect' : 'page',
|
|
159
|
-
modulePath: node.redirect ?? node.files?.ts ?? node.files?.html ?? node.files?.md ?? '',
|
|
152
|
+
modulePath: node.redirect ?? node.files?.ts ?? node.files?.js ?? node.files?.html ?? node.files?.md ?? '',
|
|
160
153
|
files: node.files,
|
|
161
154
|
};
|
|
162
155
|
}
|
|
@@ -245,31 +238,59 @@ export class RouteCore {
|
|
|
245
238
|
* Build a RouteInfo from a matched route and the resolved URL pathname.
|
|
246
239
|
* Called once per navigation; the result is reused across the route hierarchy.
|
|
247
240
|
*/
|
|
248
|
-
toRouteInfo(matched,
|
|
241
|
+
toRouteInfo(matched, url) {
|
|
249
242
|
return {
|
|
250
|
-
|
|
251
|
-
pattern: matched.route.pattern,
|
|
243
|
+
url,
|
|
252
244
|
params: matched.params,
|
|
253
|
-
searchParams: matched.searchParams ?? new URLSearchParams(),
|
|
254
245
|
};
|
|
255
246
|
}
|
|
247
|
+
/**
|
|
248
|
+
* Get inlined `__files` from a cached module (merged module pattern).
|
|
249
|
+
* Returns undefined if the module isn't cached or has no __files.
|
|
250
|
+
*/
|
|
251
|
+
getModuleFiles(modulePath) {
|
|
252
|
+
const cached = this.moduleCache.get(modulePath);
|
|
253
|
+
if (!cached || typeof cached !== 'object')
|
|
254
|
+
return undefined;
|
|
255
|
+
const files = cached.__files;
|
|
256
|
+
if (!files || typeof files !== 'object')
|
|
257
|
+
return undefined;
|
|
258
|
+
return files;
|
|
259
|
+
}
|
|
256
260
|
/**
|
|
257
261
|
* Build a ComponentContext by extending RouteInfo with loaded file contents.
|
|
262
|
+
*
|
|
263
|
+
* When the route module is a merged module (contains `__files`), uses
|
|
264
|
+
* inlined content directly. Otherwise falls back to reading companion files.
|
|
258
265
|
*/
|
|
259
266
|
async buildComponentContext(routeInfo, route, signal, isLeaf) {
|
|
260
|
-
const fetchFile = (filePath) => this.readFile(this.toAbsolutePath(filePath));
|
|
261
267
|
const rf = route.files;
|
|
262
|
-
const
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
268
|
+
const modulePath = rf?.ts ?? rf?.js;
|
|
269
|
+
// Try inlined __files from merged module (already cached by loadRouteContent)
|
|
270
|
+
const inlined = modulePath ? this.getModuleFiles(modulePath) : undefined;
|
|
271
|
+
let html;
|
|
272
|
+
let md;
|
|
273
|
+
let css;
|
|
274
|
+
if (inlined) {
|
|
275
|
+
html = inlined.html;
|
|
276
|
+
md = inlined.md;
|
|
277
|
+
css = inlined.css;
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
const fetchFile = (filePath) => this.readFile(this.toAbsolutePath(filePath));
|
|
281
|
+
[html, md, css] = await Promise.all([
|
|
282
|
+
rf?.html ? fetchFile(rf.html) : undefined,
|
|
283
|
+
rf?.md ? fetchFile(rf.md) : undefined,
|
|
284
|
+
rf?.css ? fetchFile(rf.css) : undefined,
|
|
285
|
+
]);
|
|
286
|
+
}
|
|
267
287
|
const base = {
|
|
268
288
|
...routeInfo,
|
|
289
|
+
pathname: routeInfo.url.pathname,
|
|
290
|
+
searchParams: routeInfo.url.searchParams,
|
|
269
291
|
files: { html, md, css },
|
|
270
292
|
signal,
|
|
271
293
|
isLeaf,
|
|
272
|
-
basePath: this.basePath || undefined,
|
|
273
294
|
};
|
|
274
295
|
return this.contextProvider ? this.contextProvider(base) : base;
|
|
275
296
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.core.js","sourceRoot":"","sources":["../../../src/route/route.core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"route.core.js","sourceRoot":"","sources":["../../../src/route/route.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
export interface RouteFiles {
|
|
13
13
|
/** TypeScript module (e.g. "routes/about.page.ts") */
|
|
14
14
|
ts?: string;
|
|
15
|
+
/** JavaScript module — merged module with inlined companions (e.g. "routes/about.page.js") */
|
|
16
|
+
js?: string;
|
|
15
17
|
/** HTML template (e.g. "routes/about.page.html") */
|
|
16
18
|
html?: string;
|
|
17
19
|
/** Markdown content (e.g. "routes/about.page.md") */
|
|
@@ -8,14 +8,10 @@
|
|
|
8
8
|
export type RouteParams = Readonly<Record<string, string>>;
|
|
9
9
|
/** Immutable route context built once per navigation, shared across the render pipeline. */
|
|
10
10
|
export interface RouteInfo {
|
|
11
|
-
/**
|
|
12
|
-
readonly
|
|
13
|
-
/**
|
|
14
|
-
readonly pattern: string;
|
|
15
|
-
/** URL parameters extracted by the router */
|
|
11
|
+
/** The URL being rendered. Components read pathname, searchParams, hash from this. */
|
|
12
|
+
readonly url: URL;
|
|
13
|
+
/** URL parameters extracted by the trie match. */
|
|
16
14
|
readonly params: RouteParams;
|
|
17
|
-
/** Query string parameters */
|
|
18
|
-
readonly searchParams: URLSearchParams;
|
|
19
15
|
}
|
|
20
16
|
/** Supported file patterns in file-based routing */
|
|
21
17
|
export type RouteFileType = 'page' | 'error' | 'redirect';
|
|
@@ -28,6 +24,8 @@ export interface RedirectConfig {
|
|
|
28
24
|
export interface RouteFiles {
|
|
29
25
|
/** TypeScript module path (.page.ts) */
|
|
30
26
|
ts?: string;
|
|
27
|
+
/** JavaScript module — merged module with inlined companions (.page.js) */
|
|
28
|
+
js?: string;
|
|
31
29
|
/** HTML template path (.page.html) */
|
|
32
30
|
html?: string;
|
|
33
31
|
/** Markdown content path (.page.md) */
|
|
@@ -56,10 +54,6 @@ export interface MatchedRoute {
|
|
|
56
54
|
readonly route: RouteConfig;
|
|
57
55
|
/** Extracted URL parameters */
|
|
58
56
|
readonly params: RouteParams;
|
|
59
|
-
/** Query string parameters from the matched URL */
|
|
60
|
-
readonly searchParams?: URLSearchParams;
|
|
61
|
-
/** The URLPatternResult from matching */
|
|
62
|
-
readonly patternResult?: URLPatternResult;
|
|
63
57
|
}
|
|
64
58
|
/** Error boundary configuration */
|
|
65
59
|
export interface ErrorBoundary {
|
|
@@ -68,19 +62,7 @@ export interface ErrorBoundary {
|
|
|
68
62
|
/** Module path for the error handler */
|
|
69
63
|
modulePath: string;
|
|
70
64
|
}
|
|
71
|
-
|
|
72
|
-
export interface RoutesManifest {
|
|
73
|
-
/** All page routes */
|
|
74
|
-
routes: RouteConfig[];
|
|
75
|
-
/** Error boundaries by pattern prefix */
|
|
76
|
-
errorBoundaries: ErrorBoundary[];
|
|
77
|
-
/** Status-specific pages (404, 401, 403) */
|
|
78
|
-
statusPages: Map<number, RouteConfig>;
|
|
79
|
-
/** Generic error handler */
|
|
80
|
-
errorHandler?: RouteConfig;
|
|
81
|
-
/** Pre-bundled module loaders keyed by module path (for SPA bundles) */
|
|
82
|
-
moduleLoaders?: Record<string, () => Promise<unknown>>;
|
|
83
|
-
}
|
|
65
|
+
export type { RouteNode } from './route-tree.type.ts';
|
|
84
66
|
/** Router state for history management */
|
|
85
67
|
export interface RouterState {
|
|
86
68
|
/** Current URL pathname */
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown Link Rewriting
|
|
3
|
+
*
|
|
4
|
+
* Rewrites internal absolute links in markdown to include a base path prefix.
|
|
5
|
+
* Skips fenced code blocks and links already under a known base path.
|
|
6
|
+
*/
|
|
7
|
+
/** Rewrite internal absolute links in markdown to include the base path prefix. */
|
|
8
|
+
export declare function rewriteMdLinks(markdown: string, base: string, skipPrefixes: string[]): string;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown Link Rewriting
|
|
3
|
+
*
|
|
4
|
+
* Rewrites internal absolute links in markdown to include a base path prefix.
|
|
5
|
+
* Skips fenced code blocks and links already under a known base path.
|
|
6
|
+
*/
|
|
7
|
+
/** Rewrite internal absolute links in markdown to include the base path prefix. */
|
|
8
|
+
export function rewriteMdLinks(markdown, base, skipPrefixes) {
|
|
9
|
+
const prefix = base + '/';
|
|
10
|
+
// Negative lookahead: skip links already under a known base path
|
|
11
|
+
const skip = skipPrefixes.map((p) => p.slice(1) + '/').join('|');
|
|
12
|
+
const inlineRe = new RegExp(`\\]\\(\\/(?!${skip})`, 'g');
|
|
13
|
+
const refRe = new RegExp(`^(\\[[^\\]]+\\]:\\s+)\\/(?!${skip})`, 'g');
|
|
14
|
+
const lines = markdown.split('\n');
|
|
15
|
+
let inCodeBlock = false;
|
|
16
|
+
for (let i = 0; i < lines.length; i++) {
|
|
17
|
+
if (lines[i].startsWith('```')) {
|
|
18
|
+
inCodeBlock = !inCodeBlock;
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (inCodeBlock)
|
|
22
|
+
continue;
|
|
23
|
+
lines[i] = lines[i].replaceAll(inlineRe, `](${prefix}`);
|
|
24
|
+
lines[i] = lines[i].replaceAll(refRe, `$1${prefix}`);
|
|
25
|
+
}
|
|
26
|
+
return lines.join('\n');
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=md.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md.util.js","sourceRoot":"","sources":["../../../src/util/md.util.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,IAAY,EAAE,YAAsB;IACnF,MAAM,MAAM,GAAG,IAAI,GAAG,GAAG,CAAC;IAC1B,iEAAiE;IACjE,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,eAAe,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,8BAA8B,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;IAErE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,WAAW,GAAG,CAAC,WAAW,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,IAAI,WAAW;YAAE,SAAS;QAE1B,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC;QACxD,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -81,7 +81,12 @@ export function resolveWidgetTags(html, registry, routeInfo, loadFiles, contextP
|
|
|
81
81
|
if (loadFiles) {
|
|
82
82
|
files = await loadFiles(widgetName, widget.files);
|
|
83
83
|
}
|
|
84
|
-
const baseContext = {
|
|
84
|
+
const baseContext = {
|
|
85
|
+
...routeInfo,
|
|
86
|
+
pathname: routeInfo.url.pathname,
|
|
87
|
+
searchParams: routeInfo.url.searchParams,
|
|
88
|
+
files,
|
|
89
|
+
};
|
|
85
90
|
const context = contextProvider ? contextProvider(baseContext) : baseContext;
|
|
86
91
|
const data = await widget.getData({ params, context });
|
|
87
92
|
const rendered = widget.renderHTML({ data, params, context });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget-resolve.util.js","sourceRoot":"","sources":["../../../src/util/widget-resolve.util.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"widget-resolve.util.js","sourceRoot":"","sources":["../../../src/util/widget-resolve.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,7 +33,6 @@ export declare class BreadcrumbWidget extends WidgetComponent<BreadcrumbParams,
|
|
|
33
33
|
signal?: AbortSignal;
|
|
34
34
|
context: ComponentContext;
|
|
35
35
|
}): Promise<BreadcrumbData | null>;
|
|
36
|
-
private resolvePathname;
|
|
37
36
|
renderHTML(args: {
|
|
38
37
|
data: BreadcrumbData | null;
|
|
39
38
|
params: BreadcrumbParams;
|
|
@@ -15,23 +15,17 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { WidgetComponent } from "../component/widget.component.js";
|
|
17
17
|
import { escapeHtml } from "../util/html.util.js";
|
|
18
|
-
import { DEFAULT_BASE_PATH } from "../route/route.core.js";
|
|
19
18
|
const DEFAULT_HTML_SEPARATOR = ' \u203A ';
|
|
20
19
|
const DEFAULT_MD_SEPARATOR = ' > ';
|
|
21
20
|
export class BreadcrumbWidget extends WidgetComponent {
|
|
22
21
|
name = 'breadcrumb';
|
|
23
22
|
getData(args) {
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
// Skip basePath segments for display — only show route segments
|
|
27
|
-
const barePathname = htmlBase && pathname.startsWith(htmlBase)
|
|
28
|
-
? pathname.slice(htmlBase.length) || '/'
|
|
29
|
-
: pathname;
|
|
30
|
-
const parts = barePathname.split('/').filter(Boolean);
|
|
23
|
+
const pathname = args.context.pathname || '/';
|
|
24
|
+
const parts = pathname.split('/').filter(Boolean);
|
|
31
25
|
const segments = [
|
|
32
|
-
{ label: 'Home', href:
|
|
26
|
+
{ label: 'Home', href: '/' },
|
|
33
27
|
];
|
|
34
|
-
let accumulated =
|
|
28
|
+
let accumulated = '';
|
|
35
29
|
for (const part of parts) {
|
|
36
30
|
accumulated += '/' + part;
|
|
37
31
|
segments.push({
|
|
@@ -41,11 +35,6 @@ export class BreadcrumbWidget extends WidgetComponent {
|
|
|
41
35
|
}
|
|
42
36
|
return Promise.resolve({ segments });
|
|
43
37
|
}
|
|
44
|
-
resolvePathname(htmlBase) {
|
|
45
|
-
if (typeof globalThis.location === 'undefined')
|
|
46
|
-
return htmlBase + '/';
|
|
47
|
-
return location.pathname;
|
|
48
|
-
}
|
|
49
38
|
renderHTML(args) {
|
|
50
39
|
if (!args.data || args.data.segments.length === 0)
|
|
51
40
|
return '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breadcrumb.widget.js","sourceRoot":"","sources":["../../../src/widget/breadcrumb.widget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"breadcrumb.widget.js","sourceRoot":"","sources":["../../../src/widget/breadcrumb.widget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,MAAM,sBAAsB,GAAG,UAAU,CAAC;AAC1C,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAgBnC,MAAM,OAAO,gBAAiB,SAAQ,eAAiD;IACnE,IAAI,GAAG,YAAY,CAAC;IAE7B,OAAO,CACd,IAAmF;QAEnF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC;QAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAElD,MAAM,QAAQ,GAAwB;YACpC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE;SAC7B,CAAC;QAEF,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,WAAW,IAAI,GAAG,GAAG,IAAI,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;gBACtE,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvC,CAAC;IAEQ,UAAU,CACjB,IAA0F;QAE1F,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAE7D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,sBAAsB,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QAEpC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,OAAO,6BAA6B,OAAO,SAAS,CAAC;YACvD,CAAC;YACD,OAAO,YAAY,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,OAAO,MAAM,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,OAAO,gCAAgC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC7E,CAAC;IAEQ,cAAc,CACrB,IAA0F;QAE1F,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAE7D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,oBAAoB,CAAC;QAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ;aACtB,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CACnB,CAAC,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,IAAI,GAAG,CAC1E;aACA,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@emkodev/emroute",
|
|
3
|
-
"version": "1.6.6-beta.
|
|
3
|
+
"version": "1.6.6-beta.4",
|
|
4
4
|
"description": "File-based (but storage-agnostic) router with triple rendering (SPA, SSR HTML, SSR Markdown). Zero dependencies.",
|
|
5
5
|
"license": "BSD-3-Clause",
|
|
6
6
|
"author": "emko.dev",
|
|
@@ -61,6 +61,11 @@
|
|
|
61
61
|
"types": "./dist/server/emroute.server.d.ts",
|
|
62
62
|
"default": "./dist/server/emroute.server.js"
|
|
63
63
|
},
|
|
64
|
+
"./server/build": {
|
|
65
|
+
"bun": "./server/build.util.ts",
|
|
66
|
+
"types": "./dist/server/build.util.d.ts",
|
|
67
|
+
"default": "./dist/server/build.util.js"
|
|
68
|
+
},
|
|
64
69
|
"./runtime": {
|
|
65
70
|
"bun": "./runtime/abstract.runtime.ts",
|
|
66
71
|
"types": "./dist/runtime/abstract.runtime.d.ts",
|
|
@@ -85,9 +90,15 @@
|
|
|
85
90
|
"bun": "./runtime/universal/fs/universal-fs.runtime.ts",
|
|
86
91
|
"types": "./dist/runtime/universal/fs/universal-fs.runtime.d.ts",
|
|
87
92
|
"default": "./dist/runtime/universal/fs/universal-fs.runtime.js"
|
|
93
|
+
},
|
|
94
|
+
"./runtime/fetch": {
|
|
95
|
+
"bun": "./runtime/fetch.runtime.ts",
|
|
96
|
+
"types": "./dist/runtime/fetch.runtime.d.ts",
|
|
97
|
+
"default": "./dist/runtime/fetch.runtime.js"
|
|
88
98
|
}
|
|
89
99
|
},
|
|
90
100
|
"devDependencies": {
|
|
101
|
+
"@emkodev/emkoma": "^0.1.0",
|
|
91
102
|
"@eslint/js": "^10.0.1",
|
|
92
103
|
"@types/bun": "^1.3.9",
|
|
93
104
|
"esbuild": "^0.27.3",
|
|
@@ -97,7 +108,7 @@
|
|
|
97
108
|
"typescript-eslint": "^8.56.1"
|
|
98
109
|
},
|
|
99
110
|
"scripts": {
|
|
100
|
-
"build": "tsc -p tsconfig.build.json",
|
|
111
|
+
"build": "tsc -p tsconfig.build.json && bun scripts/bundle-browser.ts",
|
|
101
112
|
"prepublishOnly": "bun run build",
|
|
102
113
|
"check": "bun x tsc --noEmit",
|
|
103
114
|
"test": "bun test test/unit",
|
|
@@ -34,24 +34,9 @@ export const DEFAULT_WIDGETS_DIR = '/widgets';
|
|
|
34
34
|
export const ROUTES_MANIFEST_PATH = '/routes.manifest.json';
|
|
35
35
|
export const WIDGETS_MANIFEST_PATH = '/widgets.manifest.json';
|
|
36
36
|
|
|
37
|
-
export const EMROUTE_EXTERNALS = [
|
|
38
|
-
'@emkodev/emroute/spa',
|
|
39
|
-
'@emkodev/emroute/overlay',
|
|
40
|
-
'@emkodev/emroute',
|
|
41
|
-
] as const;
|
|
42
|
-
|
|
43
37
|
export interface RuntimeConfig {
|
|
44
38
|
routesDir?: string;
|
|
45
39
|
widgetsDir?: string;
|
|
46
|
-
/** SPA mode. When 'none', bundling is skipped entirely. */
|
|
47
|
-
spa?: 'none' | 'leaf' | 'root' | 'only';
|
|
48
|
-
/** Consumer's SPA entry point (e.g. '/main.ts'). Skips app bundle when absent. */
|
|
49
|
-
entryPoint?: string;
|
|
50
|
-
bundlePaths?: {
|
|
51
|
-
emroute: string;
|
|
52
|
-
app: string;
|
|
53
|
-
widgets?: string;
|
|
54
|
-
};
|
|
55
40
|
}
|
|
56
41
|
|
|
57
42
|
/**
|
|
@@ -100,68 +85,6 @@ export abstract class Runtime {
|
|
|
100
85
|
throw new Error(`loadModule not implemented for ${this.constructor.name}`);
|
|
101
86
|
}
|
|
102
87
|
|
|
103
|
-
static transpile(_ts: string): Promise<string> {
|
|
104
|
-
throw new Error('Not implemented');
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Build client bundles. Called by the server after manifests are written.
|
|
109
|
-
* No-op by default — override in runtimes that support bundling.
|
|
110
|
-
*/
|
|
111
|
-
bundle(): Promise<void> {
|
|
112
|
-
return Promise.resolve();
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Generate an HTML shell (`index.html`) if one doesn't already exist.
|
|
117
|
-
* Writes through `this.command()` so it works for any runtime.
|
|
118
|
-
*/
|
|
119
|
-
protected async writeShell(
|
|
120
|
-
paths: { emroute: string; app: string; widgets?: string },
|
|
121
|
-
): Promise<void> {
|
|
122
|
-
if ((await this.query('/index.html')).status !== 404) return;
|
|
123
|
-
|
|
124
|
-
const imports: Record<(typeof EMROUTE_EXTERNALS)[number], string> = Object.fromEntries(
|
|
125
|
-
EMROUTE_EXTERNALS.map((pkg) => [pkg, paths.emroute]),
|
|
126
|
-
) as Record<(typeof EMROUTE_EXTERNALS)[number], string>;
|
|
127
|
-
const importMap = JSON.stringify({ imports }, null, 2);
|
|
128
|
-
|
|
129
|
-
const scripts = [
|
|
130
|
-
`<script type="importmap">\n${importMap}\n </script>`,
|
|
131
|
-
];
|
|
132
|
-
if (this.config.entryPoint) {
|
|
133
|
-
scripts.push(`<script type="module" src="${paths.app}"></script>`);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
const html = `<!DOCTYPE html>
|
|
137
|
-
<html>
|
|
138
|
-
<head>
|
|
139
|
-
<meta charset="utf-8">
|
|
140
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
141
|
-
<title>emroute</title>
|
|
142
|
-
<style>@view-transition { navigation: auto; } router-slot { display: contents; }</style>
|
|
143
|
-
</head>
|
|
144
|
-
<body>
|
|
145
|
-
<router-slot></router-slot>
|
|
146
|
-
${scripts.join('\n ')}
|
|
147
|
-
</body>
|
|
148
|
-
</html>`;
|
|
149
|
-
|
|
150
|
-
await this.command('/index.html', { body: html });
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
static compress(
|
|
154
|
-
_data: Uint8Array,
|
|
155
|
-
_encoding: 'br' | 'gzip',
|
|
156
|
-
): Promise<Uint8Array> {
|
|
157
|
-
throw new Error('Not implemented');
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/** Stop the bundler subprocess if running. No-op by default. */
|
|
161
|
-
static stopBundler(): Promise<void> {
|
|
162
|
-
return Promise.resolve();
|
|
163
|
-
}
|
|
164
|
-
|
|
165
88
|
// ── Manifest resolution ─────────────────────────────────────────────
|
|
166
89
|
|
|
167
90
|
private routesManifestCache: Response | null = null;
|
|
@@ -249,7 +172,7 @@ export abstract class Runtime {
|
|
|
249
172
|
const dirSegments = parts.slice(0, -1);
|
|
250
173
|
|
|
251
174
|
// Parse filename: name.kind.ext (e.g. "about.page.ts", "[id].page.html", "index.error.ts")
|
|
252
|
-
const match = filename.match(/^(.+?)\.(page|error|redirect)\.(ts|html|md|css)$/);
|
|
175
|
+
const match = filename.match(/^(.+?)\.(page|error|redirect)\.(ts|js|html|md|css)$/);
|
|
253
176
|
if (!match) continue;
|
|
254
177
|
|
|
255
178
|
const [, name, kind, ext] = match;
|
|
@@ -297,7 +220,6 @@ export abstract class Runtime {
|
|
|
297
220
|
pathPrefix?: string,
|
|
298
221
|
): Promise<WidgetManifestEntry[]> {
|
|
299
222
|
const COMPANION_EXTENSIONS = ['html', 'md', 'css'] as const;
|
|
300
|
-
const WIDGET_FILE_SUFFIX = '.widget.ts';
|
|
301
223
|
const entries: WidgetManifestEntry[] = [];
|
|
302
224
|
|
|
303
225
|
const trailingDir = widgetsDir.endsWith('/') ? widgetsDir : widgetsDir + '/';
|
|
@@ -308,10 +230,15 @@ export abstract class Runtime {
|
|
|
308
230
|
if (!item.endsWith('/')) continue;
|
|
309
231
|
|
|
310
232
|
const name = item.slice(0, -1);
|
|
311
|
-
const moduleFile = `${name}${WIDGET_FILE_SUFFIX}`;
|
|
312
|
-
const modulePath = `${trailingDir}${name}/${moduleFile}`;
|
|
313
233
|
|
|
314
|
-
|
|
234
|
+
// Try .widget.ts first, then .widget.js
|
|
235
|
+
let moduleFile = `${name}.widget.ts`;
|
|
236
|
+
let modulePath = `${trailingDir}${name}/${moduleFile}`;
|
|
237
|
+
if ((await this.query(modulePath)).status === 404) {
|
|
238
|
+
moduleFile = `${name}.widget.js`;
|
|
239
|
+
modulePath = `${trailingDir}${name}/${moduleFile}`;
|
|
240
|
+
if ((await this.query(modulePath)).status === 404) continue;
|
|
241
|
+
}
|
|
315
242
|
|
|
316
243
|
const prefix = pathPrefix ? `${pathPrefix}/` : '';
|
|
317
244
|
const entry: WidgetManifestEntry = {
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import type { Runtime } from '../../runtime/abstract.runtime.ts';
|
|
14
|
+
import { EMROUTE_VIRTUAL_NS } from '../../server/build.util.ts';
|
|
14
15
|
|
|
15
16
|
/** Synthetic prefix for runtimes without a filesystem root (e.g. SQLite). */
|
|
16
17
|
export const VIRTUAL_ROOT = '/@emroute-virtual';
|
|
@@ -46,6 +47,7 @@ export function createRuntimeLoaderPlugin(options: RuntimeLoaderOptions): Esbuil
|
|
|
46
47
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
47
48
|
async (args: any) => {
|
|
48
49
|
if (args.path.startsWith('.') || args.path.startsWith('/')) return undefined;
|
|
50
|
+
if (args.path.startsWith(EMROUTE_VIRTUAL_NS + ':')) return { path: args.path, namespace: EMROUTE_VIRTUAL_NS };
|
|
49
51
|
return build.resolve(args.path, { resolveDir: process.cwd(), kind: args.kind });
|
|
50
52
|
},
|
|
51
53
|
);
|