@hypen-space/core 0.2.5 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/src/app.js CHANGED
@@ -1,10 +1,248 @@
1
- import {
2
- createObservableState,
3
- getStateSnapshot
4
- } from "./state.js";
5
- import"../chunk-5va59f7m.js";
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, {
5
+ get: all[name],
6
+ enumerable: true,
7
+ configurable: true,
8
+ set: (newValue) => all[name] = () => newValue
9
+ });
10
+ };
11
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
12
+
13
+ // src/state.ts
14
+ function deepClone(obj) {
15
+ if (obj === null || typeof obj !== "object") {
16
+ return obj;
17
+ }
18
+ const visited = new WeakMap;
19
+ function cloneInternal(value) {
20
+ if (value === null || typeof value !== "object") {
21
+ return value;
22
+ }
23
+ if (visited.has(value)) {
24
+ return visited.get(value);
25
+ }
26
+ if (value instanceof Date) {
27
+ return new Date(value.getTime());
28
+ }
29
+ if (value instanceof RegExp) {
30
+ return new RegExp(value.source, value.flags);
31
+ }
32
+ if (value instanceof Map) {
33
+ const mapClone = new Map;
34
+ visited.set(value, mapClone);
35
+ for (const [k, v] of value.entries()) {
36
+ mapClone.set(cloneInternal(k), cloneInternal(v));
37
+ }
38
+ return mapClone;
39
+ }
40
+ if (value instanceof Set) {
41
+ const setClone = new Set;
42
+ visited.set(value, setClone);
43
+ for (const item of value.values()) {
44
+ setClone.add(cloneInternal(item));
45
+ }
46
+ return setClone;
47
+ }
48
+ if (value instanceof WeakMap || value instanceof WeakSet) {
49
+ return value;
50
+ }
51
+ if (Array.isArray(value)) {
52
+ const arrClone = [];
53
+ visited.set(value, arrClone);
54
+ for (let i = 0;i < value.length; i++) {
55
+ arrClone[i] = cloneInternal(value[i]);
56
+ }
57
+ return arrClone;
58
+ }
59
+ const objClone = {};
60
+ visited.set(value, objClone);
61
+ for (const key in value) {
62
+ if (value.hasOwnProperty(key)) {
63
+ objClone[key] = cloneInternal(value[key]);
64
+ }
65
+ }
66
+ const symbolKeys = Object.getOwnPropertySymbols(value);
67
+ for (const sym of symbolKeys) {
68
+ objClone[sym] = cloneInternal(value[sym]);
69
+ }
70
+ return objClone;
71
+ }
72
+ return cloneInternal(obj);
73
+ }
74
+ function diffState(oldState, newState, basePath = "") {
75
+ const paths = [];
76
+ const newValues = {};
77
+ function diff(oldVal, newVal, path) {
78
+ if (oldVal === newVal)
79
+ return;
80
+ if (typeof oldVal !== "object" || typeof newVal !== "object" || oldVal === null || newVal === null) {
81
+ if (oldVal !== newVal) {
82
+ paths.push(path);
83
+ newValues[path] = newVal;
84
+ }
85
+ return;
86
+ }
87
+ if (Array.isArray(oldVal) || Array.isArray(newVal)) {
88
+ if (!Array.isArray(oldVal) || !Array.isArray(newVal) || oldVal.length !== newVal.length) {
89
+ paths.push(path);
90
+ newValues[path] = newVal;
91
+ return;
92
+ }
93
+ for (let i = 0;i < newVal.length; i++) {
94
+ const itemPath = path ? `${path}.${i}` : `${i}`;
95
+ diff(oldVal[i], newVal[i], itemPath);
96
+ }
97
+ return;
98
+ }
99
+ const oldKeys = new Set(Object.keys(oldVal));
100
+ const newKeys = new Set(Object.keys(newVal));
101
+ for (const key of newKeys) {
102
+ const propPath = path ? `${path}.${key}` : key;
103
+ if (!oldKeys.has(key)) {
104
+ paths.push(propPath);
105
+ newValues[propPath] = newVal[key];
106
+ } else {
107
+ diff(oldVal[key], newVal[key], propPath);
108
+ }
109
+ }
110
+ for (const key of oldKeys) {
111
+ if (!newKeys.has(key)) {
112
+ const propPath = path ? `${path}.${key}` : key;
113
+ paths.push(propPath);
114
+ newValues[propPath] = undefined;
115
+ }
116
+ }
117
+ }
118
+ diff(oldState, newState, basePath);
119
+ return { paths, newValues };
120
+ }
121
+ function createObservableState(initialState, options) {
122
+ const opts = options || { onChange: () => {} };
123
+ if (initialState === null || initialState === undefined) {
124
+ initialState = {};
125
+ }
126
+ if (initialState instanceof Number || initialState instanceof String || initialState instanceof Boolean) {
127
+ throw new TypeError("Cannot create observable state from primitive wrapper objects (Number, String, Boolean). " + "Use plain primitives or regular objects instead.");
128
+ }
129
+ initialState = deepClone(initialState);
130
+ let lastSnapshot = deepClone(initialState);
131
+ const pathPrefix = opts.pathPrefix || "";
132
+ let batchDepth = 0;
133
+ let pendingChange = null;
134
+ function notifyChange() {
135
+ if (batchDepth > 0)
136
+ return;
137
+ const change = diffState(lastSnapshot, state, pathPrefix);
138
+ if (change.paths.length > 0) {
139
+ lastSnapshot = deepClone(state);
140
+ if (pendingChange) {
141
+ change.paths.push(...pendingChange.paths);
142
+ Object.assign(change.newValues, pendingChange.newValues);
143
+ pendingChange = null;
144
+ }
145
+ opts.onChange(change);
146
+ }
147
+ }
148
+ let notificationPending = false;
149
+ function scheduleBatch() {
150
+ if (batchDepth === 0) {
151
+ if (!notificationPending) {
152
+ notificationPending = true;
153
+ queueMicrotask(() => {
154
+ notificationPending = false;
155
+ if (batchDepth === 0) {
156
+ notifyChange();
157
+ }
158
+ });
159
+ }
160
+ }
161
+ }
162
+ const proxyCache = new WeakMap;
163
+ function createProxy(target, basePath) {
164
+ if (proxyCache.has(target)) {
165
+ return proxyCache.get(target);
166
+ }
167
+ const proxy = new Proxy(target, {
168
+ get(obj, prop) {
169
+ const value = obj[prop];
170
+ if (prop === "__beginBatch") {
171
+ return () => {
172
+ batchDepth++;
173
+ };
174
+ }
175
+ if (prop === "__endBatch") {
176
+ return () => {
177
+ batchDepth--;
178
+ if (batchDepth === 0) {
179
+ notifyChange();
180
+ }
181
+ };
182
+ }
183
+ if (prop === "__getSnapshot") {
184
+ return () => deepClone(obj);
185
+ }
186
+ if (value && typeof value === "object") {
187
+ if (value instanceof Date || value instanceof RegExp || value instanceof Map || value instanceof Set || value instanceof WeakMap || value instanceof WeakSet) {
188
+ return value;
189
+ }
190
+ return createProxy(value, basePath ? `${basePath}.${String(prop)}` : String(prop));
191
+ }
192
+ return value;
193
+ },
194
+ set(obj, prop, value) {
195
+ const oldValue = obj[prop];
196
+ obj[prop] = value;
197
+ if (oldValue !== value) {
198
+ scheduleBatch();
199
+ }
200
+ return true;
201
+ },
202
+ deleteProperty(obj, prop) {
203
+ if (prop in obj) {
204
+ delete obj[prop];
205
+ scheduleBatch();
206
+ }
207
+ return true;
208
+ }
209
+ });
210
+ proxyCache.set(target, proxy);
211
+ return proxy;
212
+ }
213
+ const state = createProxy(initialState, pathPrefix);
214
+ return state;
215
+ }
216
+ function batchStateUpdates(state, fn) {
217
+ const s = state;
218
+ if (s.__beginBatch && s.__endBatch) {
219
+ s.__beginBatch();
220
+ try {
221
+ fn();
222
+ } finally {
223
+ s.__endBatch();
224
+ }
225
+ } else {
226
+ fn();
227
+ }
228
+ }
229
+ function getStateSnapshot(state) {
230
+ const s = state;
231
+ if (s.__getSnapshot) {
232
+ return s.__getSnapshot();
233
+ }
234
+ return deepClone(state);
235
+ }
6
236
 
