@emkodev/emroute 1.7.2 → 1.7.3

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 (61) hide show
  1. package/dist/emroute.js +135 -31
  2. package/dist/emroute.js.map +2 -2
  3. package/dist/runtime/abstract.runtime.d.ts +11 -0
  4. package/dist/runtime/abstract.runtime.js +53 -0
  5. package/dist/runtime/abstract.runtime.js.map +1 -1
  6. package/dist/runtime/bun/fs/bun-fs.runtime.js +3 -1
  7. package/dist/runtime/bun/fs/bun-fs.runtime.js.map +1 -1
  8. package/dist/runtime/bun/sqlite/bun-sqlite.runtime.js +3 -1
  9. package/dist/runtime/bun/sqlite/bun-sqlite.runtime.js.map +1 -1
  10. package/dist/runtime/universal/fs/universal-fs.runtime.js +3 -1
  11. package/dist/runtime/universal/fs/universal-fs.runtime.js.map +1 -1
  12. package/dist/server/build.util.js +35 -6
  13. package/dist/server/build.util.js.map +1 -1
  14. package/dist/server/emroute.server.js +17 -7
  15. package/dist/server/emroute.server.js.map +1 -1
  16. package/dist/server/server-api.type.d.ts +3 -0
  17. package/dist/src/component/abstract.component.d.ts +1 -1
  18. package/dist/src/component/abstract.component.js.map +1 -1
  19. package/dist/src/element/component.element.js +17 -3
  20. package/dist/src/element/component.element.js.map +1 -1
  21. package/dist/src/element/markdown.element.js +1 -1
  22. package/dist/src/element/markdown.element.js.map +1 -1
  23. package/dist/src/index.d.ts +1 -0
  24. package/dist/src/index.js.map +1 -1
  25. package/dist/src/renderer/spa/thin-client.js +28 -6
  26. package/dist/src/renderer/spa/thin-client.js.map +1 -1
  27. package/dist/src/renderer/ssr/html.renderer.js +1 -1
  28. package/dist/src/renderer/ssr/html.renderer.js.map +1 -1
  29. package/dist/src/renderer/ssr/md.renderer.js +2 -2
  30. package/dist/src/renderer/ssr/md.renderer.js.map +1 -1
  31. package/dist/src/renderer/ssr/ssr.renderer.js +6 -6
  32. package/dist/src/renderer/ssr/ssr.renderer.js.map +1 -1
  33. package/dist/src/route/route.core.js +21 -7
  34. package/dist/src/route/route.core.js.map +1 -1
  35. package/dist/src/type/element.type.d.ts +19 -0
  36. package/dist/src/type/element.type.js +9 -0
  37. package/dist/src/type/element.type.js.map +1 -0
  38. package/dist/src/util/widget-resolve.util.js +1 -1
  39. package/dist/src/util/widget-resolve.util.js.map +1 -1
  40. package/dist/src/widget/widget.registry.js +1 -1
  41. package/dist/src/widget/widget.registry.js.map +1 -1
  42. package/package.json +1 -1
  43. package/runtime/abstract.runtime.ts +67 -0
  44. package/runtime/bun/fs/bun-fs.runtime.ts +2 -0
  45. package/runtime/bun/sqlite/bun-sqlite.runtime.ts +2 -0
  46. package/runtime/universal/fs/universal-fs.runtime.ts +2 -0
  47. package/server/build.util.ts +37 -5
  48. package/server/emroute.server.ts +20 -6
  49. package/server/server-api.type.ts +4 -0
  50. package/src/component/abstract.component.ts +1 -1
  51. package/src/element/component.element.ts +16 -4
  52. package/src/element/markdown.element.ts +1 -1
  53. package/src/index.ts +1 -0
  54. package/src/renderer/spa/thin-client.ts +30 -5
  55. package/src/renderer/ssr/html.renderer.ts +1 -1
  56. package/src/renderer/ssr/md.renderer.ts +5 -4
  57. package/src/renderer/ssr/ssr.renderer.ts +6 -6
  58. package/src/route/route.core.ts +17 -8
  59. package/src/type/element.type.ts +22 -0
  60. package/src/util/widget-resolve.util.ts +4 -4
  61. package/src/widget/widget.registry.ts +1 -1
@@ -17,7 +17,7 @@ import type {
17
17
  RouterEvent,
18
18
  RouterEventListener,
19
19
  } from '../type/route.type.ts';
20
- import type { ComponentContext, ContextProvider } from '../component/abstract.component.ts';
20
+ import type { ComponentContext, ContextProvider, FileContents } from '../component/abstract.component.ts';
21
21
  import type { RouteResolver, ResolvedRoute } from './route.resolver.ts';
22
22
 
23
23
  /** Base paths for the two SSR rendering endpoints. */
