@hypen-space/web 0.2.0 → 0.2.1

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.
@@ -1,7 +1,3 @@
1
- import {
2
- canvasApplicators,
3
- canvasHandler
4
- } from "./canvas/index.js";
5
1
  import {
6
2
  ComponentRegistry
7
3
  } from "./components/index.js";
@@ -9,6 +5,11 @@ import"./components/list.js";
9
5
  import"./components/textarea.js";
10
6
  import"./components/grid.js";
11
7
  import"./components/link.js";
8
+ import {
9
+ canvasApplicators,
10
+ canvasHandler
11
+ } from "./canvas/index.js";
12
+ import"./components/container.js";
12
13
  import"./components/avatar.js";
13
14
  import"./components/switch.js";
14
15
  import"./components/badge.js";
@@ -16,6 +17,7 @@ import"./components/route.js";
16
17
  import"./components/center.js";
17
18
  import"./components/divider.js";
18
19
  import"./components/spacer.js";
20
+ import"./components/text.js";
19
21
  import"./components/input.js";
20
22
  import"./components/stack.js";
21
23
  import"./components/progressbar.js";
@@ -23,7 +25,7 @@ import"./components/button.js";
23
25
  import"./components/heading.js";
24
26
  import"./components/slider.js";
25
27
  import"./components/card.js";
26
- import"./components/container.js";
28
+ import"./components/image.js";
27
29
  import"./components/video.js";
28
30
  import"./components/spinner.js";
29
31
  import"./components/row.js";
@@ -31,17 +33,17 @@ import"./components/select.js";
31
33
  import"./components/router.js";
32
34
  import"./components/audio.js";
33
35
  import"./components/paragraph.js";
34
- import"./components/text.js";
35
36
  import {
36
37
  ApplicatorRegistry
37
38
  } from "./applicators/index.js";
39
+ import"./applicators/layout.js";
38
40
  import"./applicators/events.js";
39
41
  import"./applicators/color.js";
40
42
  import"./applicators/typography.js";
41
43
  import"./applicators/effects.js";
42
44
  import"./components/checkbox.js";
43
45
  import"./components/column.js";
44
- import"./components/image.js";
46
+ import"./applicators/transform.js";
45
47
  import"./applicators/margin.js";
46
48
  import"./applicators/advanced-layout.js";
47
49
  import"./applicators/display.js";
@@ -49,14 +51,12 @@ import"./applicators/size.js";
49
51
  import"./applicators/font.js";
50
52
  import"./applicators/background.js";
51
53
  import"./applicators/transition.js";
52
- import"./applicators/layout.js";
53
54
  import {
54
55
  RerenderTracker,
55
56
  defaultDebugConfig
56
57
  } from "./debug.js";
57
58
  import"./applicators/padding.js";
58
59
  import"./applicators/border.js";
59
- import"./applicators/transform.js";
60
60
  import"../../chunk-2s02mkzs.js";
61
61
 
62
62
  // src/dom/renderer.ts
