@emkodev/emroute 1.8.0-beta.1 → 1.8.0

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 (46) hide show
  1. package/core/component/abstract.component.ts +112 -0
  2. package/core/renderer/html.renderer.ts +8 -3
  3. package/core/renderer/md.renderer.ts +4 -3
  4. package/core/renderer/ssr.renderer.ts +3 -6
  5. package/core/router/route.trie.ts +4 -4
  6. package/core/server/emroute.server.ts +5 -27
  7. package/core/util/md.util.ts +3 -3
  8. package/core/util/widget-resolve.util.ts +3 -4
  9. package/core/widget/widget.parser.ts +2 -2
  10. package/core/widget/widget.registry.ts +17 -5
  11. package/dist/core/component/abstract.component.d.ts +27 -0
  12. package/dist/core/component/abstract.component.js +65 -0
  13. package/dist/core/component/abstract.component.js.map +1 -1
  14. package/dist/core/renderer/html.renderer.js +9 -3
  15. package/dist/core/renderer/html.renderer.js.map +1 -1
  16. package/dist/core/renderer/md.renderer.js +4 -3
  17. package/dist/core/renderer/md.renderer.js.map +1 -1
  18. package/dist/core/renderer/ssr.renderer.d.ts +0 -10
  19. package/dist/core/renderer/ssr.renderer.js +0 -2
  20. package/dist/core/renderer/ssr.renderer.js.map +1 -1
  21. package/dist/core/router/route.trie.js +1 -1
  22. package/dist/core/router/route.trie.js.map +1 -1
  23. package/dist/core/server/emroute.server.js +4 -26
  24. package/dist/core/server/emroute.server.js.map +1 -1
  25. package/dist/core/util/md.util.js.map +1 -1
  26. package/dist/core/util/widget-resolve.util.d.ts +1 -5
  27. package/dist/core/util/widget-resolve.util.js +2 -2
  28. package/dist/core/util/widget-resolve.util.js.map +1 -1
  29. package/dist/core/widget/widget.parser.js +1 -1
  30. package/dist/core/widget/widget.parser.js.map +1 -1
  31. package/dist/core/widget/widget.registry.d.ts +3 -2
  32. package/dist/core/widget/widget.registry.js +12 -5
  33. package/dist/core/widget/widget.registry.js.map +1 -1
  34. package/dist/emroute.js +122 -72
  35. package/dist/emroute.js.map +14 -14
  36. package/dist/runtime/abstract.runtime.js +18 -10
  37. package/dist/runtime/abstract.runtime.js.map +1 -1
  38. package/dist/src/element/component.element.d.ts +3 -8
  39. package/dist/src/element/component.element.js +10 -24
  40. package/dist/src/element/component.element.js.map +1 -1
  41. package/dist/src/renderer/spa/emroute.app.js +1 -1
  42. package/dist/src/renderer/spa/emroute.app.js.map +1 -1
  43. package/package.json +1 -1
  44. package/runtime/abstract.runtime.ts +33 -25
  45. package/src/element/component.element.ts +9 -30
  46. package/src/renderer/spa/emroute.app.ts +1 -1
@@ -128,7 +128,6 @@ export class ComponentElement<TParams, TData> extends HTMLElementBase {
128
128
  */
129
129
  static registerLazy(
130
130
  name: string,
131
- files: WidgetFiles | undefined,
132
131
  loader: () => Promise<unknown>,
133
132
  ): void {
134
133
  const tagName = `widget-${name}`;
@@ -149,7 +148,7 @@ export class ComponentElement<TParams, TData> extends HTMLElementBase {
149
148
 
150
149
  const BoundElement = class extends ComponentElement<unknown, unknown> {
151
150
  constructor() {
152
- super(placeholder, files);
151
+ super(placeholder);
153
152
  }
154
153
  };
155
154
 
@@ -175,6 +174,9 @@ export class ComponentElement<TParams, TData> extends HTMLElementBase {
175
174
  if (lazyLoader) {
176
175
  try {
177
176
  const mod = await lazyLoader() as Record<string, unknown>;
177
+ if (mod.__files && typeof mod.__files === 'object') {
178
+ this.effectiveFiles = mod.__files as WidgetFiles;
179
+ }
178
180
  for (const exp of Object.values(mod)) {
179
181
  if (exp && typeof exp === 'object' && 'getData' in exp) {
180
182
  const WidgetClass = exp.constructor as new () => Component<TParams, TData>;
@@ -271,7 +273,8 @@ export class ComponentElement<TParams, TData> extends HTMLElementBase {
271
273
 
272
274
  // Lazy: defer loadData until element is visible
273
275
  if (this.hasAttribute(LAZY_ATTR)) {
274
- this.intersectionObserver = new IntersectionObserver(([entry]) => {
276
+ this.intersectionObserver = new IntersectionObserver((entries) => {
277
+ const entry = entries[0]!;
275
278
  if (entry.isIntersecting) {
276
279
  this.intersectionObserver?.disconnect();
277
280
  this.intersectionObserver = null;
@@ -315,35 +318,11 @@ export class ComponentElement<TParams, TData> extends HTMLElementBase {
315
318
  }
316
319
 
317
320
  /**
318
- * Fetch a single file by path.
319
- * Absolute URLs (http/https) pass through; relative paths get '/' prefix.
320
- */
321
- private static loadFile(path: string): Promise<string | undefined> {
322
- const url = path.startsWith('http://') || path.startsWith('https://')
323
- ? path
324
- : (path.startsWith('/') ? path : '/' + path);
325
-
326
- return fetch(url).then(
327
- (res) => res.ok ? res.text() : undefined,
328
- () => undefined,
329
- );
330
- }
331
-
332
- /**
333
- * Load all companion files for this widget instance.
334
- * Uses effectiveFiles (from registration) falling back to component.files.
321
+ * Get companion files for this widget instance.
322
+ * Returns inlined content from __files (set during lazy module load) directly.
335
323
  */
336
324
  private async loadFiles(): Promise<{ html?: string; md?: string; css?: string }> {
337
- const filePaths = this.effectiveFiles ?? this.component.files;
338
- if (!filePaths) return {};
339
-
340
- const [html, md, css] = await Promise.all([
341
- filePaths.html ? ComponentElement.loadFile(filePaths.html) : undefined,
342
- filePaths.md ? ComponentElement.loadFile(filePaths.md) : undefined,
343
- filePaths.css ? ComponentElement.loadFile(filePaths.css) : undefined,
344
- ]);
345
-
346
- return filterUndefined({ html, md, css }) ?? {};
325
+ return this.effectiveFiles ?? {};
347
326
  }
348
327
 
349
328
  private async loadData(): Promise<void> {
@@ -219,7 +219,7 @@ export async function bootEmrouteApp(options?: BootOptions): Promise<EmrouteApp>
219
219
  // Register widgets eagerly (tag defined immediately, module loads on connectedCallback)
220
220
  const widgets = new WidgetRegistry();
221
221
  for (const entry of widgetEntries) {
222
- ComponentElement.registerLazy(entry.name, entry.files, moduleLoaders[entry.modulePath]);
222
+ ComponentElement.registerLazy(entry.name, moduleLoaders[entry.modulePath]!);
223
223
  }
224
224
 
225
225
  // Register custom elements — import all modules, define when loaded