@@ -56,7 +56,7 @@ function toRouteConfig(resolved: ResolvedRoute): RouteConfig {
56
56
  pattern: resolved.pattern,
57
57
  type: node.redirect ? 'redirect' : 'page',
58
58
  modulePath: node.redirect ?? node.files?.ts ?? node.files?.js ?? node.files?.html ?? node.files?.md ?? '',
59
- files: node.files,
59
+ ...(node.files ? { files: node.files } : {}),
60
60
  };
61
61
  }
62
62
 
@@ -157,7 +157,7 @@ export class RouteCore {
157
157
  pattern: `/${status}`,
158
158
  type: 'page',
159
159
  modulePath: node.files?.ts ?? node.files?.js ?? node.files?.html ?? node.files?.md ?? '',
160
- files: node.files,
160
+ ...(node.files ? { files: node.files } : {}),
161
161
  };
162
162
  }
163
163
 
@@ -190,7 +190,7 @@ export class RouteCore {
190
190
  pattern,
191
191
  type: node.redirect ? 'redirect' : 'page',
192
192
  modulePath: node.redirect ?? node.files?.ts ?? node.files?.js ?? node.files?.html ?? node.files?.md ?? '',
193
- files: node.files,
193
+ ...(node.files ? { files: node.files } : {}),
194
194
  };
195
195
  }
196
196
 
@@ -287,7 +287,11 @@ export class RouteCore {
287
287
  widgetFiles.css ? load(widgetFiles.css) : undefined,
288
288
  ]);
289
289
 
290
- return { html, md, css };
290
+ const result: { html?: string; md?: string; css?: string } = {};
291
+ if (html != null) result.html = html;
292
+ if (md != null) result.md = md;
293
+ if (css != null) result.css = css;
294
+ return result;
291
295
  }
292
296
 
293
297
  /**
@@ -349,13 +353,18 @@ export class RouteCore {
349
353
  ]);
350
354
  }
351
355
 
356
+ const files: FileContents = {};
357
+ if (html != null) files.html = html;
358
+ if (md != null) files.md = md;
359
+ if (css != null) files.css = css;
360
+
352
361
  const base: ComponentContext = {
353
362
  ...routeInfo,
354
363
  pathname: routeInfo.url.pathname,
355
364
  searchParams: routeInfo.url.searchParams,
356
- files: { html, md, css },
357
- signal,
358
- isLeaf,
365
+ files,
366
+ ...(signal ? { signal } : {}),
367
+ ...(isLeaf != null ? { isLeaf } : {}),
359
368
  };
360
369
  return this.contextProvider ? this.contextProvider(base) : base;
361
370
  }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Custom Element - Type Definitions
3
+ *
4
+ * Custom elements are plain HTMLElement subclasses auto-discovered from
5
+ * `elementsDir/{name}/{name}.element.ts`. They are registered in the
6
+ * browser via `customElements.define()` during `bootEmrouteApp()`.
7
+ */
8
+
9
+ /**
10
+ * Custom element manifest entry.
11
+ * Discovered from `elementsDir/{name}/{name}.element.ts`.
12
+ */
13
+ export interface ElementManifestEntry {
14
+ /** Element name in kebab-case (must contain a hyphen per web spec) */
15
+ name: string;
16
+
17
+ /** Path to element module file */
18
+ modulePath: string;
19
+
20
+ /** Custom element tag name (same as name) */
21
+ tagName: string;
22
+ }
@@ -5,7 +5,7 @@
5
5
  * Calls getData() + renderHTML() on widgets and injects SSR hydration data.
6
6
  */
7
7
 
8
- import type { Component, ContextProvider } from '../component/abstract.component.ts';
8
+ import type { Component, ComponentContext, ContextProvider } from '../component/abstract.component.ts';
9
9
  import { logger } from '../type/logger.type.ts';
10
10
  import type { RouteInfo } from '../type/route.type.ts';
11
11
  import { LAZY_ATTR, SSR_ATTR } from './html.util.ts';
@@ -118,13 +118,13 @@ export function resolveWidgetTags(
118
118
  files = await loadFiles(widgetName, widget.files);
119
119
  }
120
120
 
121
- const baseContext = {
121
+ const baseContext: ComponentContext = {
122
122
  ...routeInfo,
123
123
  pathname: routeInfo.url.pathname,
124
124
  searchParams: routeInfo.url.searchParams,
125
- files,
125
+ ...(files ? { files } : {}),
126
126
  };
127
- const context = contextProvider ? contextProvider(baseContext) : baseContext;
127
+ const context: ComponentContext = contextProvider ? contextProvider(baseContext) : baseContext;
128
128
 
129
129
  const data = await widget.getData({ params, context });
130
130
  const rendered = widget.renderHTML({ data, params, context });
@@ -40,7 +40,7 @@ export class WidgetRegistry {
40
40
  name,
41
41
  modulePath: name,
42
42
  tagName: `widget-${name}`,
43
- files: widget.files,
43
+ ...(widget.files ? { files: widget.files } : {}),
44
44
  };
45
45
  widgets.push(entry);
46
46
  moduleLoaders[name] = () => Promise.resolve({ default: widget.constructor });