@hypen-space/core 0.4.38 → 0.4.40

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/index.js CHANGED
@@ -521,6 +521,21 @@ class RenderError extends HypenError {
521
521
  }
522
522
  }
523
523
  function classifyEngineError(err) {
524
+ if (err && typeof err === "object" && "message" in err && "type" in err) {
525
+ const structured = err;
526
+ switch (structured.type) {
527
+ case "parseError":
528
+ return new ParseError(structured.message);
529
+ case "stateError":
530
+ return new StateError(structured.message);
531
+ case "renderError":
532
+ return new RenderError(structured.message);
533
+ case "actionError":
534
+ return new HypenError("ACTION_ERROR", structured.message);
535
+ default:
536
+ return new HypenError("UNKNOWN_ERROR", structured.message);
537
+ }
538
+ }
524
539
  const message = err instanceof Error ? err.message : String(err);
525
540
  if (message.startsWith("Parse error:")) {
526
541
  return new ParseError(message);
@@ -1226,7 +1241,11 @@ class HypenModuleInstance {
1226
1241
  const lastSeg = segments[segments.length - 1];
1227
1242
  target[lastSeg] = payload.value;
1228
1243
  });
1229
- this.callCreatedHandler();
1244
+ this._readyPromise = this.callCreatedHandler();
1245
+ }
1246
+ _readyPromise = Promise.resolve();
1247
+ async waitForReady() {
1248
+ await this._readyPromise;
1230
1249
  }
