@vobs/runtime 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/dist/async-boundary.cjs +623 -0
  2. package/dist/async-boundary.cjs.map +1 -0
  3. package/dist/async-boundary.d.cts +18 -0
  4. package/dist/async-boundary.d.ts +18 -0
  5. package/dist/async-boundary.js +620 -0
  6. package/dist/async-boundary.js.map +1 -0
  7. package/dist/bind.cjs +312 -0
  8. package/dist/bind.cjs.map +1 -0
  9. package/dist/bind.d.cts +8 -0
  10. package/dist/bind.d.ts +8 -0
  11. package/dist/bind.js +308 -0
  12. package/dist/bind.js.map +1 -0
  13. package/dist/boundary.cjs +621 -0
  14. package/dist/boundary.cjs.map +1 -0
  15. package/dist/boundary.d.cts +18 -0
  16. package/dist/boundary.d.ts +18 -0
  17. package/dist/boundary.js +619 -0
  18. package/dist/boundary.js.map +1 -0
  19. package/dist/debug.cjs +94 -0
  20. package/dist/debug.cjs.map +1 -0
  21. package/dist/debug.d.cts +58 -0
  22. package/dist/debug.d.ts +58 -0
  23. package/dist/debug.js +85 -0
  24. package/dist/debug.js.map +1 -0
  25. package/dist/dynamic.cjs +801 -0
  26. package/dist/dynamic.cjs.map +1 -0
  27. package/dist/dynamic.d.cts +15 -0
  28. package/dist/dynamic.d.ts +15 -0
  29. package/dist/dynamic.js +796 -0
  30. package/dist/dynamic.js.map +1 -0
  31. package/dist/error-boundary.cjs +693 -0
  32. package/dist/error-boundary.cjs.map +1 -0
  33. package/dist/error-boundary.d.cts +22 -0
  34. package/dist/error-boundary.d.ts +22 -0
  35. package/dist/error-boundary.js +690 -0
  36. package/dist/error-boundary.js.map +1 -0
  37. package/dist/error.cjs +117 -0
  38. package/dist/error.cjs.map +1 -0
  39. package/dist/error.d.cts +53 -0
  40. package/dist/error.d.ts +53 -0
  41. package/dist/error.js +111 -0
  42. package/dist/error.js.map +1 -0
  43. package/dist/fragment.cjs +216 -0
  44. package/dist/fragment.cjs.map +1 -0
  45. package/dist/fragment.d.cts +13 -0
  46. package/dist/fragment.d.ts +13 -0
  47. package/dist/fragment.js +213 -0
  48. package/dist/fragment.js.map +1 -0
  49. package/dist/hmr.cjs +106 -0
  50. package/dist/hmr.cjs.map +1 -0
  51. package/dist/hmr.d.cts +24 -0
  52. package/dist/hmr.d.ts +24 -0
  53. package/dist/hmr.js +98 -0
  54. package/dist/hmr.js.map +1 -0
  55. package/dist/index.cjs +1597 -0
  56. package/dist/index.cjs.map +1 -0
  57. package/dist/index.d.cts +15 -0
  58. package/dist/index.d.ts +15 -0
  59. package/dist/index.js +1540 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/ops.cjs +574 -0
  62. package/dist/ops.cjs.map +1 -0
  63. package/dist/ops.d.cts +39 -0
  64. package/dist/ops.d.ts +39 -0
  65. package/dist/ops.js +554 -0
  66. package/dist/ops.js.map +1 -0
  67. package/dist/profiler.cjs +523 -0
  68. package/dist/profiler.cjs.map +1 -0
  69. package/dist/profiler.d.cts +20 -0
  70. package/dist/profiler.d.ts +20 -0
  71. package/dist/profiler.js +520 -0
  72. package/dist/profiler.js.map +1 -0
  73. package/dist/ref.cjs +169 -0
  74. package/dist/ref.cjs.map +1 -0
  75. package/dist/ref.d.cts +10 -0
  76. package/dist/ref.d.ts +10 -0
  77. package/dist/ref.js +166 -0
  78. package/dist/ref.js.map +1 -0
  79. package/dist/renderer.cjs +4 -0
  80. package/dist/renderer.cjs.map +1 -0
  81. package/dist/renderer.d.cts +18 -0
  82. package/dist/renderer.d.ts +18 -0
  83. package/dist/renderer.js +3 -0
  84. package/dist/renderer.js.map +1 -0
  85. package/dist/template.cjs +28 -0
  86. package/dist/template.cjs.map +1 -0
  87. package/dist/template.d.cts +6 -0
  88. package/dist/template.d.ts +6 -0
  89. package/dist/template.js +25 -0
  90. package/dist/template.js.map +1 -0
  91. package/package.json +26 -6
  92. package/src/boundaries.test.ts +1 -0
  93. package/src/dynamic.test.ts +171 -0
  94. package/src/dynamic.ts +125 -15
  95. package/src/hmr.test.ts +1 -0
  96. package/src/index.ts +1 -0
  97. package/src/ref.test.ts +1 -0
  98. package/src/template.ts +24 -0