7
237
  // src/app.ts
238
+ var exports_app = {};
239
+ __export(exports_app, {
240
+ app: () => app,
241
+ HypenModuleInstance: () => HypenModuleInstance,
242
+ HypenAppBuilder: () => HypenAppBuilder,
243
+ HypenApp: () => HypenApp
244
+ });
245
+
8
246
  class HypenAppBuilder {
9
247
  initialState;
10
248
  options;
@@ -50,7 +288,6 @@ class HypenApp {
50
288
  return new HypenAppBuilder(initial, options);
51
289
  }
52
290
  }
53
- var app = new HypenApp;
54
291
 
55
292
  class HypenModuleInstance {
56
293
  engine;
@@ -149,6 +386,12 @@ class HypenModuleInstance {
149
386
  Object.assign(this.state, patch);
150
387
  }
151
388
  }
389
+ var app;
390
+ var init_app = __esm(() => {
391
+ app = new HypenApp;
392
+ });
393
+ init_app();
394
+
152
395
  export {
153
396
  app,
154
397
  HypenModuleInstance,
@@ -156,6 +399,4 @@ export {
156
399
  HypenApp
157
400
  };
158
401
 
159
- export { HypenAppBuilder, HypenApp, app, HypenModuleInstance };
160
-
161
- //# debugId=CC570FF56ABF0FB064756E2164756E21
402
+ //# debugId=488AB4A54C58D25D64756E2164756E21
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/app.ts"],
3
+ "sources": ["../src/state.ts", "../src/app.ts"],
4
4
  "sourcesContent": [
5
+ "/**\n * State management with observer pattern and diffing\n */\n\nexport type StatePath = string; // e.g., \"user.name\", \"items.0.title\"\n\n/**\n * Represents a change in state with full path information\n */\nexport interface StateChange {\n paths: StatePath[];\n newValues: Record<StatePath, any>;\n}\n\n/**\n * Options for state observer\n */\nexport interface StateObserverOptions {\n onChange: (change: StateChange) => void;\n pathPrefix?: string; // For nested observers\n}\n\n/**\n * Deep clone an object, handling circular references\n */\nfunction deepClone<T>(obj: T): T {\n // Handle primitives and null\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n // Use a WeakMap to track visited objects and handle circular references\n const visited = new WeakMap();\n\n function cloneInternal(value: any): any {\n // Handle primitives and null\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Check if we've already cloned this object (circular reference)\n if (visited.has(value)) {\n return visited.get(value);\n }\n\n // Handle Date\n if (value instanceof Date) {\n return new Date(value.getTime());\n }\n\n // Handle RegExp\n if (value instanceof RegExp) {\n return new RegExp(value.source, value.flags);\n }\n\n // Handle Map\n if (value instanceof Map) {\n const mapClone = new Map();\n visited.set(value, mapClone);\n for (const [k, v] of value.entries()) {\n mapClone.set(cloneInternal(k), cloneInternal(v));\n }\n return mapClone;\n }\n\n // Handle Set\n if (value instanceof Set) {\n const setClone = new Set();\n visited.set(value, setClone);\n for (const item of value.values()) {\n setClone.add(cloneInternal(item));\n }\n return setClone;\n }\n\n // Handle WeakMap/WeakSet - cannot be cloned, return as-is\n if (value instanceof WeakMap || value instanceof WeakSet) {\n return value;\n }\n\n // Handle Array\n if (Array.isArray(value)) {\n const arrClone: any[] = [];\n visited.set(value, arrClone);\n for (let i = 0; i < value.length; i++) {\n arrClone[i] = cloneInternal(value[i]);\n }\n return arrClone;\n }\n\n // Handle plain objects\n const objClone: any = {};\n visited.set(value, objClone);\n\n // Clone string keys\n for (const key in value) {\n if (value.hasOwnProperty(key)) {\n objClone[key] = cloneInternal(value[key]);\n }\n }\n\n // Clone Symbol keys (not enumerable by for...in)\n const symbolKeys = Object.getOwnPropertySymbols(value);\n for (const sym of symbolKeys) {\n objClone[sym] = cloneInternal(value[sym]);\n }\n\n return objClone;\n }\n\n return cloneInternal(obj);\n}\n\n/**\n * Compare two values and detect changes with full paths\n */\nfunction diffState(\n oldState: any,\n newState: any,\n basePath: string = \"\"\n): StateChange {\n const paths: StatePath[] = [];\n const newValues: Record<StatePath, any> = {};\n\n function diff(oldVal: any, newVal: any, path: string) {\n // Handle null/undefined\n if (oldVal === newVal) return;\n\n // Different types or primitives\n if (\n typeof oldVal !== \"object\" ||\n typeof newVal !== \"object\" ||\n oldVal === null ||\n newVal === null\n ) {\n if (oldVal !== newVal) {\n paths.push(path);\n newValues[path] = newVal;\n }\n return;\n }\n\n // Arrays\n if (Array.isArray(oldVal) || Array.isArray(newVal)) {\n if (\n !Array.isArray(oldVal) ||\n !Array.isArray(newVal) ||\n oldVal.length !== newVal.length\n ) {\n paths.push(path);\n newValues[path] = newVal;\n return;\n }\n\n for (let i = 0; i < newVal.length; i++) {\n const itemPath = path ? `${path}.${i}` : `${i}`;\n diff(oldVal[i], newVal[i], itemPath);\n }\n return;\n }\n\n // Objects\n const oldKeys = new Set(Object.keys(oldVal));\n const newKeys = new Set(Object.keys(newVal));\n\n // Check for added or changed keys\n for (const key of newKeys) {\n const propPath = path ? `${path}.${key}` : key;\n if (!oldKeys.has(key)) {\n // New property\n paths.push(propPath);\n newValues[propPath] = newVal[key];\n } else {\n // Existing property, recurse\n diff(oldVal[key], newVal[key], propPath);\n }\n }\n\n // Check for removed keys\n for (const key of oldKeys) {\n if (!newKeys.has(key)) {\n const propPath = path ? `${path}.${key}` : key;\n paths.push(propPath);\n newValues[propPath] = undefined;\n }\n }\n }\n\n diff(oldState, newState, basePath);\n return { paths, newValues };\n}\n\n/**\n * Create an observable state object that tracks changes\n */\nexport function createObservableState<T extends object>(\n initialState: T,\n options?: StateObserverOptions\n): T {\n // Use default options if not provided\n const opts: StateObserverOptions = options || { onChange: () => {} };\n\n // Handle null/undefined by using an empty object\n // This allows modules to start with null state\n if (initialState === null || initialState === undefined) {\n initialState = {} as T;\n }\n\n // Detect and reject primitive wrapper objects (Number, String, Boolean)\n // These cannot be properly proxied due to internal slots\n if (\n initialState instanceof Number ||\n initialState instanceof String ||\n initialState instanceof Boolean\n ) {\n throw new TypeError(\n \"Cannot create observable state from primitive wrapper objects (Number, String, Boolean). \" +\n \"Use plain primitives or regular objects instead.\"\n );\n }\n\n // Clone the initial state to ensure each observable has its own copy\n // This prevents multiple modules from sharing the same underlying state object\n initialState = deepClone(initialState);\n\n // Keep a snapshot of the last known state\n let lastSnapshot = deepClone(initialState);\n const pathPrefix = opts.pathPrefix || \"\";\n\n // Track if we're in a batch update\n let batchDepth = 0;\n let pendingChange: StateChange | null = null;\n\n function notifyChange() {\n if (batchDepth > 0) return;\n\n // Compare current state with last snapshot\n const change = diffState(lastSnapshot, state, pathPrefix);\n\n if (change.paths.length > 0) {\n // Update snapshot\n lastSnapshot = deepClone(state);\n\n // Merge with pending changes if any\n if (pendingChange) {\n change.paths.push(...pendingChange.paths);\n Object.assign(change.newValues, pendingChange.newValues);\n pendingChange = null;\n }\n\n // Notify\n opts.onChange(change);\n }\n }\n\n // Track if we have a pending microtask notification\n let notificationPending = false;\n\n function scheduleBatch() {\n if (batchDepth === 0) {\n // If not in a batch, schedule notification in next microtask to coalesce rapid changes\n if (!notificationPending) {\n notificationPending = true;\n queueMicrotask(() => {\n notificationPending = false;\n if (batchDepth === 0) {\n notifyChange();\n }\n });\n }\n }\n }\n\n // Cache proxies to handle circular references\n const proxyCache = new WeakMap<any, any>();\n\n function createProxy(target: any, basePath: string): any {\n // Return cached proxy if it exists (handles circular references)\n if (proxyCache.has(target)) {\n return proxyCache.get(target);\n }\n\n const proxy = new Proxy(target, {\n get(obj, prop) {\n const value = obj[prop];\n\n // Expose batch control methods\n if (prop === \"__beginBatch\") {\n return () => {\n batchDepth++;\n };\n }\n if (prop === \"__endBatch\") {\n return () => {\n batchDepth--;\n if (batchDepth === 0) {\n notifyChange();\n }\n };\n }\n if (prop === \"__getSnapshot\") {\n return () => deepClone(obj);\n }\n\n // Return proxied nested objects/arrays, but NOT special types\n if (value && typeof value === \"object\") {\n // Check for special object types that should not be proxied\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof WeakMap ||\n value instanceof WeakSet\n ) {\n return value;\n }\n\n // Proxy regular objects and arrays\n return createProxy(value, basePath ? `${basePath}.${String(prop)}` : String(prop));\n }\n\n return value;\n },\n\n set(obj, prop, value) {\n const oldValue = obj[prop];\n\n // Set the new value\n obj[prop] = value;\n\n if (oldValue !== value) {\n scheduleBatch();\n }\n\n return true;\n },\n\n deleteProperty(obj, prop) {\n if (prop in obj) {\n delete obj[prop];\n scheduleBatch();\n }\n return true;\n },\n });\n\n // Cache the proxy before returning\n proxyCache.set(target, proxy);\n return proxy;\n }\n\n const state = createProxy(initialState, pathPrefix);\n return state as T;\n}\n\n/**\n * Helper to batch multiple state updates\n */\nexport function batchStateUpdates<T>(state: T, fn: () => void): void {\n const s = state as any;\n if (s.__beginBatch && s.__endBatch) {\n s.__beginBatch();\n try {\n fn();\n } finally {\n s.__endBatch();\n }\n } else {\n fn();\n }\n}\n\n/**\n * Get a snapshot of the current state\n */\nexport function getStateSnapshot<T>(state: T): T {\n const s = state as any;\n if (s.__getSnapshot) {\n return s.__getSnapshot();\n }\n return deepClone(state);\n}\n",
5
6
  "/**\n * Hypen App Builder API\n * Implements the stateful module system from RFC-0001\n */\n\nimport type { Action } from \"./engine.js\";\n\n// Interface for engine compatibility (works with both engine.js and engine.browser.js)\nexport interface IEngine {\n setModule(name: string, actions: string[], stateKeys: string[], initialState: unknown): void;\n onAction(actionName: string, handler: (action: Action) => void | Promise<void>): void;\n notifyStateChange(paths: string[], changedValues: Record<string, unknown>): void;\n}\n\nimport { createObservableState, type StateChange, getStateSnapshot } from \"./state.js\";\nimport type { HypenRouter } from \"./router.js\";\nimport type { HypenGlobalContext, ModuleReference } from \"./context.js\";\n\nexport type RouterContext = {\n root: HypenRouter;\n current?: HypenRouter;\n parent?: HypenRouter;\n};\n\nexport type ActionContext = {\n name: string;\n payload?: unknown;\n sender?: string;\n};\n\nexport type ActionNext = {\n router: HypenRouter; // Direct access to router instance (from nearest parent)\n};\n\nexport type GlobalContext = {\n getModule: <T = unknown>(id: string) => ModuleReference<T>;\n hasModule: (id: string) => boolean;\n getModuleIds: () => string[];\n getGlobalState: () => Record<string, unknown>;\n emit: (event: string, payload?: unknown) => void;\n on: (event: string, handler: (payload?: unknown) => void) => () => void;\n __router?: unknown; // Internal: router instance for built-in Router component\n};\n\nexport type LifecycleHandler<T> = (\n state: T,\n context?: GlobalContext\n) => void | Promise<void>;\n\n/**\n * Action handler context - all parameters available explicitly\n */\nexport interface ActionHandlerContext<T> {\n action: ActionContext;\n state: T;\n next: ActionNext;\n context: GlobalContext;\n}\n\n/**\n * Action handler - receives all context in a single object\n */\nexport type ActionHandler<T> = (ctx: ActionHandlerContext<T>) => void | Promise<void>;\n\nexport interface HypenModuleDefinition<T = unknown> {\n name?: string;\n actions: string[];\n stateKeys: string[];\n persist?: boolean;\n version?: number;\n initialState: T;\n handlers: {\n onCreated?: LifecycleHandler<T>;\n onAction: Map<string, ActionHandler<T>>;\n onDestroyed?: LifecycleHandler<T>;\n };\n}\n\n/**\n * Alias for HypenModuleDefinition for backward compatibility\n */\nexport type HypenModule<T = unknown> = HypenModuleDefinition<T>;\n\n/**\n * Builder for creating Hypen app modules\n */\nexport class HypenAppBuilder<T> {\n private initialState: T;\n private options: { persist?: boolean; version?: number; name?: string };\n private createdHandler?: LifecycleHandler<T>;\n private actionHandlers: Map<string, ActionHandler<T>> = new Map();\n private destroyedHandler?: LifecycleHandler<T>;\n\n constructor(\n initialState: T,\n options?: { persist?: boolean; version?: number; name?: string }\n ) {\n this.initialState = initialState;\n this.options = options || {};\n }\n\n /**\n * Register a handler for module creation\n */\n onCreated(fn: LifecycleHandler<T>): this {\n this.createdHandler = fn;\n return this;\n }\n\n /**\n * Register a handler for a specific action\n */\n onAction(name: string, fn: ActionHandler<T>): this {\n this.actionHandlers.set(name, fn);\n return this;\n }\n\n /**\n * Register a handler for module destruction\n */\n onDestroyed(fn: LifecycleHandler<T>): this {\n this.destroyedHandler = fn;\n return this;\n }\n\n /**\n * Build the module definition\n */\n build(): HypenModuleDefinition<T> {\n // Safe way to get keys from initialState\n const stateKeys = this.initialState !== null && typeof this.initialState === 'object'\n ? Object.keys(this.initialState)\n : [];\n\n return {\n name: this.options.name,\n actions: Array.from(this.actionHandlers.keys()),\n stateKeys,\n persist: this.options.persist,\n version: this.options.version,\n initialState: this.initialState,\n handlers: {\n onCreated: this.createdHandler,\n onAction: this.actionHandlers,\n onDestroyed: this.destroyedHandler,\n },\n };\n }\n}\n\n/**\n * Hypen App API\n */\nexport class HypenApp {\n /**\n * Define the initial state for a module\n */\n defineState<T>(\n initial: T,\n options?: { persist?: boolean; version?: number; name?: string }\n ): HypenAppBuilder<T> {\n return new HypenAppBuilder(initial, options);\n }\n}\n\n/**\n * The main app instance for creating modules\n */\nexport const app = new HypenApp();\n\n/**\n * Module Instance - manages a running module with typed state\n */\nexport class HypenModuleInstance<T extends object = any> {\n private engine: IEngine;\n private definition: HypenModuleDefinition<T>;\n private state: T;\n private isDestroyed = false;\n private routerContext?: RouterContext;\n private globalContext?: HypenGlobalContext;\n private stateChangeCallbacks: Array<() => void> = [];\n\n constructor(\n engine: IEngine,\n definition: HypenModuleDefinition<T>,\n routerContext?: RouterContext,\n globalContext?: HypenGlobalContext\n ) {\n this.engine = engine;\n this.definition = definition;\n this.routerContext = routerContext;\n this.globalContext = globalContext;\n\n // Create observable state that sends only changed paths and values to engine\n this.state = createObservableState<T>(definition.initialState as T & object, {\n onChange: (change: StateChange) => {\n // Send only the changed paths and their new values (not the whole state)\n this.engine.notifyStateChange(change.paths, change.newValues);\n // Notify all registered callbacks\n this.stateChangeCallbacks.forEach(cb => cb());\n },\n });\n\n // Register with engine (initial state registration)\n this.engine.setModule(\n definition.name || \"AnonymousModule\",\n definition.actions,\n definition.stateKeys,\n getStateSnapshot(this.state)\n );\n\n // Register action handlers with flexible parameter support\n for (const [actionName, handler] of definition.handlers.onAction) {\n console.log(`[ModuleInstance] Registering action handler: ${actionName} for module ${definition.name}`);\n this.engine.onAction(actionName, async (action: Action) => {\n console.log(`[ModuleInstance] Action handler fired: ${actionName}`, action);\n\n const actionCtx: ActionContext = {\n name: action.name,\n payload: action.payload,\n sender: action.sender,\n };\n\n const next: ActionNext = {\n router: this.routerContext?.root || (null as any),\n };\n\n const context: GlobalContext | undefined = this.globalContext\n ? this.createGlobalContextAPI()\n : undefined;\n\n try {\n await handler({\n action: actionCtx,\n state: this.state,\n next,\n context: context!,\n });\n console.log(`[ModuleInstance] Action handler completed: ${actionName}`);\n } catch (error) {\n console.error(`[ModuleInstance] Action handler error for ${actionName}:`, error);\n throw error; // Re-throw to allow callers to handle the error\n }\n });\n }\n\n // Call onCreated\n this.callCreatedHandler();\n }\n\n /**\n * Create the global context API for this module\n */\n private createGlobalContextAPI(): GlobalContext {\n if (!this.globalContext) {\n throw new Error(\"Global context not available\");\n }\n\n const ctx = this.globalContext;\n const api: GlobalContext = {\n getModule: (id: string) => ctx.getModule(id),\n hasModule: (id: string) => ctx.hasModule(id),\n getModuleIds: () => ctx.getModuleIds(),\n getGlobalState: () => ctx.getGlobalState(),\n emit: (event: string, payload?: any) => ctx.emit(event, payload),\n on: (event: string, handler: (payload?: any) => void) =>\n ctx.on(event, handler),\n };\n\n // Expose router and hypen engine for built-in components (if available)\n if ((ctx as any).__router) {\n api.__router = (ctx as any).__router;\n }\n if ((ctx as any).__hypenEngine) {\n (api as any).__hypenEngine = (ctx as any).__hypenEngine;\n }\n\n return api;\n }\n\n /**\n * Call the onCreated handler\n */\n private async callCreatedHandler(): Promise<void> {\n if (this.definition.handlers.onCreated) {\n const context = this.globalContext ? this.createGlobalContextAPI() : undefined;\n await this.definition.handlers.onCreated(this.state, context);\n }\n }\n\n /**\n * Register a callback to be notified when state changes\n */\n onStateChange(callback: () => void): void {\n this.stateChangeCallbacks.push(callback);\n }\n\n /**\n * Destroy the module instance\n */\n async destroy(): Promise<void> {\n if (this.isDestroyed) return;\n\n if (this.definition.handlers.onDestroyed) {\n await this.definition.handlers.onDestroyed(this.state);\n }\n\n this.isDestroyed = true;\n }\n\n /**\n * Get the current state (returns a snapshot)\n */\n getState(): T {\n return getStateSnapshot(this.state);\n }\n\n /**\n * Get the live observable state\n */\n getLiveState(): T {\n return this.state;\n }\n\n /**\n * Update state directly (merges with existing state)\n */\n updateState(patch: Partial<T>): void {\n Object.assign(this.state, patch);\n }\n}\n"
6
7
  ],
7
- "mappings": "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",
8
- "debugId": "CC570FF56ABF0FB064756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "488AB4A54C58D25D64756E2164756E21",
9
10
  "names": []
10
11
  }