@hypen-space/core 0.2.3 → 0.2.5
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.
|
@@ -31,7 +31,7 @@ class Engine {
|
|
|
31
31
|
async init(options = {}) {
|
|
32
32
|
if (this.initialized)
|
|
33
33
|
return;
|
|
34
|
-
const wasmPath = options.wasmPath ?? "/hypen_engine_bg.wasm";
|
|
34
|
+
const wasmPath = options.wasmPath ?? "https://unpkg.com/@hypen-space/core/wasm-browser/hypen_engine_bg.wasm";
|
|
35
35
|
try {
|
|
36
36
|
const wasmModule = await import("../wasm-browser/hypen_engine.js");
|
|
37
37
|
wasmInit = wasmModule.default;
|
|
@@ -127,4 +127,4 @@ export {
|
|
|
127
127
|
|
|
128
128
|
export { Engine };
|
|
129
129
|
|
|
130
|
-
//# debugId=
|
|
130
|
+
//# debugId=CA54F8DFEBB008F764756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/engine.browser.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * Browser-compatible wrapper around the WASM engine\n * Uses web target for browser environments\n */\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 element_type?: string;\n props?: Record<string, any> | Map<string, any>;\n name?: string;\n value?: any;\n text?: string;\n parent_id?: string;\n before_id?: string;\n event_name?: 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
|
|
5
|
+
"/**\n * Browser-compatible wrapper around the WASM engine\n * Uses web target for browser environments\n */\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 element_type?: string;\n props?: Record<string, any> | Map<string, any>;\n name?: string;\n value?: any;\n text?: string;\n parent_id?: string;\n before_id?: string;\n event_name?: 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 * Path to the WASM file.\n * Default: loads from unpkg CDN (https://unpkg.com/@hypen-space/core/wasm-browser/hypen_engine_bg.wasm)\n * For production, consider serving from your own domain for better performance.\n */\n wasmPath?: 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 wasmPath\n */\n async init(options: EngineInitOptions = {}): Promise<void> {\n if (this.initialized) return;\n\n // Default to CDN for zero-config experience\n const wasmPath = options.wasmPath ??\n \"https://unpkg.com/@hypen-space/core/wasm-browser/hypen_engine_bg.wasm\";\n\n // Dynamically import the WASM module\n // This allows the path to be configured at runtime\n try {\n const wasmModule: any = await import(\"../wasm-browser/hypen_engine.js\");\n wasmInit = wasmModule.default;\n WasmEngineClass = wasmModule.WasmEngine;\n\n // Initialize WASM with explicit path\n await wasmInit!(wasmPath);\n\n this.wasmEngine = new WasmEngineClass();\n this.initialized = true;\n } catch (error) {\n console.error(\"[Hypen] 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\n */\n notifyStateChange(paths: string[], currentState: Record<string, any>): void {\n const engine = this.ensureInitialized();\n\n const plainObject = JSON.parse(JSON.stringify(currentState));\n engine.updateState(plainObject);\n\n if (paths.length > 0) {\n console.debug(\"[Hypen] State changed:\", 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 console.log(`[Engine] 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(console.error);\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"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;;;;;AAOA,IAAI,WAAsD;AAC1D,IAAI,kBAAuB;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "CA54F8DFEBB008F764756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/package.json
CHANGED
|
@@ -1,112 +1,112 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hypen-space/core",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.5",
|
|
4
4
|
"description": "Hypen core engine - Platform-agnostic reactive UI runtime",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "./dist/index.js",
|
|
7
|
-
"module": "./dist/index.js",
|
|
8
|
-
"types": "./dist/index.d.ts",
|
|
6
|
+
"main": "./dist/src/index.js",
|
|
7
|
+
"module": "./dist/src/index.js",
|
|
8
|
+
"types": "./dist/src/index.d.ts",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
|
-
"types": "./dist/index.d.ts",
|
|
12
|
-
"browser": "./dist/index.browser.js",
|
|
11
|
+
"types": "./dist/src/index.d.ts",
|
|
12
|
+
"browser": "./dist/src/index.browser.js",
|
|
13
13
|
"bun": "./src/index.ts",
|
|
14
|
-
"node": "./dist/index.js",
|
|
15
|
-
"import": "./dist/index.js",
|
|
16
|
-
"default": "./dist/index.js"
|
|
14
|
+
"node": "./dist/src/index.js",
|
|
15
|
+
"import": "./dist/src/index.js",
|
|
16
|
+
"default": "./dist/src/index.js"
|
|
17
17
|
},
|
|
18
18
|
"./engine": {
|
|
19
|
-
"types": "./dist/engine.d.ts",
|
|
20
|
-
"browser": "./dist/engine.browser.js",
|
|
19
|
+
"types": "./dist/src/engine.d.ts",
|
|
20
|
+
"browser": "./dist/src/engine.browser.js",
|
|
21
21
|
"bun": "./src/engine.ts",
|
|
22
|
-
"node": "./dist/engine.js",
|
|
23
|
-
"import": "./dist/engine.js",
|
|
24
|
-
"default": "./dist/engine.js"
|
|
22
|
+
"node": "./dist/src/engine.js",
|
|
23
|
+
"import": "./dist/src/engine.js",
|
|
24
|
+
"default": "./dist/src/engine.js"
|
|
25
25
|
},
|
|
26
26
|
"./engine/browser": {
|
|
27
|
-
"types": "./dist/engine.browser.d.ts",
|
|
28
|
-
"browser": "./dist/engine.browser.js",
|
|
27
|
+
"types": "./dist/src/engine.browser.d.ts",
|
|
28
|
+
"browser": "./dist/src/engine.browser.js",
|
|
29
29
|
"bun": "./src/engine.browser.ts",
|
|
30
|
-
"import": "./dist/engine.browser.js",
|
|
31
|
-
"default": "./dist/engine.browser.js"
|
|
30
|
+
"import": "./dist/src/engine.browser.js",
|
|
31
|
+
"default": "./dist/src/engine.browser.js"
|
|
32
32
|
},
|
|
33
33
|
"./app": {
|
|
34
|
-
"types": "./dist/app.d.ts",
|
|
34
|
+
"types": "./dist/src/app.d.ts",
|
|
35
35
|
"bun": "./src/app.ts",
|
|
36
|
-
"import": "./dist/app.js",
|
|
37
|
-
"default": "./dist/app.js"
|
|
36
|
+
"import": "./dist/src/app.js",
|
|
37
|
+
"default": "./dist/src/app.js"
|
|
38
38
|
},
|
|
39
39
|
"./state": {
|
|
40
|
-
"types": "./dist/state.d.ts",
|
|
40
|
+
"types": "./dist/src/state.d.ts",
|
|
41
41
|
"bun": "./src/state.ts",
|
|
42
|
-
"import": "./dist/state.js",
|
|
43
|
-
"default": "./dist/state.js"
|
|
42
|
+
"import": "./dist/src/state.js",
|
|
43
|
+
"default": "./dist/src/state.js"
|
|
44
44
|
},
|
|
45
45
|
"./renderer": {
|
|
46
|
-
"types": "./dist/renderer.d.ts",
|
|
46
|
+
"types": "./dist/src/renderer.d.ts",
|
|
47
47
|
"bun": "./src/renderer.ts",
|
|
48
|
-
"import": "./dist/renderer.js",
|
|
49
|
-
"default": "./dist/renderer.js"
|
|
48
|
+
"import": "./dist/src/renderer.js",
|
|
49
|
+
"default": "./dist/src/renderer.js"
|
|
50
50
|
},
|
|
51
51
|
"./router": {
|
|
52
|
-
"types": "./dist/router.d.ts",
|
|
52
|
+
"types": "./dist/src/router.d.ts",
|
|
53
53
|
"bun": "./src/router.ts",
|
|
54
|
-
"import": "./dist/router.js",
|
|
55
|
-
"default": "./dist/router.js"
|
|
54
|
+
"import": "./dist/src/router.js",
|
|
55
|
+
"default": "./dist/src/router.js"
|
|
56
56
|
},
|
|
57
57
|
"./events": {
|
|
58
|
-
"types": "./dist/events.d.ts",
|
|
58
|
+
"types": "./dist/src/events.d.ts",
|
|
59
59
|
"bun": "./src/events.ts",
|
|
60
|
-
"import": "./dist/events.js",
|
|
61
|
-
"default": "./dist/events.js"
|
|
60
|
+
"import": "./dist/src/events.js",
|
|
61
|
+
"default": "./dist/src/events.js"
|
|
62
62
|
},
|
|
63
63
|
"./context": {
|
|
64
|
-
"types": "./dist/context.d.ts",
|
|
64
|
+
"types": "./dist/src/context.d.ts",
|
|
65
65
|
"bun": "./src/context.ts",
|
|
66
|
-
"import": "./dist/context.js",
|
|
67
|
-
"default": "./dist/context.js"
|
|
66
|
+
"import": "./dist/src/context.js",
|
|
67
|
+
"default": "./dist/src/context.js"
|
|
68
68
|
},
|
|
69
69
|
"./remote": {
|
|
70
|
-
"types": "./dist/remote/index.d.ts",
|
|
70
|
+
"types": "./dist/src/remote/index.d.ts",
|
|
71
71
|
"bun": "./src/remote/index.ts",
|
|
72
|
-
"import": "./dist/remote/index.js",
|
|
73
|
-
"default": "./dist/remote/index.js"
|
|
72
|
+
"import": "./dist/src/remote/index.js",
|
|
73
|
+
"default": "./dist/src/remote/index.js"
|
|
74
74
|
},
|
|
75
75
|
"./remote/client": {
|
|
76
|
-
"types": "./dist/remote/client.d.ts",
|
|
76
|
+
"types": "./dist/src/remote/client.d.ts",
|
|
77
77
|
"bun": "./src/remote/client.ts",
|
|
78
|
-
"import": "./dist/remote/client.js",
|
|
79
|
-
"default": "./dist/remote/client.js"
|
|
78
|
+
"import": "./dist/src/remote/client.js",
|
|
79
|
+
"default": "./dist/src/remote/client.js"
|
|
80
80
|
},
|
|
81
81
|
"./loader": {
|
|
82
|
-
"types": "./dist/loader.d.ts",
|
|
82
|
+
"types": "./dist/src/loader.d.ts",
|
|
83
83
|
"bun": "./src/loader.ts",
|
|
84
|
-
"import": "./dist/loader.js",
|
|
85
|
-
"default": "./dist/loader.js"
|
|
84
|
+
"import": "./dist/src/loader.js",
|
|
85
|
+
"default": "./dist/src/loader.js"
|
|
86
86
|
},
|
|
87
87
|
"./resolver": {
|
|
88
|
-
"types": "./dist/resolver.d.ts",
|
|
88
|
+
"types": "./dist/src/resolver.d.ts",
|
|
89
89
|
"bun": "./src/resolver.ts",
|
|
90
|
-
"import": "./dist/resolver.js",
|
|
91
|
-
"default": "./dist/resolver.js"
|
|
90
|
+
"import": "./dist/src/resolver.js",
|
|
91
|
+
"default": "./dist/src/resolver.js"
|
|
92
92
|
},
|
|
93
93
|
"./discovery": {
|
|
94
|
-
"types": "./dist/discovery.d.ts",
|
|
94
|
+
"types": "./dist/src/discovery.d.ts",
|
|
95
95
|
"bun": "./src/discovery.ts",
|
|
96
|
-
"import": "./dist/discovery.js",
|
|
97
|
-
"default": "./dist/discovery.js"
|
|
96
|
+
"import": "./dist/src/discovery.js",
|
|
97
|
+
"default": "./dist/src/discovery.js"
|
|
98
98
|
},
|
|
99
99
|
"./plugin": {
|
|
100
|
-
"types": "./dist/plugin.d.ts",
|
|
100
|
+
"types": "./dist/src/plugin.d.ts",
|
|
101
101
|
"bun": "./src/plugin.ts",
|
|
102
|
-
"import": "./dist/plugin.js",
|
|
103
|
-
"default": "./dist/plugin.js"
|
|
102
|
+
"import": "./dist/src/plugin.js",
|
|
103
|
+
"default": "./dist/src/plugin.js"
|
|
104
104
|
},
|
|
105
105
|
"./components": {
|
|
106
|
-
"types": "./dist/components/builtin.d.ts",
|
|
106
|
+
"types": "./dist/src/components/builtin.d.ts",
|
|
107
107
|
"bun": "./src/components/builtin.ts",
|
|
108
|
-
"import": "./dist/components/builtin.js",
|
|
109
|
-
"default": "./dist/components/builtin.js"
|
|
108
|
+
"import": "./dist/src/components/builtin.js",
|
|
109
|
+
"default": "./dist/src/components/builtin.js"
|
|
110
110
|
}
|
|
111
111
|
},
|
|
112
112
|
"files": [
|
package/src/engine.browser.ts
CHANGED
|
@@ -41,7 +41,11 @@ export type ComponentResolver = (
|
|
|
41
41
|
) => ResolvedComponent | null;
|
|
42
42
|
|
|
43
43
|
export interface EngineInitOptions {
|
|
44
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Path to the WASM file.
|
|
46
|
+
* Default: loads from unpkg CDN (https://unpkg.com/@hypen-space/core/wasm-browser/hypen_engine_bg.wasm)
|
|
47
|
+
* For production, consider serving from your own domain for better performance.
|
|
48
|
+
*/
|
|
45
49
|
wasmPath?: string;
|
|
46
50
|
}
|
|
47
51
|
|
|
@@ -82,7 +86,9 @@ export class Engine {
|
|
|
82
86
|
async init(options: EngineInitOptions = {}): Promise<void> {
|
|
83
87
|
if (this.initialized) return;
|
|
84
88
|
|
|
85
|
-
|
|
89
|
+
// Default to CDN for zero-config experience
|
|
90
|
+
const wasmPath = options.wasmPath ??
|
|
91
|
+
"https://unpkg.com/@hypen-space/core/wasm-browser/hypen_engine_bg.wasm";
|
|
86
92
|
|
|
87
93
|
// Dynamically import the WASM module
|
|
88
94
|
// This allows the path to be configured at runtime
|