@hypen-space/core 0.4.32 → 0.4.35
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 +73 -2
- package/dist/app.js +112 -9
- package/dist/app.js.map +6 -5
- package/dist/components/builtin.js +112 -9
- package/dist/components/builtin.js.map +6 -5
- package/dist/context.d.ts +8 -0
- package/dist/context.js +6 -2
- package/dist/context.js.map +3 -3
- package/dist/datasource.d.ts +168 -0
- package/dist/discovery.js +114 -9
- package/dist/discovery.js.map +7 -6
- package/dist/disposable.js +6 -2
- package/dist/disposable.js.map +2 -2
- package/dist/engine.browser.d.ts +15 -0
- package/dist/engine.browser.js +19 -2
- package/dist/engine.browser.js.map +3 -3
- package/dist/engine.d.ts +22 -0
- package/dist/engine.js +37 -3
- package/dist/engine.js.map +3 -3
- package/dist/events.js +6 -2
- package/dist/events.js.map +2 -2
- package/dist/index.browser.js +295 -179
- package/dist/index.browser.js.map +9 -8
- package/dist/index.d.ts +3 -1
- package/dist/index.js +298 -179
- package/dist/index.js.map +10 -9
- package/dist/loader.js +6 -2
- package/dist/loader.js.map +2 -2
- package/dist/logger.js +6 -2
- package/dist/logger.js.map +2 -2
- package/dist/plugin.js +6 -2
- package/dist/plugin.js.map +2 -2
- package/dist/remote/client.js +6 -2
- package/dist/remote/client.js.map +2 -2
- package/dist/remote/index.js +152 -11
- package/dist/remote/index.js.map +9 -8
- package/dist/remote/server.js +152 -11
- package/dist/remote/server.js.map +9 -8
- package/dist/renderer.js +6 -2
- package/dist/renderer.js.map +2 -2
- package/dist/resolver.js +6 -2
- package/dist/resolver.js.map +2 -2
- package/dist/router.d.ts +9 -0
- package/dist/router.js +186 -18
- package/dist/router.js.map +6 -5
- package/dist/state.js +13 -6
- package/dist/state.js.map +3 -3
- package/package.json +1 -1
- package/src/app.ts +121 -4
- package/src/context.ts +10 -2
- package/src/datasource.ts +252 -0
- package/src/discovery.ts +2 -0
- package/src/engine.browser.ts +30 -0
- package/src/engine.ts +56 -1
- package/src/index.ts +16 -0
- package/src/managed-router.ts +3 -0
- package/src/remote/server.ts +11 -2
- package/src/router.ts +36 -10
- package/src/state.ts +10 -3
- package/wasm-browser/README.md +10 -10
- package/wasm-browser/hypen_engine.d.ts +368 -131
- package/wasm-browser/hypen_engine.js +896 -645
- package/wasm-browser/hypen_engine_bg.wasm +0 -0
- package/wasm-browser/hypen_engine_bg.wasm.d.ts +20 -13
- package/wasm-browser/package.json +1 -1
- package/wasm-node/README.md +10 -10
- package/wasm-node/hypen_engine.d.ts +318 -89
- package/wasm-node/hypen_engine.js +832 -613
- package/wasm-node/hypen_engine_bg.wasm +0 -0
- package/wasm-node/hypen_engine_bg.wasm.d.ts +20 -13
- package/wasm-node/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -44,7 +44,9 @@ export type { Patch, Action, RenderCallback, ActionHandler as EngineActionHandle
|
|
|
44
44
|
export { app, HypenApp, HypenAppBuilder, HypenModuleInstance } from "./app.js";
|
|
45
45
|
export { hypen, state, item, index } from "./hypen.js";
|
|
46
46
|
export type { StateProxy, ItemProxy } from "./hypen.js";
|
|
47
|
-
export type { IEngine, ActionContext, GlobalContext, LifecycleHandler, ActionHandlerContext, ActionHandler, HypenModuleDefinition, HypenModule, DisconnectContext, ReconnectContext, ExpireContext, DisconnectHandler, ReconnectHandler, ExpireHandler, ErrorContext, ErrorHandler, ErrorHandlerResult, } from "./app.js";
|
|
47
|
+
export type { IEngine, ActionContext, GlobalContext, LifecycleHandler, ActionHandlerContext, ActionHandler, HypenModuleDefinition, HypenModule, DisconnectContext, ReconnectContext, ExpireContext, DisconnectHandler, ReconnectHandler, ExpireHandler, ErrorContext, ErrorHandler, ErrorHandlerResult, DataSourceAccessor, } from "./app.js";
|
|
48
|
+
export { DataSourceManager } from "./datasource.js";
|
|
49
|
+
export type { DataSourcePlugin, DataSourceStatus, DataSourceQuery, DataSourceSubscription, DataSourceChange, IDataSourceEngine, } from "./datasource.js";
|
|
48
50
|
export { createObservableState, batchStateUpdates, getStateSnapshot, isStateProxy, unwrapProxy, } from "./state.js";
|
|
49
51
|
export type { StatePath, StateChange, StateObserverOptions, } from "./state.js";
|
|
50
52
|
export { BaseRenderer, ConsoleRenderer } from "./renderer.js";
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
|
+
var __returnValue = (v) => v;
|
|
4
|
+
function __exportSetter(name, newValue) {
|
|
5
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
+
}
|
|
3
7
|
var __export = (target, all) => {
|
|
4
8
|
for (var name in all)
|
|
5
9
|
__defProp(target, name, {
|
|
6
10
|
get: all[name],
|
|
7
11
|
enumerable: true,
|
|
8
12
|
configurable: true,
|
|
9
|
-
set: (
|
|
13
|
+
set: __exportSetter.bind(all, name)
|
|
10
14
|
});
|
|
11
15
|
};
|
|
12
16
|
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
@@ -182,6 +186,59 @@ var init_result = __esm(() => {
|
|
|
182
186
|
};
|
|
183
187
|
});
|
|
184
188
|
|
|
189
|
+
// src/datasource.ts
|
|
190
|
+
class DataSourceManager {
|
|
191
|
+
plugins = new Map;
|
|
192
|
+
configs = new Map;
|
|
193
|
+
state = new Map;
|
|
194
|
+
engine;
|
|
195
|
+
constructor(engine) {
|
|
196
|
+
this.engine = engine;
|
|
197
|
+
}
|
|
198
|
+
async use(plugin, config) {
|
|
199
|
+
const { name } = plugin;
|
|
200
|
+
this.state.set(name, {});
|
|
201
|
+
this.plugins.set(name, plugin);
|
|
202
|
+
this.configs.set(name, config);
|
|
203
|
+
await plugin.connect(config, (change) => {
|
|
204
|
+
const current = this.state.get(name) ?? {};
|
|
205
|
+
for (const path of change.paths) {
|
|
206
|
+
if (path in change.values) {
|
|
207
|
+
current[path] = change.values[path];
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
this.state.set(name, current);
|
|
211
|
+
this.engine.setContext(name, current);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
get(name) {
|
|
215
|
+
return this.plugins.get(name);
|
|
216
|
+
}
|
|
217
|
+
has(name) {
|
|
218
|
+
return this.plugins.has(name);
|
|
219
|
+
}
|
|
220
|
+
getNames() {
|
|
221
|
+
return Array.from(this.plugins.keys());
|
|
222
|
+
}
|
|
223
|
+
getStatus(name) {
|
|
224
|
+
return this.plugins.get(name)?.status;
|
|
225
|
+
}
|
|
226
|
+
async remove(name) {
|
|
227
|
+
const plugin = this.plugins.get(name);
|
|
228
|
+
if (plugin) {
|
|
229
|
+
await plugin.disconnect();
|
|
230
|
+
this.plugins.delete(name);
|
|
231
|
+
this.configs.delete(name);
|
|
232
|
+
this.state.delete(name);
|
|
233
|
+
this.engine.removeContext(name);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
async disconnectAll() {
|
|
237
|
+
const names = Array.from(this.plugins.keys());
|
|
238
|
+
await Promise.all(names.map((name) => this.remove(name)));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
185
242
|
// src/state.ts
|
|
186
243
|
function deepClone(obj) {
|
|
187
244
|
if (obj === null || typeof obj !== "object") {
|
|
@@ -321,9 +378,11 @@ function createObservableState(initialState, options) {
|
|
|
321
378
|
notificationPending = false;
|
|
322
379
|
if (batchDepth === 0) {
|
|
323
380
|
notifyChange();
|
|
324
|
-
}
|
|
381
|
+
} else {}
|
|
325
382
|
});
|
|
326
383
|
}
|
|
384
|
+
} else {
|
|
385
|
+
pendingChange = pendingChange || { paths: [], newValues: {} };
|
|
327
386
|
}
|
|
328
387
|
}
|
|
329
388
|
const proxyCache = new WeakMap;
|
|
@@ -382,11 +441,12 @@ function createObservableState(initialState, options) {
|
|
|
382
441
|
return true;
|
|
383
442
|
},
|
|
384
443
|
deleteProperty(obj, prop) {
|
|
385
|
-
|
|
386
|
-
|
|
444
|
+
const existed = Object.prototype.hasOwnProperty.call(obj, prop);
|
|
445
|
+
const result = delete obj[prop];
|
|
446
|
+
if (existed) {
|
|
387
447
|
scheduleBatch();
|
|
388
448
|
}
|
|
389
|
-
return
|
|
449
|
+
return result;
|
|
390
450
|
}
|
|
391
451
|
});
|
|
392
452
|
proxyCache.set(target, proxy);
|
|
@@ -650,6 +710,7 @@ class HypenAppBuilder {
|
|
|
650
710
|
errorHandler;
|
|
651
711
|
template;
|
|
652
712
|
_registry;
|
|
713
|
+
dataSourceEntries = [];
|
|
653
714
|
constructor(initialState, options, registry) {
|
|
654
715
|
this.initialState = initialState;
|
|
655
716
|
this.options = options || {};
|
|
@@ -683,10 +744,19 @@ class HypenAppBuilder {
|
|
|
683
744
|
this.errorHandler = fn;
|
|
684
745
|
return this;
|
|
685
746
|
}
|
|
747
|
+
useDataSource(plugin, config2) {
|
|
748
|
+
this.dataSourceEntries.push({ plugin, config: config2 });
|
|
749
|
+
return this;
|
|
750
|
+
}
|
|
686
751
|
ui(template) {
|
|
687
752
|
this.template = template;
|
|
688
753
|
return this.build();
|
|
689
754
|
}
|
|
755
|
+
uiFile(path) {
|
|
756
|
+
const fs = __require("fs");
|
|
757
|
+
this.template = fs.readFileSync(path, "utf-8").trim();
|
|
758
|
+
return this.build();
|
|
759
|
+
}
|
|
690
760
|
build() {
|
|
691
761
|
const stateKeys = this.initialState !== null && typeof this.initialState === "object" ? Object.keys(this.initialState) : [];
|
|
692
762
|
const definition = {
|
|
@@ -697,6 +767,7 @@ class HypenAppBuilder {
|
|
|
697
767
|
version: this.options.version,
|
|
698
768
|
initialState: this.initialState,
|
|
699
769
|
template: this.template,
|
|
770
|
+
dataSources: this.dataSourceEntries.length > 0 ? this.dataSourceEntries : undefined,
|
|
700
771
|
handlers: {
|
|
701
772
|
onCreated: this.createdHandler,
|
|
702
773
|
onAction: this.actionHandlers,
|
|
@@ -758,6 +829,8 @@ class HypenModuleInstance {
|
|
|
758
829
|
router;
|
|
759
830
|
globalContext;
|
|
760
831
|
stateChangeCallbacks = [];
|
|
832
|
+
dataSourceManager;
|
|
833
|
+
dataSourceAccessor = {};
|
|
761
834
|
constructor(engine, definition, router, globalContext) {
|
|
762
835
|
this.engine = engine;
|
|
763
836
|
this.definition = definition;
|
|
@@ -787,7 +860,8 @@ class HypenModuleInstance {
|
|
|
787
860
|
const result = await this.executeAction(actionName, handler, {
|
|
788
861
|
action: actionCtx,
|
|
789
862
|
state: this.state,
|
|
790
|
-
context
|
|
863
|
+
context,
|
|
864
|
+
dataSources: this.dataSourceAccessor
|
|
791
865
|
});
|
|
792
866
|
if (!result.ok) {
|
|
793
867
|
const shouldRethrow = await this.handleError(result.error, { actionName });
|
|
@@ -830,8 +904,9 @@ class HypenModuleInstance {
|
|
|
830
904
|
on: (event, handler) => ctx.on(event, handler),
|
|
831
905
|
router: this.router
|
|
832
906
|
};
|
|
833
|
-
|
|
834
|
-
|
|
907
|
+
const ctxRecord = ctx;
|
|
908
|
+
if (ctxRecord.__hypenEngine) {
|
|
909
|
+
api.__hypenEngine = ctxRecord.__hypenEngine;
|
|
835
910
|
}
|
|
836
911
|
return api;
|
|
837
912
|
}
|
|
@@ -878,6 +953,25 @@ class HypenModuleInstance {
|
|
|
878
953
|
return false;
|
|
879
954
|
}
|
|
880
955
|
async callCreatedHandler() {
|
|
956
|
+
if (this.definition.dataSources?.length) {
|
|
957
|
+
const dsEngine = this.engine;
|
|
958
|
+
this.dataSourceManager = new DataSourceManager(dsEngine);
|
|
959
|
+
for (const { plugin, config: config2 } of this.definition.dataSources) {
|
|
960
|
+
try {
|
|
961
|
+
await this.dataSourceManager.use(plugin, config2);
|
|
962
|
+
this.dataSourceAccessor[plugin.name] = new Proxy(plugin, {
|
|
963
|
+
get(target, prop) {
|
|
964
|
+
if (typeof prop === "string" && !(prop in target)) {
|
|
965
|
+
return (...args) => target.call(prop, ...args);
|
|
966
|
+
}
|
|
967
|
+
return target[prop];
|
|
968
|
+
}
|
|
969
|
+
});
|
|
970
|
+
} catch (e) {
|
|
971
|
+
log2.error(`Failed to connect data source "${plugin.name}":`, e);
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
}
|
|
881
975
|
if (this.definition.handlers.onCreated) {
|
|
882
976
|
const context = this.globalContext ? this.createGlobalContextAPI() : undefined;
|
|
883
977
|
try {
|
|
@@ -897,6 +991,15 @@ class HypenModuleInstance {
|
|
|
897
991
|
async destroy() {
|
|
898
992
|
if (this.isDestroyed)
|
|
899
993
|
return;
|
|
994
|
+
if (this.dataSourceManager) {
|
|
995
|
+
try {
|
|
996
|
+
await this.dataSourceManager.disconnectAll();
|
|
997
|
+
} catch (e) {
|
|
998
|
+
log2.error("Error disconnecting data sources:", e);
|
|
999
|
+
}
|
|
1000
|
+
this.dataSourceManager = undefined;
|
|
1001
|
+
this.dataSourceAccessor = {};
|
|
1002
|
+
}
|
|
900
1003
|
if (this.definition.handlers.onDestroyed) {
|
|
901
1004
|
try {
|
|
902
1005
|
await this.definition.handlers.onDestroyed(this.state);
|
|
@@ -1036,14 +1139,165 @@ class ConsoleRenderer {
|
|
|
1036
1139
|
}
|
|
1037
1140
|
// src/router.ts
|
|
1038
1141
|
init_state();
|
|
1142
|
+
|
|
1143
|
+
// src/disposable.ts
|
|
1039
1144
|
init_logger();
|
|
1040
|
-
var log4 = frameworkLoggers.
|
|
1145
|
+
var log4 = frameworkLoggers.lifecycle;
|
|
1146
|
+
function isDisposable(obj) {
|
|
1147
|
+
return obj !== null && typeof obj === "object" && "dispose" in obj && typeof obj.dispose === "function";
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
class DisposableStack {
|
|
1151
|
+
stack = [];
|
|
1152
|
+
disposed = false;
|
|
1153
|
+
add(disposable) {
|
|
1154
|
+
if (this.disposed) {
|
|
1155
|
+
disposable.dispose();
|
|
1156
|
+
return disposable;
|
|
1157
|
+
}
|
|
1158
|
+
this.stack.push(disposable);
|
|
1159
|
+
return disposable;
|
|
1160
|
+
}
|
|
1161
|
+
addCallback(callback) {
|
|
1162
|
+
this.add({ dispose: callback });
|
|
1163
|
+
}
|
|
1164
|
+
addValue(value, dispose) {
|
|
1165
|
+
this.add({ dispose: () => dispose(value) });
|
|
1166
|
+
return value;
|
|
1167
|
+
}
|
|
1168
|
+
dispose() {
|
|
1169
|
+
if (this.disposed)
|
|
1170
|
+
return;
|
|
1171
|
+
this.disposed = true;
|
|
1172
|
+
while (this.stack.length > 0) {
|
|
1173
|
+
const item2 = this.stack.pop();
|
|
1174
|
+
try {
|
|
1175
|
+
item2.dispose();
|
|
1176
|
+
} catch (error) {
|
|
1177
|
+
log4.error("Error during dispose:", error);
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
get isDisposed() {
|
|
1182
|
+
return this.disposed;
|
|
1183
|
+
}
|
|
1184
|
+
get size() {
|
|
1185
|
+
return this.stack.length;
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
function disposableListener(target, event, handler, options) {
|
|
1189
|
+
target.addEventListener(event, handler, options);
|
|
1190
|
+
return {
|
|
1191
|
+
dispose: () => target.removeEventListener(event, handler, options)
|
|
1192
|
+
};
|
|
1193
|
+
}
|
|
1194
|
+
function disposableTimeout(callback, ms) {
|
|
1195
|
+
const id = setTimeout(callback, ms);
|
|
1196
|
+
return {
|
|
1197
|
+
id,
|
|
1198
|
+
dispose: () => clearTimeout(id)
|
|
1199
|
+
};
|
|
1200
|
+
}
|
|
1201
|
+
function disposableInterval(callback, ms) {
|
|
1202
|
+
const id = setInterval(callback, ms);
|
|
1203
|
+
return {
|
|
1204
|
+
id,
|
|
1205
|
+
dispose: () => clearInterval(id)
|
|
1206
|
+
};
|
|
1207
|
+
}
|
|
1208
|
+
function disposableWebSocket(ws) {
|
|
1209
|
+
return {
|
|
1210
|
+
dispose: () => {
|
|
1211
|
+
if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
|
|
1212
|
+
ws.close();
|
|
1213
|
+
}
|
|
1214
|
+
}
|
|
1215
|
+
};
|
|
1216
|
+
}
|
|
1217
|
+
function disposableAbortController() {
|
|
1218
|
+
const controller = new AbortController;
|
|
1219
|
+
return {
|
|
1220
|
+
controller,
|
|
1221
|
+
signal: controller.signal,
|
|
1222
|
+
dispose: () => controller.abort()
|
|
1223
|
+
};
|
|
1224
|
+
}
|
|
1225
|
+
function disposableSubscription(unsubscribe) {
|
|
1226
|
+
return { dispose: unsubscribe };
|
|
1227
|
+
}
|
|
1228
|
+
var ELEMENT_DISPOSABLES = Symbol("hypen.disposables");
|
|
1229
|
+
function getElementDisposables(element) {
|
|
1230
|
+
const existing = element[ELEMENT_DISPOSABLES];
|
|
1231
|
+
if (existing instanceof DisposableStack) {
|
|
1232
|
+
return existing;
|
|
1233
|
+
}
|
|
1234
|
+
const stack = new DisposableStack;
|
|
1235
|
+
element[ELEMENT_DISPOSABLES] = stack;
|
|
1236
|
+
return stack;
|
|
1237
|
+
}
|
|
1238
|
+
function disposeElement(element) {
|
|
1239
|
+
const stack = element[ELEMENT_DISPOSABLES];
|
|
1240
|
+
if (stack instanceof DisposableStack) {
|
|
1241
|
+
stack.dispose();
|
|
1242
|
+
delete element[ELEMENT_DISPOSABLES];
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
function hasElementDisposables(element) {
|
|
1246
|
+
return element[ELEMENT_DISPOSABLES] instanceof DisposableStack;
|
|
1247
|
+
}
|
|
1248
|
+
|
|
1249
|
+
class DisposableMixin {
|
|
1250
|
+
disposables = new DisposableStack;
|
|
1251
|
+
track(disposable) {
|
|
1252
|
+
return this.disposables.add(disposable);
|
|
1253
|
+
}
|
|
1254
|
+
onDispose(callback) {
|
|
1255
|
+
this.disposables.addCallback(callback);
|
|
1256
|
+
}
|
|
1257
|
+
dispose() {
|
|
1258
|
+
this.disposables.dispose();
|
|
1259
|
+
}
|
|
1260
|
+
}
|
|
1261
|
+
function compositeDisposable(...disposables) {
|
|
1262
|
+
return {
|
|
1263
|
+
dispose: () => {
|
|
1264
|
+
for (const d of disposables) {
|
|
1265
|
+
try {
|
|
1266
|
+
d.dispose();
|
|
1267
|
+
} catch (error) {
|
|
1268
|
+
log4.error("Error during dispose:", error);
|
|
1269
|
+
}
|
|
1270
|
+
}
|
|
1271
|
+
}
|
|
1272
|
+
};
|
|
1273
|
+
}
|
|
1274
|
+
async function using(resource, fn) {
|
|
1275
|
+
const r = typeof resource === "function" ? resource() : resource;
|
|
1276
|
+
try {
|
|
1277
|
+
return await fn(r);
|
|
1278
|
+
} finally {
|
|
1279
|
+
r.dispose();
|
|
1280
|
+
}
|
|
1281
|
+
}
|
|
1282
|
+
function usingSync(resource, fn) {
|
|
1283
|
+
const r = typeof resource === "function" ? resource() : resource;
|
|
1284
|
+
try {
|
|
1285
|
+
return fn(r);
|
|
1286
|
+
} finally {
|
|
1287
|
+
r.dispose();
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
|
|
1291
|
+
// src/router.ts
|
|
1292
|
+
init_logger();
|
|
1293
|
+
var log5 = frameworkLoggers.router;
|
|
1041
1294
|
|
|
1042
1295
|
class HypenRouter {
|
|
1043
1296
|
state;
|
|
1044
1297
|
subscribers = new Set;
|
|
1045
1298
|
isInitialized = false;
|
|
1046
1299
|
isUpdating = false;
|
|
1300
|
+
browserListeners = [];
|
|
1047
1301
|
constructor() {
|
|
1048
1302
|
this.state = createObservableState({
|
|
1049
1303
|
currentPath: "/",
|
|
@@ -1064,18 +1318,18 @@ class HypenRouter {
|
|
|
1064
1318
|
this.state.currentPath = initialPath;
|
|
1065
1319
|
this.state.params = {};
|
|
1066
1320
|
this.state.query = this.parseQuery();
|
|
1067
|
-
|
|
1321
|
+
this.browserListeners.push(disposableListener(window, "popstate", () => {
|
|
1068
1322
|
const newPath = this.getPathFromBrowser();
|
|
1069
1323
|
this.updatePath(newPath, false);
|
|
1070
|
-
});
|
|
1071
|
-
|
|
1324
|
+
}));
|
|
1325
|
+
this.browserListeners.push(disposableListener(window, "hashchange", () => {
|
|
1072
1326
|
if (this.isUpdating)
|
|
1073
1327
|
return;
|
|
1074
1328
|
const newPath = this.getPathFromBrowser();
|
|
1075
1329
|
this.updatePath(newPath, false);
|
|
1076
|
-
});
|
|
1330
|
+
}));
|
|
1077
1331
|
this.isInitialized = true;
|
|
1078
|
-
|
|
1332
|
+
log5.debug("Router initialized at:", initialPath);
|
|
1079
1333
|
}
|
|
1080
1334
|
getPathFromBrowser() {
|
|
1081
1335
|
if (typeof window === "undefined")
|
|
@@ -1096,21 +1350,21 @@ class HypenRouter {
|
|
|
1096
1350
|
return query;
|
|
1097
1351
|
}
|
|
1098
1352
|
push(path) {
|
|
1099
|
-
|
|
1353
|
+
log5.debug("push:", path);
|
|
1100
1354
|
this.updatePath(path, true);
|
|
1101
1355
|
}
|
|
1102
1356
|
replace(path) {
|
|
1103
|
-
|
|
1357
|
+
log5.debug("replace:", path);
|
|
1104
1358
|
this.updatePath(path, true, true);
|
|
1105
1359
|
}
|
|
1106
1360
|
back() {
|
|
1107
|
-
|
|
1361
|
+
log5.debug("back");
|
|
1108
1362
|
if (typeof window !== "undefined") {
|
|
1109
1363
|
window.history.back();
|
|
1110
1364
|
}
|
|
1111
1365
|
}
|
|
1112
1366
|
forward() {
|
|
1113
|
-
|
|
1367
|
+
log5.debug("forward");
|
|
1114
1368
|
if (typeof window !== "undefined") {
|
|
1115
1369
|
window.history.forward();
|
|
1116
1370
|
}
|
|
@@ -1206,7 +1460,7 @@ class HypenRouter {
|
|
|
1206
1460
|
try {
|
|
1207
1461
|
callback(this.getState());
|
|
1208
1462
|
} catch (error) {
|
|
1209
|
-
|
|
1463
|
+
log5.error("Error in route subscriber:", error);
|
|
1210
1464
|
}
|
|
1211
1465
|
return () => {
|
|
1212
1466
|
this.subscribers.delete(callback);
|
|
@@ -1218,7 +1472,7 @@ class HypenRouter {
|
|
|
1218
1472
|
try {
|
|
1219
1473
|
callback(routeState);
|
|
1220
1474
|
} catch (error) {
|
|
1221
|
-
|
|
1475
|
+
log5.error("Error in route subscriber:", error);
|
|
1222
1476
|
}
|
|
1223
1477
|
});
|
|
1224
1478
|
}
|
|
@@ -1232,10 +1486,22 @@ class HypenRouter {
|
|
|
1232
1486
|
const queryString = new URLSearchParams(query).toString();
|
|
1233
1487
|
return `${path}?${queryString}`;
|
|
1234
1488
|
}
|
|
1489
|
+
dispose() {
|
|
1490
|
+
for (const listener of this.browserListeners) {
|
|
1491
|
+
listener.dispose();
|
|
1492
|
+
}
|
|
1493
|
+
this.browserListeners = [];
|
|
1494
|
+
this.subscribers.clear();
|
|
1495
|
+
this.isInitialized = false;
|
|
1496
|
+
log5.debug("Router disposed");
|
|
1497
|
+
}
|
|
1498
|
+
[Symbol.dispose]() {
|
|
1499
|
+
this.dispose();
|
|
1500
|
+
}
|
|
1235
1501
|
}
|
|
1236
1502
|
// src/events.ts
|
|
1237
1503
|
init_logger();
|
|
1238
|
-
var
|
|
1504
|
+
var log6 = frameworkLoggers.events;
|
|
1239
1505
|
|
|
1240
1506
|
class TypedEventEmitter {
|
|
1241
1507
|
eventBus = new Map;
|
|
@@ -1248,7 +1514,7 @@ class TypedEventEmitter {
|
|
|
1248
1514
|
try {
|
|
1249
1515
|
handler(payload);
|
|
1250
1516
|
} catch (error) {
|
|
1251
|
-
|
|
1517
|
+
log6.error(`Error in event handler for "${String(event)}":`, error);
|
|
1252
1518
|
}
|
|
1253
1519
|
});
|
|
1254
1520
|
}
|
|
@@ -1300,7 +1566,7 @@ function createEventEmitter() {
|
|
|
1300
1566
|
}
|
|
1301
1567
|
// src/context.ts
|
|
1302
1568
|
init_logger();
|
|
1303
|
-
var
|
|
1569
|
+
var log7 = frameworkLoggers.context;
|
|
1304
1570
|
|
|
1305
1571
|
class HypenGlobalContext {
|
|
1306
1572
|
modules = new Map;
|
|
@@ -1314,14 +1580,14 @@ class HypenGlobalContext {
|
|
|
1314
1580
|
}
|
|
1315
1581
|
registerModule(id, instance) {
|
|
1316
1582
|
if (this.modules.has(id)) {
|
|
1317
|
-
|
|
1583
|
+
log7.warn(`Module "${id}" is already registered. Overwriting.`);
|
|
1318
1584
|
}
|
|
1319
1585
|
this.modules.set(id, instance);
|
|
1320
|
-
|
|
1586
|
+
log7.debug(`Registered module: ${id}`);
|
|
1321
1587
|
}
|
|
1322
1588
|
unregisterModule(id) {
|
|
1323
1589
|
this.modules.delete(id);
|
|
1324
|
-
|
|
1590
|
+
log7.debug(`Unregistered module: ${id}`);
|
|
1325
1591
|
}
|
|
1326
1592
|
getModule(id) {
|
|
1327
1593
|
const module = this.modules.get(id);
|
|
@@ -1350,14 +1616,14 @@ class HypenGlobalContext {
|
|
|
1350
1616
|
emit(event, payload) {
|
|
1351
1617
|
const handlers = this.legacyEventBus.get(event);
|
|
1352
1618
|
if (!handlers || handlers.size === 0) {
|
|
1353
|
-
|
|
1619
|
+
log7.debug(`Event "${event}" emitted but no listeners`);
|
|
1354
1620
|
} else {
|
|
1355
|
-
|
|
1621
|
+
log7.debug(`Emitting event: ${event}`, payload);
|
|
1356
1622
|
handlers.forEach((handler) => {
|
|
1357
1623
|
try {
|
|
1358
1624
|
handler(payload);
|
|
1359
1625
|
} catch (error) {
|
|
1360
|
-
|
|
1626
|
+
log7.error(`Error in event handler for "${event}":`, error);
|
|
1361
1627
|
}
|
|
1362
1628
|
});
|
|
1363
1629
|
}
|
|
@@ -1371,7 +1637,7 @@ class HypenGlobalContext {
|
|
|
1371
1637
|
}
|
|
1372
1638
|
const handlers = this.legacyEventBus.get(event);
|
|
1373
1639
|
handlers.add(handler);
|
|
1374
|
-
|
|
1640
|
+
log7.debug(`Listening to event: ${event}`);
|
|
1375
1641
|
return () => {
|
|
1376
1642
|
handlers.delete(handler);
|
|
1377
1643
|
if (handlers.size === 0) {
|
|
@@ -1406,154 +1672,6 @@ class HypenGlobalContext {
|
|
|
1406
1672
|
// src/remote/client.ts
|
|
1407
1673
|
init_result();
|
|
1408
1674
|
|
|
1409
|
-
// src/disposable.ts
|
|
1410
|
-
init_logger();
|
|
1411
|
-
var log7 = frameworkLoggers.lifecycle;
|
|
1412
|
-
function isDisposable(obj) {
|
|
1413
|
-
return obj !== null && typeof obj === "object" && "dispose" in obj && typeof obj.dispose === "function";
|
|
1414
|
-
}
|
|
1415
|
-
|
|
1416
|
-
class DisposableStack {
|
|
1417
|
-
stack = [];
|
|
1418
|
-
disposed = false;
|
|
1419
|
-
add(disposable) {
|
|
1420
|
-
if (this.disposed) {
|
|
1421
|
-
disposable.dispose();
|
|
1422
|
-
return disposable;
|
|
1423
|
-
}
|
|
1424
|
-
this.stack.push(disposable);
|
|
1425
|
-
return disposable;
|
|
1426
|
-
}
|
|
1427
|
-
addCallback(callback) {
|
|
1428
|
-
this.add({ dispose: callback });
|
|
1429
|
-
}
|
|
1430
|
-
addValue(value, dispose) {
|
|
1431
|
-
this.add({ dispose: () => dispose(value) });
|
|
1432
|
-
return value;
|
|
1433
|
-
}
|
|
1434
|
-
dispose() {
|
|
1435
|
-
if (this.disposed)
|
|
1436
|
-
return;
|
|
1437
|
-
this.disposed = true;
|
|
1438
|
-
while (this.stack.length > 0) {
|
|
1439
|
-
const item2 = this.stack.pop();
|
|
1440
|
-
try {
|
|
1441
|
-
item2.dispose();
|
|
1442
|
-
} catch (error) {
|
|
1443
|
-
log7.error("Error during dispose:", error);
|
|
1444
|
-
}
|
|
1445
|
-
}
|
|
1446
|
-
}
|
|
1447
|
-
get isDisposed() {
|
|
1448
|
-
return this.disposed;
|
|
1449
|
-
}
|
|
1450
|
-
get size() {
|
|
1451
|
-
return this.stack.length;
|
|
1452
|
-
}
|
|
1453
|
-
}
|
|
1454
|
-
function disposableListener(target, event, handler, options) {
|
|
1455
|
-
target.addEventListener(event, handler, options);
|
|
1456
|
-
return {
|
|
1457
|
-
dispose: () => target.removeEventListener(event, handler, options)
|
|
1458
|
-
};
|
|
1459
|
-
}
|
|
1460
|
-
function disposableTimeout(callback, ms) {
|
|
1461
|
-
const id = setTimeout(callback, ms);
|
|
1462
|
-
return {
|
|
1463
|
-
id,
|
|
1464
|
-
dispose: () => clearTimeout(id)
|
|
1465
|
-
};
|
|
1466
|
-
}
|
|
1467
|
-
function disposableInterval(callback, ms) {
|
|
1468
|
-
const id = setInterval(callback, ms);
|
|
1469
|
-
return {
|
|
1470
|
-
id,
|
|
1471
|
-
dispose: () => clearInterval(id)
|
|
1472
|
-
};
|
|
1473
|
-
}
|
|
1474
|
-
function disposableWebSocket(ws) {
|
|
1475
|
-
return {
|
|
1476
|
-
dispose: () => {
|
|
1477
|
-
if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
|
|
1478
|
-
ws.close();
|
|
1479
|
-
}
|
|
1480
|
-
}
|
|
1481
|
-
};
|
|
1482
|
-
}
|
|
1483
|
-
function disposableAbortController() {
|
|
1484
|
-
const controller = new AbortController;
|
|
1485
|
-
return {
|
|
1486
|
-
controller,
|
|
1487
|
-
signal: controller.signal,
|
|
1488
|
-
dispose: () => controller.abort()
|
|
1489
|
-
};
|
|
1490
|
-
}
|
|
1491
|
-
function disposableSubscription(unsubscribe) {
|
|
1492
|
-
return { dispose: unsubscribe };
|
|
1493
|
-
}
|
|
1494
|
-
var ELEMENT_DISPOSABLES = Symbol("hypen.disposables");
|
|
1495
|
-
function getElementDisposables(element) {
|
|
1496
|
-
const existing = element[ELEMENT_DISPOSABLES];
|
|
1497
|
-
if (existing instanceof DisposableStack) {
|
|
1498
|
-
return existing;
|
|
1499
|
-
}
|
|
1500
|
-
const stack = new DisposableStack;
|
|
1501
|
-
element[ELEMENT_DISPOSABLES] = stack;
|
|
1502
|
-
return stack;
|
|
1503
|
-
}
|
|
1504
|
-
function disposeElement(element) {
|
|
1505
|
-
const stack = element[ELEMENT_DISPOSABLES];
|
|
1506
|
-
if (stack instanceof DisposableStack) {
|
|
1507
|
-
stack.dispose();
|
|
1508
|
-
delete element[ELEMENT_DISPOSABLES];
|
|
1509
|
-
}
|
|
1510
|
-
}
|
|
1511
|
-
function hasElementDisposables(element) {
|
|
1512
|
-
return element[ELEMENT_DISPOSABLES] instanceof DisposableStack;
|
|
1513
|
-
}
|
|
1514
|
-
|
|
1515
|
-
class DisposableMixin {
|
|
1516
|
-
disposables = new DisposableStack;
|
|
1517
|
-
track(disposable) {
|
|
1518
|
-
return this.disposables.add(disposable);
|
|
1519
|
-
}
|
|
1520
|
-
onDispose(callback) {
|
|
1521
|
-
this.disposables.addCallback(callback);
|
|
1522
|
-
}
|
|
1523
|
-
dispose() {
|
|
1524
|
-
this.disposables.dispose();
|
|
1525
|
-
}
|
|
1526
|
-
}
|
|
1527
|
-
function compositeDisposable(...disposables) {
|
|
1528
|
-
return {
|
|
1529
|
-
dispose: () => {
|
|
1530
|
-
for (const d of disposables) {
|
|
1531
|
-
try {
|
|
1532
|
-
d.dispose();
|
|
1533
|
-
} catch (error) {
|
|
1534
|
-
log7.error("Error during dispose:", error);
|
|
1535
|
-
}
|
|
1536
|
-
}
|
|
1537
|
-
}
|
|
1538
|
-
};
|
|
1539
|
-
}
|
|
1540
|
-
async function using(resource, fn) {
|
|
1541
|
-
const r = typeof resource === "function" ? resource() : resource;
|
|
1542
|
-
try {
|
|
1543
|
-
return await fn(r);
|
|
1544
|
-
} finally {
|
|
1545
|
-
r.dispose();
|
|
1546
|
-
}
|
|
1547
|
-
}
|
|
1548
|
-
function usingSync(resource, fn) {
|
|
1549
|
-
const r = typeof resource === "function" ? resource() : resource;
|
|
1550
|
-
try {
|
|
1551
|
-
return fn(r);
|
|
1552
|
-
} finally {
|
|
1553
|
-
r.dispose();
|
|
1554
|
-
}
|
|
1555
|
-
}
|
|
1556
|
-
|
|
1557
1675
|
// src/retry.ts
|
|
1558
1676
|
init_result();
|
|
1559
1677
|
var DEFAULT_OPTIONS = {
|
|
@@ -2345,6 +2463,7 @@ export {
|
|
|
2345
2463
|
Err,
|
|
2346
2464
|
DisposableStack,
|
|
2347
2465
|
DisposableMixin,
|
|
2466
|
+
DataSourceManager,
|
|
2348
2467
|
ConsoleRenderer,
|
|
2349
2468
|
ConnectionError,
|
|
2350
2469
|
ComponentResolver,
|
|
@@ -2352,4 +2471,4 @@ export {
|
|
|
2352
2471
|
ActionError
|
|
2353
2472
|
};
|
|
2354
2473
|
|
|
2355
|
-
//# debugId=
|
|
2474
|
+
//# debugId=D4B51C3A115B4AA664756E2164756E21
|