package/dist/hmr.cjs ADDED
@@ -0,0 +1,106 @@
1
+ 'use strict';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
+
6
+ // packages/runtime/src/hmr.ts
7
+ var globalTarget = globalThis;
8
+ var hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: /* @__PURE__ */ new Map() };
9
+ globalTarget.__VOBS_HMR__ = hmrGlobal;
10
+ function resolveComponent(component, moduleId, exportName) {
11
+ const module = getModule(moduleId);
12
+ const existing = module.components.get(exportName);
13
+ if (existing) return existing;
14
+ const proxy = /* @__PURE__ */ __name(((props) => {
15
+ const current = proxy.current;
16
+ return current(props);
17
+ }), "proxy");
18
+ proxy.current = component;
19
+ Object.defineProperties(proxy, {
20
+ displayName: { configurable: true, value: component.name || exportName },
21
+ hmrKey: { configurable: false, value: `${moduleId}:${exportName}` }
22
+ });
23
+ module.components.set(exportName, proxy);
24
+ return proxy;
25
+ }
26
+ __name(resolveComponent, "resolveComponent");
27
+ function updateHmrModule(_moduleId, nextModule) {
28
+ const modules = [...hmrGlobal.modules.values()];
29
+ for (const module of modules) {
30
+ let changed = false;
31
+ for (const [name, proxy] of module.components) {
32
+ const next = nextModule[name];
33
+ if (typeof next !== "function") continue;
34
+ const hmrProxy = proxy;
35
+ hmrProxy.current = next;
36
+ Object.defineProperty(hmrProxy, "displayName", { configurable: true, value: next.name || name });
37
+ changed = true;
38
+ }
39
+ if (!changed) continue;
40
+ for (const instance of module.instances) {
41
+ try {
42
+ instance.refresh();
43
+ } catch {
44
+ }
45
+ }
46
+ }
47
+ }
48
+ __name(updateHmrModule, "updateHmrModule");
49
+ function disposeHmrModule(_moduleId) {
50
+ }
51
+ __name(disposeHmrModule, "disposeHmrModule");
52
+ function createHmrStateStore(moduleId) {
53
+ const state = getModule(moduleId).state;
54
+ return {
55
+ get(key, initial) {
56
+ if (!state.has(key)) state.set(key, typeof initial === "function" ? initial() : initial);
57
+ return state.get(key);
58
+ },
59
+ set(key, value) {
60
+ state.set(key, value);
61
+ },
62
+ has: /* @__PURE__ */ __name((key) => state.has(key), "has"),
63
+ delete: /* @__PURE__ */ __name((key) => {
64
+ state.delete(key);
65
+ }, "delete"),
66
+ clear: /* @__PURE__ */ __name(() => {
67
+ state.clear();
68
+ }, "clear")
69
+ };
70
+ }
71
+ __name(createHmrStateStore, "createHmrStateStore");
72
+ function registerHmrInstance(moduleId, instance) {
73
+ const instances = getModule(moduleId).instances;
74
+ instances.add(instance);
75
+ return () => instances.delete(instance);
76
+ }
77
+ __name(registerHmrInstance, "registerHmrInstance");
78
+ function markHmrInstanceMounted(node, parent) {
79
+ const instance = hmrInstances.get(node);
80
+ if (instance) instance.parent = parent;
81
+ }
82
+ __name(markHmrInstanceMounted, "markHmrInstanceMounted");
83
+ function getModule(moduleId) {
84
+ let module = hmrGlobal.modules.get(moduleId);
85
+ if (!module) {
86
+ module = { components: /* @__PURE__ */ new Map(), state: /* @__PURE__ */ new Map(), instances: /* @__PURE__ */ new Set() };
87
+ hmrGlobal.modules.set(moduleId, module);
88
+ }
89
+ return module;
90
+ }
91
+ __name(getModule, "getModule");
92
+ var hmrInstances = /* @__PURE__ */ new WeakMap();
93
+ function associateHmrInstance(node, instance) {
94
+ hmrInstances.set(node, instance);
95
+ }
96
+ __name(associateHmrInstance, "associateHmrInstance");
97
+
98
+ exports.associateHmrInstance = associateHmrInstance;
99
+ exports.createHmrStateStore = createHmrStateStore;
100
+ exports.disposeHmrModule = disposeHmrModule;
101
+ exports.markHmrInstanceMounted = markHmrInstanceMounted;
102
+ exports.registerHmrInstance = registerHmrInstance;
103
+ exports.resolveComponent = resolveComponent;
104
+ exports.updateHmrModule = updateHmrModule;
105
+ //# sourceMappingURL=hmr.cjs.map
106
+ //# sourceMappingURL=hmr.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hmr.ts"],"names":[],"mappings":"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","file":"hmr.cjs","sourcesContent":["import type { VobsNode } from './fragment'\n\nexport type HmrComponent<Props extends object = Record<string, unknown>> =\n (props: Props) => VobsNode\n\nexport interface HmrStateStore {\n get<T>(key: string, initial: T | (() => T)): T\n set<T>(key: string, value: T): void\n has(key: string): boolean\n delete(key: string): void\n clear(): void\n}\n\nexport interface HmrInstance {\n node: VobsNode\n parent: Node | null\n refresh(): void\n}\n\ninterface HmrModuleState {\n readonly components: Map<string, HmrComponent>\n readonly state: Map<string, unknown>\n readonly instances: Set<HmrInstance>\n}\n\ninterface HmrGlobal {\n modules: Map<string, HmrModuleState>\n}\n\nconst globalTarget = globalThis as typeof globalThis & { __VOBS_HMR__?: HmrGlobal }\nconst hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: new Map<string, HmrModuleState>() }\nglobalTarget.__VOBS_HMR__ = hmrGlobal\n\nexport function resolveComponent<Props extends object>(\n component: HmrComponent<Props>,\n moduleId: string,\n exportName: string\n): HmrComponent<Props> {\n const module = getModule(moduleId)\n const existing = module.components.get(exportName)\n if (existing) return existing as HmrComponent<Props>\n\n const proxy = ((props: Props) => {\n const current = (proxy as HmrComponent<Props> & { current: HmrComponent<Props> }).current\n return current(props)\n }) as HmrComponent<Props> & { current: HmrComponent<Props> }\n proxy.current = component\n Object.defineProperties(proxy, {\n displayName: { configurable: true, value: component.name || exportName },\n hmrKey: { configurable: false, value: `${moduleId}:${exportName}` }\n })\n module.components.set(exportName, proxy as HmrComponent)\n return proxy\n}\n\nexport function updateHmrModule(_moduleId: string, nextModule: Record<string, unknown>): void {\n const modules = [...hmrGlobal.modules.values()]\n for (const module of modules) {\n let changed = false\n for (const [name, proxy] of module.components) {\n const next = nextModule[name]\n if (typeof next !== 'function') continue\n const hmrProxy = proxy as HmrComponent & { current: HmrComponent; displayName?: string }\n hmrProxy.current = next as HmrComponent\n Object.defineProperty(hmrProxy, 'displayName', { configurable: true, value: next.name || name })\n changed = true\n }\n if (!changed) continue\n for (const instance of module.instances) {\n try {\n instance.refresh()\n } catch {\n // HMR failures remain application errors on the next normal render.\n }\n }\n }\n}\n\nexport function disposeHmrModule(_moduleId: string): void {\n // State and component proxies intentionally survive module disposal.\n}\n\nexport function createHmrStateStore(moduleId: string): HmrStateStore {\n const state = getModule(moduleId).state\n return {\n get<T>(key: string, initial: T | (() => T)): T {\n if (!state.has(key)) state.set(key, typeof initial === 'function' ? (initial as () => T)() : initial)\n return state.get(key) as T\n },\n set<T>(key: string, value: T): void {\n state.set(key, value)\n },\n has: key => state.has(key),\n delete: key => { state.delete(key) },\n clear: () => { state.clear() }\n }\n}\n\nexport function registerHmrInstance(moduleId: string, instance: HmrInstance): () => void {\n const instances = getModule(moduleId).instances\n instances.add(instance)\n return () => instances.delete(instance)\n}\n\nexport function markHmrInstanceMounted(node: VobsNode, parent: Node): void {\n const instance = hmrInstances.get(node as object)\n if (instance) instance.parent = parent\n}\n\nfunction getModule(moduleId: string): HmrModuleState {\n let module = hmrGlobal.modules.get(moduleId)\n if (!module) {\n module = { components: new Map(), state: new Map(), instances: new Set() }\n hmrGlobal.modules.set(moduleId, module)\n }\n return module\n}\n\nconst hmrInstances = new WeakMap<object, HmrInstance>()\n\nexport function associateHmrInstance(node: VobsNode, instance: HmrInstance): void {\n hmrInstances.set(node as object, instance)\n}\n"]}
package/dist/hmr.d.cts ADDED
@@ -0,0 +1,24 @@
1
+ import { VobsNode } from './fragment.cjs';
2
+
3
+ type HmrComponent<Props extends object = Record<string, unknown>> = (props: Props) => VobsNode;
4
+ interface HmrStateStore {
5
+ get<T>(key: string, initial: T | (() => T)): T;
6
+ set<T>(key: string, value: T): void;
7
+ has(key: string): boolean;
8
+ delete(key: string): void;
9
+ clear(): void;
10
+ }
11
+ interface HmrInstance {
12
+ node: VobsNode;
13
+ parent: Node | null;
14
+ refresh(): void;
15
+ }
16
+ declare function resolveComponent<Props extends object>(component: HmrComponent<Props>, moduleId: string, exportName: string): HmrComponent<Props>;
17
+ declare function updateHmrModule(_moduleId: string, nextModule: Record<string, unknown>): void;
18
+ declare function disposeHmrModule(_moduleId: string): void;
19
+ declare function createHmrStateStore(moduleId: string): HmrStateStore;
20
+ declare function registerHmrInstance(moduleId: string, instance: HmrInstance): () => void;
21
+ declare function markHmrInstanceMounted(node: VobsNode, parent: Node): void;
22
+ declare function associateHmrInstance(node: VobsNode, instance: HmrInstance): void;
23
+
24
+ export { type HmrComponent, type HmrInstance, type HmrStateStore, associateHmrInstance, createHmrStateStore, disposeHmrModule, markHmrInstanceMounted, registerHmrInstance, resolveComponent, updateHmrModule };
package/dist/hmr.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ import { VobsNode } from './fragment.js';
2
+
3
+ type HmrComponent<Props extends object = Record<string, unknown>> = (props: Props) => VobsNode;
4
+ interface HmrStateStore {
5
+ get<T>(key: string, initial: T | (() => T)): T;
6
+ set<T>(key: string, value: T): void;
7
+ has(key: string): boolean;
8
+ delete(key: string): void;
9
+ clear(): void;
10
+ }
11
+ interface HmrInstance {
12
+ node: VobsNode;
13
+ parent: Node | null;
14
+ refresh(): void;
15
+ }
16
+ declare function resolveComponent<Props extends object>(component: HmrComponent<Props>, moduleId: string, exportName: string): HmrComponent<Props>;
17
+ declare function updateHmrModule(_moduleId: string, nextModule: Record<string, unknown>): void;
18
+ declare function disposeHmrModule(_moduleId: string): void;
19
+ declare function createHmrStateStore(moduleId: string): HmrStateStore;
20
+ declare function registerHmrInstance(moduleId: string, instance: HmrInstance): () => void;
21
+ declare function markHmrInstanceMounted(node: VobsNode, parent: Node): void;
22
+ declare function associateHmrInstance(node: VobsNode, instance: HmrInstance): void;
23
+
24
+ export { type HmrComponent, type HmrInstance, type HmrStateStore, associateHmrInstance, createHmrStateStore, disposeHmrModule, markHmrInstanceMounted, registerHmrInstance, resolveComponent, updateHmrModule };
package/dist/hmr.js ADDED
@@ -0,0 +1,98 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // packages/runtime/src/hmr.ts
5
+ var globalTarget = globalThis;
6
+ var hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: /* @__PURE__ */ new Map() };
7
+ globalTarget.__VOBS_HMR__ = hmrGlobal;
8
+ function resolveComponent(component, moduleId, exportName) {
9
+ const module = getModule(moduleId);
10
+ const existing = module.components.get(exportName);
11
+ if (existing) return existing;
12
+ const proxy = /* @__PURE__ */ __name(((props) => {
13
+ const current = proxy.current;
14
+ return current(props);
15
+ }), "proxy");
16
+ proxy.current = component;
17
+ Object.defineProperties(proxy, {
18
+ displayName: { configurable: true, value: component.name || exportName },
19
+ hmrKey: { configurable: false, value: `${moduleId}:${exportName}` }
20
+ });
21
+ module.components.set(exportName, proxy);
22
+ return proxy;
23
+ }
24
+ __name(resolveComponent, "resolveComponent");
25
+ function updateHmrModule(_moduleId, nextModule) {
26
+ const modules = [...hmrGlobal.modules.values()];
27
+ for (const module of modules) {
28
+ let changed = false;
29
+ for (const [name, proxy] of module.components) {
30
+ const next = nextModule[name];
31
+ if (typeof next !== "function") continue;
32
+ const hmrProxy = proxy;
33
+ hmrProxy.current = next;
34
+ Object.defineProperty(hmrProxy, "displayName", { configurable: true, value: next.name || name });
35
+ changed = true;
36
+ }
37
+ if (!changed) continue;
38
+ for (const instance of module.instances) {
39
+ try {
40
+ instance.refresh();
41
+ } catch {
42
+ }
43
+ }
44
+ }
45
+ }
46
+ __name(updateHmrModule, "updateHmrModule");
47
+ function disposeHmrModule(_moduleId) {
48
+ }
49
+ __name(disposeHmrModule, "disposeHmrModule");
50
+ function createHmrStateStore(moduleId) {
51
+ const state = getModule(moduleId).state;
52
+ return {
53
+ get(key, initial) {
54
+ if (!state.has(key)) state.set(key, typeof initial === "function" ? initial() : initial);
55
+ return state.get(key);
56
+ },
57
+ set(key, value) {
58
+ state.set(key, value);
59
+ },
60
+ has: /* @__PURE__ */ __name((key) => state.has(key), "has"),
61
+ delete: /* @__PURE__ */ __name((key) => {
62
+ state.delete(key);
63
+ }, "delete"),
64
+ clear: /* @__PURE__ */ __name(() => {
65
+ state.clear();
66
+ }, "clear")
67
+ };
68
+ }
69
+ __name(createHmrStateStore, "createHmrStateStore");
70
+ function registerHmrInstance(moduleId, instance) {
71
+ const instances = getModule(moduleId).instances;
72
+ instances.add(instance);
73
+ return () => instances.delete(instance);
74
+ }
75
+ __name(registerHmrInstance, "registerHmrInstance");
76
+ function markHmrInstanceMounted(node, parent) {
77
+ const instance = hmrInstances.get(node);
78
+ if (instance) instance.parent = parent;
79
+ }
80
+ __name(markHmrInstanceMounted, "markHmrInstanceMounted");
81
+ function getModule(moduleId) {
82
+ let module = hmrGlobal.modules.get(moduleId);
83
+ if (!module) {
84
+ module = { components: /* @__PURE__ */ new Map(), state: /* @__PURE__ */ new Map(), instances: /* @__PURE__ */ new Set() };
85
+ hmrGlobal.modules.set(moduleId, module);
86
+ }
87
+ return module;
88
+ }
89
+ __name(getModule, "getModule");
90
+ var hmrInstances = /* @__PURE__ */ new WeakMap();
91
+ function associateHmrInstance(node, instance) {
92
+ hmrInstances.set(node, instance);
93
+ }
94
+ __name(associateHmrInstance, "associateHmrInstance");
95
+
96
+ export { associateHmrInstance, createHmrStateStore, disposeHmrModule, markHmrInstanceMounted, registerHmrInstance, resolveComponent, updateHmrModule };
97
+ //# sourceMappingURL=hmr.js.map
98
+ //# sourceMappingURL=hmr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hmr.ts"],"names":[],"mappings":"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","file":"hmr.js","sourcesContent":["import type { VobsNode } from './fragment'\n\nexport type HmrComponent<Props extends object = Record<string, unknown>> =\n (props: Props) => VobsNode\n\nexport interface HmrStateStore {\n get<T>(key: string, initial: T | (() => T)): T\n set<T>(key: string, value: T): void\n has(key: string): boolean\n delete(key: string): void\n clear(): void\n}\n\nexport interface HmrInstance {\n node: VobsNode\n parent: Node | null\n refresh(): void\n}\n\ninterface HmrModuleState {\n readonly components: Map<string, HmrComponent>\n readonly state: Map<string, unknown>\n readonly instances: Set<HmrInstance>\n}\n\ninterface HmrGlobal {\n modules: Map<string, HmrModuleState>\n}\n\nconst globalTarget = globalThis as typeof globalThis & { __VOBS_HMR__?: HmrGlobal }\nconst hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: new Map<string, HmrModuleState>() }\nglobalTarget.__VOBS_HMR__ = hmrGlobal\n\nexport function resolveComponent<Props extends object>(\n component: HmrComponent<Props>,\n moduleId: string,\n exportName: string\n): HmrComponent<Props> {\n const module = getModule(moduleId)\n const existing = module.components.get(exportName)\n if (existing) return existing as HmrComponent<Props>\n\n const proxy = ((props: Props) => {\n const current = (proxy as HmrComponent<Props> & { current: HmrComponent<Props> }).current\n return current(props)\n }) as HmrComponent<Props> & { current: HmrComponent<Props> }\n proxy.current = component\n Object.defineProperties(proxy, {\n displayName: { configurable: true, value: component.name || exportName },\n hmrKey: { configurable: false, value: `${moduleId}:${exportName}` }\n })\n module.components.set(exportName, proxy as HmrComponent)\n return proxy\n}\n\nexport function updateHmrModule(_moduleId: string, nextModule: Record<string, unknown>): void {\n const modules = [...hmrGlobal.modules.values()]\n for (const module of modules) {\n let changed = false\n for (const [name, proxy] of module.components) {\n const next = nextModule[name]\n if (typeof next !== 'function') continue\n const hmrProxy = proxy as HmrComponent & { current: HmrComponent; displayName?: string }\n hmrProxy.current = next as HmrComponent\n Object.defineProperty(hmrProxy, 'displayName', { configurable: true, value: next.name || name })\n changed = true\n }\n if (!changed) continue\n for (const instance of module.instances) {\n try {\n instance.refresh()\n } catch {\n // HMR failures remain application errors on the next normal render.\n }\n }\n }\n}\n\nexport function disposeHmrModule(_moduleId: string): void {\n // State and component proxies intentionally survive module disposal.\n}\n\nexport function createHmrStateStore(moduleId: string): HmrStateStore {\n const state = getModule(moduleId).state\n return {\n get<T>(key: string, initial: T | (() => T)): T {\n if (!state.has(key)) state.set(key, typeof initial === 'function' ? (initial as () => T)() : initial)\n return state.get(key) as T\n },\n set<T>(key: string, value: T): void {\n state.set(key, value)\n },\n has: key => state.has(key),\n delete: key => { state.delete(key) },\n clear: () => { state.clear() }\n }\n}\n\nexport function registerHmrInstance(moduleId: string, instance: HmrInstance): () => void {\n const instances = getModule(moduleId).instances\n instances.add(instance)\n return () => instances.delete(instance)\n}\n\nexport function markHmrInstanceMounted(node: VobsNode, parent: Node): void {\n const instance = hmrInstances.get(node as object)\n if (instance) instance.parent = parent\n}\n\nfunction getModule(moduleId: string): HmrModuleState {\n let module = hmrGlobal.modules.get(moduleId)\n if (!module) {\n module = { components: new Map(), state: new Map(), instances: new Set() }\n hmrGlobal.modules.set(moduleId, module)\n }\n return module\n}\n\nconst hmrInstances = new WeakMap<object, HmrInstance>()\n\nexport function associateHmrInstance(node: VobsNode, instance: HmrInstance): void {\n hmrInstances.set(node as object, instance)\n}\n"]}