@hypen-space/core 0.4.46 → 0.4.82
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/README.md +8 -9
- package/dist/app.d.ts +56 -6
- package/dist/app.js +77 -8
- package/dist/app.js.map +4 -4
- package/dist/components/builtin.js +77 -8
- package/dist/components/builtin.js.map +4 -4
- package/dist/datasource.d.ts +4 -4
- package/dist/datasource.js.map +1 -1
- package/dist/engine-base.d.ts +193 -0
- package/dist/engine-base.js +540 -0
- package/dist/engine-base.js.map +12 -0
- package/dist/hypen.d.ts +24 -19
- package/dist/hypen.js +7 -7
- package/dist/hypen.js.map +3 -3
- package/dist/index.browser.js +86 -14
- package/dist/index.browser.js.map +6 -6
- package/dist/index.d.ts +3 -2
- package/dist/index.js +92 -20
- package/dist/index.js.map +7 -7
- package/dist/persistence.d.ts +21 -0
- package/dist/remote/client.d.ts +2 -0
- package/dist/remote/client.js +3 -2
- package/dist/remote/client.js.map +3 -3
- package/dist/remote/index.js +3 -2
- package/dist/remote/index.js.map +3 -3
- package/dist/remote/types.d.ts +2 -0
- package/dist/router.js +8 -6
- package/dist/router.js.map +3 -3
- package/package.json +7 -1
- package/src/app.ts +177 -29
- package/src/datasource.ts +4 -4
- package/src/engine-base.ts +358 -0
- package/src/hypen.ts +34 -28
- package/src/index.ts +8 -2
- package/src/persistence.ts +25 -0
- package/src/remote/client.ts +3 -0
- package/src/remote/types.ts +2 -0
- package/src/router.ts +13 -6
- package/src/types.ts +1 -0
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __returnValue = (v) => v;
|
|
3
|
+
function __exportSetter(name, newValue) {
|
|
4
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
5
|
+
}
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, {
|
|
9
|
+
get: all[name],
|
|
10
|
+
enumerable: true,
|
|
11
|
+
configurable: true,
|
|
12
|
+
set: __exportSetter.bind(all, name)
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
16
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
17
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
18
|
+
}) : x)(function(x) {
|
|
19
|
+
if (typeof require !== "undefined")
|
|
20
|
+
return require.apply(this, arguments);
|
|
21
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// src/result.ts
|
|
25
|
+
function Ok(value) {
|
|
26
|
+
return { ok: true, value };
|
|
27
|
+
}
|
|
28
|
+
function Err(error) {
|
|
29
|
+
return { ok: false, error };
|
|
30
|
+
}
|
|
31
|
+
function isOk(result) {
|
|
32
|
+
return result.ok;
|
|
33
|
+
}
|
|
34
|
+
function isErr(result) {
|
|
35
|
+
return !result.ok;
|
|
36
|
+
}
|
|
37
|
+
async function fromPromise(promise, mapError) {
|
|
38
|
+
try {
|
|
39
|
+
const value = await promise;
|
|
40
|
+
return Ok(value);
|
|
41
|
+
} catch (e) {
|
|
42
|
+
if (mapError) {
|
|
43
|
+
return Err(mapError(e));
|
|
44
|
+
}
|
|
45
|
+
return Err(e);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function fromTry(fn, mapError) {
|
|
49
|
+
try {
|
|
50
|
+
return Ok(fn());
|
|
51
|
+
} catch (e) {
|
|
52
|
+
if (mapError) {
|
|
53
|
+
return Err(mapError(e));
|
|
54
|
+
}
|
|
55
|
+
return Err(e);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function map(result, fn) {
|
|
59
|
+
if (result.ok) {
|
|
60
|
+
return Ok(fn(result.value));
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
function mapErr(result, fn) {
|
|
65
|
+
if (!result.ok) {
|
|
66
|
+
return Err(fn(result.error));
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
function flatMap(result, fn) {
|
|
71
|
+
if (result.ok) {
|
|
72
|
+
return fn(result.value);
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
function unwrap(result) {
|
|
77
|
+
if (result.ok) {
|
|
78
|
+
return result.value;
|
|
79
|
+
}
|
|
80
|
+
throw result.error;
|
|
81
|
+
}
|
|
82
|
+
function unwrapOr(result, defaultValue) {
|
|
83
|
+
if (result.ok) {
|
|
84
|
+
return result.value;
|
|
85
|
+
}
|
|
86
|
+
return defaultValue;
|
|
87
|
+
}
|
|
88
|
+
function unwrapOrElse(result, fn) {
|
|
89
|
+
if (result.ok) {
|
|
90
|
+
return result.value;
|
|
91
|
+
}
|
|
92
|
+
return fn(result.error);
|
|
93
|
+
}
|
|
94
|
+
function match(result, handlers) {
|
|
95
|
+
if (result.ok) {
|
|
96
|
+
return handlers.ok(result.value);
|
|
97
|
+
}
|
|
98
|
+
return handlers.err(result.error);
|
|
99
|
+
}
|
|
100
|
+
function all(results) {
|
|
101
|
+
const values = [];
|
|
102
|
+
for (const result of results) {
|
|
103
|
+
if (!result.ok) {
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
values.push(result.value);
|
|
107
|
+
}
|
|
108
|
+
return Ok(values);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
class HypenError extends Error {
|
|
112
|
+
code;
|
|
113
|
+
context;
|
|
114
|
+
cause;
|
|
115
|
+
constructor(code, message, options) {
|
|
116
|
+
super(message);
|
|
117
|
+
this.name = "HypenError";
|
|
118
|
+
this.code = code;
|
|
119
|
+
this.context = options?.context;
|
|
120
|
+
this.cause = options?.cause;
|
|
121
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
class ActionError extends HypenError {
|
|
126
|
+
actionName;
|
|
127
|
+
constructor(actionName, cause) {
|
|
128
|
+
super("ACTION_ERROR", `Action handler "${actionName}" failed: ${cause instanceof Error ? cause.message : String(cause)}`, {
|
|
129
|
+
context: { actionName },
|
|
130
|
+
cause: cause instanceof Error ? cause : undefined
|
|
131
|
+
});
|
|
132
|
+
this.name = "ActionError";
|
|
133
|
+
this.actionName = actionName;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
class ConnectionError extends HypenError {
|
|
138
|
+
url;
|
|
139
|
+
attempt;
|
|
140
|
+
constructor(url, cause, attempt) {
|
|
141
|
+
super("CONNECTION_ERROR", `Connection to "${url}" failed${attempt ? ` (attempt ${attempt})` : ""}: ${cause instanceof Error ? cause.message : String(cause)}`, {
|
|
142
|
+
context: { url, attempt },
|
|
143
|
+
cause: cause instanceof Error ? cause : undefined
|
|
144
|
+
});
|
|
145
|
+
this.name = "ConnectionError";
|
|
146
|
+
this.url = url;
|
|
147
|
+
this.attempt = attempt;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
class StateError extends HypenError {
|
|
152
|
+
path;
|
|
153
|
+
constructor(message, path, cause) {
|
|
154
|
+
super("STATE_ERROR", message, {
|
|
155
|
+
context: { path },
|
|
156
|
+
cause: cause instanceof Error ? cause : undefined
|
|
157
|
+
});
|
|
158
|
+
this.name = "StateError";
|
|
159
|
+
this.path = path;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
class ParseError extends HypenError {
|
|
164
|
+
source;
|
|
165
|
+
constructor(message, source, cause) {
|
|
166
|
+
super("PARSE_ERROR", message, {
|
|
167
|
+
context: { source },
|
|
168
|
+
cause: cause instanceof Error ? cause : undefined
|
|
169
|
+
});
|
|
170
|
+
this.name = "ParseError";
|
|
171
|
+
this.source = source;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
class RenderError extends HypenError {
|
|
176
|
+
constructor(message, cause) {
|
|
177
|
+
super("RENDER_ERROR", message, {
|
|
178
|
+
cause: cause instanceof Error ? cause : undefined
|
|
179
|
+
});
|
|
180
|
+
this.name = "RenderError";
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function classifyEngineError(err) {
|
|
184
|
+
if (err && typeof err === "object" && "message" in err && "type" in err) {
|
|
185
|
+
const structured = err;
|
|
186
|
+
switch (structured.type) {
|
|
187
|
+
case "parseError":
|
|
188
|
+
return new ParseError(structured.message);
|
|
189
|
+
case "stateError":
|
|
190
|
+
return new StateError(structured.message);
|
|
191
|
+
case "renderError":
|
|
192
|
+
return new RenderError(structured.message);
|
|
193
|
+
case "actionError":
|
|
194
|
+
return new HypenError("ACTION_ERROR", structured.message);
|
|
195
|
+
default:
|
|
196
|
+
return new HypenError("UNKNOWN_ERROR", structured.message);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
200
|
+
if (message.startsWith("Parse error:")) {
|
|
201
|
+
return new ParseError(message);
|
|
202
|
+
}
|
|
203
|
+
if (message.startsWith("Invalid state:") || message.startsWith("Invalid state patch:")) {
|
|
204
|
+
return new StateError(message);
|
|
205
|
+
}
|
|
206
|
+
if (message.startsWith("Parent node not found:")) {
|
|
207
|
+
return new RenderError(message);
|
|
208
|
+
}
|
|
209
|
+
return new RenderError(message);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// src/logger.ts
|
|
213
|
+
var LOG_LEVEL_ORDER = {
|
|
214
|
+
debug: 0,
|
|
215
|
+
info: 1,
|
|
216
|
+
warn: 2,
|
|
217
|
+
error: 3,
|
|
218
|
+
none: 4
|
|
219
|
+
};
|
|
220
|
+
var LOG_LEVEL_COLORS = {
|
|
221
|
+
debug: "\x1B[36m",
|
|
222
|
+
info: "\x1B[32m",
|
|
223
|
+
warn: "\x1B[33m",
|
|
224
|
+
error: "\x1B[31m"
|
|
225
|
+
};
|
|
226
|
+
var RESET_COLOR = "\x1B[0m";
|
|
227
|
+
function isProduction() {
|
|
228
|
+
if (typeof process !== "undefined" && process.env) {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
var config = {
|
|
234
|
+
level: isProduction() ? "error" : "info",
|
|
235
|
+
colors: true,
|
|
236
|
+
timestamps: false
|
|
237
|
+
};
|
|
238
|
+
function setLogLevel(level) {
|
|
239
|
+
config.level = level;
|
|
240
|
+
}
|
|
241
|
+
function getLogLevel() {
|
|
242
|
+
return config.level;
|
|
243
|
+
}
|
|
244
|
+
function configureLogger(options) {
|
|
245
|
+
config = { ...config, ...options };
|
|
246
|
+
}
|
|
247
|
+
function enableLogging() {
|
|
248
|
+
config.level = "debug";
|
|
249
|
+
}
|
|
250
|
+
function disableLogging() {
|
|
251
|
+
config.level = "none";
|
|
252
|
+
}
|
|
253
|
+
function setDebugMode(enabled) {
|
|
254
|
+
config.level = enabled ? "debug" : "error";
|
|
255
|
+
}
|
|
256
|
+
function isDebugMode() {
|
|
257
|
+
return config.level === "debug";
|
|
258
|
+
}
|
|
259
|
+
function shouldLog(level) {
|
|
260
|
+
return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[config.level];
|
|
261
|
+
}
|
|
262
|
+
function formatTag(tag, level) {
|
|
263
|
+
const timestamp = config.timestamps ? `${new Date().toISOString()} ` : "";
|
|
264
|
+
if (config.colors && level !== "none") {
|
|
265
|
+
const color = LOG_LEVEL_COLORS[level];
|
|
266
|
+
return `${timestamp}${color}[${tag}]${RESET_COLOR}`;
|
|
267
|
+
}
|
|
268
|
+
return `${timestamp}[${tag}]`;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
class Logger {
|
|
272
|
+
tag;
|
|
273
|
+
constructor(tag) {
|
|
274
|
+
this.tag = tag;
|
|
275
|
+
}
|
|
276
|
+
debug(...args) {
|
|
277
|
+
if (!shouldLog("debug"))
|
|
278
|
+
return;
|
|
279
|
+
if (config.handler) {
|
|
280
|
+
config.handler.debug(this.tag, ...args);
|
|
281
|
+
} else {
|
|
282
|
+
console.log(formatTag(this.tag, "debug"), ...args);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
info(...args) {
|
|
286
|
+
if (!shouldLog("info"))
|
|
287
|
+
return;
|
|
288
|
+
if (config.handler) {
|
|
289
|
+
config.handler.info(this.tag, ...args);
|
|
290
|
+
} else {
|
|
291
|
+
console.info(formatTag(this.tag, "info"), ...args);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
warn(...args) {
|
|
295
|
+
if (!shouldLog("warn"))
|
|
296
|
+
return;
|
|
297
|
+
if (config.handler) {
|
|
298
|
+
config.handler.warn(this.tag, ...args);
|
|
299
|
+
} else {
|
|
300
|
+
console.warn(formatTag(this.tag, "warn"), ...args);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
error(...args) {
|
|
304
|
+
if (!shouldLog("error"))
|
|
305
|
+
return;
|
|
306
|
+
if (config.handler) {
|
|
307
|
+
config.handler.error(this.tag, ...args);
|
|
308
|
+
} else {
|
|
309
|
+
console.error(formatTag(this.tag, "error"), ...args);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
time(label, fn) {
|
|
313
|
+
if (!shouldLog("debug")) {
|
|
314
|
+
return fn();
|
|
315
|
+
}
|
|
316
|
+
const start = performance.now();
|
|
317
|
+
try {
|
|
318
|
+
return fn();
|
|
319
|
+
} finally {
|
|
320
|
+
const duration = performance.now() - start;
|
|
321
|
+
this.debug(`${label}: ${duration.toFixed(2)}ms`);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
async timeAsync(label, fn) {
|
|
325
|
+
if (!shouldLog("debug")) {
|
|
326
|
+
return fn();
|
|
327
|
+
}
|
|
328
|
+
const start = performance.now();
|
|
329
|
+
try {
|
|
330
|
+
return await fn();
|
|
331
|
+
} finally {
|
|
332
|
+
const duration = performance.now() - start;
|
|
333
|
+
this.debug(`${label}: ${duration.toFixed(2)}ms`);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
child(subTag) {
|
|
337
|
+
return new Logger(`${this.tag}:${subTag}`);
|
|
338
|
+
}
|
|
339
|
+
debugIf(condition, ...args) {
|
|
340
|
+
if (condition)
|
|
341
|
+
this.debug(...args);
|
|
342
|
+
}
|
|
343
|
+
warnIf(condition, ...args) {
|
|
344
|
+
if (condition)
|
|
345
|
+
this.warn(...args);
|
|
346
|
+
}
|
|
347
|
+
errorIf(condition, ...args) {
|
|
348
|
+
if (condition)
|
|
349
|
+
this.error(...args);
|
|
350
|
+
}
|
|
351
|
+
loggedOnce = new Set;
|
|
352
|
+
warnOnce(key, ...args) {
|
|
353
|
+
if (this.loggedOnce.has(key))
|
|
354
|
+
return;
|
|
355
|
+
this.loggedOnce.add(key);
|
|
356
|
+
this.warn(...args);
|
|
357
|
+
}
|
|
358
|
+
debugOnce(key, ...args) {
|
|
359
|
+
if (this.loggedOnce.has(key))
|
|
360
|
+
return;
|
|
361
|
+
this.loggedOnce.add(key);
|
|
362
|
+
this.debug(...args);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
function createLogger(tag) {
|
|
366
|
+
return new Logger(tag);
|
|
367
|
+
}
|
|
368
|
+
var logger = createLogger("Hypen");
|
|
369
|
+
var log = {
|
|
370
|
+
debug: (tag, ...args) => {
|
|
371
|
+
if (!shouldLog("debug"))
|
|
372
|
+
return;
|
|
373
|
+
console.log(formatTag(tag, "debug"), ...args);
|
|
374
|
+
},
|
|
375
|
+
info: (tag, ...args) => {
|
|
376
|
+
if (!shouldLog("info"))
|
|
377
|
+
return;
|
|
378
|
+
console.info(formatTag(tag, "info"), ...args);
|
|
379
|
+
},
|
|
380
|
+
warn: (tag, ...args) => {
|
|
381
|
+
if (!shouldLog("warn"))
|
|
382
|
+
return;
|
|
383
|
+
console.warn(formatTag(tag, "warn"), ...args);
|
|
384
|
+
},
|
|
385
|
+
error: (tag, ...args) => {
|
|
386
|
+
if (!shouldLog("error"))
|
|
387
|
+
return;
|
|
388
|
+
console.error(formatTag(tag, "error"), ...args);
|
|
389
|
+
}
|
|
390
|
+
};
|
|
391
|
+
var frameworkLoggers = {
|
|
392
|
+
hypen: createLogger("Hypen"),
|
|
393
|
+
engine: createLogger("Engine"),
|
|
394
|
+
router: createLogger("Router"),
|
|
395
|
+
state: createLogger("State"),
|
|
396
|
+
events: createLogger("Events"),
|
|
397
|
+
remote: createLogger("Remote"),
|
|
398
|
+
renderer: createLogger("Renderer"),
|
|
399
|
+
module: createLogger("Module"),
|
|
400
|
+
lifecycle: createLogger("Lifecycle"),
|
|
401
|
+
loader: createLogger("Loader"),
|
|
402
|
+
context: createLogger("Context"),
|
|
403
|
+
discovery: createLogger("Discovery"),
|
|
404
|
+
plugin: createLogger("Plugin"),
|
|
405
|
+
canvas: createLogger("Canvas"),
|
|
406
|
+
debug: createLogger("Debug")
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
// src/engine-base.ts
|
|
410
|
+
var log2 = frameworkLoggers.engine;
|
|
411
|
+
|
|
412
|
+
class BaseEngine {
|
|
413
|
+
wasmEngine = null;
|
|
414
|
+
initialized = false;
|
|
415
|
+
ensureInitialized() {
|
|
416
|
+
if (!this.wasmEngine) {
|
|
417
|
+
throw new Error("Engine not initialized. Call init() first.");
|
|
418
|
+
}
|
|
419
|
+
return this.wasmEngine;
|
|
420
|
+
}
|
|
421
|
+
setRenderCallback(callback) {
|
|
422
|
+
const engine = this.ensureInitialized();
|
|
423
|
+
engine.setRenderCallback((patches) => {
|
|
424
|
+
callback(patches);
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
setComponentResolver(resolver) {
|
|
428
|
+
const engine = this.ensureInitialized();
|
|
429
|
+
engine.setComponentResolver((componentName, contextPath) => {
|
|
430
|
+
return resolver(componentName, contextPath);
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
renderSource(source) {
|
|
434
|
+
const engine = this.ensureInitialized();
|
|
435
|
+
try {
|
|
436
|
+
engine.renderSource(source);
|
|
437
|
+
} catch (err) {
|
|
438
|
+
throw classifyEngineError(err);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
renderLazyComponent(source) {
|
|
442
|
+
const engine = this.ensureInitialized();
|
|
443
|
+
engine.renderLazyComponent(source);
|
|
444
|
+
}
|
|
445
|
+
renderInto(source, parentNodeId, state) {
|
|
446
|
+
const engine = this.ensureInitialized();
|
|
447
|
+
try {
|
|
448
|
+
engine.renderInto(source, parentNodeId, this.unwrapForWasm(state));
|
|
449
|
+
} catch (err) {
|
|
450
|
+
throw classifyEngineError(err);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
updateStateSparse(scope, paths, values) {
|
|
454
|
+
const engine = this.ensureInitialized();
|
|
455
|
+
if (paths.length === 0) {
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
try {
|
|
459
|
+
engine.updateStateSparse(scope ?? "", paths, this.unwrapForWasm(values));
|
|
460
|
+
} catch (err) {
|
|
461
|
+
throw classifyEngineError(err);
|
|
462
|
+
}
|
|
463
|
+
log2.debug("State changed (sparse):", { scope, paths });
|
|
464
|
+
}
|
|
465
|
+
updateState(scope, statePatch) {
|
|
466
|
+
const engine = this.ensureInitialized();
|
|
467
|
+
engine.updateState(scope ?? "", this.unwrapForWasm(statePatch));
|
|
468
|
+
}
|
|
469
|
+
dispatchAction(name, payload) {
|
|
470
|
+
const engine = this.ensureInitialized();
|
|
471
|
+
try {
|
|
472
|
+
engine.dispatchAction(name, payload ?? null);
|
|
473
|
+
} catch (err) {
|
|
474
|
+
throw classifyEngineError(err);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
onAction(actionName, handler) {
|
|
478
|
+
const engine = this.ensureInitialized();
|
|
479
|
+
engine.onAction(actionName, (action) => {
|
|
480
|
+
const normalized = this.normalizeAction(action);
|
|
481
|
+
Promise.resolve(handler(normalized)).catch((err) => {
|
|
482
|
+
log2.error("Action handler error:", err);
|
|
483
|
+
});
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
normalizeAction(action) {
|
|
487
|
+
return action;
|
|
488
|
+
}
|
|
489
|
+
setModule(name, actions, stateKeys, initialState) {
|
|
490
|
+
const engine = this.ensureInitialized();
|
|
491
|
+
engine.setModule(name, actions, stateKeys, initialState);
|
|
492
|
+
}
|
|
493
|
+
registerModule(name, actions, stateKeys, initialState) {
|
|
494
|
+
const engine = this.ensureInitialized();
|
|
495
|
+
engine.registerModule(name, actions, stateKeys, this.unwrapForWasm(initialState));
|
|
496
|
+
}
|
|
497
|
+
getRevision() {
|
|
498
|
+
const engine = this.ensureInitialized();
|
|
499
|
+
return Number(engine.getRevision());
|
|
500
|
+
}
|
|
501
|
+
clearResolvedComponents() {
|
|
502
|
+
const engine = this.ensureInitialized();
|
|
503
|
+
engine.clearResolvedComponents();
|
|
504
|
+
}
|
|
505
|
+
clearTree() {
|
|
506
|
+
const engine = this.ensureInitialized();
|
|
507
|
+
engine.clearTree();
|
|
508
|
+
}
|
|
509
|
+
reset() {
|
|
510
|
+
const engine = this.ensureInitialized();
|
|
511
|
+
engine.reset();
|
|
512
|
+
}
|
|
513
|
+
debugParseComponent(source) {
|
|
514
|
+
const engine = this.ensureInitialized();
|
|
515
|
+
return engine.debugParseComponent(source);
|
|
516
|
+
}
|
|
517
|
+
setContext(name, data) {
|
|
518
|
+
const engine = this.ensureInitialized();
|
|
519
|
+
try {
|
|
520
|
+
engine.setContext(name, this.unwrapForWasm(data));
|
|
521
|
+
} catch (err) {
|
|
522
|
+
throw classifyEngineError(err);
|
|
523
|
+
}
|
|
524
|
+
log2.debug(`Data source "${name}" context set`);
|
|
525
|
+
}
|
|
526
|
+
removeContext(name) {
|
|
527
|
+
const engine = this.ensureInitialized();
|
|
528
|
+
engine.removeContext(name);
|
|
529
|
+
}
|
|
530
|
+
registerResources(map2) {
|
|
531
|
+
const engine = this.ensureInitialized();
|
|
532
|
+
engine.registerResources(map2);
|
|
533
|
+
log2.debug(`Resources registered (${Object.keys(map2).length} entries)`);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
export {
|
|
537
|
+
BaseEngine
|
|
538
|
+
};
|
|
539
|
+
|
|
540
|
+
//# debugId=C692071C8477B29964756E2164756E21
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/result.ts", "../src/logger.ts", "../src/engine-base.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Result Type for Error Handling\n *\n * A lightweight Result type for explicit error handling without exceptions.\n * Provides type-safe error propagation and composition.\n */\n\n/**\n * Represents either a successful value or an error\n */\nexport type Result<T, E = Error> =\n | { readonly ok: true; readonly value: T }\n | { readonly ok: false; readonly error: E };\n\n/**\n * Create a successful Result\n */\nexport function Ok<T>(value: T): Result<T, never> {\n return { ok: true, value };\n}\n\n/**\n * Create a failed Result\n */\nexport function Err<E>(error: E): Result<never, E> {\n return { ok: false, error };\n}\n\n/**\n * Check if a Result is Ok\n */\nexport function isOk<T, E>(result: Result<T, E>): result is { ok: true; value: T } {\n return result.ok;\n}\n\n/**\n * Check if a Result is Err\n */\nexport function isErr<T, E>(result: Result<T, E>): result is { ok: false; error: E } {\n return !result.ok;\n}\n\n/**\n * Wrap a Promise in a Result, catching any thrown errors\n */\nexport async function fromPromise<T, E = Error>(\n promise: Promise<T>,\n mapError?: (e: unknown) => E\n): Promise<Result<T, E>> {\n try {\n const value = await promise;\n return Ok(value);\n } catch (e) {\n if (mapError) {\n return Err(mapError(e));\n }\n return Err(e as E);\n }\n}\n\n/**\n * Wrap a synchronous function in a Result, catching any thrown errors\n */\nexport function fromTry<T, E = Error>(\n fn: () => T,\n mapError?: (e: unknown) => E\n): Result<T, E> {\n try {\n return Ok(fn());\n } catch (e) {\n if (mapError) {\n return Err(mapError(e));\n }\n return Err(e as E);\n }\n}\n\n/**\n * Map over a successful Result value\n */\nexport function map<T, U, E>(\n result: Result<T, E>,\n fn: (value: T) => U\n): Result<U, E> {\n if (result.ok) {\n return Ok(fn(result.value));\n }\n return result;\n}\n\n/**\n * Map over a failed Result error\n */\nexport function mapErr<T, E, F>(\n result: Result<T, E>,\n fn: (error: E) => F\n): Result<T, F> {\n if (!result.ok) {\n return Err(fn(result.error));\n }\n return result;\n}\n\n/**\n * Chain Results together (flatMap)\n */\nexport function flatMap<T, U, E>(\n result: Result<T, E>,\n fn: (value: T) => Result<U, E>\n): Result<U, E> {\n if (result.ok) {\n return fn(result.value);\n }\n return result;\n}\n\n/**\n * Unwrap a Result, throwing if it's an error\n */\nexport function unwrap<T, E>(result: Result<T, E>): T {\n if (result.ok) {\n return result.value;\n }\n throw result.error;\n}\n\n/**\n * Unwrap a Result with a default value\n */\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n if (result.ok) {\n return result.value;\n }\n return defaultValue;\n}\n\n/**\n * Unwrap a Result with a lazy default value\n */\nexport function unwrapOrElse<T, E>(result: Result<T, E>, fn: (error: E) => T): T {\n if (result.ok) {\n return result.value;\n }\n return fn(result.error);\n}\n\n/**\n * Match on a Result, providing handlers for both cases\n */\nexport function match<T, E, U>(\n result: Result<T, E>,\n handlers: {\n ok: (value: T) => U;\n err: (error: E) => U;\n }\n): U {\n if (result.ok) {\n return handlers.ok(result.value);\n }\n return handlers.err(result.error);\n}\n\n/**\n * Combine multiple Results into a single Result containing an array\n * Returns the first error encountered, or Ok with all values\n */\nexport function all<T, E>(results: Result<T, E>[]): Result<T[], E> {\n const values: T[] = [];\n for (const result of results) {\n if (!result.ok) {\n return result;\n }\n values.push(result.value);\n }\n return Ok(values);\n}\n\n/**\n * Base class for typed errors with context\n */\nexport class HypenError extends Error {\n readonly code: string;\n readonly context?: Record<string, unknown>;\n override readonly cause?: Error;\n\n constructor(\n code: string,\n message: string,\n options?: { context?: Record<string, unknown>; cause?: Error }\n ) {\n super(message);\n this.name = 'HypenError';\n this.code = code;\n this.context = options?.context;\n this.cause = options?.cause;\n\n // Maintain proper prototype chain\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when an action handler fails\n */\nexport class ActionError extends HypenError {\n readonly actionName: string;\n\n constructor(actionName: string, cause?: unknown) {\n super(\n 'ACTION_ERROR',\n `Action handler \"${actionName}\" failed: ${cause instanceof Error ? cause.message : String(cause)}`,\n {\n context: { actionName },\n cause: cause instanceof Error ? cause : undefined,\n }\n );\n this.name = 'ActionError';\n this.actionName = actionName;\n }\n}\n\n/**\n * Error thrown when a connection fails\n */\nexport class ConnectionError extends HypenError {\n readonly url: string;\n readonly attempt?: number;\n\n constructor(url: string, cause?: unknown, attempt?: number) {\n super(\n 'CONNECTION_ERROR',\n `Connection to \"${url}\" failed${attempt ? ` (attempt ${attempt})` : ''}: ${\n cause instanceof Error ? cause.message : String(cause)\n }`,\n {\n context: { url, attempt },\n cause: cause instanceof Error ? cause : undefined,\n }\n );\n this.name = 'ConnectionError';\n this.url = url;\n this.attempt = attempt;\n }\n}\n\n/**\n * Error thrown when state operations fail\n */\nexport class StateError extends HypenError {\n readonly path?: string;\n\n constructor(message: string, path?: string, cause?: unknown) {\n super('STATE_ERROR', message, {\n context: { path },\n cause: cause instanceof Error ? cause : undefined,\n });\n this.name = 'StateError';\n this.path = path;\n }\n}\n\n/**\n * Error thrown when parsing Hypen DSL source fails\n */\nexport class ParseError extends HypenError {\n readonly source?: string;\n\n constructor(message: string, source?: string, cause?: unknown) {\n super('PARSE_ERROR', message, {\n context: { source },\n cause: cause instanceof Error ? cause : undefined,\n });\n this.name = 'ParseError';\n this.source = source;\n }\n}\n\n/**\n * Error thrown when rendering fails\n */\nexport class RenderError extends HypenError {\n constructor(message: string, cause?: unknown) {\n super('RENDER_ERROR', message, {\n cause: cause instanceof Error ? cause : undefined,\n });\n this.name = 'RenderError';\n }\n}\n\n/**\n * Classify a WASM engine error string into the appropriate HypenError subclass.\n * The engine returns JsValue error strings with known prefixes.\n */\nexport function classifyEngineError(err: unknown): HypenError {\n // Handle structured WASM errors: { type: string, message: string }\n if (err && typeof err === 'object' && 'message' in err && 'type' in err) {\n const structured = err as { type: string; message: string };\n switch (structured.type) {\n case 'parseError': return new ParseError(structured.message);\n case 'stateError': return new StateError(structured.message);\n case 'renderError': return new RenderError(structured.message);\n case 'actionError': return new HypenError('ACTION_ERROR', structured.message);\n default: return new HypenError('UNKNOWN_ERROR', structured.message);\n }\n }\n const message = err instanceof Error ? err.message : String(err);\n\n if (message.startsWith('Parse error:')) {\n return new ParseError(message);\n }\n if (message.startsWith('Invalid state:') || message.startsWith('Invalid state patch:')) {\n return new StateError(message);\n }\n if (message.startsWith('Parent node not found:')) {\n return new RenderError(message);\n }\n\n return new RenderError(message);\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\" : \"info\",\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 * Abstract base class for Hypen WASM engine wrappers.\n *\n * The Hypen engine is distributed as a wasm-bindgen module — two builds:\n *\n * - `wasm-node` (bundler target) — used by `@hypen-space/server` on Node/Bun\n * - `wasm-browser` (web target) — used by `@hypen-space/web-engine` in browsers\n *\n * Both builds expose an identical `WasmEngine` class; the only genuine\n * platform differences are:\n *\n * 1. How the WASM module is *instantiated*. Node can synchronously `new\n * WasmEngine()` (the bundler target auto-initializes); the browser\n * target needs an async dynamic import of the JS glue code and an\n * explicit `wasm_init(url)` call before any `new WasmEngine()`.\n *\n * 2. How host state is *unwrapped* before it crosses the WASM boundary.\n * Node can use `structuredClone` (with a `__getSnapshot` fast path for\n * Hypen's proxy-backed state); the browser path does a\n * `JSON.parse(JSON.stringify())` round-trip plus a Map-to-Object\n * conversion for the native Map values that the wasm-bindgen browser\n * target returns in action payloads.\n *\n * Everything else — method wrappers, error classification, callback wiring,\n * revision plumbing — is identical between the two. That shared surface\n * lives here.\n *\n * Subclasses implement two abstract hooks:\n *\n * - `init(options?): Promise<void>` — platform-specific WASM setup. Must\n * assign `this.wasmEngine` and set `this.initialized = true` on success.\n *\n * - `unwrapForWasm<T>(value: T): T` — platform-specific proxy-to-plain\n * conversion. Called before any value crosses into WASM.\n */\n\nimport { frameworkLoggers } from \"./logger.js\";\nimport { classifyEngineError } from \"./result.js\";\nimport type {\n Patch,\n Action,\n RenderCallback,\n ActionHandler,\n ComponentResolver,\n} from \"./types.js\";\n\nconst log = frameworkLoggers.engine;\n\n/**\n * Shared base wrapping a wasm-bindgen `WasmEngine`. `any` here is load-\n * bearing: the concrete type is `WasmEngine` from either the `wasm-node`\n * or `wasm-browser` build, and those are separate generated `.d.ts`\n * files that core cannot (and should not) depend on. Subclasses keep\n * their own typed reference if they want stricter checking locally.\n */\nexport abstract class BaseEngine {\n protected wasmEngine: any = null;\n protected initialized = false;\n\n /**\n * Initialize the WASM module. Platform-specific.\n *\n * Must assign `this.wasmEngine` and set `this.initialized = true`.\n * Idempotent: must early-return if already initialized.\n */\n abstract init(options?: unknown): Promise<void>;\n\n /**\n * Convert a host value (possibly a Proxy, possibly containing Maps,\n * possibly wrapped in Hypen's observable state) into a plain-object\n * form safe to pass across the WASM boundary.\n *\n * Called on every `updateState` / `updateStateSparse` / `renderInto`\n * / `setContext` / `registerModule` entry point.\n */\n protected abstract unwrapForWasm<T>(value: T): T;\n\n /**\n * Guard that throws if the engine hasn't been initialized.\n * Returns the underlying WASM engine for chained access.\n */\n protected 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(\n (componentName: string, contextPath: string | null) => {\n return resolver(componentName, contextPath);\n },\n );\n }\n\n /**\n * Parse and render Hypen DSL source code.\n * @throws {ParseError} if the source fails to parse\n * @throws {RenderError} if rendering fails\n */\n renderSource(source: string): void {\n const engine = this.ensureInitialized();\n try {\n engine.renderSource(source);\n } catch (err) {\n throw classifyEngineError(err);\n }\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 * @throws {ParseError} if the source fails to parse\n * @throws {RenderError} if the parent node is not found or rendering fails\n */\n renderInto(\n source: string,\n parentNodeId: string,\n state: Record<string, any>,\n ): void {\n const engine = this.ensureInitialized();\n try {\n engine.renderInto(source, parentNodeId, this.unwrapForWasm(state));\n } catch (err) {\n throw classifyEngineError(err);\n }\n }\n\n /**\n * Apply a sparse state update.\n *\n * @param scope Lowercase module name to target a named module registered\n * via `registerModule`. Pass `null` (or empty string) to\n * target the primary module set via `setModule`.\n * @param paths Changed state paths (relative to the targeted module).\n * @param values Map of `path -> new value`.\n * @throws {StateError} if the state patch is invalid\n */\n updateStateSparse(\n scope: string | null,\n paths: string[],\n values: Record<string, any>,\n ): void {\n const engine = this.ensureInitialized();\n\n if (paths.length === 0) {\n return;\n }\n\n try {\n engine.updateStateSparse(scope ?? \"\", paths, this.unwrapForWasm(values));\n } catch (err) {\n throw classifyEngineError(err);\n }\n log.debug(\"State changed (sparse):\", { scope, paths });\n }\n\n /**\n * Apply a full-state patch. See [updateStateSparse] for `scope` semantics.\n * Prefer the sparse form when only a few paths changed.\n */\n updateState(scope: string | null, statePatch: Record<string, any>): void {\n const engine = this.ensureInitialized();\n engine.updateState(scope ?? \"\", this.unwrapForWasm(statePatch));\n }\n\n /**\n * Dispatch an action.\n * @throws {HypenError} if the action dispatch fails\n */\n dispatchAction(name: string, payload?: any): void {\n const engine = this.ensureInitialized();\n try {\n engine.dispatchAction(name, payload ?? null);\n } catch (err) {\n throw classifyEngineError(err);\n }\n }\n\n /**\n * Register an action handler. Errors thrown synchronously or via rejected\n * promises are caught and logged at the framework level; caller-side error\n * recovery should happen inside `handler`.\n *\n * Action payloads may contain platform-specific native values (e.g. Maps\n * in the browser target). Subclasses can override `normalizeAction` to\n * pre-process the action before calling the user handler.\n */\n onAction(actionName: string, handler: ActionHandler): void {\n const engine = this.ensureInitialized();\n engine.onAction(actionName, (action: Action) => {\n const normalized = this.normalizeAction(action);\n Promise.resolve(handler(normalized)).catch((err) => {\n log.error(\"Action handler error:\", err);\n });\n });\n }\n\n /**\n * Platform hook: normalize an incoming action before the user handler\n * sees it. Default identity; subclasses can override to unwrap native\n * values (e.g. browser Maps in action payloads).\n */\n protected normalizeAction(action: Action): Action {\n return action;\n }\n\n /**\n * Initialize the primary 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 * Register a named module for multi-module apps.\n *\n * Unlike setModule which sets the primary module, this registers an\n * additional module whose state is scoped to `module <name> { ... }`\n * blocks in the DSL.\n */\n registerModule(\n name: string,\n actions: string[],\n stateKeys: string[],\n initialState: Record<string, any>,\n ): void {\n const engine = this.ensureInitialized();\n engine.registerModule(\n name,\n actions,\n stateKeys,\n this.unwrapForWasm(initialState),\n );\n }\n\n /**\n * Get the current revision number.\n *\n * Note: the underlying WASM builder returns `bigint` in some targets\n * and `number` in others; this normalizes to `number` for consumer\n * ergonomics (revision counts don't exceed 2^53).\n */\n getRevision(): number {\n const engine = this.ensureInitialized();\n return Number(engine.getRevision());\n }\n\n /**\n * Clear resolved components and caches, preserving primitives and resolver.\n * Call before renderSource() during hot-reload so components are re-resolved\n * from fresh source files.\n */\n clearResolvedComponents(): void {\n const engine = this.ensureInitialized();\n engine.clearResolvedComponents();\n }\n\n /**\n * Clear the engine tree.\n */\n clearTree(): void {\n const engine = this.ensureInitialized();\n engine.clearTree();\n }\n\n /**\n * Full reset: clears tree, module, component registry, dependencies,\n * and revision. Render callback and component resolver are preserved.\n */\n reset(): void {\n const engine = this.ensureInitialized();\n engine.reset();\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 // ── Data Source Context ────────────────────────────────────────\n\n /**\n * Set (or replace) a named data source context.\n *\n * Registers the provider in the dependency graph, stores the data,\n * and re-renders every node bound to `$name.*`.\n *\n * @param name - Provider name (e.g., \"spacetime\", \"firebase\")\n * @param data - Full state object for this provider\n */\n setContext(name: string, data: Record<string, unknown>): void {\n const engine = this.ensureInitialized();\n try {\n engine.setContext(name, this.unwrapForWasm(data));\n } catch (err) {\n throw classifyEngineError(err);\n }\n log.debug(`Data source \"${name}\" context set`);\n }\n\n /**\n * Remove a data source context entirely.\n * Drops the provider's state and re-renders bound nodes (they resolve to null).\n */\n removeContext(name: string): void {\n const engine = this.ensureInitialized();\n engine.removeContext(name);\n }\n\n // ── Resource System ─────────────────────────────────────────────────\n\n /**\n * Register resources (name → raw SVG string) with the engine.\n *\n * Each SVG is parsed by the WASM engine. When the engine encounters\n * `Icon(@resources.heart)` in the DSL, it resolves the name from registered\n * resources and injects SVG path data into the Create patch props.\n *\n * @param map - Flat map of resource name to raw SVG string\n */\n registerResources(map: Record<string, string>): void {\n const engine = this.ensureInitialized();\n engine.registerResources(map);\n log.debug(`Resources registered (${Object.keys(map).length} entries)`);\n }\n}\n"
|
|
8
|
+
],
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "C692071C8477B29964756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|