@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/app.d.ts +7 -0
- package/dist/app.js +21 -2
- package/dist/app.js.map +4 -4
- package/dist/components/builtin.d.ts +17 -0
- package/dist/components/builtin.js +53 -31
- package/dist/components/builtin.js.map +5 -5
- package/dist/context.d.ts +11 -20
- package/dist/context.js +10 -38
- package/dist/context.js.map +3 -3
- package/dist/index.browser.js +30 -39
- package/dist/index.browser.js.map +5 -5
- package/dist/index.js +61 -68
- package/dist/index.js.map +6 -6
- package/dist/remote/client.js +16 -1
- package/dist/remote/client.js.map +3 -3
- package/dist/remote/index.js +16 -1
- package/dist/remote/index.js.map +3 -3
- package/dist/result.js +16 -1
- package/dist/result.js.map +3 -3
- package/dist/retry.js +16 -1
- package/dist/retry.js.map +3 -3
- package/package.json +1 -1
- package/src/app.ts +13 -2
- package/src/components/builtin.ts +78 -56
- package/src/context.ts +22 -65
- package/src/result.ts +11 -0
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
|
-
|
|
1937
|
-
if (!handlers || handlers.size === 0) {
|
|
1954
|
+
if (this.typedEvents.listenerCount(event) === 0) {
|
|
1938
1955
|
log7.debug(`Event "${event}" emitted but no listeners`);
|
|
1939
|
-
|
|
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
|
-
|
|
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.
|
|
1969
|
+
this.typedEvents.removeAllListeners(event);
|
|
1978
1970
|
}
|
|
1979
1971
|
clearAllEvents() {
|
|
1980
|
-
this.
|
|
1972
|
+
this.typedEvents.clearAll();
|
|
1981
1973
|
}
|
|
1982
1974
|
debug() {
|
|
1983
1975
|
return {
|
|
1984
1976
|
modules: this.getModuleIds(),
|
|
1985
|
-
events:
|
|
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=
|
|
2779
|
+
//# debugId=84498787A9B728DD64756E2164756E21
|