1231
1250
  createGlobalContextAPI() {
1232
1251
  if (!this.globalContext) {
@@ -1890,7 +1909,6 @@ var log7 = frameworkLoggers.context;
1890
1909
  class HypenGlobalContext {
1891
1910
  modules = new Map;
1892
1911
  typedEvents;
1893
- legacyEventBus = new Map;
1894
1912
  constructor() {
1895
1913
  this.typedEvents = new TypedEventEmitter;
1896
1914
  }
@@ -1933,57 +1951,30 @@ class HypenGlobalContext {
1933
1951
  return state2;
1934
1952
  }
1935
1953
  emit(event, payload) {
1936
- const handlers = this.legacyEventBus.get(event);
1937
- if (!handlers || handlers.size === 0) {
1954
+ if (this.typedEvents.listenerCount(event) === 0) {
1938
1955
  log7.debug(`Event "${event}" emitted but no listeners`);
1939
- } else {
1940
- log7.debug(`Emitting event: ${event}`, payload);
1941
- handlers.forEach((handler) => {
1942
- try {
1943
- handler(payload);
1944
- } catch (error) {
1945
- log7.error(`Error in event handler for "${event}":`, error);
1946
- }
1947
- });
1948
- }
1949
- if (this.typedEvents.listenerCount(event) > 0) {
1950
- this.typedEvents.emit(event, payload);
1956
+ return;
1951
1957
  }
1958
+ log7.debug(`Emitting event: ${event}`, payload);
1959
+ this.typedEvents.emit(event, payload);
1952
1960
  }
1953
1961
  on(event, handler) {
1954
- if (!this.legacyEventBus.has(event)) {
1955
- this.legacyEventBus.set(event, new Set);
1956
- }
1957
- const handlers = this.legacyEventBus.get(event);
1958
- handlers.add(handler);
1959
1962
  log7.debug(`Listening to event: ${event}`);
1960
- return () => {
1961
- handlers.delete(handler);
1962
- if (handlers.size === 0) {
1963
- this.legacyEventBus.delete(event);
1964
- }
1965
- };
1963
+ return this.typedEvents.on(event, handler);
1966
1964
  }
1967
1965
  off(event, handler) {
1968
- const handlers = this.legacyEventBus.get(event);
1969
- if (handlers) {
1970
- handlers.delete(handler);
1971
- if (handlers.size === 0) {
1972
- this.legacyEventBus.delete(event);
1973
- }
1974
- }
1966
+ this.typedEvents.off(event, handler);
1975
1967
  }
1976
1968
  clearEvent(event) {
1977
- this.legacyEventBus.delete(event);
1969
+ this.typedEvents.removeAllListeners(event);
1978
1970
  }
1979
1971
  clearAllEvents() {
1980
- this.legacyEventBus.clear();
1972
+ this.typedEvents.clearAll();
1981
1973
  }
1982
1974
  debug() {
1983
1975
  return {
1984
1976
  modules: this.getModuleIds(),
1985
- events: Array.from(this.legacyEventBus.keys()),
1986
- typedEvents: this.typedEvents.eventNames(),
1977
+ events: this.typedEvents.eventNames(),
1987
1978
  state: this.getGlobalState()
1988
1979
  };
1989
1980
  }
@@ -2628,6 +2619,35 @@ class ComponentResolver {
2628
2619
 
2629
2620
  // src/components/builtin.ts
2630
2621
  var log9 = frameworkLoggers.router;
2622
+ async function updateRouteVisibility(currentPath, engine, doc) {
2623
+ const targetDoc = doc ?? document;
2624
+ const routeElements = targetDoc.querySelectorAll('[data-hypen-type="route"]');
2625
+ let matchFound = false;
2626
+ for (let index2 = 0;index2 < routeElements.length; index2++) {
2627
+ const routeEl = routeElements[index2];
2628
+ const htmlEl = routeEl;
2629
+ const routePath = htmlEl.dataset.routePath || "/";
2630
+ const isMatch = routePath === currentPath;
2631
+ htmlEl.style.display = isMatch ? "flex" : "none";
2632
+ if (isMatch) {
2633
+ matchFound = true;
2634
+ const componentName = htmlEl.dataset.routeComponent;
2635
+ const isLazy = htmlEl.dataset.routeLazy === "true";
2636
+ const hasContent = htmlEl.children.length > 0;
2637
+ const shouldRender = componentName && engine && (isLazy || !hasContent);
2638
+ if (shouldRender) {
2639
+ try {
2640
+ await engine.renderLazyRoute(routePath, componentName, htmlEl);
2641
+ } catch (err) {
2642
+ log9.error(`Failed to render route ${routePath}:`, err);
2643
+ }
2644
+ }
2645
+ }
2646
+ }
2647
+ if (!matchFound) {
2648
+ log9.warn(`No route matched path: ${currentPath}. Available routes:`, Array.from(routeElements).map((el) => el.dataset.routePath));
2649
+ }
2650
+ }
2631
2651
  var Router = app.defineState({
2632
2652
  currentPath: "/",
2633
2653
  matchedRoute: null,
@@ -2643,40 +2663,13 @@ var Router = app.defineState({
2643
2663
  return;
2644
2664
  }
2645
2665
  const hypenEngine = context.__hypenEngine;
2646
- const updateRouteVisibility = async (currentPath) => {
2647
- const routeElements = document.querySelectorAll('[data-hypen-type="route"]');
2648
- let matchFound = false;
2649
- for (let index2 = 0;index2 < routeElements.length; index2++) {
2650
- const routeEl = routeElements[index2];
2651
- const htmlEl = routeEl;
2652
- const routePath = htmlEl.dataset.routePath || "/";
2653
- const isMatch = routePath === currentPath;
2654
- htmlEl.style.display = isMatch ? "flex" : "none";
2655
- if (isMatch) {
2656
- matchFound = true;
2657
- const componentName = htmlEl.dataset.routeComponent;
2658
- const isLazy = htmlEl.dataset.routeLazy === "true";
2659
- const hasContent = htmlEl.children.length > 0;
2660
- if (componentName && !hasContent && hypenEngine) {
2661
- try {
2662
- await hypenEngine.renderLazyRoute(routePath, componentName, htmlEl);
2663
- } catch (err) {
2664
- log9.error(`Failed to render route ${routePath}:`, err);
2665
- }
2666
- }
2667
- }
2668
- }
2669
- if (!matchFound) {
2670
- log9.warn(`No route matched path: ${currentPath}. Available routes:`, Array.from(routeElements).map((el) => el.dataset.routePath));
2671
- }
2672
- };
2673
2666
  setTimeout(() => {
2674
- updateRouteVisibility(state2.currentPath);
2667
+ updateRouteVisibility(state2.currentPath, hypenEngine);
2675
2668
  }, 100);
2676
2669
  router.onNavigate((routeState) => {
2677
2670
  state2.currentPath = routeState.currentPath;
2678
2671
  state2.routeParams = routeState.params;
2679
- updateRouteVisibility(routeState.currentPath);
2672
+ updateRouteVisibility(routeState.currentPath, hypenEngine);
2680
2673
  });
2681
2674
  }).build();
2682
2675
  var Route = app.defineState({}, { name: "__Route" }).build();
@@ -2783,4 +2776,4 @@ export {
2783
2776
  ActionError
2784
2777
  };
2785
2778
 
2786
- //# debugId=D79999CB9031D22F64756E2164756E21
2779
+ //# debugId=84498787A9B728DD64756E2164756E21