@hypen-space/core 0.3.9 → 0.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/{src/app.js → app.js} +15 -2
  2. package/dist/{src/app.js.map → app.js.map} +3 -3
  3. package/dist/{src/components → components}/builtin.js +22 -7
  4. package/dist/{src/components → components}/builtin.js.map +4 -4
  5. package/dist/context.js +387 -0
  6. package/dist/context.js.map +12 -0
  7. package/dist/{src/discovery.js → discovery.js} +18 -4
  8. package/dist/{src/discovery.js.map → discovery.js.map} +4 -4
  9. package/dist/disposable.js +377 -0
  10. package/dist/disposable.js.map +11 -0
  11. package/dist/engine.browser.js +347 -0
  12. package/dist/engine.browser.js.map +11 -0
  13. package/dist/engine.js +320 -0
  14. package/dist/engine.js.map +11 -0
  15. package/dist/events.js +282 -0
  16. package/dist/events.js.map +11 -0
  17. package/dist/{src/index.browser.js → index.browser.js} +278 -229
  18. package/dist/index.browser.js.map +22 -0
  19. package/dist/{src/index.js → index.js} +1377 -1330
  20. package/dist/index.js.map +31 -0
  21. package/dist/loader.js +286 -0
  22. package/dist/loader.js.map +11 -0
  23. package/dist/plugin.js +334 -0
  24. package/dist/plugin.js.map +11 -0
  25. package/dist/{src/remote → remote}/client.js +215 -11
  26. package/dist/remote/client.js.map +14 -0
  27. package/dist/{src/remote → remote}/index.js +234 -210
  28. package/dist/remote/index.js.map +19 -0
  29. package/dist/remote/server.js +1442 -0
  30. package/dist/remote/server.js.map +16 -0
  31. package/dist/renderer.js +264 -0
  32. package/dist/renderer.js.map +11 -0
  33. package/dist/{src/router.js → router.js} +209 -8
  34. package/dist/router.js.map +12 -0
  35. package/package.json +69 -69
  36. package/src/components/builtin.ts +9 -6
  37. package/src/context.ts +10 -7
  38. package/src/discovery.ts +3 -2
  39. package/src/disposable.ts +6 -2
  40. package/src/engine.browser.ts +30 -11
  41. package/src/engine.ts +6 -3
  42. package/src/events.ts +5 -1
  43. package/src/index.browser.ts +20 -0
  44. package/src/index.ts +2 -0
  45. package/src/loader.ts +8 -8
  46. package/src/logger.ts +28 -0
  47. package/src/plugin.ts +2 -1
  48. package/src/remote/client.ts +8 -9
  49. package/src/remote/server.ts +6 -3
  50. package/src/renderer.ts +4 -5
  51. package/src/router.ts +10 -7
  52. package/wasm-browser/hypen_engine_bg.wasm +0 -0
  53. package/wasm-browser/package.json +1 -1
  54. package/wasm-node/hypen_engine_bg.wasm +0 -0
  55. package/wasm-node/package.json +5 -3
  56. package/dist/src/context.js +0 -182
  57. package/dist/src/context.js.map +0 -11
  58. package/dist/src/engine.browser.js +0 -137
  59. package/dist/src/engine.browser.js.map +0 -10
  60. package/dist/src/engine.js +0 -119
  61. package/dist/src/engine.js.map +0 -10
  62. package/dist/src/events.js +0 -80
  63. package/dist/src/events.js.map +0 -10
  64. package/dist/src/index.browser.js.map +0 -22
  65. package/dist/src/index.js.map +0 -31
  66. package/dist/src/loader.js +0 -85
  67. package/dist/src/loader.js.map +0 -10
  68. package/dist/src/plugin.js +0 -134
  69. package/dist/src/plugin.js.map +0 -10
  70. package/dist/src/remote/client.js.map +0 -13
  71. package/dist/src/remote/index.js.map +0 -19
  72. package/dist/src/renderer.js +0 -66
  73. package/dist/src/renderer.js.map +0 -10
  74. package/dist/src/router.js.map +0 -11
  75. /package/dist/{src/remote → remote}/types.js +0 -0
  76. /package/dist/{src/remote → remote}/types.js.map +0 -0
  77. /package/dist/{src/resolver.js → resolver.js} +0 -0
  78. /package/dist/{src/resolver.js.map → resolver.js.map} +0 -0
  79. /package/dist/{src/state.js → state.js} +0 -0
  80. /package/dist/{src/state.js.map → state.js.map} +0 -0
