@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
|
@@ -0,0 +1,347 @@
|
|
|
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.browser.ts
|
|
213
|
+
init_logger();
|
|
214
|
+
var log2 = frameworkLoggers.engine;
|
|
215
|
+
var wasmInit = null;
|
|
216
|
+
var WasmEngineClass = null;
|
|
217
|
+
function mapToObject(value) {
|
|
218
|
+
if (value instanceof Map) {
|
|
219
|
+
const obj = {};
|
|
220
|
+
for (const [key, val] of value.entries()) {
|
|
221
|
+
obj[key] = mapToObject(val);
|
|
222
|
+
}
|
|
223
|
+
return obj;
|
|
224
|
+
} else if (Array.isArray(value)) {
|
|
225
|
+
return value.map(mapToObject);
|
|
226
|
+
} else if (value && typeof value === "object" && value.constructor === Object) {
|
|
227
|
+
const obj = {};
|
|
228
|
+
for (const [key, val] of Object.entries(value)) {
|
|
229
|
+
obj[key] = mapToObject(val);
|
|
230
|
+
}
|
|
231
|
+
return obj;
|
|
232
|
+
}
|
|
233
|
+
return value;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
class Engine {
|
|
237
|
+
wasmEngine = null;
|
|
238
|
+
initialized = false;
|
|
239
|
+
async init(options = {}) {
|
|
240
|
+
if (this.initialized)
|
|
241
|
+
return;
|
|
242
|
+
const cdnBase = "https://unpkg.com/@hypen-space/core@latest/wasm-browser";
|
|
243
|
+
const jsUrl = options.jsUrl ?? `${cdnBase}/hypen_engine.js`;
|
|
244
|
+
const wasmUrl = options.wasmUrl ?? `${cdnBase}/hypen_engine_bg.wasm`;
|
|
245
|
+
try {
|
|
246
|
+
const wasmModule = await import(jsUrl);
|
|
247
|
+
wasmInit = wasmModule.default;
|
|
248
|
+
WasmEngineClass = wasmModule.WasmEngine;
|
|
249
|
+
await wasmInit(wasmUrl);
|
|
250
|
+
this.wasmEngine = new WasmEngineClass;
|
|
251
|
+
this.initialized = true;
|
|
252
|
+
} catch (error) {
|
|
253
|
+
log2.error("Failed to initialize WASM engine:", error);
|
|
254
|
+
throw error;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
ensureInitialized() {
|
|
258
|
+
if (!this.wasmEngine) {
|
|
259
|
+
throw new Error("Engine not initialized. Call init() first.");
|
|
260
|
+
}
|
|
261
|
+
return this.wasmEngine;
|
|
262
|
+
}
|
|
263
|
+
setRenderCallback(callback) {
|
|
264
|
+
const engine = this.ensureInitialized();
|
|
265
|
+
engine.setRenderCallback((patches) => {
|
|
266
|
+
callback(patches);
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
setComponentResolver(resolver) {
|
|
270
|
+
const engine = this.ensureInitialized();
|
|
271
|
+
engine.setComponentResolver((componentName, contextPath) => {
|
|
272
|
+
const result = resolver(componentName, contextPath);
|
|
273
|
+
return result;
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
renderSource(source) {
|
|
277
|
+
const engine = this.ensureInitialized();
|
|
278
|
+
engine.renderSource(source);
|
|
279
|
+
}
|
|
280
|
+
renderLazyComponent(source) {
|
|
281
|
+
const engine = this.ensureInitialized();
|
|
282
|
+
engine.renderLazyComponent(source);
|
|
283
|
+
}
|
|
284
|
+
renderInto(source, parentNodeId, state) {
|
|
285
|
+
const engine = this.ensureInitialized();
|
|
286
|
+
const safeState = JSON.parse(JSON.stringify(state));
|
|
287
|
+
engine.renderInto(source, parentNodeId, safeState);
|
|
288
|
+
}
|
|
289
|
+
notifyStateChange(paths, values) {
|
|
290
|
+
const engine = this.ensureInitialized();
|
|
291
|
+
if (paths.length === 0) {
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
const plainValues = JSON.parse(JSON.stringify(values));
|
|
295
|
+
engine.updateStateSparse(paths, plainValues);
|
|
296
|
+
log2.debug("State changed (sparse):", paths);
|
|
297
|
+
}
|
|
298
|
+
notifyStateChangeFull(paths, currentState) {
|
|
299
|
+
const engine = this.ensureInitialized();
|
|
300
|
+
const plainObject = JSON.parse(JSON.stringify(currentState));
|
|
301
|
+
engine.updateState(plainObject);
|
|
302
|
+
if (paths.length > 0) {
|
|
303
|
+
log2.debug("State changed (full):", paths);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
updateState(statePatch) {
|
|
307
|
+
const engine = this.ensureInitialized();
|
|
308
|
+
const plainObject = JSON.parse(JSON.stringify(statePatch));
|
|
309
|
+
engine.updateState(plainObject);
|
|
310
|
+
}
|
|
311
|
+
dispatchAction(name, payload) {
|
|
312
|
+
const engine = this.ensureInitialized();
|
|
313
|
+
log2.debug(`Action dispatched: ${name}`);
|
|
314
|
+
engine.dispatchAction(name, payload ?? null);
|
|
315
|
+
}
|
|
316
|
+
onAction(actionName, handler) {
|
|
317
|
+
const engine = this.ensureInitialized();
|
|
318
|
+
engine.onAction(actionName, (action) => {
|
|
319
|
+
const normalizedAction = {
|
|
320
|
+
...action,
|
|
321
|
+
payload: action.payload ? mapToObject(action.payload) : action.payload
|
|
322
|
+
};
|
|
323
|
+
Promise.resolve(handler(normalizedAction)).catch((err) => log2.error("Action handler error:", err));
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
setModule(name, actions, stateKeys, initialState) {
|
|
327
|
+
const engine = this.ensureInitialized();
|
|
328
|
+
engine.setModule(name, actions, stateKeys, initialState);
|
|
329
|
+
}
|
|
330
|
+
getRevision() {
|
|
331
|
+
const engine = this.ensureInitialized();
|
|
332
|
+
return engine.getRevision();
|
|
333
|
+
}
|
|
334
|
+
clearTree() {
|
|
335
|
+
const engine = this.ensureInitialized();
|
|
336
|
+
engine.clearTree();
|
|
337
|
+
}
|
|
338
|
+
debugParseComponent(source) {
|
|
339
|
+
const engine = this.ensureInitialized();
|
|
340
|
+
return engine.debugParseComponent(source);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
export {
|
|
344
|
+
Engine
|
|
345
|
+
};
|
|
346
|
+
|
|
347
|
+
//# debugId=A007129E7B8BDD5964756E2164756E21
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/logger.ts", "../src/engine.browser.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 * Browser-compatible wrapper around the WASM engine\n * Uses web target for browser environments\n */\n\nimport { frameworkLoggers } from \"./logger.js\";\n\nconst log = frameworkLoggers.engine;\n\n// Dynamic import path - will be configured at build time\n// For browser, the WASM needs to be served and initialized explicitly\nlet wasmInit: ((path?: string) => Promise<void>) | null = null;\nlet WasmEngineClass: any = null;\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\nexport interface EngineInitOptions {\n /**\n * URL to the WASM binary file.\n * Default: loads from unpkg CDN\n * For production, consider serving from your own domain for better performance.\n */\n wasmUrl?: string;\n\n /**\n * URL to the WASM JS glue code.\n * Default: loads from unpkg CDN\n * For self-hosting, point to your own copy of hypen_engine.js\n */\n jsUrl?: string;\n}\n\n/**\n * Recursively convert Maps and nested structures to plain objects\n */\nfunction mapToObject(value: any): any {\n if (value instanceof Map) {\n const obj: Record<string, any> = {};\n for (const [key, val] of value.entries()) {\n obj[key] = mapToObject(val);\n }\n return obj;\n } else if (Array.isArray(value)) {\n return value.map(mapToObject);\n } else if (value && typeof value === 'object' && value.constructor === Object) {\n const obj: Record<string, any> = {};\n for (const [key, val] of Object.entries(value)) {\n obj[key] = mapToObject(val);\n }\n return obj;\n }\n return value;\n}\n\n/**\n * Engine wraps the WASM engine and provides a TypeScript-friendly API\n * Browser version with explicit WASM initialization\n */\nexport class Engine {\n private wasmEngine: any = null;\n private initialized = false;\n\n /**\n * Initialize the WASM module\n * @param options - Initialization options including wasmUrl and jsUrl\n */\n async init(options: EngineInitOptions = {}): Promise<void> {\n if (this.initialized) return;\n\n // Default to CDN for zero-config experience\n const cdnBase = \"https://unpkg.com/@hypen-space/core@latest/wasm-browser\";\n const jsUrl = options.jsUrl ?? `${cdnBase}/hypen_engine.js`;\n const wasmUrl = options.wasmUrl ?? `${cdnBase}/hypen_engine_bg.wasm`;\n\n // Dynamically import the WASM JS glue code from CDN (or custom URL)\n // Using dynamic import with variable URL to avoid bundler resolution\n try {\n const wasmModule: any = await import(/* @vite-ignore */ jsUrl);\n wasmInit = wasmModule.default;\n WasmEngineClass = wasmModule.WasmEngine;\n\n // Initialize WASM with explicit path\n await wasmInit!(wasmUrl);\n\n this.wasmEngine = new WasmEngineClass();\n this.initialized = true;\n } catch (error) {\n log.error(\"Failed to initialize WASM engine:\", error);\n throw error;\n }\n }\n\n /**\n * Ensure the engine is initialized before operations\n */\n private ensureInitialized(): any {\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 const safeState = JSON.parse(JSON.stringify(state));\n engine.renderInto(source, parentNodeId, safeState);\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 const plainValues = JSON.parse(JSON.stringify(values));\n engine.updateStateSparse(paths, plainValues);\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 const plainObject = JSON.parse(JSON.stringify(currentState));\n engine.updateState(plainObject);\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 const plainObject = JSON.parse(JSON.stringify(statePatch));\n engine.updateState(plainObject);\n }\n\n /**\n * Dispatch an action\n */\n dispatchAction(name: string, payload?: any): void {\n const engine = this.ensureInitialized();\n log.debug(`Action dispatched: ${name}`);\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 const normalizedAction: Action = {\n ...action,\n payload: action.payload ? mapToObject(action.payload) : action.payload,\n };\n Promise.resolve(handler(normalizedAction)).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(): bigint {\n const engine = this.ensureInitialized();\n return 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": "A007129E7B8BDD5964756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|