@hypen-space/core 0.3.9 → 0.3.10
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/{src/app.js → app.js} +15 -2
- package/dist/{src/app.js.map → app.js.map} +3 -3
- package/dist/{src/components → components}/builtin.js +22 -7
- package/dist/{src/components → components}/builtin.js.map +4 -4
- package/dist/context.js +387 -0
- package/dist/context.js.map +12 -0
- package/dist/{src/discovery.js → discovery.js} +18 -4
- package/dist/{src/discovery.js.map → discovery.js.map} +4 -4
- package/dist/disposable.js +377 -0
- package/dist/disposable.js.map +11 -0
- package/dist/engine.browser.js +347 -0
- package/dist/engine.browser.js.map +11 -0
- package/dist/engine.js +320 -0
- package/dist/engine.js.map +11 -0
- package/dist/events.js +282 -0
- package/dist/events.js.map +11 -0
- package/dist/{src/index.browser.js → index.browser.js} +278 -229
- package/dist/index.browser.js.map +22 -0
- package/dist/{src/index.js → index.js} +1377 -1330
- package/dist/index.js.map +31 -0
- package/dist/loader.js +286 -0
- package/dist/loader.js.map +11 -0
- package/dist/plugin.js +334 -0
- package/dist/plugin.js.map +11 -0
- package/dist/{src/remote → remote}/client.js +215 -11
- package/dist/remote/client.js.map +14 -0
- package/dist/{src/remote → remote}/index.js +234 -210
- package/dist/remote/index.js.map +19 -0
- package/dist/remote/server.js +1442 -0
- package/dist/remote/server.js.map +16 -0
- package/dist/renderer.js +264 -0
- package/dist/renderer.js.map +11 -0
- package/dist/{src/router.js → router.js} +209 -8
- package/dist/router.js.map +12 -0
- package/package.json +69 -69
- package/src/components/builtin.ts +9 -6
- package/src/context.ts +10 -7
- package/src/discovery.ts +3 -2
- package/src/disposable.ts +6 -2
- package/src/engine.browser.ts +30 -11
- package/src/engine.ts +6 -3
- package/src/events.ts +5 -1
- package/src/index.browser.ts +20 -0
- package/src/index.ts +2 -0
- package/src/loader.ts +8 -8
- package/src/logger.ts +28 -0
- package/src/plugin.ts +2 -1
- package/src/remote/client.ts +8 -9
- package/src/remote/server.ts +6 -3
- package/src/renderer.ts +4 -5
- package/src/router.ts +10 -7
- package/wasm-browser/hypen_engine_bg.wasm +0 -0
- package/wasm-browser/package.json +1 -1
- package/wasm-node/hypen_engine_bg.wasm +0 -0
- package/wasm-node/package.json +4 -3
- package/dist/src/context.js +0 -182
- package/dist/src/context.js.map +0 -11
- package/dist/src/engine.browser.js +0 -137
- package/dist/src/engine.browser.js.map +0 -10
- package/dist/src/engine.js +0 -119
- package/dist/src/engine.js.map +0 -10
- package/dist/src/events.js +0 -80
- package/dist/src/events.js.map +0 -10
- package/dist/src/index.browser.js.map +0 -22
- package/dist/src/index.js.map +0 -31
- package/dist/src/loader.js +0 -85
- package/dist/src/loader.js.map +0 -10
- package/dist/src/plugin.js +0 -134
- package/dist/src/plugin.js.map +0 -10
- package/dist/src/remote/client.js.map +0 -13
- package/dist/src/remote/index.js.map +0 -19
- package/dist/src/renderer.js +0 -66
- package/dist/src/renderer.js.map +0 -10
- package/dist/src/router.js.map +0 -11
- /package/dist/{src/remote → remote}/types.js +0 -0
- /package/dist/{src/remote → remote}/types.js.map +0 -0
- /package/dist/{src/resolver.js → resolver.js} +0 -0
- /package/dist/{src/resolver.js.map → resolver.js.map} +0 -0
- /package/dist/{src/state.js → state.js} +0 -0
- /package/dist/{src/state.js.map → state.js.map} +0 -0
|
@@ -258,8 +258,209 @@ var init_state = __esm(() => {
|
|
|
258
258
|
RAW_TARGET = Symbol.for("hypen.rawTarget");
|
|
259
259
|
});
|
|
260
260
|
|
|
261
|
+
// src/logger.ts
|
|
262
|
+
function isProduction() {
|
|
263
|
+
if (typeof process !== "undefined" && process.env) {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
function setLogLevel(level) {
|
|
269
|
+
config.level = level;
|
|
270
|
+
}
|
|
271
|
+
function getLogLevel() {
|
|
272
|
+
return config.level;
|
|
273
|
+
}
|
|
274
|
+
function configureLogger(options) {
|
|
275
|
+
config = { ...config, ...options };
|
|
276
|
+
}
|
|
277
|
+
function enableLogging() {
|
|
278
|
+
config.level = "debug";
|
|
279
|
+
}
|
|
280
|
+
function disableLogging() {
|
|
281
|
+
config.level = "none";
|
|
282
|
+
}
|
|
283
|
+
function setDebugMode(enabled) {
|
|
284
|
+
config.level = enabled ? "debug" : "error";
|
|
285
|
+
}
|
|
286
|
+
function isDebugMode() {
|
|
287
|
+
return config.level === "debug";
|
|
288
|
+
}
|
|
289
|
+
function shouldLog(level) {
|
|
290
|
+
return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[config.level];
|
|
291
|
+
}
|
|
292
|
+
function formatTag(tag, level) {
|
|
293
|
+
const timestamp = config.timestamps ? `${new Date().toISOString()} ` : "";
|
|
294
|
+
if (config.colors && level !== "none") {
|
|
295
|
+
const color = LOG_LEVEL_COLORS[level];
|
|
296
|
+
return `${timestamp}${color}[${tag}]${RESET_COLOR}`;
|
|
297
|
+
}
|
|
298
|
+
return `${timestamp}[${tag}]`;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
class Logger {
|
|
302
|
+
tag;
|
|
303
|
+
constructor(tag) {
|
|
304
|
+
this.tag = tag;
|
|
305
|
+
}
|
|
306
|
+
debug(...args) {
|
|
307
|
+
if (!shouldLog("debug"))
|
|
308
|
+
return;
|
|
309
|
+
if (config.handler) {
|
|
310
|
+
config.handler.debug(this.tag, ...args);
|
|
311
|
+
} else {
|
|
312
|
+
console.log(formatTag(this.tag, "debug"), ...args);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
info(...args) {
|
|
316
|
+
if (!shouldLog("info"))
|
|
317
|
+
return;
|
|
318
|
+
if (config.handler) {
|
|
319
|
+
config.handler.info(this.tag, ...args);
|
|
320
|
+
} else {
|
|
321
|
+
console.info(formatTag(this.tag, "info"), ...args);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
warn(...args) {
|
|
325
|
+
if (!shouldLog("warn"))
|
|
326
|
+
return;
|
|
327
|
+
if (config.handler) {
|
|
328
|
+
config.handler.warn(this.tag, ...args);
|
|
329
|
+
} else {
|
|
330
|
+
console.warn(formatTag(this.tag, "warn"), ...args);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
error(...args) {
|
|
334
|
+
if (!shouldLog("error"))
|
|
335
|
+
return;
|
|
336
|
+
if (config.handler) {
|
|
337
|
+
config.handler.error(this.tag, ...args);
|
|
338
|
+
} else {
|
|
339
|
+
console.error(formatTag(this.tag, "error"), ...args);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
time(label, fn) {
|
|
343
|
+
if (!shouldLog("debug")) {
|
|
344
|
+
return fn();
|
|
345
|
+
}
|
|
346
|
+
const start = performance.now();
|
|
347
|
+
try {
|
|
348
|
+
return fn();
|
|
349
|
+
} finally {
|
|
350
|
+
const duration = performance.now() - start;
|
|
351
|
+
this.debug(`${label}: ${duration.toFixed(2)}ms`);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
async timeAsync(label, fn) {
|
|
355
|
+
if (!shouldLog("debug")) {
|
|
356
|
+
return fn();
|
|
357
|
+
}
|
|
358
|
+
const start = performance.now();
|
|
359
|
+
try {
|
|
360
|
+
return await fn();
|
|
361
|
+
} finally {
|
|
362
|
+
const duration = performance.now() - start;
|
|
363
|
+
this.debug(`${label}: ${duration.toFixed(2)}ms`);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
child(subTag) {
|
|
367
|
+
return new Logger(`${this.tag}:${subTag}`);
|
|
368
|
+
}
|
|
369
|
+
debugIf(condition, ...args) {
|
|
370
|
+
if (condition)
|
|
371
|
+
this.debug(...args);
|
|
372
|
+
}
|
|
373
|
+
warnIf(condition, ...args) {
|
|
374
|
+
if (condition)
|
|
375
|
+
this.warn(...args);
|
|
376
|
+
}
|
|
377
|
+
errorIf(condition, ...args) {
|
|
378
|
+
if (condition)
|
|
379
|
+
this.error(...args);
|
|
380
|
+
}
|
|
381
|
+
loggedOnce = new Set;
|
|
382
|
+
warnOnce(key, ...args) {
|
|
383
|
+
if (this.loggedOnce.has(key))
|
|
384
|
+
return;
|
|
385
|
+
this.loggedOnce.add(key);
|
|
386
|
+
this.warn(...args);
|
|
387
|
+
}
|
|
388
|
+
debugOnce(key, ...args) {
|
|
389
|
+
if (this.loggedOnce.has(key))
|
|
390
|
+
return;
|
|
391
|
+
this.loggedOnce.add(key);
|
|
392
|
+
this.debug(...args);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
function createLogger(tag) {
|
|
396
|
+
return new Logger(tag);
|
|
397
|
+
}
|
|
398
|
+
var LOG_LEVEL_ORDER, LOG_LEVEL_COLORS, RESET_COLOR = "\x1B[0m", config, logger, log, frameworkLoggers;
|
|
399
|
+
var init_logger = __esm(() => {
|
|
400
|
+
LOG_LEVEL_ORDER = {
|
|
401
|
+
debug: 0,
|
|
402
|
+
info: 1,
|
|
403
|
+
warn: 2,
|
|
404
|
+
error: 3,
|
|
405
|
+
none: 4
|
|
406
|
+
};
|
|
407
|
+
LOG_LEVEL_COLORS = {
|
|
408
|
+
debug: "\x1B[36m",
|
|
409
|
+
info: "\x1B[32m",
|
|
410
|
+
warn: "\x1B[33m",
|
|
411
|
+
error: "\x1B[31m"
|
|
412
|
+
};
|
|
413
|
+
config = {
|
|
414
|
+
level: isProduction() ? "error" : "debug",
|
|
415
|
+
colors: true,
|
|
416
|
+
timestamps: false
|
|
417
|
+
};
|
|
418
|
+
logger = createLogger("Hypen");
|
|
419
|
+
log = {
|
|
420
|
+
debug: (tag, ...args) => {
|
|
421
|
+
if (!shouldLog("debug"))
|
|
422
|
+
return;
|
|
423
|
+
console.log(formatTag(tag, "debug"), ...args);
|
|
424
|
+
},
|
|
425
|
+
info: (tag, ...args) => {
|
|
426
|
+
if (!shouldLog("info"))
|
|
427
|
+
return;
|
|
428
|
+
console.info(formatTag(tag, "info"), ...args);
|
|
429
|
+
},
|
|
430
|
+
warn: (tag, ...args) => {
|
|
431
|
+
if (!shouldLog("warn"))
|
|
432
|
+
return;
|
|
433
|
+
console.warn(formatTag(tag, "warn"), ...args);
|
|
434
|
+
},
|
|
435
|
+
error: (tag, ...args) => {
|
|
436
|
+
if (!shouldLog("error"))
|
|
437
|
+
return;
|
|
438
|
+
console.error(formatTag(tag, "error"), ...args);
|
|
439
|
+
}
|
|
440
|
+
};
|
|
441
|
+
frameworkLoggers = {
|
|
442
|
+
hypen: createLogger("Hypen"),
|
|
443
|
+
engine: createLogger("Engine"),
|
|
444
|
+
router: createLogger("Router"),
|
|
445
|
+
state: createLogger("State"),
|
|
446
|
+
events: createLogger("Events"),
|
|
447
|
+
remote: createLogger("Remote"),
|
|
448
|
+
renderer: createLogger("Renderer"),
|
|
449
|
+
module: createLogger("Module"),
|
|
450
|
+
lifecycle: createLogger("Lifecycle"),
|
|
451
|
+
loader: createLogger("Loader"),
|
|
452
|
+
context: createLogger("Context"),
|
|
453
|
+
discovery: createLogger("Discovery"),
|
|
454
|
+
plugin: createLogger("Plugin"),
|
|
455
|
+
canvas: createLogger("Canvas"),
|
|
456
|
+
debug: createLogger("Debug")
|
|
457
|
+
};
|
|
458
|
+
});
|
|
459
|
+
|
|
261
460
|
// src/router.ts
|
|
262
461
|
init_state();
|
|
462
|
+
init_logger();
|
|
463
|
+
var log2 = frameworkLoggers.router;
|
|
263
464
|
|
|
264
465
|
class HypenRouter {
|
|
265
466
|
state;
|
|
@@ -297,7 +498,7 @@ class HypenRouter {
|
|
|
297
498
|
this.updatePath(newPath, false);
|
|
298
499
|
});
|
|
299
500
|
this.isInitialized = true;
|
|
300
|
-
|
|
501
|
+
log2.debug("Router initialized at:", initialPath);
|
|
301
502
|
}
|
|
302
503
|
getPathFromBrowser() {
|
|
303
504
|
if (typeof window === "undefined")
|
|
@@ -318,21 +519,21 @@ class HypenRouter {
|
|
|
318
519
|
return query;
|
|
319
520
|
}
|
|
320
521
|
push(path) {
|
|
321
|
-
|
|
522
|
+
log2.debug("push:", path);
|
|
322
523
|
this.updatePath(path, true);
|
|
323
524
|
}
|
|
324
525
|
replace(path) {
|
|
325
|
-
|
|
526
|
+
log2.debug("replace:", path);
|
|
326
527
|
this.updatePath(path, true, true);
|
|
327
528
|
}
|
|
328
529
|
back() {
|
|
329
|
-
|
|
530
|
+
log2.debug("back");
|
|
330
531
|
if (typeof window !== "undefined") {
|
|
331
532
|
window.history.back();
|
|
332
533
|
}
|
|
333
534
|
}
|
|
334
535
|
forward() {
|
|
335
|
-
|
|
536
|
+
log2.debug("forward");
|
|
336
537
|
if (typeof window !== "undefined") {
|
|
337
538
|
window.history.forward();
|
|
338
539
|
}
|
|
@@ -428,7 +629,7 @@ class HypenRouter {
|
|
|
428
629
|
try {
|
|
429
630
|
callback(this.getState());
|
|
430
631
|
} catch (error) {
|
|
431
|
-
|
|
632
|
+
log2.error("Error in route subscriber:", error);
|
|
432
633
|
}
|
|
433
634
|
return () => {
|
|
434
635
|
this.subscribers.delete(callback);
|
|
@@ -440,7 +641,7 @@ class HypenRouter {
|
|
|
440
641
|
try {
|
|
441
642
|
callback(routeState);
|
|
442
643
|
} catch (error) {
|
|
443
|
-
|
|
644
|
+
log2.error("Error in route subscriber:", error);
|
|
444
645
|
}
|
|
445
646
|
});
|
|
446
647
|
}
|
|
@@ -459,4 +660,4 @@ export {
|
|
|
459
660
|
HypenRouter
|
|
460
661
|
};
|
|
461
662
|
|
|
462
|
-
//# debugId=
|
|
663
|
+
//# debugId=D44928C3F2480EE564756E2164756E21
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/state.ts", "../src/logger.ts", "../src/router.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * State management with observer pattern and diffing\n *\n * Uses a proxy-based approach with self-detection to avoid\n * creating nested proxies repeatedly.\n */\n\n// Symbol for proxy detection (more robust than string property)\nconst IS_PROXY = Symbol.for('hypen.isProxy');\nconst RAW_TARGET = Symbol.for('hypen.rawTarget');\n\nexport type StatePath = string; // e.g., \"user.name\", \"items.0.title\"\n\n/**\n * Represents a change in state with full path information\n */\nexport interface StateChange {\n paths: StatePath[];\n newValues: Record<StatePath, any>;\n}\n\n/**\n * Options for state observer\n */\nexport interface StateObserverOptions {\n onChange: (change: StateChange) => void;\n pathPrefix?: string; // For nested observers\n}\n\n/**\n * Deep clone an object, using structuredClone when available.\n * Handles proxy objects, circular references, and special types.\n */\nfunction deepClone<T>(obj: T): T {\n // Handle primitives and null\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n // Handle functions (pass through, can't be cloned)\n if (typeof obj === 'function') {\n return obj;\n }\n\n // Handle proxy objects with snapshot method\n if (typeof (obj as any).__getSnapshot === 'function') {\n return (obj as any).__getSnapshot() as T;\n }\n\n // Handle types that can't be cloned (return as-is)\n if (obj instanceof WeakMap || obj instanceof WeakSet) {\n return obj;\n }\n\n // Use a WeakMap to track visited objects and handle circular references\n const visited = new WeakMap();\n\n function cloneInternal(value: any): any {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Functions can't be cloned, pass through\n if (typeof value === 'function') {\n return value;\n }\n\n // Check for circular reference\n if (visited.has(value)) {\n return visited.get(value);\n }\n\n // Handle types that can't be cloned\n if (value instanceof WeakMap || value instanceof WeakSet) {\n return value;\n }\n\n // Try structuredClone for supported types (Date, Map, Set, etc.)\n // This is faster than manual cloning for these types\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n ArrayBuffer.isView(value) ||\n value instanceof ArrayBuffer\n ) {\n try {\n return structuredClone(value);\n } catch {\n // If structuredClone fails, fall through to manual handling\n }\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n const arrClone: any[] = [];\n visited.set(value, arrClone);\n for (let i = 0; i < value.length; i++) {\n arrClone[i] = cloneInternal(value[i]);\n }\n return arrClone;\n }\n\n // Handle plain objects\n const objClone: any = {};\n visited.set(value, objClone);\n\n // Clone string keys\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n objClone[key] = cloneInternal(value[key]);\n }\n }\n\n // Clone Symbol keys\n const symbolKeys = Object.getOwnPropertySymbols(value);\n for (const sym of symbolKeys) {\n objClone[sym] = cloneInternal(value[sym]);\n }\n\n return objClone;\n }\n\n return cloneInternal(obj);\n}\n\n/**\n * Compare two values and detect changes with full paths\n */\nfunction diffState(\n oldState: any,\n newState: any,\n basePath: string = \"\"\n): StateChange {\n const paths: StatePath[] = [];\n const newValues: Record<StatePath, any> = {};\n\n function diff(oldVal: any, newVal: any, path: string) {\n // Handle null/undefined\n if (oldVal === newVal) return;\n\n // Different types or primitives\n if (\n typeof oldVal !== \"object\" ||\n typeof newVal !== \"object\" ||\n oldVal === null ||\n newVal === null\n ) {\n if (oldVal !== newVal) {\n paths.push(path);\n newValues[path] = newVal;\n }\n return;\n }\n\n // Arrays\n if (Array.isArray(oldVal) || Array.isArray(newVal)) {\n if (\n !Array.isArray(oldVal) ||\n !Array.isArray(newVal) ||\n oldVal.length !== newVal.length\n ) {\n paths.push(path);\n newValues[path] = newVal;\n return;\n }\n\n for (let i = 0; i < newVal.length; i++) {\n const itemPath = path ? `${path}.${i}` : `${i}`;\n diff(oldVal[i], newVal[i], itemPath);\n }\n return;\n }\n\n // Objects\n const oldKeys = new Set(Object.keys(oldVal));\n const newKeys = new Set(Object.keys(newVal));\n\n // Check for added or changed keys\n for (const key of newKeys) {\n const propPath = path ? `${path}.${key}` : key;\n if (!oldKeys.has(key)) {\n // New property\n paths.push(propPath);\n newValues[propPath] = newVal[key];\n } else {\n // Existing property, recurse\n diff(oldVal[key], newVal[key], propPath);\n }\n }\n\n // Check for removed keys\n for (const key of oldKeys) {\n if (!newKeys.has(key)) {\n const propPath = path ? `${path}.${key}` : key;\n paths.push(propPath);\n newValues[propPath] = undefined;\n }\n }\n }\n\n diff(oldState, newState, basePath);\n return { paths, newValues };\n}\n\n/**\n * Create an observable state object that tracks changes\n */\nexport function createObservableState<T extends object>(\n initialState: T,\n options?: StateObserverOptions\n): T {\n // Use default options if not provided\n const opts: StateObserverOptions = options || { onChange: () => {} };\n\n // Handle null/undefined by using an empty object\n // This allows modules to start with null state\n if (initialState === null || initialState === undefined) {\n initialState = {} as T;\n }\n\n // Detect and reject primitive wrapper objects (Number, String, Boolean)\n // These cannot be properly proxied due to internal slots\n if (\n initialState instanceof Number ||\n initialState instanceof String ||\n initialState instanceof Boolean\n ) {\n throw new TypeError(\n \"Cannot create observable state from primitive wrapper objects (Number, String, Boolean). \" +\n \"Use plain primitives or regular objects instead.\"\n );\n }\n\n // Clone the initial state to ensure each observable has its own copy\n // This prevents multiple modules from sharing the same underlying state object\n initialState = deepClone(initialState);\n\n // Keep a snapshot of the last known state\n let lastSnapshot = deepClone(initialState);\n const pathPrefix = opts.pathPrefix || \"\";\n\n // Track if we're in a batch update\n let batchDepth = 0;\n let pendingChange: StateChange | null = null;\n\n function notifyChange() {\n if (batchDepth > 0) return;\n\n // Compare current state with last snapshot\n const change = diffState(lastSnapshot, state, pathPrefix);\n\n if (change.paths.length > 0) {\n // Update snapshot\n lastSnapshot = deepClone(state);\n\n // Merge with pending changes if any\n if (pendingChange) {\n change.paths.push(...pendingChange.paths);\n Object.assign(change.newValues, pendingChange.newValues);\n pendingChange = null;\n }\n\n // Notify\n opts.onChange(change);\n }\n }\n\n // Track if we have a pending microtask notification\n let notificationPending = false;\n\n function scheduleBatch() {\n if (batchDepth === 0) {\n // If not in a batch, schedule notification in next microtask to coalesce rapid changes\n if (!notificationPending) {\n notificationPending = true;\n queueMicrotask(() => {\n notificationPending = false;\n if (batchDepth === 0) {\n notifyChange();\n }\n });\n }\n }\n }\n\n // WeakMap to cache proxies by their raw target\n // This is essential for circular reference handling\n const proxyCache = new WeakMap<object, any>();\n\n function createProxy(target: any, basePath: string): any {\n // Check cache first (handles circular references)\n const cached = proxyCache.get(target);\n if (cached) return cached;\n\n const proxy = new Proxy(target, {\n get(obj, prop) {\n // Self-detection: if checking IS_PROXY, return true\n // This allows us to detect if a value is already proxied\n if (prop === IS_PROXY) return true;\n\n // Allow access to raw target (useful for debugging/serialization)\n if (prop === RAW_TARGET) return obj;\n\n // Expose batch control methods\n if (prop === \"__beginBatch\") {\n return () => {\n batchDepth++;\n };\n }\n if (prop === \"__endBatch\") {\n return () => {\n batchDepth--;\n if (batchDepth === 0) {\n notifyChange();\n }\n };\n }\n if (prop === \"__getSnapshot\") {\n return () => deepClone(obj);\n }\n\n const value = obj[prop];\n\n // Return proxied nested objects/arrays, but NOT special types\n if (value && typeof value === \"object\") {\n // Fast path: if already a proxy, return as-is\n // This check is O(1) and avoids WeakMap lookup\n if ((value as any)[IS_PROXY]) {\n return value;\n }\n\n // Check for special object types that should not be proxied\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof WeakMap ||\n value instanceof WeakSet\n ) {\n return value;\n }\n\n // Check cache for this value (handles circular refs and repeated access)\n const cachedNested = proxyCache.get(value);\n if (cachedNested) {\n return cachedNested;\n }\n\n // Create proxy for nested object/array\n const nestedProxy = createProxy(value, basePath ? `${basePath}.${String(prop)}` : String(prop));\n return nestedProxy;\n }\n\n return value;\n },\n\n set(obj, prop, value) {\n const oldValue = obj[prop];\n\n // If setting an object that's already a proxy, unwrap it first\n // to store the raw value (prevents proxy-wrapping-proxy)\n if (value && typeof value === \"object\" && (value as any)[IS_PROXY]) {\n value = (value as any)[RAW_TARGET];\n }\n\n // Set the new value\n obj[prop] = value;\n\n if (oldValue !== value) {\n scheduleBatch();\n }\n\n return true;\n },\n\n deleteProperty(obj, prop) {\n if (prop in obj) {\n delete obj[prop];\n scheduleBatch();\n }\n return true;\n },\n });\n\n // Cache the proxy before returning\n proxyCache.set(target, proxy);\n return proxy;\n }\n\n const state = createProxy(initialState, pathPrefix);\n return state as T;\n}\n\n/**\n * Helper to batch multiple state updates\n */\nexport function batchStateUpdates<T>(state: T, fn: () => void): void {\n const s = state as any;\n if (s.__beginBatch && s.__endBatch) {\n s.__beginBatch();\n try {\n fn();\n } finally {\n s.__endBatch();\n }\n } else {\n fn();\n }\n}\n\n/**\n * Get a snapshot of the current state\n */\nexport function getStateSnapshot<T>(state: T): T {\n const s = state as any;\n if (s.__getSnapshot) {\n return s.__getSnapshot();\n }\n return deepClone(state);\n}\n\n/**\n * Check if a value is a Hypen state proxy\n */\nexport function isStateProxy(value: unknown): boolean {\n return value !== null && typeof value === 'object' && (value as any)[IS_PROXY] === true;\n}\n\n/**\n * Get the raw (unwrapped) target from a proxy\n * Returns the value as-is if not a proxy\n */\nexport function unwrapProxy<T>(value: T): T {\n if (value !== null && typeof value === 'object' && (value as any)[IS_PROXY]) {\n return (value as any)[RAW_TARGET];\n }\n return value;\n}\n",
|
|
6
|
+
"/**\n * Configurable Debug Logger\n *\n * Provides environment-aware logging that can be disabled in production.\n * Supports log levels, tagged output, and performance timing.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"none\";\n\nexport interface LoggerConfig {\n /** Minimum log level (default: \"debug\" in dev, \"error\" in prod) */\n level: LogLevel;\n /** Enable colored output (default: true) */\n colors: boolean;\n /** Include timestamps (default: false) */\n timestamps: boolean;\n /** Custom log handler (default: console) */\n handler?: LogHandler;\n}\n\nexport interface LogHandler {\n debug(tag: string, ...args: unknown[]): void;\n info(tag: string, ...args: unknown[]): void;\n warn(tag: string, ...args: unknown[]): void;\n error(tag: string, ...args: unknown[]): void;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst LOG_LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\nconst LOG_LEVEL_COLORS: Record<Exclude<LogLevel, \"none\">, string> = {\n debug: \"\\x1b[36m\", // Cyan\n info: \"\\x1b[32m\", // Green\n warn: \"\\x1b[33m\", // Yellow\n error: \"\\x1b[31m\", // Red\n};\n\nconst RESET_COLOR = \"\\x1b[0m\";\n\n// ============================================================================\n// Global Configuration\n// ============================================================================\n\n/**\n * Detect if running in production environment\n */\nfunction isProduction(): boolean {\n if (typeof process !== \"undefined\" && process.env) {\n return process.env.NODE_ENV === \"production\";\n }\n return false;\n}\n\n/**\n * Default configuration\n */\nlet config: LoggerConfig = {\n level: isProduction() ? \"error\" : \"debug\",\n colors: true,\n timestamps: false,\n};\n\n// ============================================================================\n// Configuration API\n// ============================================================================\n\n/**\n * Set the global log level\n */\nexport function setLogLevel(level: LogLevel): void {\n config.level = level;\n}\n\n/**\n * Get the current log level\n */\nexport function getLogLevel(): LogLevel {\n return config.level;\n}\n\n/**\n * Configure the logger\n */\nexport function configureLogger(options: Partial<LoggerConfig>): void {\n config = { ...config, ...options };\n}\n\n/**\n * Enable all logging (sets level to \"debug\")\n */\nexport function enableLogging(): void {\n config.level = \"debug\";\n}\n\n/**\n * Disable all logging (sets level to \"none\")\n */\nexport function disableLogging(): void {\n config.level = \"none\";\n}\n\n/**\n * Enable debug mode - alias for enableLogging()\n * Call this at app startup to see all debug logs\n *\n * @example\n * ```typescript\n * import { setDebugMode } from \"@hypen-space/core\";\n * setDebugMode(true);\n * ```\n */\nexport function setDebugMode(enabled: boolean): void {\n config.level = enabled ? \"debug\" : \"error\";\n}\n\n/**\n * Check if debug mode is enabled\n */\nexport function isDebugMode(): boolean {\n return config.level === \"debug\";\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[config.level];\n}\n\nfunction formatTag(tag: string, level: LogLevel): string {\n const timestamp = config.timestamps ? `${new Date().toISOString()} ` : \"\";\n\n if (config.colors && level !== \"none\") {\n const color = LOG_LEVEL_COLORS[level as Exclude<LogLevel, \"none\">];\n return `${timestamp}${color}[${tag}]${RESET_COLOR}`;\n }\n\n return `${timestamp}[${tag}]`;\n}\n\n// ============================================================================\n// Logger Class\n// ============================================================================\n\n/**\n * Tagged logger instance\n *\n * @example\n * ```typescript\n * const log = createLogger(\"MyComponent\");\n * log.debug(\"initialized with\", { props });\n * log.error(\"failed to load\", error);\n * ```\n */\nexport class Logger {\n private readonly tag: string;\n\n constructor(tag: string) {\n this.tag = tag;\n }\n\n debug(...args: unknown[]): void {\n if (!shouldLog(\"debug\")) return;\n\n if (config.handler) {\n config.handler.debug(this.tag, ...args);\n } else {\n console.log(formatTag(this.tag, \"debug\"), ...args);\n }\n }\n\n info(...args: unknown[]): void {\n if (!shouldLog(\"info\")) return;\n\n if (config.handler) {\n config.handler.info(this.tag, ...args);\n } else {\n console.info(formatTag(this.tag, \"info\"), ...args);\n }\n }\n\n warn(...args: unknown[]): void {\n if (!shouldLog(\"warn\")) return;\n\n if (config.handler) {\n config.handler.warn(this.tag, ...args);\n } else {\n console.warn(formatTag(this.tag, \"warn\"), ...args);\n }\n }\n\n error(...args: unknown[]): void {\n if (!shouldLog(\"error\")) return;\n\n if (config.handler) {\n config.handler.error(this.tag, ...args);\n } else {\n console.error(formatTag(this.tag, \"error\"), ...args);\n }\n }\n\n /**\n * Time a function execution\n */\n time<T>(label: string, fn: () => T): T {\n if (!shouldLog(\"debug\")) {\n return fn();\n }\n\n const start = performance.now();\n try {\n return fn();\n } finally {\n const duration = performance.now() - start;\n this.debug(`${label}: ${duration.toFixed(2)}ms`);\n }\n }\n\n /**\n * Time an async function execution\n */\n async timeAsync<T>(label: string, fn: () => Promise<T>): Promise<T> {\n if (!shouldLog(\"debug\")) {\n return fn();\n }\n\n const start = performance.now();\n try {\n return await fn();\n } finally {\n const duration = performance.now() - start;\n this.debug(`${label}: ${duration.toFixed(2)}ms`);\n }\n }\n\n /**\n * Create a child logger with additional context\n */\n child(subTag: string): Logger {\n return new Logger(`${this.tag}:${subTag}`);\n }\n\n /**\n * Conditionally log based on a condition\n */\n debugIf(condition: boolean, ...args: unknown[]): void {\n if (condition) this.debug(...args);\n }\n\n warnIf(condition: boolean, ...args: unknown[]): void {\n if (condition) this.warn(...args);\n }\n\n errorIf(condition: boolean, ...args: unknown[]): void {\n if (condition) this.error(...args);\n }\n\n /**\n * Log once (useful for deprecation warnings)\n */\n private loggedOnce = new Set<string>();\n\n warnOnce(key: string, ...args: unknown[]): void {\n if (this.loggedOnce.has(key)) return;\n this.loggedOnce.add(key);\n this.warn(...args);\n }\n\n debugOnce(key: string, ...args: unknown[]): void {\n if (this.loggedOnce.has(key)) return;\n this.loggedOnce.add(key);\n this.debug(...args);\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a tagged logger\n *\n * @example\n * ```typescript\n * const log = createLogger(\"Router\");\n * log.info(\"navigating to\", path);\n * ```\n */\nexport function createLogger(tag: string): Logger {\n return new Logger(tag);\n}\n\n// ============================================================================\n// Default Logger Instance\n// ============================================================================\n\n/**\n * Default logger for general use\n */\nexport const logger = createLogger(\"Hypen\");\n\n// ============================================================================\n// Shorthand Functions (untagged)\n// ============================================================================\n\n/**\n * Shorthand logging functions for quick use\n * Prefer createLogger() for component-specific logging\n */\nexport const log = {\n debug: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"debug\")) return;\n console.log(formatTag(tag, \"debug\"), ...args);\n },\n\n info: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"info\")) return;\n console.info(formatTag(tag, \"info\"), ...args);\n },\n\n warn: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"warn\")) return;\n console.warn(formatTag(tag, \"warn\"), ...args);\n },\n\n error: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"error\")) return;\n console.error(formatTag(tag, \"error\"), ...args);\n },\n};\n\n// ============================================================================\n// Predefined Loggers for Framework Components\n// ============================================================================\n\nexport const frameworkLoggers = {\n hypen: createLogger(\"Hypen\"),\n engine: createLogger(\"Engine\"),\n router: createLogger(\"Router\"),\n state: createLogger(\"State\"),\n events: createLogger(\"Events\"),\n remote: createLogger(\"Remote\"),\n renderer: createLogger(\"Renderer\"),\n module: createLogger(\"Module\"),\n lifecycle: createLogger(\"Lifecycle\"),\n loader: createLogger(\"Loader\"),\n context: createLogger(\"Context\"),\n discovery: createLogger(\"Discovery\"),\n plugin: createLogger(\"Plugin\"),\n canvas: createLogger(\"Canvas\"),\n debug: createLogger(\"Debug\"),\n};\n",
|
|
7
|
+
"/**\n * Hypen Router - Declarative routing system\n * Integrated with Hypen's reactive state management\n */\n\nimport { createObservableState, getStateSnapshot } from \"./state.js\";\nimport { frameworkLoggers } from \"./logger.js\";\n\nconst log = frameworkLoggers.router;\n\nexport type RouteMatch = {\n params: Record<string, string>;\n query: Record<string, string>;\n path: string;\n};\n\nexport type RouteState = {\n currentPath: string;\n params: Record<string, string>;\n query: Record<string, string>;\n previousPath: string | null;\n};\n\nexport type RouteChangeCallback = (route: RouteState) => void;\n\n/**\n * Hypen Router - Manages application routing with pattern matching\n */\nexport class HypenRouter {\n private state: RouteState;\n private subscribers = new Set<RouteChangeCallback>();\n private isInitialized = false;\n private isUpdating = false;\n\n constructor() {\n // Create observable state for reactivity\n this.state = createObservableState<RouteState>(\n {\n currentPath: \"/\",\n params: {},\n query: {},\n previousPath: null,\n },\n {\n onChange: () => {\n this.notifySubscribers();\n },\n }\n );\n\n // Initialize from browser if available\n if (typeof window !== \"undefined\") {\n this.initializeBrowserSync();\n }\n }\n\n /**\n * Initialize browser history sync\n */\n private initializeBrowserSync() {\n // Get initial path from hash or pathname\n const initialPath = this.getPathFromBrowser();\n this.state.currentPath = initialPath;\n this.state.params = {};\n this.state.query = this.parseQuery();\n\n // Listen for browser back/forward\n window.addEventListener(\"popstate\", () => {\n const newPath = this.getPathFromBrowser();\n this.updatePath(newPath, false); // Don't push to history again\n });\n\n // Listen for hash changes\n window.addEventListener(\"hashchange\", () => {\n // Don't respond to hashchange events we triggered ourselves\n if (this.isUpdating) return;\n const newPath = this.getPathFromBrowser();\n this.updatePath(newPath, false);\n });\n\n this.isInitialized = true;\n log.debug(\"Router initialized at:\", initialPath);\n }\n\n /**\n * Get path from browser URL (supports both hash and pathname)\n */\n private getPathFromBrowser(): string {\n if (typeof window === \"undefined\") return \"/\";\n\n // Prefer hash-based routing for simplicity\n const hash = window.location.hash.slice(1);\n if (hash) return hash;\n\n // Fallback to pathname\n return window.location.pathname;\n }\n\n /**\n * Parse query string from URL\n */\n private parseQuery(): Record<string, string> {\n if (typeof window === \"undefined\") return {};\n\n const query: Record<string, string> = {};\n const searchParams = new URLSearchParams(window.location.search);\n\n searchParams.forEach((value, key) => {\n query[key] = value;\n });\n\n return query;\n }\n\n /**\n * Navigate to a new path\n */\n push(path: string) {\n log.debug(\"push:\", path);\n this.updatePath(path, true);\n }\n\n /**\n * Replace current path without adding to history\n */\n replace(path: string) {\n log.debug(\"replace:\", path);\n this.updatePath(path, true, true);\n }\n\n /**\n * Go back in history\n */\n back() {\n log.debug(\"back\");\n if (typeof window !== \"undefined\") {\n window.history.back();\n }\n }\n\n /**\n * Go forward in history\n */\n forward() {\n log.debug(\"forward\");\n if (typeof window !== \"undefined\") {\n window.history.forward();\n }\n }\n\n /**\n * Update the current path\n */\n private updatePath(\n path: string,\n updateBrowser: boolean,\n replace: boolean = false\n ) {\n // Prevent re-entrant updates\n if (this.isUpdating) return;\n\n this.isUpdating = true;\n try {\n const oldPath = this.state.currentPath;\n this.state.previousPath = oldPath;\n this.state.currentPath = path;\n this.state.query = this.parseQuery();\n\n // Notify subscribers synchronously before any browser events\n this.notifySubscribers();\n\n // Update browser URL if needed\n if (updateBrowser && typeof window !== \"undefined\") {\n const url = \"#\" + path;\n if (replace) {\n window.history.replaceState(null, \"\", url);\n } else {\n window.history.pushState(null, \"\", url);\n }\n\n // Manually trigger hashchange event\n const hashChangeEvent = new HashChangeEvent(\"hashchange\", {\n oldURL: window.location.href.replace(window.location.hash, \"#\" + oldPath),\n newURL: window.location.href,\n });\n window.dispatchEvent(hashChangeEvent);\n }\n } finally {\n this.isUpdating = false;\n }\n }\n\n /**\n * Get current path\n */\n getCurrentPath(): string {\n return this.state.currentPath;\n }\n\n /**\n * Get current route params\n */\n getParams(): Record<string, string> {\n return { ...this.state.params };\n }\n\n /**\n * Get current query params\n */\n getQuery(): Record<string, string> {\n return { ...this.state.query };\n }\n\n /**\n * Get full route state snapshot\n */\n getState(): RouteState {\n return getStateSnapshot(this.state);\n }\n\n /**\n * Match a pattern against a path\n */\n matchPath(pattern: string, path: string): RouteMatch | null {\n // Handle invalid inputs gracefully\n if (!pattern || typeof pattern !== 'string') {\n return null;\n }\n if (!path || typeof path !== 'string') {\n return null;\n }\n\n // Exact match\n if (pattern === path) {\n return {\n params: {},\n query: this.state.query,\n path,\n };\n }\n\n // Wildcard match: /dashboard/* matches /dashboard/anything\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -2);\n if (path === prefix || path.startsWith(prefix + \"/\")) {\n return {\n params: {},\n query: this.state.query,\n path,\n };\n }\n return null;\n }\n\n // Parameter match: /users/:id matches /users/123\n const paramNames: string[] = [];\n const regexPattern = pattern\n .replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, name) => {\n paramNames.push(name);\n return \"([^/]+)\";\n })\n .replace(/\\*/g, \".*\");\n\n const regex = new RegExp(`^${regexPattern}$`);\n const match = path.match(regex);\n\n if (!match) return null;\n\n // Extract params\n const params: Record<string, string> = {};\n paramNames.forEach((name, i) => {\n const value = match[i + 1];\n if (value !== undefined) {\n params[name] = decodeURIComponent(value);\n }\n });\n\n return {\n params,\n query: this.state.query,\n path,\n };\n }\n\n /**\n * Subscribe to route changes\n */\n onNavigate(callback: RouteChangeCallback): () => void {\n this.subscribers.add(callback);\n\n // Call immediately with current state\n try {\n callback(this.getState());\n } catch (error) {\n log.error(\"Error in route subscriber:\", error);\n }\n\n // Return unsubscribe function\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Notify all subscribers of route change\n */\n private notifySubscribers() {\n const routeState = this.getState();\n this.subscribers.forEach((callback) => {\n try {\n callback(routeState);\n } catch (error) {\n log.error(\"Error in route subscriber:\", error);\n }\n });\n }\n\n /**\n * Check if a path matches the current route\n */\n isActive(pattern: string): boolean {\n return this.matchPath(pattern, this.state.currentPath) !== null;\n }\n\n /**\n * Get a URL with query params\n */\n buildUrl(path: string, query?: Record<string, string>): string {\n if (!query || Object.keys(query).length === 0) {\n return path;\n }\n\n const queryString = new URLSearchParams(query).toString();\n return `${path}?${queryString}`;\n }\n}\n"
|
|
8
|
+
],
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "D44928C3F2480EE564756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|
package/package.json
CHANGED
|
@@ -1,134 +1,134 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hypen-space/core",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.10",
|
|
4
4
|
"description": "Hypen core engine - Platform-agnostic reactive UI runtime",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "./dist/
|
|
7
|
-
"module": "./dist/
|
|
8
|
-
"types": "./dist/
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.browser.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
|
-
"types": "./dist/
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
12
|
"bun": "./src/index.ts",
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"import": "./dist/
|
|
16
|
-
"default": "./dist/
|
|
13
|
+
"browser": "./dist/index.browser.js",
|
|
14
|
+
"node": "./dist/index.js",
|
|
15
|
+
"import": "./dist/index.js",
|
|
16
|
+
"default": "./dist/index.js"
|
|
17
17
|
},
|
|
18
18
|
"./engine": {
|
|
19
|
-
"types": "./dist/
|
|
19
|
+
"types": "./dist/engine.d.ts",
|
|
20
20
|
"bun": "./src/engine.ts",
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"import": "./dist/
|
|
24
|
-
"default": "./dist/
|
|
21
|
+
"browser": "./dist/engine.browser.js",
|
|
22
|
+
"node": "./dist/engine.js",
|
|
23
|
+
"import": "./dist/engine.js",
|
|
24
|
+
"default": "./dist/engine.js"
|
|
25
25
|
},
|
|
26
26
|
"./node": {
|
|
27
|
-
"types": "./dist/
|
|
28
|
-
"import": "./dist/
|
|
29
|
-
"default": "./dist/
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"import": "./dist/index.js",
|
|
29
|
+
"default": "./dist/index.js"
|
|
30
30
|
},
|
|
31
31
|
"./engine/node": {
|
|
32
|
-
"types": "./dist/
|
|
33
|
-
"import": "./dist/
|
|
34
|
-
"default": "./dist/
|
|
32
|
+
"types": "./dist/engine.d.ts",
|
|
33
|
+
"import": "./dist/engine.js",
|
|
34
|
+
"default": "./dist/engine.js"
|
|
35
35
|
},
|
|
36
36
|
"./engine/browser": {
|
|
37
|
-
"types": "./dist/
|
|
38
|
-
"browser": "./dist/
|
|
37
|
+
"types": "./dist/engine.browser.d.ts",
|
|
38
|
+
"browser": "./dist/engine.browser.js",
|
|
39
39
|
"bun": "./src/engine.browser.ts",
|
|
40
|
-
"import": "./dist/
|
|
41
|
-
"default": "./dist/
|
|
40
|
+
"import": "./dist/engine.browser.js",
|
|
41
|
+
"default": "./dist/engine.browser.js"
|
|
42
42
|
},
|
|
43
43
|
"./app": {
|
|
44
|
-
"types": "./dist/
|
|
44
|
+
"types": "./dist/app.d.ts",
|
|
45
45
|
"bun": "./src/app.ts",
|
|
46
|
-
"import": "./dist/
|
|
47
|
-
"default": "./dist/
|
|
46
|
+
"import": "./dist/app.js",
|
|
47
|
+
"default": "./dist/app.js"
|
|
48
48
|
},
|
|
49
49
|
"./state": {
|
|
50
|
-
"types": "./dist/
|
|
50
|
+
"types": "./dist/state.d.ts",
|
|
51
51
|
"bun": "./src/state.ts",
|
|
52
|
-
"import": "./dist/
|
|
53
|
-
"default": "./dist/
|
|
52
|
+
"import": "./dist/state.js",
|
|
53
|
+
"default": "./dist/state.js"
|
|
54
54
|
},
|
|
55
55
|
"./renderer": {
|
|
56
|
-
"types": "./dist/
|
|
56
|
+
"types": "./dist/renderer.d.ts",
|
|
57
57
|
"bun": "./src/renderer.ts",
|
|
58
|
-
"import": "./dist/
|
|
59
|
-
"default": "./dist/
|
|
58
|
+
"import": "./dist/renderer.js",
|
|
59
|
+
"default": "./dist/renderer.js"
|
|
60
60
|
},
|
|
61
61
|
"./router": {
|
|
62
|
-
"types": "./dist/
|
|
62
|
+
"types": "./dist/router.d.ts",
|
|
63
63
|
"bun": "./src/router.ts",
|
|
64
|
-
"import": "./dist/
|
|
65
|
-
"default": "./dist/
|
|
64
|
+
"import": "./dist/router.js",
|
|
65
|
+
"default": "./dist/router.js"
|
|
66
66
|
},
|
|
67
67
|
"./events": {
|
|
68
|
-
"types": "./dist/
|
|
68
|
+
"types": "./dist/events.d.ts",
|
|
69
69
|
"bun": "./src/events.ts",
|
|
70
|
-
"import": "./dist/
|
|
71
|
-
"default": "./dist/
|
|
70
|
+
"import": "./dist/events.js",
|
|
71
|
+
"default": "./dist/events.js"
|
|
72
72
|
},
|
|
73
73
|
"./context": {
|
|
74
|
-
"types": "./dist/
|
|
74
|
+
"types": "./dist/context.d.ts",
|
|
75
75
|
"bun": "./src/context.ts",
|
|
76
|
-
"import": "./dist/
|
|
77
|
-
"default": "./dist/
|
|
76
|
+
"import": "./dist/context.js",
|
|
77
|
+
"default": "./dist/context.js"
|
|
78
78
|
},
|
|
79
79
|
"./remote": {
|
|
80
|
-
"types": "./dist/
|
|
80
|
+
"types": "./dist/remote/index.d.ts",
|
|
81
81
|
"bun": "./src/remote/index.ts",
|
|
82
|
-
"import": "./dist/
|
|
83
|
-
"default": "./dist/
|
|
82
|
+
"import": "./dist/remote/index.js",
|
|
83
|
+
"default": "./dist/remote/index.js"
|
|
84
84
|
},
|
|
85
85
|
"./remote/client": {
|
|
86
|
-
"types": "./dist/
|
|
86
|
+
"types": "./dist/remote/client.d.ts",
|
|
87
87
|
"bun": "./src/remote/client.ts",
|
|
88
|
-
"import": "./dist/
|
|
89
|
-
"default": "./dist/
|
|
88
|
+
"import": "./dist/remote/client.js",
|
|
89
|
+
"default": "./dist/remote/client.js"
|
|
90
90
|
},
|
|
91
91
|
"./remote/server": {
|
|
92
|
-
"types": "./dist/
|
|
92
|
+
"types": "./dist/remote/server.d.ts",
|
|
93
93
|
"bun": "./src/remote/server.ts",
|
|
94
|
-
"import": "./dist/
|
|
95
|
-
"default": "./dist/
|
|
94
|
+
"import": "./dist/remote/server.js",
|
|
95
|
+
"default": "./dist/remote/server.js"
|
|
96
96
|
},
|
|
97
97
|
"./loader": {
|
|
98
|
-
"types": "./dist/
|
|
98
|
+
"types": "./dist/loader.d.ts",
|
|
99
99
|
"bun": "./src/loader.ts",
|
|
100
|
-
"import": "./dist/
|
|
101
|
-
"default": "./dist/
|
|
100
|
+
"import": "./dist/loader.js",
|
|
101
|
+
"default": "./dist/loader.js"
|
|
102
102
|
},
|
|
103
103
|
"./resolver": {
|
|
104
|
-
"types": "./dist/
|
|
104
|
+
"types": "./dist/resolver.d.ts",
|
|
105
105
|
"bun": "./src/resolver.ts",
|
|
106
|
-
"import": "./dist/
|
|
107
|
-
"default": "./dist/
|
|
106
|
+
"import": "./dist/resolver.js",
|
|
107
|
+
"default": "./dist/resolver.js"
|
|
108
108
|
},
|
|
109
109
|
"./discovery": {
|
|
110
|
-
"types": "./dist/
|
|
110
|
+
"types": "./dist/discovery.d.ts",
|
|
111
111
|
"bun": "./src/discovery.ts",
|
|
112
|
-
"import": "./dist/
|
|
113
|
-
"default": "./dist/
|
|
112
|
+
"import": "./dist/discovery.js",
|
|
113
|
+
"default": "./dist/discovery.js"
|
|
114
114
|
},
|
|
115
115
|
"./plugin": {
|
|
116
|
-
"types": "./dist/
|
|
116
|
+
"types": "./dist/plugin.d.ts",
|
|
117
117
|
"bun": "./src/plugin.ts",
|
|
118
|
-
"import": "./dist/
|
|
119
|
-
"default": "./dist/
|
|
118
|
+
"import": "./dist/plugin.js",
|
|
119
|
+
"default": "./dist/plugin.js"
|
|
120
120
|
},
|
|
121
121
|
"./components": {
|
|
122
|
-
"types": "./dist/
|
|
122
|
+
"types": "./dist/components/builtin.d.ts",
|
|
123
123
|
"bun": "./src/components/builtin.ts",
|
|
124
|
-
"import": "./dist/
|
|
125
|
-
"default": "./dist/
|
|
124
|
+
"import": "./dist/components/builtin.js",
|
|
125
|
+
"default": "./dist/components/builtin.js"
|
|
126
126
|
},
|
|
127
127
|
"./disposable": {
|
|
128
|
-
"types": "./dist/
|
|
128
|
+
"types": "./dist/disposable.d.ts",
|
|
129
129
|
"bun": "./src/disposable.ts",
|
|
130
|
-
"import": "./dist/
|
|
131
|
-
"default": "./dist/
|
|
130
|
+
"import": "./dist/disposable.js",
|
|
131
|
+
"default": "./dist/disposable.js"
|
|
132
132
|
}
|
|
133
133
|
},
|
|
134
134
|
"files": [
|
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
|
|
6
6
|
import { app } from "../app.js";
|
|
7
7
|
import type { HypenRouter } from "../router.js";
|
|
8
|
+
import { frameworkLoggers } from "../logger.js";
|
|
9
|
+
|
|
10
|
+
const log = frameworkLoggers.router;
|
|
8
11
|
|
|
9
12
|
/**
|
|
10
13
|
* Router Component
|
|
@@ -28,14 +31,14 @@ export const Router = app
|
|
|
28
31
|
)
|
|
29
32
|
.onCreated((state, context) => {
|
|
30
33
|
if (!context) {
|
|
31
|
-
|
|
34
|
+
log.error("Requires global context");
|
|
32
35
|
return;
|
|
33
36
|
}
|
|
34
37
|
|
|
35
38
|
// Subscribe to router changes
|
|
36
39
|
const router = (context as any).__router as HypenRouter;
|
|
37
40
|
if (!router) {
|
|
38
|
-
|
|
41
|
+
log.error("Router not found in context");
|
|
39
42
|
return;
|
|
40
43
|
}
|
|
41
44
|
|
|
@@ -79,15 +82,15 @@ export const Router = app
|
|
|
79
82
|
htmlEl
|
|
80
83
|
);
|
|
81
84
|
} catch (err) {
|
|
82
|
-
|
|
85
|
+
log.error(`Failed to render route ${routePath}:`, err);
|
|
83
86
|
}
|
|
84
87
|
}
|
|
85
88
|
}
|
|
86
89
|
}
|
|
87
90
|
|
|
88
91
|
if (!matchFound) {
|
|
89
|
-
|
|
90
|
-
`
|
|
92
|
+
log.warn(
|
|
93
|
+
`No route matched path: ${currentPath}. Available routes:`,
|
|
91
94
|
Array.from(routeElements).map(
|
|
92
95
|
(el: Element) => (el as HTMLElement).dataset.routePath
|
|
93
96
|
)
|
|
@@ -148,7 +151,7 @@ export const Link = app
|
|
|
148
151
|
.onAction("navigate", ({ state, context }) => {
|
|
149
152
|
const router = (context as any)?.__router as HypenRouter;
|
|
150
153
|
if (!router) {
|
|
151
|
-
|
|
154
|
+
log.error("Link requires router context");
|
|
152
155
|
return;
|
|
153
156
|
}
|
|
154
157
|
|