@@ -274,4 +274,4 @@ export {
274
274
 
275
275
  export { DOMRenderer };
276
276
 
277
- //# debugId=0B5D2325D2CA974964756E2164756E21
277
+ //# debugId=873A4414F9F26CBC64756E2164756E21
@@ -5,6 +5,6 @@
5
5
  "/**\n * DOM Renderer\n *\n * Renders Hypen patches to the DOM\n */\n\nimport type { Patch } from \"@hypen/core\";\nimport type { HypenModuleInstance, RouterContext } from \"@hypen/core\";\nimport type { HypenRouter } from \"@hypen/core\";\nimport type { HypenGlobalContext } from \"@hypen/core\";\nimport { ComponentRegistry } from \"./components/index.js\";\nimport { ApplicatorRegistry } from \"./applicators/index.js\";\nimport { canvasHandler, canvasApplicators } from \"./canvas/index.js\";\nimport { RerenderTracker, type DebugConfig, defaultDebugConfig } from \"./debug.js\";\n\n// Interface for the engine that renderer needs\ninterface IEngine {\n dispatchAction(name: string, payload?: any): void;\n}\n\nexport class DOMRenderer {\n private container: HTMLElement;\n private nodes: Map<string, HTMLElement> = new Map();\n private rootId: string | null = null;\n private components: ComponentRegistry;\n private applicators: ApplicatorRegistry;\n private engine: IEngine;\n private currentState: Record<string, any> = {};\n private routerContext: RouterContext | null = null;\n private globalContext: HypenGlobalContext | null = null;\n private componentInstances = new Map<string, HypenModuleInstance>();\n private debugTracker: RerenderTracker;\n\n constructor(container: HTMLElement, engine: IEngine, debugConfig?: Partial<DebugConfig>) {\n this.container = container;\n this.engine = engine;\n this.components = new ComponentRegistry();\n this.applicators = new ApplicatorRegistry();\n this.debugTracker = new RerenderTracker({ ...defaultDebugConfig, ...debugConfig });\n\n // Register canvas component and applicators\n this.components.register(\"canvas\", canvasHandler);\n for (const [name, handler] of Object.entries(canvasApplicators)) {\n this.applicators.register(name, handler);\n }\n }\n\n /**\n * Set router and global context for component composition\n */\n setContext(routerContext: RouterContext, globalContext: HypenGlobalContext): void {\n this.routerContext = routerContext;\n this.globalContext = globalContext;\n }\n\n /**\n * Apply a batch of patches to the DOM\n */\n applyPatches(patches: Patch[]): void {\n for (const patch of patches) {\n this.applyPatch(patch);\n }\n }\n\n /**\n * Update state and interpolate text content\n */\n updateState(state: Record<string, any>): void {\n console.log(`[Renderer] Updating state:`, state);\n this.currentState = state;\n this.interpolateAllText();\n }\n\n /**\n * Merge component state into current state and re-interpolate\n */\n private mergeComponentState(componentState: Record<string, any>): void {\n this.currentState = { ...this.currentState, ...componentState };\n console.log(`[Renderer] Merged state:`, this.currentState);\n this.interpolateAllText();\n }\n\n /**\n * Interpolate state values in all text elements\n */\n private interpolateAllText(): void {\n for (const [id, element] of this.nodes.entries()) {\n if (element.dataset.hypenType === \"text\" && element.dataset.textTemplate) {\n const template = element.dataset.textTemplate;\n const interpolated = this.interpolateText(template, this.currentState);\n\n // Track re-render if text actually changed\n const currentText = element.textContent;\n if (currentText !== interpolated) {\n this.debugTracker.trackRerender(id, element, \"interpolate\");\n }\n\n element.textContent = interpolated;\n }\n }\n }\n\n /**\n * Interpolate state values in text template\n */\n private interpolateText(template: string, state: Record<string, any>): string {\n return template.replace(/\\$\\{([^}]+)\\}/g, (match, path) => {\n try {\n const value = path.split('.').reduce((obj: any, key: string) => {\n if (key === 'state') return state;\n return obj?.[key];\n }, state);\n return value !== undefined ? String(value) : match;\n } catch {\n return match;\n }\n });\n }\n\n /**\n * Apply a single patch\n */\n private applyPatch(patch: Patch): void {\n switch (patch.type) {\n case \"create\":\n this.onCreate(patch.id!, (patch as any).element_type!, patch.props || {});\n break;\n case \"setProp\":\n this.onSetProp(patch.id!, patch.name!, patch.value);\n break;\n case \"setText\":\n this.onSetText(patch.id!, patch.text!);\n break;\n case \"insert\":\n this.onInsert((patch as any).parent_id!, patch.id!, (patch as any).before_id);\n break;\n case \"move\":\n this.onMove((patch as any).parent_id!, patch.id!, (patch as any).before_id);\n break;\n case \"remove\":\n this.onRemove(patch.id!);\n break;\n }\n }\n\n /**\n * Create a new element\n */\n private onCreate(id: string, elementType: string, props: Record<string, any> | Map<string, any>): void {\n const propsObj = props instanceof Map ? Object.fromEntries(props) : props;\n\n const element = this.components.createElement(elementType, propsObj);\n\n if (!element) {\n const fallback = document.createElement(\"div\");\n fallback.dataset.hypenType = elementType;\n fallback.textContent = `Unknown component: ${elementType}`;\n this.nodes.set(id, fallback);\n return;\n }\n\n element.dataset.hypenType = elementType.toLowerCase();\n element.dataset.hypenId = id;\n (element as any).__hypenEngine = this.engine;\n\n this.applicators.applyAll(element, propsObj);\n this.nodes.set(id, element);\n this.debugTracker.trackRerender(id, element, `create:${elementType}`);\n\n if (!this.rootId) {\n this.rootId = id;\n if (!this.container.contains(element)) {\n this.container.appendChild(element);\n }\n }\n }\n\n /**\n * Set a property on an element\n */\n private onSetProp(id: string, name: string, value: any): void {\n const element = this.nodes.get(id);\n if (!element) return;\n\n this.debugTracker.trackRerender(id, element, `setProp:${name}`);\n\n if (name === \"0\" || name === \"text\") {\n const elementType = element.dataset.hypenType;\n\n if (elementType === \"input\") {\n const inputEl = element as HTMLInputElement;\n inputEl.value = String(value);\n console.log(`[Renderer] Updated input value: \"${value}\"`);\n return;\n }\n\n element.textContent = String(value);\n if (element.dataset.textTemplate !== undefined) {\n element.dataset.textTemplate = String(value);\n }\n console.log(`[Renderer] Updated text content: \"${value}\"`);\n return;\n }\n\n this.applicators.apply(element, name, value);\n }\n\n /**\n * Set text content\n */\n private onSetText(id: string, text: string): void {\n const element = this.nodes.get(id);\n if (!element) return;\n\n this.debugTracker.trackRerender(id, element, \"setText\");\n element.textContent = text;\n }\n\n /**\n * Insert an element into the tree\n */\n private onInsert(parentId: string, id: string, beforeId?: string): void {\n const parent = parentId === \"root\" ? this.container : this.nodes.get(parentId);\n const child = this.nodes.get(id);\n\n console.log(`[Renderer] Inserting ${id} into ${parentId}`, {\n parent: parent ? `${parent.tagName}#${parent.id || 'no-id'}` : 'null',\n child: child ? `${child.tagName}#${child.id || 'no-id'}` : 'null',\n childText: child?.textContent?.substring(0, 20)\n });\n\n if (!parent || !child) return;\n\n if (parentId === \"root\") {\n this.rootId = id;\n }\n\n if (beforeId) {\n const before = this.nodes.get(beforeId);\n if (before && before.parentNode === parent) {\n parent.insertBefore(child, before);\n } else if (!parent.contains(child)) {\n parent.appendChild(child);\n }\n } else {\n if (!parent.contains(child)) {\n parent.appendChild(child);\n }\n }\n }\n\n /**\n * Move an element within the tree\n */\n private onMove(parentId: string, id: string, beforeId?: string): void {\n this.onInsert(parentId, id, beforeId);\n }\n\n /**\n * Remove an element from the tree\n */\n private onRemove(id: string): void {\n const element = this.nodes.get(id);\n if (!element) return;\n\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n\n this.nodes.delete(id);\n\n if (this.rootId === id) {\n this.rootId = null;\n }\n }\n\n /**\n * Get an element by ID\n */\n getNode(id: string): HTMLElement | undefined {\n return this.nodes.get(id);\n }\n\n /**\n * Clear all nodes\n */\n clear(): void {\n this.container.innerHTML = \"\";\n this.nodes.clear();\n this.rootId = null;\n }\n\n /**\n * Get the component registry (for registering custom components)\n */\n getComponentRegistry(): ComponentRegistry {\n return this.components;\n }\n\n /**\n * Get the applicator registry (for registering custom applicators)\n */\n getApplicatorRegistry(): ApplicatorRegistry {\n return this.applicators;\n }\n\n /**\n * Enable or configure debug mode\n */\n setDebugConfig(config: Partial<DebugConfig>): void {\n this.debugTracker.setConfig(config);\n }\n\n /**\n * Reset debug tracking for all elements\n */\n resetDebugTracking(): void {\n this.debugTracker.resetAll();\n }\n\n /**\n * Get debug statistics\n */\n getDebugStats(): { totalRerenders: number; elementCount: number; avgRerenders: number } {\n return this.debugTracker.getStats();\n }\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "0B5D2325D2CA974964756E2164756E21",
8
+ "debugId": "873A4414F9F26CBC64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -0,0 +1,396 @@
1
+ import {
2
+ DOMRenderer
3
+ } from "./dom/renderer.js";
4
+ import"./dom/components/index.js";
5
+ import"./dom/components/list.js";
6
+ import"./dom/components/textarea.js";
7
+ import"./dom/components/grid.js";
8
+ import"./dom/components/link.js";
9
+ import"./dom/canvas/index.js";
10
+ import"./dom/components/container.js";
11
+ import"./dom/components/avatar.js";
12
+ import"./dom/components/switch.js";
13
+ import"./dom/components/badge.js";
14
+ import"./dom/components/route.js";
15
+ import"./dom/components/center.js";
16
+ import"./dom/components/divider.js";
17
+ import"./dom/components/spacer.js";
18
+ import"./dom/components/text.js";
19
+ import"./dom/components/input.js";
20
+ import"./dom/components/stack.js";
21
+ import"./dom/components/progressbar.js";
22
+ import"./dom/components/button.js";
23
+ import"./dom/components/heading.js";
24
+ import"./dom/components/slider.js";
25
+ import"./dom/components/card.js";
26
+ import"./dom/components/image.js";
27
+ import"./dom/components/video.js";
28
+ import"./dom/components/spinner.js";
29
+ import"./dom/components/row.js";
30
+ import"./dom/components/select.js";
31
+ import"./dom/components/router.js";
32
+ import"./dom/components/audio.js";
33
+ import"./dom/components/paragraph.js";
34
+ import"./dom/applicators/index.js";
35
+ import"./dom/applicators/layout.js";
36
+ import"./dom/applicators/events.js";
37
+ import"./dom/applicators/color.js";
38
+ import"./dom/applicators/typography.js";
39
+ import"./dom/applicators/effects.js";
40
+ import"./dom/components/checkbox.js";
41
+ import"./dom/components/column.js";
42
+ import"./dom/applicators/transform.js";
43
+ import"./dom/applicators/margin.js";
44
+ import"./dom/applicators/advanced-layout.js";
45
+ import"./dom/applicators/display.js";
46
+ import"./dom/applicators/size.js";
47
+ import"./dom/applicators/font.js";
48
+ import"./dom/applicators/background.js";
49
+ import"./dom/applicators/transition.js";
50
+ import"./dom/debug.js";
51
+ import"./dom/applicators/padding.js";
52
+ import"./dom/applicators/border.js";
53
+ import"../chunk-2s02mkzs.js";
54
+
55
+ // src/hypen.ts
56
+ import {
57
+ BrowserEngine as Engine,
58
+ HypenModuleInstance,
59
+ HypenRouter,
60
+ HypenGlobalContext,
61
+ componentLoader,
62
+ Router,
63
+ Route,
64
+ Link
65
+ } from "@hypen-space/core";
66
+ class Hypen {
67
+ engine = null;
68
+ renderer = null;
69
+ moduleInstance = null;
70
+ container = null;
71
+ config;
72
+ router;
73
+ globalContext;
74
+ moduleInstances = new Map;
75
+ constructor(config = {}) {
76
+ this.config = {
77
+ componentsDir: "./src/components",
78
+ debug: false,
79
+ ...config
80
+ };
81
+ this.router = new HypenRouter;
82
+ this.globalContext = new HypenGlobalContext;
83
+ componentLoader.register("Router", Router, "");
84
+ componentLoader.register("Route", Route, "");
85
+ componentLoader.register("Link", Link, "");
86
+ this.globalContext.__router = this.router;
87
+ this.globalContext.__hypenEngine = this;
88
+ }
89
+ async init() {
90
+ if (this.config.debug) {
91
+ console.log("[Hypen] Initializing...");
92
+ }
93
+ this.engine = new Engine;
94
+ await this.engine.init(this.config.wasmPath ? { wasmPath: this.config.wasmPath } : undefined);
95
+ if (this.config.debug) {
96
+ console.log("[Hypen] Engine initialized");
97
+ }
98
+ }
99
+ async loadComponents(componentsDir) {
100
+ const dir = componentsDir || this.config.componentsDir;
101
+ if (this.config.debug) {
102
+ console.log(`[Hypen] Loading components from ${dir}...`);
103
+ }
104
+ await componentLoader.loadFromComponentsDir(dir);
105
+ if (this.config.debug) {
106
+ console.log(`[Hypen] Loaded ${componentLoader.getNames().length} components`);
107
+ }
108
+ }
109
+ async render(componentName, containerSelector) {
110
+ if (!this.engine) {
111
+ throw new Error("[Hypen] Engine not initialized. Call init() first.");
112
+ }
113
+ if (typeof containerSelector === "string") {
114
+ const element = document.querySelector(containerSelector);
115
+ if (!element) {
116
+ throw new Error(`[Hypen] Container not found: ${containerSelector}`);
117
+ }
118
+ this.container = element;
119
+ } else {
120
+ this.container = containerSelector;
121
+ }
122
+ const component = componentLoader.get(componentName);
123
+ if (!component) {
124
+ throw new Error(`[Hypen] Component "${componentName}" not found. Available: ${componentLoader.getNames().join(", ")}`);
125
+ }
126
+ if (this.config.debug) {
127
+ console.log(`[Hypen] Rendering ${componentName} to`, this.container);
128
+ }
129
+ this.renderer = new DOMRenderer(this.container, this.engine, {
130
+ enabled: this.config.debugHeatmap || false,
131
+ showHeatmap: this.config.debugHeatmap || false,
132
+ heatmapIncrement: this.config.heatmapIncrement || 5,
133
+ fadeOutDuration: this.config.heatmapFadeOut || 2000,
134
+ maxOpacity: 0.8
135
+ });
136
+ this.engine.setRenderCallback((patches) => {
137
+ if (this.config.debug) {
138
+ console.log(`[Hypen] Applying ${patches.length} patches`);
139
+ }
140
+ this.renderer.applyPatches(patches);
141
+ });
142
+ const routerContext = {
143
+ root: this.router,
144
+ current: this.router
145
+ };
146
+ this.renderer.setContext(routerContext, this.globalContext);
147
+ const moduleId = this.extractModuleId(componentName, component.template);
148
+ this.moduleInstance = new HypenModuleInstance(this.engine, component.module, routerContext, this.globalContext);
149
+ this.globalContext.registerModule(moduleId, this.moduleInstance);
150
+ this.moduleInstances.set(moduleId, this.moduleInstance);
151
+ this.moduleInstance.onStateChange(() => {
152
+ const mergedState = this.getMergedState();
153
+ if (this.config.debug) {
154
+ console.log(`[Hypen] State changed, merged state:`, mergedState);
155
+ }
156
+ this.renderer.updateState(mergedState);
157
+ });
158
+ this.setupComponentResolver();
159
+ this.createNestedModuleInstances();
160
+ this.engine.renderSource(component.template);
161
+ this.renderer.updateState(this.getMergedState());
162
+ if (this.config.debug) {
163
+ console.log(`[Hypen] ${componentName} rendered successfully`);
164
+ }
165
+ }
166
+ async unmount() {
167
+ if (this.config.debug) {
168
+ console.log("[Hypen] Unmounting...");
169
+ }
170
+ if (this.moduleInstance) {
171
+ await this.moduleInstance.destroy();
172
+ this.moduleInstance = null;
173
+ }
174
+ if (this.container) {
175
+ this.container.innerHTML = "";
176
+ this.container = null;
177
+ }
178
+ this.renderer = null;
179
+ if (this.config.debug) {
180
+ console.log("[Hypen] Unmounted");
181
+ }
182
+ }
183
+ getModuleInstance() {
184
+ return this.moduleInstance;
185
+ }
186
+ getState() {
187
+ return this.moduleInstance?.getState() ?? null;
188
+ }
189
+ getRouter() {
190
+ return this.router;
191
+ }
192
+ getGlobalContext() {
193
+ return this.globalContext;
194
+ }
195
+ setDebugHeatmap(enabled) {
196
+ if (this.renderer) {
197
+ this.renderer.setDebugConfig({ enabled, showHeatmap: enabled });
198
+ if (this.config.debug) {
199
+ console.log(`[Hypen] Debug heatmap ${enabled ? "enabled" : "disabled"}`);
200
+ }
201
+ }
202
+ }
203
+ resetDebugTracking() {
204
+ if (this.renderer) {
205
+ this.renderer.resetDebugTracking();
206
+ if (this.config.debug) {
207
+ console.log(`[Hypen] Debug tracking reset`);
208
+ }
209
+ }
210
+ }
211
+ getDebugStats() {
212
+ return this.renderer?.getDebugStats() || null;
213
+ }
214
+ async renderLazyRoute(routePath, componentName, routeElement) {
215
+ if (!this.engine || !this.renderer) {
216
+ throw new Error("Engine not initialized");
217
+ }
218
+ const component = componentLoader.get(componentName);
219
+ if (!component) {
220
+ throw new Error(`Component ${componentName} not found`);
221
+ }
222
+ const template = component.template;
223
+ if (!template) {
224
+ throw new Error(`Component ${componentName} has no template`);
225
+ }
226
+ if (component.module && !this.moduleInstances.has(componentName)) {
227
+ const moduleId = this.extractModuleId(componentName, template);
228
+ const routerContext = {
229
+ root: this.router,
230
+ current: this.router
231
+ };
232
+ const moduleInstance = new HypenModuleInstance(this.engine, component.module, routerContext, this.globalContext);
233
+ this.globalContext.registerModule(moduleId, moduleInstance);
234
+ this.moduleInstances.set(componentName, moduleInstance);
235
+ moduleInstance.onStateChange(() => {
236
+ const mergedState2 = this.getMergedState();
237
+ if (this.config.debug) {
238
+ console.log(`[Hypen] Lazy component ${componentName} state changed:`, mergedState2);
239
+ }
240
+ this.renderer.updateState(mergedState2);
241
+ });
242
+ }
243
+ await new Promise((resolve) => setTimeout(resolve, 50));
244
+ const routeNodeId = routeElement.dataset.hypenId;
245
+ if (!routeNodeId) {
246
+ throw new Error(`Route element is missing data-hypen-id attribute`);
247
+ }
248
+ const mergedState = this.getMergedState();
249
+ this.engine.renderInto(template, routeNodeId, mergedState);
250
+ this.renderer.updateState(mergedState);
251
+ }
252
+ extractModuleId(componentName, template) {
253
+ const idMatch = template.match(/\.id\(["']([^"']+)["']\)/);
254
+ const matchedId = idMatch?.[1];
255
+ if (matchedId) {
256
+ return matchedId;
257
+ }
258
+ return componentName;
259
+ }
260
+ createNestedModuleInstances() {
261
+ const routerContext = {
262
+ root: this.router,
263
+ current: this.router
264
+ };
265
+ if (Router && !this.moduleInstances.has("Router")) {
266
+ const routerInstance = new HypenModuleInstance(this.engine, Router, routerContext, this.globalContext);
267
+ this.globalContext.registerModule("Router", routerInstance);
268
+ this.moduleInstances.set("Router", routerInstance);
269
+ routerInstance.onStateChange(() => {
270
+ const mergedState = this.getMergedState();
271
+ if (this.config.debug) {
272
+ console.log(`[Hypen] Router state changed:`, mergedState);
273
+ }
274
+ this.renderer.updateState(mergedState);
275
+ });
276
+ }
277
+ const componentNames = componentLoader.getNames();
278
+ for (const name of componentNames) {
279
+ if (this.moduleInstances.has(name)) {
280
+ continue;
281
+ }
282
+ const comp = componentLoader.get(name);
283
+ if (!comp || !comp.module) {
284
+ continue;
285
+ }
286
+ if (this.config.debug) {
287
+ console.log(`[Hypen] Creating nested module instance for: ${name}`);
288
+ }
289
+ const moduleInstance = new HypenModuleInstance(this.engine, comp.module, routerContext, this.globalContext);
290
+ this.globalContext.registerModule(name, moduleInstance);
291
+ this.moduleInstances.set(name, moduleInstance);
292
+ moduleInstance.onStateChange(() => {
293
+ const mergedState = this.getMergedState();
294
+ if (this.config.debug) {
295
+ console.log(`[Hypen] Nested component ${name} state changed:`, mergedState);
296
+ }
297
+ this.renderer.updateState(mergedState);
298
+ });
299
+ }
300
+ }
301
+ getMergedState() {
302
+ const merged = {};
303
+ if (this.moduleInstance) {
304
+ const mainState = this.moduleInstance.getState();
305
+ Object.assign(merged, mainState);
306
+ }
307
+ for (const [name, instance] of this.moduleInstances.entries()) {
308
+ const nestedState = instance.getState();
309
+ Object.assign(merged, nestedState);
310
+ }
311
+ return merged;
312
+ }
313
+ setupComponentResolver() {
314
+ if (!this.engine)
315
+ return;
316
+ const builtInElements = new Set([
317
+ "Column",
318
+ "Row",
319
+ "Text",
320
+ "Button",
321
+ "Image",
322
+ "Input",
323
+ "Container",
324
+ "Box",
325
+ "Center",
326
+ "List",
327
+ "Canvas",
328
+ "Spacer",
329
+ "Divider",
330
+ "ScrollView"
331
+ ]);
332
+ this.engine.setComponentResolver((componentName, contextPath) => {
333
+ if (builtInElements.has(componentName)) {
334
+ return null;
335
+ }
336
+ if (this.config.debug) {
337
+ console.log(`[Hypen] Resolving component: ${componentName} (context: ${contextPath})`);
338
+ }
339
+ const componentDef = componentLoader.get(componentName);
340
+ if (!componentDef) {
341
+ if (this.config.debug) {
342
+ console.log(`[Hypen] Component not found: ${componentName}`);
343
+ }
344
+ return null;
345
+ }
346
+ const isPassthrough = componentName === "Router";
347
+ const isLazy = componentName === "Route";
348
+ const resolved = {
349
+ source: componentDef.template,
350
+ path: componentDef.path || componentName,
351
+ passthrough: isPassthrough,
352
+ lazy: isLazy
353
+ };
354
+ if (this.config.debug) {
355
+ const flags = [];
356
+ if (isPassthrough)
357
+ flags.push("passthrough");
358
+ if (isLazy)
359
+ flags.push("lazy");
360
+ const flagStr = flags.length > 0 ? ` (${flags.join(", ")})` : "";
361
+ console.log(`[Hypen] Resolved ${componentName} -> ${resolved.path}${flagStr}`);
362
+ }
363
+ return resolved;
364
+ });
365
+ }
366
+ }
367
+ async function render(componentName, containerSelector, config) {
368
+ const hypen = new Hypen(config);
369
+ await hypen.init();
370
+ await hypen.loadComponents();
371
+ await hypen.render(componentName, containerSelector);
372
+ return hypen;
373
+ }
374
+ async function renderWithComponents(components, componentName, containerSelector, config) {
375
+ const hypen = new Hypen(config);
376
+ await hypen.init();
377
+ for (const [name, { module, template }] of Object.entries(components)) {
378
+ let processedTemplate = template;
379
+ const moduleMatch = template.match(/^\s*module\s+\w+\s*\{([\s\S]*)\}\s*$/);
380
+ if (moduleMatch && moduleMatch[1]) {
381
+ processedTemplate = moduleMatch[1].trim();
382
+ }
383
+ componentLoader.register(name, module, processedTemplate);
384
+ }
385
+ await hypen.render(componentName, containerSelector);
386
+ return hypen;
387
+ }
388
+ export {
389
+ renderWithComponents,
390
+ render,
391
+ Hypen
392
+ };
393
+
394
+ export { Hypen, render, renderWithComponents };
395
+
396
+ //# debugId=7427343EFC068BA764756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/hypen.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Hypen - High-Level API for Web Applications\n *\n * Simple API for rendering Hypen applications (like ReactDOM.render)\n */\n\nimport {\n BrowserEngine as Engine,\n HypenModuleInstance,\n HypenRouter,\n HypenGlobalContext,\n componentLoader,\n Router,\n Route,\n Link,\n type RouterContext,\n type HypenModuleDefinition,\n} from \"@hypen-space/core\";\nimport { DOMRenderer } from \"./dom/renderer.js\";\nimport type { DebugConfig } from \"./dom/debug.js\";\n\nexport interface HypenConfig {\n /** Base directory for components (default: \"./src/components\") */\n componentsDir?: string;\n /** Enable debug logging */\n debug?: boolean;\n /** Custom WASM path */\n wasmPath?: string;\n /** Enable re-render heatmap debugging */\n debugHeatmap?: boolean;\n /** Heatmap increment per re-render (default: 5%) */\n heatmapIncrement?: number;\n /** Heatmap fade out duration in ms (default: 2000) */\n heatmapFadeOut?: number;\n}\n\nexport class Hypen {\n private engine: Engine | null = null;\n private renderer: DOMRenderer | null = null;\n private moduleInstance: HypenModuleInstance<any> | null = null;\n private container: HTMLElement | null = null;\n private config: HypenConfig;\n private router: HypenRouter;\n private globalContext: HypenGlobalContext;\n private moduleInstances = new Map<string, HypenModuleInstance<any>>();\n\n constructor(config: HypenConfig = {}) {\n this.config = {\n componentsDir: \"./src/components\",\n debug: false,\n ...config,\n };\n\n // Initialize router and global context\n this.router = new HypenRouter();\n this.globalContext = new HypenGlobalContext();\n\n // Register built-in components\n componentLoader.register(\"Router\", Router, \"\");\n componentLoader.register(\"Route\", Route, \"\");\n componentLoader.register(\"Link\", Link, \"\");\n\n // Store router and hypen instance in global context for access in components\n (this.globalContext as any).__router = this.router;\n (this.globalContext as any).__hypenEngine = this;\n }\n\n /**\n * Initialize the Hypen runtime\n * Must be called before render()\n */\n async init(): Promise<void> {\n if (this.config.debug) {\n console.log(\"[Hypen] Initializing...\");\n }\n\n // Initialize engine\n this.engine = new Engine();\n await this.engine.init(\n this.config.wasmPath ? { wasmPath: this.config.wasmPath } : undefined\n );\n\n if (this.config.debug) {\n console.log(\"[Hypen] Engine initialized\");\n }\n }\n\n /**\n * Load all components from the components directory\n */\n async loadComponents(componentsDir?: string): Promise<void> {\n const dir = componentsDir || this.config.componentsDir!;\n\n if (this.config.debug) {\n console.log(`[Hypen] Loading components from ${dir}...`);\n }\n\n await componentLoader.loadFromComponentsDir(dir);\n\n if (this.config.debug) {\n console.log(\n `[Hypen] Loaded ${componentLoader.getNames().length} components`\n );\n }\n }\n\n /**\n * Render a component to a DOM container\n *\n * @param componentName - Name of the component to render (e.g., \"HomePage\")\n * @param containerSelector - CSS selector or HTMLElement for the mount point\n */\n async render(\n componentName: string,\n containerSelector: string | HTMLElement\n ): Promise<void> {\n if (!this.engine) {\n throw new Error(\"[Hypen] Engine not initialized. Call init() first.\");\n }\n\n // Get the container element\n if (typeof containerSelector === \"string\") {\n const element = document.querySelector(containerSelector);\n if (!element) {\n throw new Error(`[Hypen] Container not found: ${containerSelector}`);\n }\n this.container = element as HTMLElement;\n } else {\n this.container = containerSelector;\n }\n\n // Get the component definition\n const component = componentLoader.get(componentName);\n if (!component) {\n throw new Error(\n `[Hypen] Component \"${componentName}\" not found. Available: ${componentLoader.getNames().join(\", \")}`\n );\n }\n\n if (this.config.debug) {\n console.log(`[Hypen] Rendering ${componentName} to`, this.container);\n }\n\n // Create renderer with debug config\n this.renderer = new DOMRenderer(this.container, this.engine, {\n enabled: this.config.debugHeatmap || false,\n showHeatmap: this.config.debugHeatmap || false,\n heatmapIncrement: this.config.heatmapIncrement || 5,\n fadeOutDuration: this.config.heatmapFadeOut || 2000,\n maxOpacity: 0.8,\n });\n\n // Set render callback\n this.engine.setRenderCallback((patches) => {\n if (this.config.debug) {\n console.log(`[Hypen] Applying ${patches.length} patches`);\n }\n this.renderer!.applyPatches(patches);\n });\n\n // Create router context\n const routerContext: RouterContext = {\n root: this.router,\n current: this.router,\n };\n\n // Set context on renderer for component composition\n this.renderer.setContext(routerContext, this.globalContext);\n\n // Extract module ID from component name or .id() applicator\n const moduleId = this.extractModuleId(componentName, component.template);\n\n // Create module instance with router and global context\n this.moduleInstance = new HypenModuleInstance(\n this.engine,\n component.module,\n routerContext,\n this.globalContext\n );\n\n // Register module in global context\n this.globalContext.registerModule(moduleId, this.moduleInstance);\n this.moduleInstances.set(moduleId, this.moduleInstance);\n\n // Connect module state changes to renderer\n this.moduleInstance.onStateChange(() => {\n const mergedState = this.getMergedState();\n if (this.config.debug) {\n console.log(`[Hypen] State changed, merged state:`, mergedState);\n }\n this.renderer!.updateState(mergedState);\n });\n\n // Set up component resolver for dynamic component composition\n this.setupComponentResolver();\n\n // Create module instances for ALL components that have state\n this.createNestedModuleInstances();\n\n // Render the UI template\n this.engine.renderSource(component.template);\n\n // Update renderer with initial state\n this.renderer!.updateState(this.getMergedState());\n\n if (this.config.debug) {\n console.log(`[Hypen] ${componentName} rendered successfully`);\n }\n }\n\n /**\n * Unmount and cleanup\n */\n async unmount(): Promise<void> {\n if (this.config.debug) {\n console.log(\"[Hypen] Unmounting...\");\n }\n\n if (this.moduleInstance) {\n await this.moduleInstance.destroy();\n this.moduleInstance = null;\n }\n\n if (this.container) {\n this.container.innerHTML = \"\";\n this.container = null;\n }\n\n this.renderer = null;\n\n if (this.config.debug) {\n console.log(\"[Hypen] Unmounted\");\n }\n }\n\n /**\n * Get the current module instance\n */\n getModuleInstance(): HypenModuleInstance<any> | null {\n return this.moduleInstance;\n }\n\n /**\n * Get the current state\n */\n getState(): any {\n return this.moduleInstance?.getState() ?? null;\n }\n\n /**\n * Get the router instance\n */\n getRouter(): HypenRouter {\n return this.router;\n }\n\n /**\n * Get the global context\n */\n getGlobalContext(): HypenGlobalContext {\n return this.globalContext;\n }\n\n /**\n * Enable or disable debug heatmap mode\n */\n setDebugHeatmap(enabled: boolean): void {\n if (this.renderer) {\n this.renderer.setDebugConfig({ enabled, showHeatmap: enabled });\n if (this.config.debug) {\n console.log(`[Hypen] Debug heatmap ${enabled ? \"enabled\" : \"disabled\"}`);\n }\n }\n }\n\n /**\n * Reset debug tracking for all elements\n */\n resetDebugTracking(): void {\n if (this.renderer) {\n this.renderer.resetDebugTracking();\n if (this.config.debug) {\n console.log(`[Hypen] Debug tracking reset`);\n }\n }\n }\n\n /**\n * Get debug statistics\n */\n getDebugStats(): {\n totalRerenders: number;\n elementCount: number;\n avgRerenders: number;\n } | null {\n return this.renderer?.getDebugStats() || null;\n }\n\n /**\n * Render a lazy route component into a specific route element\n * This is called by the Router when a route becomes active\n */\n async renderLazyRoute(\n routePath: string,\n componentName: string,\n routeElement: HTMLElement\n ): Promise<void> {\n if (!this.engine || !this.renderer) {\n throw new Error(\"Engine not initialized\");\n }\n\n // Get the component from the loader\n const component = componentLoader.get(componentName);\n if (!component) {\n throw new Error(`Component ${componentName} not found`);\n }\n\n // Get the component template\n const template = component.template;\n if (!template) {\n throw new Error(`Component ${componentName} has no template`);\n }\n\n // Create module instance for this component if it has state\n if (component.module && !this.moduleInstances.has(componentName)) {\n const moduleId = this.extractModuleId(componentName, template);\n\n const routerContext: RouterContext = {\n root: this.router,\n current: this.router,\n };\n\n const moduleInstance = new HypenModuleInstance(\n this.engine,\n component.module,\n routerContext,\n this.globalContext\n );\n\n this.globalContext.registerModule(moduleId, moduleInstance);\n this.moduleInstances.set(componentName, moduleInstance);\n\n // Listen to state changes\n moduleInstance.onStateChange(() => {\n const mergedState = this.getMergedState();\n if (this.config.debug) {\n console.log(\n `[Hypen] Lazy component ${componentName} state changed:`,\n mergedState\n );\n }\n this.renderer!.updateState(mergedState);\n });\n }\n\n // Wait a tick for module instance to initialize and fetch data\n await new Promise((resolve) => setTimeout(resolve, 50));\n\n // Get the route element's node ID from the renderer\n const routeNodeId = routeElement.dataset.hypenId;\n if (!routeNodeId) {\n throw new Error(`Route element is missing data-hypen-id attribute`);\n }\n\n // Get the current merged state\n const mergedState = this.getMergedState();\n\n // Render into the Route element\n this.engine.renderInto(template, routeNodeId, mergedState);\n\n // Ensure freshly created text nodes are interpolated with current state\n this.renderer!.updateState(mergedState);\n }\n\n /**\n * Extract module ID from component name or .id() applicator\n */\n private extractModuleId(componentName: string, template: string): string {\n // Look for .id(\"CustomName\") or .id('CustomName') in the template\n const idMatch = template.match(/\\.id\\([\"']([^\"']+)[\"']\\)/);\n const matchedId = idMatch?.[1];\n if (matchedId) {\n return matchedId;\n }\n\n // Default to component name\n return componentName;\n }\n\n /**\n * Create module instances for all components that have state\n */\n private createNestedModuleInstances(): void {\n const routerContext: RouterContext = {\n root: this.router,\n current: this.router,\n };\n\n // Create built-in Router module instance\n if (Router && !this.moduleInstances.has(\"Router\")) {\n const routerInstance = new HypenModuleInstance(\n this.engine!,\n Router,\n routerContext,\n this.globalContext\n );\n this.globalContext.registerModule(\"Router\", routerInstance);\n this.moduleInstances.set(\"Router\", routerInstance);\n routerInstance.onStateChange(() => {\n const mergedState = this.getMergedState();\n if (this.config.debug) {\n console.log(`[Hypen] Router state changed:`, mergedState);\n }\n this.renderer!.updateState(mergedState);\n });\n }\n\n // Get all registered components\n const componentNames = componentLoader.getNames();\n\n for (const name of componentNames) {\n // Skip if already created\n if (this.moduleInstances.has(name)) {\n continue;\n }\n\n const comp = componentLoader.get(name);\n if (!comp || !comp.module) {\n continue;\n }\n\n // Create module instance\n if (this.config.debug) {\n console.log(`[Hypen] Creating nested module instance for: ${name}`);\n }\n\n const moduleInstance = new HypenModuleInstance(\n this.engine!,\n comp.module,\n routerContext,\n this.globalContext\n );\n\n this.globalContext.registerModule(name, moduleInstance);\n this.moduleInstances.set(name, moduleInstance);\n\n // Connect state changes to renderer\n moduleInstance.onStateChange(() => {\n const mergedState = this.getMergedState();\n if (this.config.debug) {\n console.log(\n `[Hypen] Nested component ${name} state changed:`,\n mergedState\n );\n }\n this.renderer!.updateState(mergedState);\n });\n }\n }\n\n /**\n * Get merged state from all module instances\n */\n private getMergedState(): Record<string, any> {\n const merged: Record<string, any> = {};\n\n // Include main module state\n if (this.moduleInstance) {\n const mainState = this.moduleInstance.getState();\n Object.assign(merged, mainState);\n }\n\n // Include all nested component states\n for (const [name, instance] of this.moduleInstances.entries()) {\n const nestedState = instance.getState();\n Object.assign(merged, nestedState);\n }\n\n return merged;\n }\n\n /**\n * Set up component resolver for the engine\n */\n private setupComponentResolver(): void {\n if (!this.engine) return;\n\n // List of built-in DOM elements that should NOT be resolved\n const builtInElements = new Set([\n \"Column\",\n \"Row\",\n \"Text\",\n \"Button\",\n \"Image\",\n \"Input\",\n \"Container\",\n \"Box\",\n \"Center\",\n \"List\",\n \"Canvas\",\n \"Spacer\",\n \"Divider\",\n \"ScrollView\",\n ]);\n\n this.engine.setComponentResolver(\n (componentName: string, contextPath: string | null) => {\n // Don't try to resolve built-in DOM elements\n if (builtInElements.has(componentName)) {\n return null;\n }\n\n if (this.config.debug) {\n console.log(\n `[Hypen] Resolving component: ${componentName} (context: ${contextPath})`\n );\n }\n\n // Check if component is registered\n const componentDef = componentLoader.get(componentName);\n if (!componentDef) {\n if (this.config.debug) {\n console.log(`[Hypen] Component not found: ${componentName}`);\n }\n return null;\n }\n\n // Router is passthrough, Route is lazy\n const isPassthrough = componentName === \"Router\";\n const isLazy = componentName === \"Route\";\n\n const resolved = {\n source: componentDef.template,\n path: componentDef.path || componentName,\n passthrough: isPassthrough,\n lazy: isLazy,\n };\n\n if (this.config.debug) {\n const flags = [];\n if (isPassthrough) flags.push(\"passthrough\");\n if (isLazy) flags.push(\"lazy\");\n const flagStr = flags.length > 0 ? ` (${flags.join(\", \")})` : \"\";\n console.log(\n `[Hypen] Resolved ${componentName} -> ${resolved.path}${flagStr}`\n );\n }\n\n return resolved;\n }\n );\n }\n}\n\n/**\n * Quick render function (like ReactDOM.render)\n *\n * @example\n * ```typescript\n * import { render } from \"@hypen-space/web\";\n *\n * await render(\"HomePage\", \"#app\");\n * ```\n */\nexport async function render(\n componentName: string,\n containerSelector: string | HTMLElement,\n config?: HypenConfig\n): Promise<Hypen> {\n const hypen = new Hypen(config);\n await hypen.init();\n await hypen.loadComponents();\n await hypen.render(componentName, containerSelector);\n return hypen;\n}\n\n/**\n * Render with explicit component loading\n *\n * @example\n * ```typescript\n * import { renderWithComponents } from \"@hypen-space/web\";\n * import HomePage from \"./components/HomePage/component\";\n * import homePageTemplate from \"./components/HomePage/component.hypen\";\n *\n * await renderWithComponents(\n * { HomePage: { module: HomePage, template: homePageTemplate } },\n * \"HomePage\",\n * \"#app\"\n * );\n * ```\n */\nexport async function renderWithComponents(\n components: Record<string, { module: HypenModuleDefinition; template: string }>,\n componentName: string,\n containerSelector: string | HTMLElement,\n config?: HypenConfig\n): Promise<Hypen> {\n const hypen = new Hypen(config);\n await hypen.init();\n\n // Register components manually\n for (const [name, { module, template }] of Object.entries(components)) {\n let processedTemplate = template;\n\n // If template starts with \"module ComponentName {\", extract just the children\n const moduleMatch = template.match(/^\\s*module\\s+\\w+\\s*\\{([\\s\\S]*)\\}\\s*$/);\n if (moduleMatch && moduleMatch[1]) {\n processedTemplate = moduleMatch[1].trim();\n }\n\n componentLoader.register(name, module, processedTemplate);\n }\n\n await hypen.render(componentName, containerSelector);\n return hypen;\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "7427343EFC068BA764756E2164756E21",
9
+ "names": []
10
+ }