package/dist/engine.js ADDED
@@ -0,0 +1,320 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, {
5
+ get: all[name],
6
+ enumerable: true,
7
+ configurable: true,
8
+ set: (newValue) => all[name] = () => newValue
9
+ });
10
+ };
11
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
12
+
13
+ // src/logger.ts
14
+ function isProduction() {
15
+ if (typeof process !== "undefined" && process.env) {
16
+ return false;
17
+ }
18
+ return false;
19
+ }
20
+ function setLogLevel(level) {
21
+ config.level = level;
22
+ }
23
+ function getLogLevel() {
24
+ return config.level;
25
+ }
26
+ function configureLogger(options) {
27
+ config = { ...config, ...options };
28
+ }
29
+ function enableLogging() {
30
+ config.level = "debug";
31
+ }
32
+ function disableLogging() {
33
+ config.level = "none";
34
+ }
35
+ function setDebugMode(enabled) {
36
+ config.level = enabled ? "debug" : "error";
37
+ }
38
+ function isDebugMode() {
39
+ return config.level === "debug";
40
+ }
41
+ function shouldLog(level) {
42
+ return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[config.level];
43
+ }
44
+ function formatTag(tag, level) {
45
+ const timestamp = config.timestamps ? `${new Date().toISOString()} ` : "";
46
+ if (config.colors && level !== "none") {
47
+ const color = LOG_LEVEL_COLORS[level];
48
+ return `${timestamp}${color}[${tag}]${RESET_COLOR}`;
49
+ }
50
+ return `${timestamp}[${tag}]`;
51
+ }
52
+
53
+ class Logger {
54
+ tag;
55
+ constructor(tag) {
56
+ this.tag = tag;
57
+ }
58
+ debug(...args) {
59
+ if (!shouldLog("debug"))
60
+ return;
61
+ if (config.handler) {
62
+ config.handler.debug(this.tag, ...args);
63
+ } else {
64
+ console.log(formatTag(this.tag, "debug"), ...args);
65
+ }
66
+ }
67
+ info(...args) {
68
+ if (!shouldLog("info"))
69
+ return;
70
+ if (config.handler) {
71
+ config.handler.info(this.tag, ...args);
72
+ } else {
73
+ console.info(formatTag(this.tag, "info"), ...args);
74
+ }
75
+ }
76
+ warn(...args) {
77
+ if (!shouldLog("warn"))
78
+ return;
79
+ if (config.handler) {
80
+ config.handler.warn(this.tag, ...args);
81
+ } else {
82
+ console.warn(formatTag(this.tag, "warn"), ...args);
83
+ }
84
+ }
85
+ error(...args) {
86
+ if (!shouldLog("error"))
87
+ return;
88
+ if (config.handler) {
89
+ config.handler.error(this.tag, ...args);
90
+ } else {
91
+ console.error(formatTag(this.tag, "error"), ...args);
92
+ }
93
+ }
94
+ time(label, fn) {
95
+ if (!shouldLog("debug")) {
96
+ return fn();
97
+ }
98
+ const start = performance.now();
99
+ try {
100
+ return fn();
101
+ } finally {
102
+ const duration = performance.now() - start;
103
+ this.debug(`${label}: ${duration.toFixed(2)}ms`);
104
+ }
105
+ }
106
+ async timeAsync(label, fn) {
107
+ if (!shouldLog("debug")) {
108
+ return fn();
109
+ }
110
+ const start = performance.now();
111
+ try {
112
+ return await fn();
113
+ } finally {
114
+ const duration = performance.now() - start;
115
+ this.debug(`${label}: ${duration.toFixed(2)}ms`);
116
+ }
117
+ }
118
+ child(subTag) {
119
+ return new Logger(`${this.tag}:${subTag}`);
120
+ }
121
+ debugIf(condition, ...args) {
122
+ if (condition)
123
+ this.debug(...args);
124
+ }
125
+ warnIf(condition, ...args) {
126
+ if (condition)
127
+ this.warn(...args);
128
+ }
129
+ errorIf(condition, ...args) {
130
+ if (condition)
131
+ this.error(...args);
132
+ }
133
+ loggedOnce = new Set;
134
+ warnOnce(key, ...args) {
135
+ if (this.loggedOnce.has(key))
136
+ return;
137
+ this.loggedOnce.add(key);
138
+ this.warn(...args);
139
+ }
140
+ debugOnce(key, ...args) {
141
+ if (this.loggedOnce.has(key))
142
+ return;
143
+ this.loggedOnce.add(key);
144
+ this.debug(...args);
145
+ }
146
+ }
147
+ function createLogger(tag) {
148
+ return new Logger(tag);
149
+ }
150
+ var LOG_LEVEL_ORDER, LOG_LEVEL_COLORS, RESET_COLOR = "\x1B[0m", config, logger, log, frameworkLoggers;
151
+ var init_logger = __esm(() => {
152
+ LOG_LEVEL_ORDER = {
153
+ debug: 0,
154
+ info: 1,
155
+ warn: 2,
156
+ error: 3,
157
+ none: 4
158
+ };
159
+ LOG_LEVEL_COLORS = {
160
+ debug: "\x1B[36m",
161
+ info: "\x1B[32m",
162
+ warn: "\x1B[33m",
163
+ error: "\x1B[31m"
164
+ };
165
+ config = {
166
+ level: isProduction() ? "error" : "debug",
167
+ colors: true,
168
+ timestamps: false
169
+ };
170
+ logger = createLogger("Hypen");
171
+ log = {
172
+ debug: (tag, ...args) => {
173
+ if (!shouldLog("debug"))
174
+ return;
175
+ console.log(formatTag(tag, "debug"), ...args);
176
+ },
177
+ info: (tag, ...args) => {
178
+ if (!shouldLog("info"))
179
+ return;
180
+ console.info(formatTag(tag, "info"), ...args);
181
+ },
182
+ warn: (tag, ...args) => {
183
+ if (!shouldLog("warn"))
184
+ return;
185
+ console.warn(formatTag(tag, "warn"), ...args);
186
+ },
187
+ error: (tag, ...args) => {
188
+ if (!shouldLog("error"))
189
+ return;
190
+ console.error(formatTag(tag, "error"), ...args);
191
+ }
192
+ };
193
+ frameworkLoggers = {
194
+ hypen: createLogger("Hypen"),
195
+ engine: createLogger("Engine"),
196
+ router: createLogger("Router"),
197
+ state: createLogger("State"),
198
+ events: createLogger("Events"),
199
+ remote: createLogger("Remote"),
200
+ renderer: createLogger("Renderer"),
201
+ module: createLogger("Module"),
202
+ lifecycle: createLogger("Lifecycle"),
203
+ loader: createLogger("Loader"),
204
+ context: createLogger("Context"),
205
+ discovery: createLogger("Discovery"),
206
+ plugin: createLogger("Plugin"),
207
+ canvas: createLogger("Canvas"),
208
+ debug: createLogger("Debug")
209
+ };
210
+ });
211
+
212
+ // src/engine.ts
213
+ init_logger();
214
+ import { WasmEngine } from "../wasm-node/hypen_engine.js";
215
+ var log2 = frameworkLoggers.engine;
216
+ function unwrapForWasm(value) {
217
+ if (value === null || typeof value !== "object") {
218
+ return value;
219
+ }
220
+ if (typeof value.__getSnapshot === "function") {
221
+ return value.__getSnapshot();
222
+ }
223
+ try {
224
+ return structuredClone(value);
225
+ } catch {
226
+ return JSON.parse(JSON.stringify(value));
227
+ }
228
+ }
229
+
230
+ class Engine {
231
+ wasmEngine = null;
232
+ initialized = false;
233
+ async init() {
234
+ if (this.initialized)
235
+ return;
236
+ this.wasmEngine = new WasmEngine;
237
+ this.initialized = true;
238
+ }
239
+ ensureInitialized() {
240
+ if (!this.wasmEngine) {
241
+ throw new Error("Engine not initialized. Call init() first.");
242
+ }
243
+ return this.wasmEngine;
244
+ }
245
+ setRenderCallback(callback) {
246
+ const engine = this.ensureInitialized();
247
+ engine.setRenderCallback((patches) => {
248
+ callback(patches);
249
+ });
250
+ }
251
+ setComponentResolver(resolver) {
252
+ const engine = this.ensureInitialized();
253
+ engine.setComponentResolver((componentName, contextPath) => {
254
+ const result = resolver(componentName, contextPath);
255
+ return result;
256
+ });
257
+ }
258
+ renderSource(source) {
259
+ const engine = this.ensureInitialized();
260
+ engine.renderSource(source);
261
+ }
262
+ renderLazyComponent(source) {
263
+ const engine = this.ensureInitialized();
264
+ engine.renderLazyComponent(source);
265
+ }
266
+ renderInto(source, parentNodeId, state) {
267
+ const engine = this.ensureInitialized();
268
+ engine.renderInto(source, parentNodeId, unwrapForWasm(state));
269
+ }
270
+ notifyStateChange(paths, values) {
271
+ const engine = this.ensureInitialized();
272
+ if (paths.length === 0) {
273
+ return;
274
+ }
275
+ engine.updateStateSparse(paths, unwrapForWasm(values));
276
+ log2.debug("State changed (sparse):", paths);
277
+ }
278
+ notifyStateChangeFull(paths, currentState) {
279
+ const engine = this.ensureInitialized();
280
+ engine.updateState(unwrapForWasm(currentState));
281
+ if (paths.length > 0) {
282
+ log2.debug("State changed (full):", paths);
283
+ }
284
+ }
285
+ updateState(statePatch) {
286
+ const engine = this.ensureInitialized();
287
+ engine.updateState(unwrapForWasm(statePatch));
288
+ }
289
+ dispatchAction(name, payload) {
290
+ const engine = this.ensureInitialized();
291
+ engine.dispatchAction(name, payload ?? null);
292
+ }
293
+ onAction(actionName, handler) {
294
+ const engine = this.ensureInitialized();
295
+ engine.onAction(actionName, (action) => {
296
+ Promise.resolve(handler(action)).catch((err) => log2.error("Action handler error:", err));
297
+ });
298
+ }
299
+ setModule(name, actions, stateKeys, initialState) {
300
+ const engine = this.ensureInitialized();
301
+ engine.setModule(name, actions, stateKeys, initialState);
302
+ }
303
+ getRevision() {
304
+ const engine = this.ensureInitialized();
305
+ return Number(engine.getRevision());
306
+ }
307
+ clearTree() {
308
+ const engine = this.ensureInitialized();
309
+ engine.clearTree();
310
+ }
311
+ debugParseComponent(source) {
312
+ const engine = this.ensureInitialized();
313
+ return engine.debugParseComponent(source);
314
+ }
315
+ }
316
+ export {
317
+ Engine
318
+ };
319
+
320
+ //# debugId=0A8C8DFA87BBF11164756E2164756E21
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/logger.ts", "../src/engine.ts"],
4
+ "sourcesContent": [
5
+ "/**\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",
6
+ "/**\n * Low-level wrapper around the WASM engine\n * Node.js / Bundler target\n */\n\n// WASM module types\nimport { WasmEngine } from \"../wasm-node/hypen_engine.js\";\nimport { frameworkLoggers } from \"./logger.js\";\n\nconst log = frameworkLoggers.engine;\n\n/**\n * Unwrap proxy objects to plain values for WASM serialization.\n * Uses structuredClone when available (Node 17+, Bun, modern browsers),\n * falls back to JSON round-trip for proxy objects or older environments.\n */\nfunction unwrapForWasm<T>(value: T): T {\n // Fast path: primitives don't need cloning\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Check if the object has a snapshot method (our proxy convention)\n if (typeof (value as any).__getSnapshot === 'function') {\n return (value as any).__getSnapshot() as T;\n }\n\n // Try structuredClone first (fastest for plain objects)\n try {\n return structuredClone(value);\n } catch {\n // Fallback for proxy objects or unsupported types\n return JSON.parse(JSON.stringify(value));\n }\n}\n\nexport type Patch = {\n type: \"create\" | \"setProp\" | \"setText\" | \"insert\" | \"move\" | \"remove\" | \"attachEvent\" | \"detachEvent\";\n id?: string;\n elementType?: string;\n props?: Record<string, any>;\n name?: string;\n value?: any;\n text?: string;\n parentId?: string;\n beforeId?: string;\n eventName?: string;\n};\n\nexport type Action = {\n name: string;\n payload?: any;\n sender?: string;\n};\n\nexport type RenderCallback = (patches: Patch[]) => void;\nexport type ActionHandler = (action: Action) => void | Promise<void>;\n\nexport type ResolvedComponent = {\n source: string;\n path: string;\n};\n\nexport type ComponentResolver = (\n componentName: string,\n contextPath: string | null\n) => ResolvedComponent | null;\n\n/**\n * Engine wraps the WASM engine and provides a TypeScript-friendly API\n */\nexport class Engine {\n private wasmEngine: WasmEngine | null = null;\n private initialized = false;\n\n /**\n * Initialize the WASM module\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n\n // For bundler target, WASM is auto-initialized\n this.wasmEngine = new WasmEngine();\n this.initialized = true;\n }\n\n /**\n * Ensure the engine is initialized before operations\n */\n private ensureInitialized(): WasmEngine {\n if (!this.wasmEngine) {\n throw new Error(\"Engine not initialized. Call init() first.\");\n }\n return this.wasmEngine;\n }\n\n /**\n * Set the render callback that receives patches\n */\n setRenderCallback(callback: RenderCallback): void {\n const engine = this.ensureInitialized();\n engine.setRenderCallback((patches: Patch[]) => {\n callback(patches);\n });\n }\n\n /**\n * Set the component resolver for dynamic component composition\n */\n setComponentResolver(resolver: ComponentResolver): void {\n const engine = this.ensureInitialized();\n engine.setComponentResolver((componentName: string, contextPath: string | null) => {\n const result = resolver(componentName, contextPath);\n return result;\n });\n }\n\n /**\n * Parse and render Hypen DSL source code\n */\n renderSource(source: string): void {\n const engine = this.ensureInitialized();\n engine.renderSource(source);\n }\n\n /**\n * Render a lazy component (for lazy route loading)\n */\n renderLazyComponent(source: string): void {\n const engine = this.ensureInitialized();\n engine.renderLazyComponent(source);\n }\n\n /**\n * Render a component into a specific parent node (subtree rendering)\n */\n renderInto(source: string, parentNodeId: string, state: Record<string, any>): void {\n const engine = this.ensureInitialized();\n engine.renderInto(source, parentNodeId, unwrapForWasm(state));\n }\n\n /**\n * Notify the engine of state changes using sparse updates\n */\n notifyStateChange(paths: string[], values: Record<string, any>): void {\n const engine = this.ensureInitialized();\n\n if (paths.length === 0) {\n return;\n }\n\n engine.updateStateSparse(paths, unwrapForWasm(values));\n log.debug(\"State changed (sparse):\", paths);\n }\n\n /**\n * Notify the engine of state changes using full state replacement\n * @deprecated Use notifyStateChange with sparse values instead\n */\n notifyStateChangeFull(paths: string[], currentState: Record<string, any>): void {\n const engine = this.ensureInitialized();\n engine.updateState(unwrapForWasm(currentState));\n\n if (paths.length > 0) {\n log.debug(\"State changed (full):\", paths);\n }\n }\n\n /**\n * Update state (triggers re-render of affected nodes)\n * @deprecated Use notifyStateChange instead\n */\n updateState(statePatch: Record<string, any>): void {\n const engine = this.ensureInitialized();\n engine.updateState(unwrapForWasm(statePatch));\n }\n\n /**\n * Dispatch an action\n */\n dispatchAction(name: string, payload?: any): void {\n const engine = this.ensureInitialized();\n engine.dispatchAction(name, payload ?? null);\n }\n\n /**\n * Register an action handler\n */\n onAction(actionName: string, handler: ActionHandler): void {\n const engine = this.ensureInitialized();\n engine.onAction(actionName, (action: Action) => {\n Promise.resolve(handler(action)).catch((err) => log.error(\"Action handler error:\", err));\n });\n }\n\n /**\n * Initialize a module\n */\n setModule(\n name: string,\n actions: string[],\n stateKeys: string[],\n initialState: Record<string, any>\n ): void {\n const engine = this.ensureInitialized();\n engine.setModule(name, actions, stateKeys, initialState);\n }\n\n /**\n * Get the current revision number\n */\n getRevision(): number {\n const engine = this.ensureInitialized();\n return Number(engine.getRevision());\n }\n\n /**\n * Clear the engine tree\n */\n clearTree(): void {\n const engine = this.ensureInitialized();\n engine.clearTree();\n }\n\n /**\n * Debug method to inspect parsed components\n */\n debugParseComponent(source: string): string {\n const engine = this.ensureInitialized();\n return engine.debugParseComponent(source);\n }\n}\n"
7
+ ],
8
+ "mappings": "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",
9
+ "debugId": "0A8C8DFA87BBF11164756E2164756E21",
10
+ "names": []
11
+ }
package/dist/events.js ADDED
@@ -0,0 +1,282 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, {
5
+ get: all[name],
6
+ enumerable: true,
7
+ configurable: true,
8
+ set: (newValue) => all[name] = () => newValue
9
+ });
10
+ };
11
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
12
+
13
+ // src/logger.ts
14
+ function isProduction() {
15
+ if (typeof process !== "undefined" && process.env) {
16
+ return false;
17
+ }
18
+ return false;
19
+ }
20
+ function setLogLevel(level) {
21
+ config.level = level;
22
+ }
23
+ function getLogLevel() {
24
+ return config.level;
25
+ }
26
+ function configureLogger(options) {
27
+ config = { ...config, ...options };
28
+ }
29
+ function enableLogging() {
30
+ config.level = "debug";
31
+ }
32
+ function disableLogging() {
33
+ config.level = "none";
34
+ }
35
+ function setDebugMode(enabled) {
36
+ config.level = enabled ? "debug" : "error";
37
+ }
38
+ function isDebugMode() {
39
+ return config.level === "debug";
40
+ }
41
+ function shouldLog(level) {
42
+ return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[config.level];
43
+ }
44
+ function formatTag(tag, level) {
45
+ const timestamp = config.timestamps ? `${new Date().toISOString()} ` : "";
46
+ if (config.colors && level !== "none") {
47
+ const color = LOG_LEVEL_COLORS[level];
48
+ return `${timestamp}${color}[${tag}]${RESET_COLOR}`;
49
+ }
50
+ return `${timestamp}[${tag}]`;
51
+ }
52
+
53
+ class Logger {
54
+ tag;
55
+ constructor(tag) {
56
+ this.tag = tag;
57
+ }
58
+ debug(...args) {
59
+ if (!shouldLog("debug"))
60
+ return;
61
+ if (config.handler) {
62
+ config.handler.debug(this.tag, ...args);
63
+ } else {
64
+ console.log(formatTag(this.tag, "debug"), ...args);
65
+ }
66
+ }
67
+ info(...args) {
68
+ if (!shouldLog("info"))
69
+ return;
70
+ if (config.handler) {
71
+ config.handler.info(this.tag, ...args);
72
+ } else {
73
+ console.info(formatTag(this.tag, "info"), ...args);
74
+ }
75
+ }
76
+ warn(...args) {
77
+ if (!shouldLog("warn"))
78
+ return;
79
+ if (config.handler) {
80
+ config.handler.warn(this.tag, ...args);
81
+ } else {
82
+ console.warn(formatTag(this.tag, "warn"), ...args);
83
+ }
84
+ }
85
+ error(...args) {
86
+ if (!shouldLog("error"))
87
+ return;
88
+ if (config.handler) {
89
+ config.handler.error(this.tag, ...args);
90
+ } else {
91
+ console.error(formatTag(this.tag, "error"), ...args);
92
+ }
93
+ }
94
+ time(label, fn) {
95
+ if (!shouldLog("debug")) {
96
+ return fn();
97
+ }
98
+ const start = performance.now();
99
+ try {
100
+ return fn();
101
+ } finally {
102
+ const duration = performance.now() - start;
103
+ this.debug(`${label}: ${duration.toFixed(2)}ms`);
104
+ }
105
+ }
106
+ async timeAsync(label, fn) {
107
+ if (!shouldLog("debug")) {
108
+ return fn();
109
+ }
110
+ const start = performance.now();
111
+ try {
112
+ return await fn();
113
+ } finally {
114
+ const duration = performance.now() - start;
115
+ this.debug(`${label}: ${duration.toFixed(2)}ms`);
116
+ }
117
+ }
118
+ child(subTag) {
119
+ return new Logger(`${this.tag}:${subTag}`);
120
+ }
121
+ debugIf(condition, ...args) {
122
+ if (condition)
123
+ this.debug(...args);
124
+ }
125
+ warnIf(condition, ...args) {
126
+ if (condition)
127
+ this.warn(...args);
128
+ }
129
+ errorIf(condition, ...args) {
130
+ if (condition)
131
+ this.error(...args);
132
+ }
133
+ loggedOnce = new Set;
134
+ warnOnce(key, ...args) {
135
+ if (this.loggedOnce.has(key))
136
+ return;
137
+ this.loggedOnce.add(key);
138
+ this.warn(...args);
139
+ }
140
+ debugOnce(key, ...args) {
141
+ if (this.loggedOnce.has(key))
142
+ return;
143
+ this.loggedOnce.add(key);
144
+ this.debug(...args);
145
+ }
146
+ }
147
+ function createLogger(tag) {
148
+ return new Logger(tag);
149
+ }
150
+ var LOG_LEVEL_ORDER, LOG_LEVEL_COLORS, RESET_COLOR = "\x1B[0m", config, logger, log, frameworkLoggers;
151
+ var init_logger = __esm(() => {
152
+ LOG_LEVEL_ORDER = {
153
+ debug: 0,
154
+ info: 1,
155
+ warn: 2,
156
+ error: 3,
157
+ none: 4
158
+ };
159
+ LOG_LEVEL_COLORS = {
160
+ debug: "\x1B[36m",
161
+ info: "\x1B[32m",
162
+ warn: "\x1B[33m",
163
+ error: "\x1B[31m"
164
+ };
165
+ config = {
166
+ level: isProduction() ? "error" : "debug",
167
+ colors: true,
168
+ timestamps: false
169
+ };
170
+ logger = createLogger("Hypen");
171
+ log = {
172
+ debug: (tag, ...args) => {
173
+ if (!shouldLog("debug"))
174
+ return;
175
+ console.log(formatTag(tag, "debug"), ...args);
176
+ },
177
+ info: (tag, ...args) => {
178
+ if (!shouldLog("info"))
179
+ return;
180
+ console.info(formatTag(tag, "info"), ...args);
181
+ },
182
+ warn: (tag, ...args) => {
183
+ if (!shouldLog("warn"))
184
+ return;
185
+ console.warn(formatTag(tag, "warn"), ...args);
186
+ },
187
+ error: (tag, ...args) => {
188
+ if (!shouldLog("error"))
189
+ return;
190
+ console.error(formatTag(tag, "error"), ...args);
191
+ }
192
+ };
193
+ frameworkLoggers = {
194
+ hypen: createLogger("Hypen"),
195
+ engine: createLogger("Engine"),
196
+ router: createLogger("Router"),
197
+ state: createLogger("State"),
198
+ events: createLogger("Events"),
199
+ remote: createLogger("Remote"),
200
+ renderer: createLogger("Renderer"),
201
+ module: createLogger("Module"),
202
+ lifecycle: createLogger("Lifecycle"),
203
+ loader: createLogger("Loader"),
204
+ context: createLogger("Context"),
205
+ discovery: createLogger("Discovery"),
206
+ plugin: createLogger("Plugin"),
207
+ canvas: createLogger("Canvas"),
208
+ debug: createLogger("Debug")
209
+ };
210
+ });
211
+
212
+ // src/events.ts
213
+ init_logger();
214
+ var log2 = frameworkLoggers.events;
215
+
216
+ class TypedEventEmitter {
217
+ eventBus = new Map;
218
+ emit(event, payload) {
219
+ const handlers = this.eventBus.get(event);
220
+ if (!handlers || handlers.size === 0) {
221
+ return;
222
+ }
223
+ handlers.forEach((handler) => {
224
+ try {
225
+ handler(payload);
226
+ } catch (error) {
227
+ log2.error(`Error in event handler for "${String(event)}":`, error);
228
+ }
229
+ });
230
+ }
231
+ on(event, handler) {
232
+ if (!this.eventBus.has(event)) {
233
+ this.eventBus.set(event, new Set);
234
+ }
235
+ const handlers = this.eventBus.get(event);
236
+ handlers.add(handler);
237
+ return () => {
238
+ handlers.delete(handler);
239
+ if (handlers.size === 0) {
240
+ this.eventBus.delete(event);
241
+ }
242
+ };
243
+ }
244
+ once(event, handler) {
245
+ const wrappedHandler = (payload) => {
246
+ handler(payload);
247
+ unsubscribe();
248
+ };
249
+ const unsubscribe = this.on(event, wrappedHandler);
250
+ return unsubscribe;
251
+ }
252
+ off(event, handler) {
253
+ const handlers = this.eventBus.get(event);
254
+ if (handlers) {
255
+ handlers.delete(handler);
256
+ if (handlers.size === 0) {
257
+ this.eventBus.delete(event);
258
+ }
259
+ }
260
+ }
261
+ removeAllListeners(event) {
262
+ this.eventBus.delete(event);
263
+ }
264
+ clearAll() {
265
+ this.eventBus.clear();
266
+ }
267
+ listenerCount(event) {
268
+ return this.eventBus.get(event)?.size ?? 0;
269
+ }
270
+ eventNames() {
271
+ return Array.from(this.eventBus.keys());
272
+ }
273
+ }
274
+ function createEventEmitter() {
275
+ return new TypedEventEmitter;
276
+ }
277
+ export {
278
+ createEventEmitter,
279
+ TypedEventEmitter
280
+ };
281
+
282
+ //# debugId=61BFE19F94E55E0C64756E2164756E21