@blac/core 2.0.0-rc.4 → 2.0.0-rc.6

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/index.cjs CHANGED
@@ -82,6 +82,7 @@ function __resetIdCounters() {
82
82
  var StateContainerRegistry = class {
83
83
  instances = /* @__PURE__ */ new Map();
84
84
  types = /* @__PURE__ */ new Map();
85
+ listeners = /* @__PURE__ */ new Map();
85
86
  /**
86
87
  * Register a type with isolation mode
87
88
  */
@@ -196,6 +197,32 @@ var StateContainerRegistry = class {
196
197
  const instanceKey = `${constructor.name}:${key || "default"}`;
197
198
  return this.instances.has(instanceKey);
198
199
  }
200
+ /**
201
+ * Subscribe to lifecycle events
202
+ * @param event - The lifecycle event to listen for
203
+ * @param listener - The listener function to call when the event occurs
204
+ * @returns Unsubscribe function
205
+ */
206
+ on(event, listener) {
207
+ if (!this.listeners.has(event)) this.listeners.set(event, /* @__PURE__ */ new Set());
208
+ this.listeners.get(event).add(listener);
209
+ return () => {
210
+ this.listeners.get(event)?.delete(listener);
211
+ };
212
+ }
213
+ /**
214
+ * Emit lifecycle event to all listeners
215
+ * @internal - Called by StateContainer/Vertex lifecycle methods
216
+ */
217
+ emit(event, ...args) {
218
+ const listeners = this.listeners.get(event);
219
+ if (!listeners || listeners.size === 0) return;
220
+ for (const listener of listeners) try {
221
+ listener(...args);
222
+ } catch (error$1) {
223
+ console.error(`[BlaC] Listener error for '${event}':`, error$1);
224
+ }
225
+ }
199
226
  };
200
227
  /**
201
228
  * Global default registry instance
@@ -291,6 +318,7 @@ var StateContainer = class StateContainer {
291
318
  this.name = config.name || this.constructor.name;
292
319
  this.debug = config.debug ?? false;
293
320
  this.instanceId = config.instanceId || generateSimpleId(this.constructor.name);
321
+ StateContainer._registry.emit("created", this);
294
322
  }
295
323
  /**
296
324
  * Get the current state
@@ -322,6 +350,7 @@ var StateContainer = class StateContainer {
322
350
  this._disposed = true;
323
351
  this.onDispose?.();
324
352
  this.listeners.clear();
353
+ StateContainer._registry.emit("disposed", this);
325
354
  if (this.debug) console.log(`[${this.name}] Disposed successfully`);
326
355
  }
327
356
  /**
@@ -338,6 +367,7 @@ var StateContainer = class StateContainer {
338
367
  } catch (error$1) {
339
368
  console.error(`[${this.name}] Error in listener:`, error$1);
340
369
  }
370
+ StateContainer._registry.emit("stateChanged", this, previousState, newState);
341
371
  }
342
372
  /**
343
373
  * Update state using a function
@@ -512,6 +542,7 @@ var Vertex = class extends StateContainer {
512
542
  * Arrow function to maintain correct 'this' binding in React
513
543
  */
514
544
  add = (event) => {
545
+ StateContainer._registry.emit("eventAdded", this, event);
515
546
  this.processEvent(event);
516
547
  };
517
548
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["results: T[]","toDelete: string[]","typeBreakdown: Record<string, number>","error","error","amount: number","email: string","password: string","fullPath: string","segments: string[]","info","entry: LogEntry","currentConfig: LogConfig","isProxyable","fullPath: string"],"sources":["../src/utils/idGenerator.ts","../src/core/StateContainerRegistry.ts","../src/core/StateContainer.ts","../src/core/Cubit.ts","../src/core/Vertex.ts","../src/tracking/proxy-tracker.ts","../src/tracking/path-utils.ts","../src/tracking/dependency-tracker.ts","../src/logging/Logger.ts","../src/proxy/ProxyTracker.ts","../src/constants.ts"],"sourcesContent":["/**\n * Centralized ID Generation\n *\n * Provides consistent, collision-resistant ID generation for all BlaC subsystems.\n * Uses timestamp + counter + random suffix for uniqueness.\n */\n\n// Global counter map for ID generation\nconst globalCounters = new Map<string, number>();\n\n/**\n * Creates an ID generator with isolated counter state\n *\n * @param prefix - Prefix for generated IDs\n * @returns Object with next(), nextSimple(), and reset() methods\n *\n * @example\n * ```ts\n * const generator = createIdGenerator('sub');\n * const id1 = generator.next(); // \"sub_1698765432100_1_a3k9d7f2q\"\n * const id2 = generator.next(); // \"sub_1698765432101_2_b4n8e9g3r\"\n * ```\n */\nexport function createIdGenerator(prefix: string) {\n let counter = 0;\n return {\n next: () =>\n `${prefix}_${Date.now()}_${++counter}_${Math.random().toString(36).substring(2, 11)}`,\n nextSimple: () => `${prefix}_${++counter}`,\n reset: () => {\n counter = 0;\n },\n };\n}\n\n/**\n * Generate ID with timestamp, counter, and random suffix (tree-shakeable)\n *\n * Format: `${prefix}_${timestamp}_${counter}_${random}`\n *\n * @param prefix - Prefix for the ID (e.g., 'sub', 'consumer', 'stage')\n * @returns Branded ID string\n *\n * @example\n * ```ts\n * const id = generateId('sub');\n * // Returns: \"sub_1698765432100_1_a3k9d7f2q\"\n * ```\n */\nexport function generateId(prefix: string): string {\n const counter = (globalCounters.get(prefix) ?? 0) + 1;\n globalCounters.set(prefix, counter);\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 11);\n return `${prefix}_${timestamp}_${counter}_${random}`;\n}\n\n/**\n * Generate simple ID with timestamp and random (no counter tracking)\n *\n * Format: `${prefix}_${timestamp}_${random}`\n *\n * @param prefix - Prefix for the ID\n * @returns Branded ID string\n *\n * @example\n * ```ts\n * const id = generateSimpleId('CounterBloc');\n * // Returns: \"CounterBloc_1698765432100_a3k9d7f2q\"\n * ```\n */\nexport function generateSimpleId(prefix: string): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 11);\n return `${prefix}_${timestamp}_${random}`;\n}\n\n/**\n * Reset all counters for testing purposes\n * @internal\n */\nexport function __resetIdCounters(): void {\n globalCounters.clear();\n}\n","/**\n * StateContainerRegistry - Clean, minimal registry for StateContainer instances\n *\n * Responsibilities:\n * - Instance lifecycle management with ref counting\n * - Singleton/shared instance pattern\n * - Isolated instance support\n */\n\nimport type { StateContainer } from './StateContainer';\n\ninterface InstanceEntry {\n instance: StateContainer<any>;\n refCount: number;\n}\n\ninterface TypeConfig {\n isolated: boolean;\n}\n\n/**\n * Registry for managing StateContainer instances\n */\nexport class StateContainerRegistry {\n private readonly instances = new Map<string, InstanceEntry>();\n private readonly types = new Map<string, TypeConfig>();\n\n /**\n * Register a type with isolation mode\n */\n register<T extends StateContainer<any>>(\n constructor: new (...args: any[]) => T,\n isolated = false,\n ): void {\n const className = constructor.name;\n\n // Check for static isolated property\n if (!isolated && (constructor as any).isolated === true) {\n isolated = true;\n }\n\n if (this.types.has(className)) {\n throw new Error(`Type \"${className}\" is already registered`);\n }\n\n this.types.set(className, { isolated });\n }\n\n /**\n * Get or create a StateContainer instance\n * For isolated: always creates new\n * For shared: singleton per key\n */\n getOrCreate<T extends StateContainer<any>>(\n constructor: new (...args: any[]) => T,\n key?: string,\n ...args: any[]\n ): T {\n const className = constructor.name;\n let config = this.types.get(className);\n\n // Auto-register if not registered\n if (!config) {\n const isolated = (constructor as any).isolated === true;\n this.types.set(className, { isolated });\n config = this.types.get(className)!;\n }\n\n // Isolated: always create new instance\n if (config.isolated) {\n return new constructor(...args);\n }\n\n // Shared: singleton pattern\n const instanceKey = `${className}:${key || 'default'}`;\n const existing = this.instances.get(instanceKey);\n\n if (existing) {\n existing.refCount++;\n return existing.instance as T;\n }\n\n // Create new shared instance\n const instance = new constructor(...args);\n this.instances.set(instanceKey, { instance, refCount: 1 });\n\n return instance;\n }\n\n /**\n * Release a reference to an instance\n * Disposes when ref count reaches zero (unless static keepAlive is true)\n */\n release<T extends StateContainer<any>>(\n constructor: new (...args: any[]) => T,\n key?: string,\n forceDispose = false,\n ): void {\n const className = constructor.name;\n const instanceKey = `${className}:${key || 'default'}`;\n const entry = this.instances.get(instanceKey);\n\n if (!entry) return;\n\n if (forceDispose) {\n entry.instance.dispose();\n this.instances.delete(instanceKey);\n return;\n }\n\n entry.refCount--;\n\n // Check static keepAlive property\n const keepAlive = (constructor as any).keepAlive === true;\n if (entry.refCount <= 0 && !keepAlive) {\n entry.instance.dispose();\n this.instances.delete(instanceKey);\n }\n }\n\n /**\n * Get all instances of a type (shared only, isolated aren't tracked)\n */\n getAll<T extends StateContainer<any>>(\n constructor: new (...args: any[]) => T,\n ): T[] {\n const className = constructor.name;\n const prefix = `${className}:`;\n const results: T[] = [];\n\n for (const [key, entry] of this.instances) {\n if (key.startsWith(prefix)) {\n results.push(entry.instance as T);\n }\n }\n\n return results;\n }\n\n /**\n * Clear all instances of a type\n */\n clear<T extends StateContainer<any>>(\n constructor: new (...args: any[]) => T,\n ): void {\n const className = constructor.name;\n const prefix = `${className}:`;\n const toDelete: string[] = [];\n\n for (const [key, entry] of this.instances) {\n if (key.startsWith(prefix)) {\n if (!entry.instance.isDisposed) {\n entry.instance.dispose();\n }\n toDelete.push(key);\n }\n }\n\n for (const key of toDelete) {\n this.instances.delete(key);\n }\n }\n\n /**\n * Clear all instances from all types (for testing)\n */\n clearAll(): void {\n for (const entry of this.instances.values()) {\n if (!entry.instance.isDisposed) {\n entry.instance.dispose();\n }\n }\n this.instances.clear();\n this.types.clear();\n }\n\n /**\n * Get registry statistics (for debugging)\n */\n getStats(): {\n registeredTypes: number;\n totalInstances: number;\n typeBreakdown: Record<string, number>;\n } {\n const typeBreakdown: Record<string, number> = {};\n\n for (const key of this.instances.keys()) {\n const typeName = key.split(':')[0];\n typeBreakdown[typeName] = (typeBreakdown[typeName] || 0) + 1;\n }\n\n return {\n registeredTypes: this.types.size,\n totalInstances: this.instances.size,\n typeBreakdown,\n };\n }\n\n /**\n * Get reference count for an instance\n */\n getRefCount<T extends StateContainer<any>>(\n constructor: new (...args: any[]) => T,\n key?: string,\n ): number {\n const className = constructor.name;\n const instanceKey = `${className}:${key || 'default'}`;\n const entry = this.instances.get(instanceKey);\n return entry?.refCount ?? 0;\n }\n\n /**\n * Check if an instance exists\n */\n hasInstance<T extends StateContainer<any>>(\n constructor: new (...args: any[]) => T,\n key?: string,\n ): boolean {\n const className = constructor.name;\n const instanceKey = `${className}:${key || 'default'}`;\n return this.instances.has(instanceKey);\n }\n}\n\n/**\n * Global default registry instance\n */\nexport const globalRegistry = new StateContainerRegistry();\n","/**\n * StateContainer - Clean, minimal state management container\n *\n * Responsibilities:\n * - State storage and updates\n * - Change notifications to subscribers\n * - Lifecycle management\n */\n\nimport { generateSimpleId } from '../utils/idGenerator';\nimport {\n StateContainerRegistry,\n globalRegistry,\n} from './StateContainerRegistry';\n\n/**\n * Configuration options for StateContainer\n */\nexport interface StateContainerConfig {\n /** Container name for debugging */\n name?: string;\n /** Enable debug logging */\n debug?: boolean;\n /** Custom instance identifier */\n instanceId?: string;\n}\n\n/**\n * Listener function for state changes\n */\ntype StateListener<S> = (state: S) => void;\n\n/**\n * Base abstract class for all state containers\n */\nexport abstract class StateContainer<S> {\n private static _registry = globalRegistry;\n\n /**\n * Set a custom registry (mainly for testing)\n */\n static setRegistry(registry: StateContainerRegistry): void {\n StateContainer._registry = registry;\n }\n\n /**\n * Register a type as isolated or shared\n */\n static register<T extends StateContainer<any>>(\n this: new (...args: any[]) => T,\n isolated = false,\n ): void {\n StateContainer._registry.register(this, isolated);\n }\n\n /**\n * Get or create an instance\n * @param key - Optional instance key for shared instances\n * @param args - Constructor arguments\n */\n static getOrCreate<T extends StateContainer<any>>(\n this: new (...args: any[]) => T,\n key?: string,\n ...args: any[]\n ): T {\n return StateContainer._registry.getOrCreate(this, key, ...args);\n }\n\n /**\n * Release a reference to an instance\n * @param key - Optional instance key\n * @param forceDispose - Force dispose regardless of ref count or keepAlive\n */\n static release<T extends StateContainer<any>>(\n this: new (...args: any[]) => T,\n key?: string,\n forceDispose = false,\n ): void {\n StateContainer._registry.release(this, key, forceDispose);\n }\n\n /**\n * Get all instances of this type\n */\n static getAll<T extends StateContainer<any>>(\n this: new (...args: any[]) => T,\n ): T[] {\n return StateContainer._registry.getAll(this);\n }\n\n /**\n * Clear all instances of this type\n */\n static clear<T extends StateContainer<any>>(\n this: new (...args: any[]) => T,\n ): void {\n StateContainer._registry.clear(this);\n }\n\n /**\n * Clear all instances from all types (for testing)\n */\n static clearAllInstances(): void {\n StateContainer._registry.clearAll();\n }\n\n /**\n * Get registry statistics (for debugging)\n */\n static getStats(): {\n registeredTypes: number;\n totalInstances: number;\n typeBreakdown: Record<string, number>;\n } {\n return StateContainer._registry.getStats();\n }\n\n /**\n * Get reference count for an instance\n * @param key - Optional instance key\n */\n static getRefCount<T extends StateContainer<any>>(\n this: new (...args: any[]) => T,\n key?: string,\n ): number {\n return StateContainer._registry.getRefCount(this, key);\n }\n\n /**\n * Check if an instance exists\n * @param key - Optional instance key\n */\n static hasInstance<T extends StateContainer<any>>(\n this: new (...args: any[]) => T,\n key?: string,\n ): boolean {\n return StateContainer._registry.hasInstance(this, key);\n }\n\n private _state: S;\n private readonly listeners = new Set<StateListener<S>>();\n private _disposed = false;\n private readonly config: StateContainerConfig;\n\n readonly name: string;\n readonly debug: boolean;\n readonly instanceId: string;\n\n /**\n * Create a new StateContainer\n */\n constructor(initialState: S, config: StateContainerConfig = {}) {\n this._state = initialState;\n this.config = config;\n this.name = config.name || this.constructor.name;\n this.debug = config.debug ?? false;\n this.instanceId =\n config.instanceId || generateSimpleId(this.constructor.name);\n }\n\n /**\n * Get the current state\n */\n get state(): S {\n return this._state;\n }\n\n /**\n * Check if disposed\n */\n get isDisposed(): boolean {\n return this._disposed;\n }\n\n /**\n * Subscribe to state changes\n * @returns Unsubscribe function\n */\n subscribe(listener: StateListener<S>): () => void {\n if (this._disposed) {\n throw new Error(`Cannot subscribe to disposed container ${this.name}`);\n }\n\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Dispose the container\n */\n dispose(): void {\n if (this._disposed) return;\n\n if (this.debug) {\n console.log(`[${this.name}] Disposing...`);\n }\n\n this._disposed = true;\n\n // Call optional lifecycle hook\n this.onDispose?.();\n\n this.listeners.clear();\n\n if (this.debug) {\n console.log(`[${this.name}] Disposed successfully`);\n }\n }\n\n /**\n * Emit a new state (with change detection)\n */\n protected emit(newState: S): void {\n if (this._disposed) {\n throw new Error(`Cannot emit state from disposed container ${this.name}`);\n }\n\n // Skip if state hasn't changed (reference equality)\n if (this._state === newState) return;\n\n const previousState = this._state;\n this._state = newState;\n\n // Call optional lifecycle hook\n this.onStateChange?.(newState, previousState);\n\n // Notify listeners\n for (const listener of this.listeners) {\n try {\n listener(newState);\n } catch (error) {\n console.error(`[${this.name}] Error in listener:`, error);\n }\n }\n }\n\n /**\n * Update state using a function\n */\n protected update(updater: (current: S) => S): void {\n if (this._disposed) {\n throw new Error(\n `Cannot update state from disposed container ${this.name}`,\n );\n }\n this.emit(updater(this._state));\n }\n\n /**\n * Optional disposal hook for subclasses\n */\n protected onDispose?(): void;\n\n /**\n * Optional state change hook for subclasses\n */\n protected onStateChange?(newState: S, previousState: S): void;\n}\n","/**\n * Cubit - Simple state container with direct state emission\n *\n * This validates that our StateContainer design can support\n * the simple Cubit pattern from the original BlaC.\n */\n\nimport { StateContainer, StateContainerConfig } from './StateContainer';\n\n/**\n * Cubit is a simple state container that allows direct state emission\n *\n * Unlike StateContainer (where emit is protected), Cubit exposes emit and update\n * as public methods to allow direct state management.\n */\nexport abstract class Cubit<S> extends StateContainer<S> {\n /**\n * Create a new Cubit\n * @param initialState Initial state value\n * @param config Configuration options\n */\n constructor(initialState: S, config?: StateContainerConfig) {\n super(initialState, config);\n }\n\n /**\n * Emit a new state (public override of protected parent method)\n */\n public emit(newState: S): void {\n super['emit'](newState);\n }\n\n /**\n * Update state using a function (public override of protected parent method)\n */\n public update(updater: (current: S) => S): void {\n super['update'](updater);\n }\n\n /**\n * Patch state with partial updates (shallow merge)\n * Only available when state is an object type\n * Arrow function to maintain correct 'this' binding in React\n *\n * @example\n * ```typescript\n * // Update single field\n * this.patch({ count: 5 });\n *\n * // Update multiple fields\n * this.patch({ count: 5, name: 'Updated' });\n * ```\n */\n public patch = ((partial: S extends object ? Partial<S> : never): void => {\n if (typeof this.state !== 'object' || this.state === null) {\n throw new Error('patch() is only available for object state types');\n }\n this.update((current) => ({ ...current, ...partial }) as S);\n }) as S extends object ? (partial: Partial<S>) => void : never;\n}\n\n/**\n * Example: Counter Cubit\n */\nexport class CounterCubit extends Cubit<number> {\n constructor() {\n super(0, { name: 'CounterCubit' });\n }\n\n increment = (): void => {\n this.emit(this.state + 1);\n };\n\n decrement = (): void => {\n this.emit(this.state - 1);\n };\n\n reset = (): void => {\n this.emit(0);\n };\n\n addAmount = (amount: number): void => {\n this.emit(this.state + amount);\n };\n}\n\n/**\n * Example: Complex State Cubit\n */\nexport interface TodoState {\n todos: Array<{ id: string; text: string; done: boolean }>;\n filter: 'all' | 'active' | 'completed';\n isLoading: boolean;\n}\n\nexport class TodoCubit extends Cubit<TodoState> {\n static keepAlive = true;\n private nextId = 0;\n\n constructor() {\n super(\n {\n todos: [],\n filter: 'all',\n isLoading: false,\n },\n { name: 'TodoCubit' },\n );\n }\n\n addTodo = (text: string): void => {\n this.update((state) => ({\n ...state,\n todos: [\n ...state.todos,\n { id: `todo-${Date.now()}-${this.nextId++}`, text, done: false },\n ],\n }));\n };\n\n toggleTodo = (id: string): void => {\n this.update((state) => ({\n ...state,\n todos: state.todos.map((todo) =>\n todo.id === id ? { ...todo, done: !todo.done } : todo,\n ),\n }));\n };\n\n removeTodo = (id: string): void => {\n this.update((state) => ({\n ...state,\n todos: state.todos.filter((todo) => todo.id !== id),\n }));\n };\n\n setFilter = (filter: TodoState['filter']): void => {\n this.patch({ filter }); // Using patch() for simple field update\n };\n\n setLoading = (isLoading: boolean): void => {\n this.patch({ isLoading }); // Using patch() for simple field update\n };\n\n get visibleTodos() {\n const todos = this.state.todos;\n const filter = this.state.filter;\n\n switch (filter) {\n case 'active':\n return todos.filter((t) => !t.done);\n case 'completed':\n return todos.filter((t) => t.done);\n case 'all':\n default:\n return todos;\n }\n }\n\n get activeTodoCount() {\n return this.state.todos.filter((t) => !t.done).length;\n }\n}\n","/**\n * Vertex - Event-driven state container (Bloc pattern)\n *\n * Simplified version that includes its own event handling,\n * since events are only needed for the Vertex pattern.\n */\n\nimport { StateContainer, StateContainerConfig } from './StateContainer';\nimport { BaseEvent } from '../types/events';\n\n/**\n * Event handler signature (synchronous only)\n */\nexport type EventHandler<E extends BaseEvent, S> = (\n event: E,\n emit: (state: S) => void,\n) => void;\n\n/**\n * Type-safe event constructor\n */\nexport type EventConstructor<T extends BaseEvent = BaseEvent> = new (\n ...args: never[]\n) => T;\n\n/**\n * Event handler registration\n */\ninterface EventHandlerRegistration<E extends BaseEvent, S> {\n eventClass: EventConstructor<E>;\n handler: EventHandler<E, S>;\n}\n\n/**\n * Vertex is an event-driven state container (Bloc pattern)\n *\n * Includes its own simple event system since events are only needed\n * for the Vertex pattern, not for the base StateContainer.\n */\nexport abstract class Vertex<\n S,\n E extends BaseEvent = BaseEvent,\n> extends StateContainer<S> {\n private eventHandlers = new Map<string, EventHandlerRegistration<E, S>[]>();\n private isProcessing = false;\n private eventQueue: E[] = [];\n\n /**\n * Create a new Vertex\n * @param initialState Initial state value\n * @param config Configuration options\n */\n constructor(initialState: S, config?: StateContainerConfig) {\n super(initialState, config);\n }\n\n /**\n * Register an event handler\n * Arrow function to maintain correct 'this' binding\n */\n protected on = <T extends E>(\n EventClass: EventConstructor<T>,\n handler: EventHandler<T, S>,\n ): void => {\n const className = EventClass.name;\n const registrations = this.eventHandlers.get(className) || [];\n registrations.push({\n eventClass: EventClass as EventConstructor<E>,\n handler: handler as EventHandler<E, S>,\n });\n this.eventHandlers.set(className, registrations);\n };\n\n /**\n * Add an event to be processed\n * Arrow function to maintain correct 'this' binding in React\n */\n public add = (event: E): void => {\n this.processEvent(event);\n };\n\n /**\n * Process an event (synchronously)\n */\n private processEvent(event: E): void {\n // Queue event if already processing\n if (this.isProcessing) {\n this.eventQueue.push(event);\n return;\n }\n\n this.isProcessing = true;\n\n try {\n this.handleEvent(event);\n\n // Process queued events\n while (this.eventQueue.length > 0) {\n const nextEvent = this.eventQueue.shift()!;\n this.handleEvent(nextEvent);\n }\n } finally {\n this.isProcessing = false;\n }\n }\n\n /**\n * Handle a single event (synchronously)\n */\n private handleEvent(event: E): void {\n const className = event.constructor.name;\n const registrations = this.eventHandlers.get(className);\n\n if (!registrations || registrations.length === 0) {\n if (this.debug) {\n console.warn(`No handler registered for event: ${className}`);\n }\n return;\n }\n\n // Create emit function that captures current context\n const emitFn = (state: S) => {\n this.emit(state);\n };\n\n // Execute all handlers for this event type (synchronously)\n for (const registration of registrations) {\n try {\n registration.handler(event, emitFn);\n } catch (error) {\n if (this.debug) {\n console.error(`Error handling event ${className}:`, error);\n }\n // Optionally emit error state\n this.onEventError(event, error as Error);\n }\n }\n }\n\n /**\n * Hook for handling event processing errors\n */\n protected onEventError(event: E, error: Error): void {\n // Override in subclass to handle errors\n }\n}\n\n/**\n * Example: Counter Events\n */\nexport class IncrementEvent implements BaseEvent {\n readonly type = 'increment';\n readonly timestamp = Date.now();\n\n constructor(public readonly amount: number = 1) {}\n}\n\nexport class DecrementEvent implements BaseEvent {\n readonly type = 'decrement';\n readonly timestamp = Date.now();\n\n constructor(public readonly amount: number = 1) {}\n}\n\nexport class ResetEvent implements BaseEvent {\n readonly type = 'reset';\n readonly timestamp = Date.now();\n}\n\n/**\n * Example: Counter Vertex\n * Demonstrates proper typing and event handling\n */\nexport class CounterVertex extends Vertex<number> {\n constructor() {\n super(0);\n\n this.on(IncrementEvent, (event, emit) => {\n emit(this.state + event.amount);\n });\n\n this.on(DecrementEvent, (event, emit) => {\n emit(this.state - event.amount);\n });\n\n this.on(ResetEvent, (_, emit) => {\n emit(0);\n });\n }\n\n // Arrow functions for React compatibility\n increment = (amount = 1) => {\n this.add(new IncrementEvent(amount));\n };\n\n decrement = (amount = 1) => {\n this.add(new DecrementEvent(amount));\n };\n\n reset = () => {\n this.add(new ResetEvent());\n };\n}\n\n/**\n * Auth State and Events for testing async handlers\n */\nexport interface AuthState {\n isAuthenticated: boolean;\n isLoading: boolean;\n user: { id: string; name: string; email: string } | null;\n error: string | null;\n}\n\nexport class LoginEvent implements BaseEvent {\n readonly type = 'login';\n readonly timestamp = Date.now();\n constructor(\n public readonly email: string,\n public readonly password: string,\n ) {}\n}\n\nexport class LogoutEvent implements BaseEvent {\n readonly type = 'logout';\n readonly timestamp = Date.now();\n}\n\nexport class AuthVertex extends Vertex<AuthState> {\n constructor() {\n super({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n\n // Synchronous login handler (async operations should be done before calling this)\n this.on(LoginEvent, (event, emit) => {\n // Set loading\n emit({ ...this.state, isLoading: true, error: null });\n\n // Simulate sync auth (in real app, async work would be done before dispatching event)\n // Check credentials\n if (event.email === 'user@example.com' && event.password === 'password') {\n emit({\n isAuthenticated: true,\n isLoading: false,\n user: { id: '123', name: 'Test User', email: 'user@example.com' },\n error: null,\n });\n } else {\n emit({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: 'Invalid credentials',\n });\n }\n });\n\n this.on(LogoutEvent, (_, emit) => {\n emit({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n });\n }\n\n login = (email: string, password: string) => {\n this.add(new LoginEvent(email, password));\n };\n\n logout = () => {\n this.add(new LogoutEvent());\n };\n}\n","/**\n * Functional proxy tracker for automatic dependency tracking\n *\n * This module provides a functional approach to proxy-based dependency tracking.\n * Unlike the class-based ProxyTracker, this uses a state object pattern that's\n * easier to integrate with functional programming patterns and framework hooks.\n */\n\n/**\n * Array methods that should trigger tracking of the entire array\n */\nconst ARRAY_METHODS = new Set([\n 'map',\n 'filter',\n 'forEach',\n 'find',\n 'some',\n 'every',\n 'reduce',\n]);\n\n/**\n * Check if a value can be proxied\n *\n * Returns true for plain objects and arrays only.\n * Excludes built-in objects like Date, Map, Set, etc.\n */\nexport function isProxyable(value: unknown): value is object {\n if (typeof value !== 'object' || value === null) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === Array.prototype;\n}\n\n/**\n * State container for proxy tracking\n */\nexport interface ProxyTrackerState<T> {\n /** Set of all tracked property paths */\n trackedPaths: Set<string>;\n /** Whether tracking is currently active */\n isTracking: boolean;\n /** Cache of created proxies to avoid duplicates */\n proxyCache: WeakMap<object, any>;\n /** Cache of bound functions to maintain referential equality */\n boundFunctionsCache: WeakMap<Function, Function> | null;\n /** Last state object that was proxied (for cache invalidation) */\n lastProxiedState: T | null;\n /** Last proxy created (for cache reuse) */\n lastProxy: T | null;\n /** Maximum depth for nested proxy creation */\n maxDepth: number;\n}\n\n/**\n * Create a new proxy tracker state\n *\n * @example\n * const state = createProxyTrackerState<MyState>();\n * startProxyTracking(state);\n * const proxy = createProxyForTarget(state, myObject);\n * // ... use proxy ...\n * const paths = stopProxyTracking(state);\n */\nexport function createProxyTrackerState<T>(): ProxyTrackerState<T> {\n return {\n trackedPaths: new Set<string>(),\n isTracking: false,\n proxyCache: new WeakMap<object, any>(),\n boundFunctionsCache: null,\n lastProxiedState: null,\n lastProxy: null,\n maxDepth: 10,\n };\n}\n\n/**\n * Start tracking property accesses\n *\n * Clears previous tracked paths and enables tracking mode.\n */\nexport function startProxyTracking<T>(state: ProxyTrackerState<T>): void {\n state.isTracking = true;\n state.trackedPaths.clear();\n}\n\n/**\n * Stop tracking and return the tracked paths\n *\n * Returns a new Set containing all tracked paths.\n */\nexport function stopProxyTracking<T>(state: ProxyTrackerState<T>): Set<string> {\n state.isTracking = false;\n return new Set(state.trackedPaths);\n}\n\n/**\n * Create a proxy for an array with property access tracking\n *\n * Tracks:\n * - Array element access (arr[0])\n * - Length access (arr.length)\n * - Array method calls (arr.map, arr.filter, etc.)\n */\nexport function createArrayProxy<T, U>(\n state: ProxyTrackerState<T>,\n target: U[],\n path: string,\n depth: number = 0,\n): U[] {\n const proxy = new Proxy(target, {\n get: (arr, prop: string | symbol) => {\n if (typeof prop === 'symbol') {\n return Reflect.get(arr, prop);\n }\n\n const value = Reflect.get(arr, prop);\n\n if (typeof value === 'function') {\n if (ARRAY_METHODS.has(prop)) {\n if (state.isTracking && path) {\n state.trackedPaths.add(path);\n }\n }\n\n if (!state.boundFunctionsCache) {\n state.boundFunctionsCache = new WeakMap<Function, Function>();\n }\n const cached = state.boundFunctionsCache.get(value);\n if (cached) {\n return cached;\n }\n const bound = value.bind(arr);\n state.boundFunctionsCache.set(value, bound);\n return bound;\n }\n\n let fullPath: string;\n if (prop === 'length') {\n fullPath = path ? `${path}.length` : 'length';\n } else if (typeof prop === 'string') {\n const index = Number(prop);\n if (!isNaN(index) && index >= 0) {\n fullPath = path ? `${path}[${index}]` : `[${index}]`;\n } else {\n fullPath = path ? `${path}.${prop}` : prop;\n }\n } else {\n return value;\n }\n\n if (isProxyable(value)) {\n return createProxyInternal(state, value as T, fullPath, depth + 1);\n }\n\n if (state.isTracking) {\n state.trackedPaths.add(fullPath);\n }\n\n return value;\n },\n });\n\n state.proxyCache.set(target, proxy);\n return proxy;\n}\n\n/**\n * Create a proxy for an object with property access tracking\n *\n * This is the core proxy creation function that recursively creates proxies\n * for nested objects and arrays.\n *\n * Tracks:\n * - Property access (obj.prop)\n * - Nested property access (obj.nested.prop)\n * - 'in' operator usage ('prop' in obj)\n * - Object.keys, Object.entries, etc.\n */\nexport function createProxyInternal<T>(\n state: ProxyTrackerState<T>,\n target: T,\n path: string = '',\n depth: number = 0,\n): T {\n if (!state.isTracking || !isProxyable(target)) {\n return target;\n }\n\n if (depth >= state.maxDepth) {\n return target;\n }\n\n if (state.proxyCache.has(target)) {\n return state.proxyCache.get(target);\n }\n\n if (Array.isArray(target)) {\n return createArrayProxy(\n state,\n target as unknown as any[],\n path,\n depth,\n ) as unknown as T;\n }\n\n const proxy = new Proxy(target, {\n get: (obj, prop: string | symbol) => {\n if (typeof prop === 'symbol') {\n return Reflect.get(obj, prop);\n }\n\n const value = Reflect.get(obj, prop);\n\n if (typeof value === 'function') {\n if (!state.boundFunctionsCache) {\n state.boundFunctionsCache = new WeakMap<Function, Function>();\n }\n const cached = state.boundFunctionsCache.get(value);\n if (cached) {\n return cached;\n }\n const bound = value.bind(obj);\n state.boundFunctionsCache.set(value, bound);\n return bound;\n }\n\n const fullPath = path ? `${path}.${String(prop)}` : String(prop);\n\n if (isProxyable(value)) {\n const proxiedValue = createProxyInternal(\n state,\n value as T,\n fullPath,\n depth + 1,\n );\n return proxiedValue;\n }\n\n if (typeof prop === 'string' && state.isTracking) {\n if (!prop.startsWith('_') && !prop.startsWith('$$')) {\n state.trackedPaths.add(fullPath);\n }\n }\n\n return value;\n },\n\n has: (obj, prop: string | symbol) => {\n if (typeof prop === 'string' && state.isTracking) {\n const fullPath = path ? `${path}.${prop}` : prop;\n state.trackedPaths.add(fullPath);\n }\n return Reflect.has(obj, prop);\n },\n\n ownKeys: (obj) => {\n if (state.isTracking && path) {\n state.trackedPaths.add(path);\n }\n return Reflect.ownKeys(obj);\n },\n });\n\n state.proxyCache.set(target, proxy);\n return proxy as T;\n}\n\n/**\n * Create a proxy for a target with caching\n *\n * If the target hasn't changed since the last call, returns the cached proxy.\n * Otherwise, creates a new proxy and caches it.\n *\n * This is the main entry point for creating tracked proxies.\n */\nexport function createProxyForTarget<T>(\n state: ProxyTrackerState<T>,\n target: T,\n): T {\n if (state.lastProxiedState === target && state.lastProxy) {\n return state.lastProxy;\n }\n\n // Clear caches when state changes to prevent stale bound functions\n // This is critical for array methods like .map() which get bound to the target\n state.proxyCache = new WeakMap<object, any>();\n state.boundFunctionsCache = null;\n\n const proxy = createProxyInternal(state, target, '', 0);\n state.lastProxiedState = target;\n state.lastProxy = proxy;\n return proxy;\n}\n","/**\n * Path utilities for dependency tracking\n *\n * Provides utilities for parsing property paths and extracting values\n * from nested objects using path strings.\n */\n\n/**\n * Parse a property path string into an array of segments\n *\n * Handles both dot notation (a.b.c) and bracket notation (a[0].b)\n *\n * @example\n * parsePath('user.name') // ['user', 'name']\n * parsePath('items[0].name') // ['items', '0', 'name']\n * parsePath('data.users[2].address.city') // ['data', 'users', '2', 'address', 'city']\n */\nexport function parsePath(path: string): string[] {\n const segments: string[] = [];\n let current = '';\n let i = 0;\n\n while (i < path.length) {\n const char = path[i];\n if (char === '.') {\n if (current) segments.push(current);\n current = '';\n } else if (char === '[') {\n if (current) segments.push(current);\n current = '';\n // Skip bracket\n i++;\n // Read until ]\n while (i < path.length && path[i] !== ']') {\n current += path[i++];\n }\n if (current) segments.push(current);\n current = '';\n } else {\n current += char;\n }\n i++;\n }\n\n if (current) segments.push(current);\n return segments;\n}\n\n/**\n * Get a value from an object using a path of segments\n *\n * @example\n * const obj = { user: { name: 'Alice', age: 30 } }\n * getValueAtPath(obj, ['user', 'name']) // 'Alice'\n * getValueAtPath(obj, ['user', 'age']) // 30\n * getValueAtPath(obj, ['user', 'missing']) // undefined\n */\nexport function getValueAtPath(obj: any, segments: string[]): any {\n if (obj == null) return undefined;\n\n let current = obj;\n for (let i = 0; i < segments.length; i++) {\n current = current[segments[i]];\n if (current == null) return undefined;\n }\n return current;\n}\n\n/**\n * Shallow equality comparison for arrays\n *\n * Compares two arrays element-by-element using Object.is\n *\n * @example\n * shallowEqual([1, 2, 3], [1, 2, 3]) // true\n * shallowEqual([1, 2, 3], [1, 2, 4]) // false\n * shallowEqual([1, 2], [1, 2, 3]) // false\n */\nexport function shallowEqual(arr1: unknown[], arr2: unknown[]): boolean {\n if (arr1.length !== arr2.length) return false;\n for (let i = 0; i < arr1.length; i++) {\n if (!Object.is(arr1[i], arr2[i])) return false;\n }\n return true;\n}\n","/**\n * Dependency tracking for state management\n *\n * Provides high-level dependency tracking that combines proxy tracking with\n * change detection to determine when a component needs to re-render.\n */\n\nimport type { AnyObject } from '../types/branded';\nimport {\n type ProxyTrackerState,\n createProxyTrackerState,\n startProxyTracking,\n stopProxyTracking,\n createProxyForTarget,\n} from './proxy-tracker';\nimport { parsePath, getValueAtPath } from './path-utils';\n\n/**\n * Information about a tracked path\n */\nexport interface PathInfo {\n /** Parsed path segments */\n segments: string[];\n /** Last known value at this path */\n value: any;\n}\n\n/**\n * State for dependency tracking\n */\nexport interface TrackerState<T extends AnyObject> {\n /** Internal proxy tracker state */\n proxyTrackerState: ProxyTrackerState<T>;\n /** Paths tracked in the previous render */\n previousRenderPaths: Set<string>;\n /** Paths tracked in the current render */\n currentRenderPaths: Set<string>;\n /** Cache of parsed paths and their values */\n pathCache: Map<string, PathInfo>;\n /** Last state object that was checked for changes */\n lastCheckedState: T | null;\n /** Values from the last change check (optimization) */\n lastCheckedValues: Map<string, any>;\n /** Counter for periodic cleanup of unused paths */\n cleanupCounter: number;\n}\n\n/**\n * How often to clean up unused paths from the cache\n */\nconst CLEANUP_INTERVAL = 10;\n\n/**\n * Create a new tracker state\n */\nexport function createTrackerState<T extends AnyObject>(): TrackerState<T> {\n return {\n proxyTrackerState: createProxyTrackerState<T>(),\n previousRenderPaths: new Set<string>(),\n currentRenderPaths: new Set<string>(),\n pathCache: new Map<string, PathInfo>(),\n lastCheckedState: null,\n lastCheckedValues: new Map<string, any>(),\n cleanupCounter: 0,\n };\n}\n\n/**\n * Start tracking property accesses\n */\nexport function startTracking<T extends AnyObject>(\n tracker: TrackerState<T>,\n): void {\n startProxyTracking(tracker.proxyTrackerState);\n}\n\n/**\n * Create a proxy for the given state\n */\nexport function createProxy<T extends AnyObject>(\n tracker: TrackerState<T>,\n state: T,\n): T {\n return createProxyForTarget(tracker.proxyTrackerState, state);\n}\n\n/**\n * Capture the paths that were tracked during a render\n *\n * This should be called after each render to record which paths were accessed.\n * It also performs periodic cleanup of unused paths to prevent memory leaks.\n */\nexport function captureTrackedPaths<T extends AnyObject>(\n tracker: TrackerState<T>,\n state: T,\n): void {\n tracker.previousRenderPaths = tracker.currentRenderPaths;\n tracker.currentRenderPaths = stopProxyTracking(tracker.proxyTrackerState);\n\n if (\n tracker.previousRenderPaths.size === 0 &&\n tracker.currentRenderPaths.size === 0\n ) {\n return;\n }\n\n const trackedPathsUnion = new Set(tracker.previousRenderPaths);\n for (const path of tracker.currentRenderPaths) {\n trackedPathsUnion.add(path);\n }\n\n const canReuseCache = tracker.lastCheckedState === state;\n\n for (const path of trackedPathsUnion) {\n if (!tracker.pathCache.has(path)) {\n const segments = parsePath(path);\n const value =\n canReuseCache && tracker.lastCheckedValues.has(path)\n ? tracker.lastCheckedValues.get(path)\n : getValueAtPath(state, segments);\n\n tracker.pathCache.set(path, { segments, value });\n } else {\n const info = tracker.pathCache.get(path)!;\n info.value =\n canReuseCache && tracker.lastCheckedValues.has(path)\n ? tracker.lastCheckedValues.get(path)\n : getValueAtPath(state, info.segments);\n }\n }\n\n tracker.cleanupCounter++;\n if (tracker.cleanupCounter >= CLEANUP_INTERVAL) {\n tracker.cleanupCounter = 0;\n for (const path of tracker.pathCache.keys()) {\n if (!trackedPathsUnion.has(path)) {\n tracker.pathCache.delete(path);\n }\n }\n }\n\n tracker.lastCheckedValues.clear();\n}\n\n/**\n * Check if any tracked paths have changed\n *\n * This is called when state changes to determine if a re-render is needed.\n * Returns true if any tracked path has a different value than before.\n */\nexport function hasChanges<T extends AnyObject>(\n tracker: TrackerState<T>,\n state: T,\n): boolean {\n if (tracker.pathCache.size === 0) {\n return true;\n }\n\n tracker.lastCheckedValues.clear();\n\n for (const [path, info] of tracker.pathCache.entries()) {\n const currentValue = getValueAtPath(state, info.segments);\n tracker.lastCheckedValues.set(path, currentValue);\n\n if (!Object.is(currentValue, info.value)) {\n tracker.lastCheckedState = state;\n return true;\n }\n }\n\n tracker.lastCheckedState = state;\n return false;\n}\n\n/**\n * Check if tracker has any tracked data\n *\n * Returns true if there are any tracked paths or cached paths.\n */\nexport function hasTrackedData<T extends AnyObject>(\n tracker: TrackerState<T>,\n): boolean {\n return (\n tracker.proxyTrackerState.trackedPaths.size > 0 ||\n tracker.pathCache.size > 0 ||\n tracker.previousRenderPaths.size > 0\n );\n}\n","export enum LogLevel {\n ERROR = 0,\n WARN = 1,\n INFO = 2,\n DEBUG = 3,\n}\n\nexport interface LogEntry {\n level: string;\n context: string;\n message: string;\n data?: any;\n timestamp: number;\n}\n\nexport interface LogConfig {\n enabled: boolean;\n level: LogLevel;\n output: (entry: LogEntry) => void;\n}\n\n/**\n * Creates a logger instance with given configuration\n *\n * @param config - Logger configuration\n * @returns Logger instance with debug, info, warn, error, and configure methods\n *\n * @example\n * ```ts\n * const logger = createLogger({\n * enabled: true,\n * level: LogLevel.DEBUG,\n * output: (entry) => console.log(JSON.stringify(entry))\n * });\n * logger.debug('MyComponent', 'Rendering', { props: { foo: 'bar' } });\n * ```\n */\nexport function createLogger(config: LogConfig) {\n const shouldLog = (level: LogLevel): boolean => {\n return config.enabled && config.level >= level;\n };\n\n const log = (\n level: string,\n context: string,\n message: string,\n data?: any,\n ): void => {\n try {\n const entry: LogEntry = {\n level,\n context,\n message,\n timestamp: Date.now(),\n ...(data !== undefined && { data: serialize(data) }),\n };\n config.output(entry);\n } catch (e) {\n console.error('[BlacLogger] Error logging:', e);\n }\n };\n\n const serialize = (data: any): any => {\n try {\n return JSON.parse(JSON.stringify(data));\n } catch {\n return String(data);\n }\n };\n\n return {\n debug: (context: string, message: string, data?: any) => {\n if (shouldLog(LogLevel.DEBUG)) {\n log('DEBUG', context, message, data);\n }\n },\n info: (context: string, message: string, data?: any) => {\n if (shouldLog(LogLevel.INFO)) {\n log('INFO', context, message, data);\n }\n },\n warn: (context: string, message: string, data?: any) => {\n if (shouldLog(LogLevel.WARN)) {\n log('WARN', context, message, data);\n }\n },\n error: (context: string, message: string, data?: any) => {\n if (shouldLog(LogLevel.ERROR)) {\n log('ERROR', context, message, data);\n }\n },\n configure: (opts: Partial<LogConfig>) => {\n Object.assign(config, opts);\n },\n };\n}\n\n// Track current configuration for proper merging\nlet currentConfig: LogConfig = {\n enabled: false, // Off by default (matches current implementation)\n level: LogLevel.INFO,\n output: (entry) => console.log(JSON.stringify(entry)),\n};\n\n// Default logger instance\nlet defaultLogger = createLogger(currentConfig);\n\n// Export individual methods for tree-shaking\nexport const debug = (context: string, message: string, data?: any) =>\n defaultLogger.debug(context, message, data);\nexport const info = (context: string, message: string, data?: any) =>\n defaultLogger.info(context, message, data);\nexport const warn = (context: string, message: string, data?: any) =>\n defaultLogger.warn(context, message, data);\nexport const error = (context: string, message: string, data?: any) =>\n defaultLogger.error(context, message, data);\n\n/**\n * Configuration function that recreates the default logger\n *\n * @param opts - Partial logger configuration\n *\n * @example\n * ```ts\n * configureLogger({ enabled: true, level: LogLevel.DEBUG });\n * ```\n */\nexport function configureLogger(opts: Partial<LogConfig>): void {\n // Merge with existing config\n currentConfig = {\n ...currentConfig,\n ...opts,\n };\n defaultLogger = createLogger(currentConfig);\n}\n","/**\n * ProxyTracker - Automatic dependency tracking through Proxies\n *\n * Tracks property access on state objects to automatically determine\n * which parts of the state a component depends on.\n */\n\nimport { debug, info, warn, error } from '../logging/Logger';\n\n/**\n * Check if a value is an object that can be proxied\n */\nfunction isProxyable(value: unknown): value is object {\n return (\n value !== null &&\n typeof value === 'object' &&\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 !(value instanceof Promise)\n );\n}\n\n/**\n * Tracks property access on state objects\n */\nexport class ProxyTracker<T> {\n private trackedPaths = new Set<string>();\n private isTracking = false;\n private proxyCache = new WeakMap<object, any>();\n private maxDepth = 10; // Prevent infinite recursion\n\n /**\n * Create a proxy that tracks property access\n */\n createProxy(target: T, path: string = '', depth: number = 0): T {\n // Return target as-is if not tracking or not proxyable\n if (!this.isTracking || !isProxyable(target)) {\n return target;\n }\n\n // Prevent infinite recursion or max depth exceeded\n if (depth >= this.maxDepth) {\n return target;\n }\n\n // Check cache to avoid creating duplicate proxies\n if (this.proxyCache.has(target)) {\n return this.proxyCache.get(target);\n }\n\n // Handle arrays specially to track index access\n if (Array.isArray(target)) {\n return this.createArrayProxy(\n target as unknown as any[],\n path,\n depth,\n ) as unknown as T;\n }\n\n // Create object proxy for all objects\n const proxy = new Proxy(target, {\n get: (obj, prop: string | symbol) => {\n const value = Reflect.get(obj, prop);\n\n // Handle functions - bind them to original object\n if (typeof value === 'function') {\n return value.bind(obj);\n }\n\n // Build the full path\n const fullPath = path ? `${path}.${String(prop)}` : String(prop);\n\n // If the value is a nested object, recursively proxy it\n // DON'T track intermediate objects, only track when we access leaf values\n if (isProxyable(value)) {\n const proxiedValue = this.createProxy(\n value as T,\n fullPath,\n depth + 1,\n );\n return proxiedValue;\n }\n\n // Track ONLY leaf properties (non-objects)\n if (typeof prop === 'string' && this.isTracking) {\n // Don't track internal properties\n if (!prop.startsWith('_') && !prop.startsWith('$$')) {\n this.trackedPaths.add(fullPath);\n debug('ProxyTracker', 'Tracked property access', {\n path: fullPath,\n valueType: typeof value,\n });\n }\n }\n\n return value;\n },\n\n // Track 'in' operator\n has: (obj, prop: string | symbol) => {\n if (typeof prop === 'string' && this.isTracking) {\n const fullPath = path ? `${path}.${prop}` : prop;\n this.trackedPaths.add(fullPath);\n debug('ProxyTracker', 'Tracked \"in\" operator access', {\n path: fullPath,\n });\n }\n return Reflect.has(obj, prop);\n },\n\n // Track Object.keys, Object.entries, etc.\n ownKeys: (obj) => {\n if (this.isTracking && path) {\n // Track that we're iterating over this object\n this.trackedPaths.add(path);\n debug('ProxyTracker', 'Tracked object keys iteration', {\n path: path,\n });\n }\n return Reflect.ownKeys(obj);\n },\n });\n\n this.proxyCache.set(target, proxy);\n return proxy as T;\n }\n\n /**\n * Create a proxy for arrays with special handling\n */\n private createArrayProxy<U>(\n target: U[],\n path: string,\n depth: number = 0,\n ): U[] {\n const proxy = new Proxy(target, {\n get: (arr, prop: string | symbol) => {\n const value = Reflect.get(arr, prop);\n\n // Handle array methods\n if (typeof value === 'function') {\n // For methods like map, filter, etc., track array access\n if (\n [\n 'map',\n 'filter',\n 'forEach',\n 'find',\n 'some',\n 'every',\n 'reduce',\n ].includes(String(prop))\n ) {\n if (this.isTracking && path) {\n this.trackedPaths.add(path);\n debug('ProxyTracker', 'Tracked array method access', {\n path: path,\n method: String(prop),\n });\n }\n }\n return value.bind(arr);\n }\n\n // Build the full path for array access\n let fullPath: string;\n if (prop === 'length') {\n fullPath = path ? `${path}.length` : 'length';\n } else if (typeof prop === 'string') {\n const index = Number(prop);\n if (!isNaN(index) && index >= 0) {\n fullPath = path ? `${path}[${index}]` : `[${index}]`;\n } else {\n fullPath = path ? `${path}.${prop}` : prop;\n }\n } else {\n return value;\n }\n\n // Recursively proxy nested objects in arrays\n // DON'T track intermediate objects, only track when we access leaf values\n if (isProxyable(value)) {\n return this.createProxy(value as T, fullPath, depth + 1);\n }\n\n // Track ONLY leaf properties (non-objects) and array length\n if (this.isTracking) {\n this.trackedPaths.add(fullPath);\n debug('ProxyTracker', 'Tracked array property access', {\n path: fullPath,\n valueType: typeof value,\n });\n }\n\n return value;\n },\n });\n\n this.proxyCache.set(target, proxy);\n return proxy;\n }\n\n /**\n * Start tracking property access\n */\n startTracking(): void {\n this.isTracking = true;\n this.trackedPaths.clear();\n debug('ProxyTracker', 'Started tracking');\n }\n\n /**\n * Stop tracking and return tracked paths\n */\n stopTracking(): Set<string> {\n this.isTracking = false;\n debug('ProxyTracker', 'Stopped tracking', {\n pathCount: this.trackedPaths.size,\n paths: Array.from(this.trackedPaths),\n });\n return new Set(this.trackedPaths);\n }\n\n /**\n * Get currently tracked paths\n */\n getTrackedPaths(): ReadonlySet<string> {\n return new Set(this.trackedPaths);\n }\n\n /**\n * Check if currently tracking\n */\n isCurrentlyTracking(): boolean {\n return this.isTracking;\n }\n\n /**\n * Clear proxy cache (useful for memory management)\n */\n clearCache(): void {\n this.proxyCache = new WeakMap();\n }\n\n /**\n * Set maximum tracking depth\n */\n setMaxDepth(depth: number): void {\n this.maxDepth = Math.max(1, depth);\n }\n\n /**\n * Add a path manually (useful for forcing dependencies)\n */\n addPath(path: string): void {\n this.trackedPaths.add(path);\n }\n\n /**\n * Remove a path manually\n */\n removePath(path: string): void {\n this.trackedPaths.delete(path);\n }\n\n /**\n * Clear all tracked paths\n */\n clearPaths(): void {\n this.trackedPaths.clear();\n }\n}\n\n/**\n * Global proxy tracker instance for convenience\n */\nexport const globalProxyTracker = new ProxyTracker();\n\n/**\n * Utility function to track property access in a callback\n */\nexport function trackAccess<T, R>(\n state: T,\n callback: (proxiedState: T) => R,\n): { result: R; trackedPaths: Set<string> } {\n const tracker = new ProxyTracker<T>();\n\n tracker.startTracking();\n const proxiedState = tracker.createProxy(state);\n const result = callback(proxiedState);\n const trackedPaths = tracker.stopTracking();\n\n return { result, trackedPaths };\n}\n","/**\n * Default configuration constants for BlaC\n *\n * Centralized location for all magic numbers and default values.\n */\n\n/**\n * Default configuration constants for BlaC\n */\nexport const BLAC_DEFAULTS = {\n /**\n * Default cleanup interval for subscriptions (30 seconds)\n */\n CLEANUP_INTERVAL_MS: 30_000,\n\n /**\n * Cleanup interval for weak reference stage (10 seconds)\n */\n WEAKREF_CLEANUP_INTERVAL_MS: 10_000,\n\n /**\n * Default maximum subscriptions per container\n */\n MAX_SUBSCRIPTIONS: 1_000,\n\n /**\n * Maximum subscriptions for high-performance mode\n */\n MAX_SUBSCRIPTIONS_HIGH_PERF: 10_000,\n\n /**\n * Default timeout for pipeline execution (5 seconds)\n */\n PIPELINE_TIMEOUT_MS: 5_000,\n\n /**\n * Cleanup interval for high-performance mode (5 seconds)\n */\n CLEANUP_INTERVAL_HIGH_PERF_MS: 5_000,\n\n /**\n * Maximum number of stages in a pipeline\n */\n MAX_PIPELINE_STAGES: 30,\n} as const;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["results: T[]","toDelete: string[]","typeBreakdown: Record<string, number>","error","error","error","amount: number","email: string","password: string","fullPath: string","segments: string[]","info","entry: LogEntry","currentConfig: LogConfig","isProxyable","fullPath: string"],"sources":["../src/utils/idGenerator.ts","../src/core/StateContainerRegistry.ts","../src/core/StateContainer.ts","../src/core/Cubit.ts","../src/core/Vertex.ts","../src/tracking/proxy-tracker.ts","../src/tracking/path-utils.ts","../src/tracking/dependency-tracker.ts","../src/logging/Logger.ts","../src/proxy/ProxyTracker.ts","../src/constants.ts"],"sourcesContent":["/**\n * Centralized ID Generation\n *\n * Provides consistent, collision-resistant ID generation for all BlaC subsystems.\n * Uses timestamp + counter + random suffix for uniqueness.\n */\n\n// Global counter map for ID generation\nconst globalCounters = new Map<string, number>();\n\n/**\n * Creates an ID generator with isolated counter state\n *\n * @param prefix - Prefix for generated IDs\n * @returns Object with next(), nextSimple(), and reset() methods\n *\n * @example\n * ```ts\n * const generator = createIdGenerator('sub');\n * const id1 = generator.next(); // \"sub_1698765432100_1_a3k9d7f2q\"\n * const id2 = generator.next(); // \"sub_1698765432101_2_b4n8e9g3r\"\n * ```\n */\nexport function createIdGenerator(prefix: string) {\n let counter = 0;\n return {\n next: () =>\n `${prefix}_${Date.now()}_${++counter}_${Math.random().toString(36).substring(2, 11)}`,\n nextSimple: () => `${prefix}_${++counter}`,\n reset: () => {\n counter = 0;\n },\n };\n}\n\n/**\n * Generate ID with timestamp, counter, and random suffix (tree-shakeable)\n *\n * Format: `${prefix}_${timestamp}_${counter}_${random}`\n *\n * @param prefix - Prefix for the ID (e.g., 'sub', 'consumer', 'stage')\n * @returns Branded ID string\n *\n * @example\n * ```ts\n * const id = generateId('sub');\n * // Returns: \"sub_1698765432100_1_a3k9d7f2q\"\n * ```\n */\nexport function generateId(prefix: string): string {\n const counter = (globalCounters.get(prefix) ?? 0) + 1;\n globalCounters.set(prefix, counter);\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 11);\n return `${prefix}_${timestamp}_${counter}_${random}`;\n}\n\n/**\n * Generate simple ID with timestamp and random (no counter tracking)\n *\n * Format: `${prefix}_${timestamp}_${random}`\n *\n * @param prefix - Prefix for the ID\n * @returns Branded ID string\n *\n * @example\n * ```ts\n * const id = generateSimpleId('CounterBloc');\n * // Returns: \"CounterBloc_1698765432100_a3k9d7f2q\"\n * ```\n */\nexport function generateSimpleId(prefix: string): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 11);\n return `${prefix}_${timestamp}_${random}`;\n}\n\n/**\n * Reset all counters for testing purposes\n * @internal\n */\nexport function __resetIdCounters(): void {\n globalCounters.clear();\n}\n","/**\n * StateContainerRegistry - Clean, minimal registry for StateContainer instances\n *\n * Responsibilities:\n * - Instance lifecycle management with ref counting\n * - Singleton/shared instance pattern\n * - Isolated instance support\n * - Lifecycle event notifications (plugin system)\n */\n\nimport type { StateContainer } from './StateContainer';\nimport type { Vertex } from './Vertex';\n\ninterface InstanceEntry {\n instance: StateContainer<any>;\n refCount: number;\n}\n\ninterface TypeConfig {\n isolated: boolean;\n}\n\n/**\n * Lifecycle events that can be observed\n */\nexport type LifecycleEvent =\n | 'created'\n | 'stateChanged'\n | 'eventAdded'\n | 'disposed';\n\n/**\n * Listener function types for each lifecycle event\n */\nexport type LifecycleListener<E extends LifecycleEvent> = E extends 'created'\n ? (container: StateContainer<any>) => void\n : E extends 'stateChanged'\n ? (\n container: StateContainer<any>,\n previousState: any,\n currentState: any,\n ) => void\n : E extends 'eventAdded'\n ? (container: Vertex<any, any>, event: any) => void\n : E extends 'disposed'\n ? (container: StateContainer<any>) => void\n : never;\n\n/**\n * Registry for managing StateContainer instances\n */\nexport class StateContainerRegistry {\n private readonly instances = new Map<string, InstanceEntry>();\n private readonly types = new Map<string, TypeConfig>();\n private readonly listeners = new Map<LifecycleEvent, Set<Function>>();\n\n /**\n * Register a type with isolation mode\n */\n register<T extends StateContainer<any>>(\n constructor: new (...args: any[]) => T,\n isolated = false,\n ): void {\n const className = constructor.name;\n\n // Check for static isolated property\n if (!isolated && (constructor as any).isolated === true) {\n isolated = true;\n }\n\n if (this.types.has(className)) {\n throw new Error(`Type \"${className}\" is already registered`);\n }\n\n this.types.set(className, { isolated });\n }\n\n /**\n * Get or create a StateContainer instance\n * For isolated: always creates new\n * For shared: singleton per key\n */\n getOrCreate<T extends StateContainer<any>>(\n constructor: new (...args: any[]) => T,\n key?: string,\n ...args: any[]\n ): T {\n const className = constructor.name;\n let config = this.types.get(className);\n\n // Auto-register if not registered\n if (!config) {\n const isolated = (constructor as any).isolated === true;\n this.types.set(className, { isolated });\n config = this.types.get(className)!;\n }\n\n // Isolated: always create new instance\n if (config.isolated) {\n return new constructor(...args);\n }\n\n // Shared: singleton pattern\n const instanceKey = `${className}:${key || 'default'}`;\n const existing = this.instances.get(instanceKey);\n\n if (existing) {\n existing.refCount++;\n return existing.instance as T;\n }\n\n // Create new shared instance\n const instance = new constructor(...args);\n this.instances.set(instanceKey, { instance, refCount: 1 });\n\n return instance;\n }\n\n /**\n * Release a reference to an instance\n * Disposes when ref count reaches zero (unless static keepAlive is true)\n */\n release<T extends StateContainer<any>>(\n constructor: new (...args: any[]) => T,\n key?: string,\n forceDispose = false,\n ): void {\n const className = constructor.name;\n const instanceKey = `${className}:${key || 'default'}`;\n const entry = this.instances.get(instanceKey);\n\n if (!entry) return;\n\n if (forceDispose) {\n entry.instance.dispose();\n this.instances.delete(instanceKey);\n return;\n }\n\n entry.refCount--;\n\n // Check static keepAlive property\n const keepAlive = (constructor as any).keepAlive === true;\n if (entry.refCount <= 0 && !keepAlive) {\n entry.instance.dispose();\n this.instances.delete(instanceKey);\n }\n }\n\n /**\n * Get all instances of a type (shared only, isolated aren't tracked)\n */\n getAll<T extends StateContainer<any>>(\n constructor: new (...args: any[]) => T,\n ): T[] {\n const className = constructor.name;\n const prefix = `${className}:`;\n const results: T[] = [];\n\n for (const [key, entry] of this.instances) {\n if (key.startsWith(prefix)) {\n results.push(entry.instance as T);\n }\n }\n\n return results;\n }\n\n /**\n * Clear all instances of a type\n */\n clear<T extends StateContainer<any>>(\n constructor: new (...args: any[]) => T,\n ): void {\n const className = constructor.name;\n const prefix = `${className}:`;\n const toDelete: string[] = [];\n\n for (const [key, entry] of this.instances) {\n if (key.startsWith(prefix)) {\n if (!entry.instance.isDisposed) {\n entry.instance.dispose();\n }\n toDelete.push(key);\n }\n }\n\n for (const key of toDelete) {\n this.instances.delete(key);\n }\n }\n\n /**\n * Clear all instances from all types (for testing)\n */\n clearAll(): void {\n for (const entry of this.instances.values()) {\n if (!entry.instance.isDisposed) {\n entry.instance.dispose();\n }\n }\n this.instances.clear();\n this.types.clear();\n }\n\n /**\n * Get registry statistics (for debugging)\n */\n getStats(): {\n registeredTypes: number;\n totalInstances: number;\n typeBreakdown: Record<string, number>;\n } {\n const typeBreakdown: Record<string, number> = {};\n\n for (const key of this.instances.keys()) {\n const typeName = key.split(':')[0];\n typeBreakdown[typeName] = (typeBreakdown[typeName] || 0) + 1;\n }\n\n return {\n registeredTypes: this.types.size,\n totalInstances: this.instances.size,\n typeBreakdown,\n };\n }\n\n /**\n * Get reference count for an instance\n */\n getRefCount<T extends StateContainer<any>>(\n constructor: new (...args: any[]) => T,\n key?: string,\n ): number {\n const className = constructor.name;\n const instanceKey = `${className}:${key || 'default'}`;\n const entry = this.instances.get(instanceKey);\n return entry?.refCount ?? 0;\n }\n\n /**\n * Check if an instance exists\n */\n hasInstance<T extends StateContainer<any>>(\n constructor: new (...args: any[]) => T,\n key?: string,\n ): boolean {\n const className = constructor.name;\n const instanceKey = `${className}:${key || 'default'}`;\n return this.instances.has(instanceKey);\n }\n\n /**\n * Subscribe to lifecycle events\n * @param event - The lifecycle event to listen for\n * @param listener - The listener function to call when the event occurs\n * @returns Unsubscribe function\n */\n on<E extends LifecycleEvent>(\n event: E,\n listener: LifecycleListener<E>,\n ): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener as Function);\n\n // Return unsubscribe function\n return () => {\n this.listeners.get(event)?.delete(listener as Function);\n };\n }\n\n /**\n * Emit lifecycle event to all listeners\n * @internal - Called by StateContainer/Vertex lifecycle methods\n */\n emit(event: LifecycleEvent, ...args: any[]): void {\n const listeners = this.listeners.get(event);\n if (!listeners || listeners.size === 0) return; // Zero overhead when no listeners\n\n for (const listener of listeners) {\n try {\n listener(...args);\n } catch (error) {\n console.error(`[BlaC] Listener error for '${event}':`, error);\n }\n }\n }\n}\n\n/**\n * Global default registry instance\n */\nexport const globalRegistry = new StateContainerRegistry();\n","/**\n * StateContainer - Clean, minimal state management container\n *\n * Responsibilities:\n * - State storage and updates\n * - Change notifications to subscribers\n * - Lifecycle management\n */\n\nimport { generateSimpleId } from '../utils/idGenerator';\nimport {\n StateContainerRegistry,\n globalRegistry,\n} from './StateContainerRegistry';\n\n/**\n * Configuration options for StateContainer\n */\nexport interface StateContainerConfig {\n /** Container name for debugging */\n name?: string;\n /** Enable debug logging */\n debug?: boolean;\n /** Custom instance identifier */\n instanceId?: string;\n}\n\n/**\n * Listener function for state changes\n */\ntype StateListener<S> = (state: S) => void;\n\n/**\n * Base abstract class for all state containers\n */\nexport abstract class StateContainer<S> {\n protected static _registry = globalRegistry;\n\n /**\n * Set a custom registry (mainly for testing)\n */\n static setRegistry(registry: StateContainerRegistry): void {\n StateContainer._registry = registry;\n }\n\n /**\n * Register a type as isolated or shared\n */\n static register<T extends StateContainer<any>>(\n this: new (...args: any[]) => T,\n isolated = false,\n ): void {\n StateContainer._registry.register(this, isolated);\n }\n\n /**\n * Get or create an instance\n * @param key - Optional instance key for shared instances\n * @param args - Constructor arguments\n */\n static getOrCreate<T extends StateContainer<any>>(\n this: new (...args: any[]) => T,\n key?: string,\n ...args: any[]\n ): T {\n return StateContainer._registry.getOrCreate(this, key, ...args);\n }\n\n /**\n * Release a reference to an instance\n * @param key - Optional instance key\n * @param forceDispose - Force dispose regardless of ref count or keepAlive\n */\n static release<T extends StateContainer<any>>(\n this: new (...args: any[]) => T,\n key?: string,\n forceDispose = false,\n ): void {\n StateContainer._registry.release(this, key, forceDispose);\n }\n\n /**\n * Get all instances of this type\n */\n static getAll<T extends StateContainer<any>>(\n this: new (...args: any[]) => T,\n ): T[] {\n return StateContainer._registry.getAll(this);\n }\n\n /**\n * Clear all instances of this type\n */\n static clear<T extends StateContainer<any>>(\n this: new (...args: any[]) => T,\n ): void {\n StateContainer._registry.clear(this);\n }\n\n /**\n * Clear all instances from all types (for testing)\n */\n static clearAllInstances(): void {\n StateContainer._registry.clearAll();\n }\n\n /**\n * Get registry statistics (for debugging)\n */\n static getStats(): {\n registeredTypes: number;\n totalInstances: number;\n typeBreakdown: Record<string, number>;\n } {\n return StateContainer._registry.getStats();\n }\n\n /**\n * Get reference count for an instance\n * @param key - Optional instance key\n */\n static getRefCount<T extends StateContainer<any>>(\n this: new (...args: any[]) => T,\n key?: string,\n ): number {\n return StateContainer._registry.getRefCount(this, key);\n }\n\n /**\n * Check if an instance exists\n * @param key - Optional instance key\n */\n static hasInstance<T extends StateContainer<any>>(\n this: new (...args: any[]) => T,\n key?: string,\n ): boolean {\n return StateContainer._registry.hasInstance(this, key);\n }\n\n private _state: S;\n private readonly listeners = new Set<StateListener<S>>();\n private _disposed = false;\n private readonly config: StateContainerConfig;\n\n readonly name: string;\n readonly debug: boolean;\n readonly instanceId: string;\n\n /**\n * Create a new StateContainer\n */\n constructor(initialState: S, config: StateContainerConfig = {}) {\n this._state = initialState;\n this.config = config;\n this.name = config.name || this.constructor.name;\n this.debug = config.debug ?? false;\n this.instanceId =\n config.instanceId || generateSimpleId(this.constructor.name);\n\n // Notify lifecycle listeners\n StateContainer._registry.emit('created', this);\n }\n\n /**\n * Get the current state\n */\n get state(): S {\n return this._state;\n }\n\n /**\n * Check if disposed\n */\n get isDisposed(): boolean {\n return this._disposed;\n }\n\n /**\n * Subscribe to state changes\n * @returns Unsubscribe function\n */\n subscribe(listener: StateListener<S>): () => void {\n if (this._disposed) {\n throw new Error(`Cannot subscribe to disposed container ${this.name}`);\n }\n\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Dispose the container\n */\n dispose(): void {\n if (this._disposed) return;\n\n if (this.debug) {\n console.log(`[${this.name}] Disposing...`);\n }\n\n this._disposed = true;\n\n // Call optional lifecycle hook\n this.onDispose?.();\n\n this.listeners.clear();\n\n // Notify lifecycle listeners\n StateContainer._registry.emit('disposed', this);\n\n if (this.debug) {\n console.log(`[${this.name}] Disposed successfully`);\n }\n }\n\n /**\n * Emit a new state (with change detection)\n */\n protected emit(newState: S): void {\n if (this._disposed) {\n throw new Error(`Cannot emit state from disposed container ${this.name}`);\n }\n\n // Skip if state hasn't changed (reference equality)\n if (this._state === newState) return;\n\n const previousState = this._state;\n this._state = newState;\n\n // Call optional lifecycle hook\n this.onStateChange?.(newState, previousState);\n\n // Notify listeners\n for (const listener of this.listeners) {\n try {\n listener(newState);\n } catch (error) {\n console.error(`[${this.name}] Error in listener:`, error);\n }\n }\n\n // Notify lifecycle listeners\n StateContainer._registry.emit(\n 'stateChanged',\n this,\n previousState,\n newState,\n );\n }\n\n /**\n * Update state using a function\n */\n protected update(updater: (current: S) => S): void {\n if (this._disposed) {\n throw new Error(\n `Cannot update state from disposed container ${this.name}`,\n );\n }\n this.emit(updater(this._state));\n }\n\n /**\n * Optional disposal hook for subclasses\n */\n protected onDispose?(): void;\n\n /**\n * Optional state change hook for subclasses\n */\n protected onStateChange?(newState: S, previousState: S): void;\n}\n","/**\n * Cubit - Simple state container with direct state emission\n *\n * This validates that our StateContainer design can support\n * the simple Cubit pattern from the original BlaC.\n */\n\nimport { StateContainer, StateContainerConfig } from './StateContainer';\n\n/**\n * Cubit is a simple state container that allows direct state emission\n *\n * Unlike StateContainer (where emit is protected), Cubit exposes emit and update\n * as public methods to allow direct state management.\n */\nexport abstract class Cubit<S> extends StateContainer<S> {\n /**\n * Create a new Cubit\n * @param initialState Initial state value\n * @param config Configuration options\n */\n constructor(initialState: S, config?: StateContainerConfig) {\n super(initialState, config);\n }\n\n /**\n * Emit a new state (public override of protected parent method)\n */\n public emit(newState: S): void {\n super['emit'](newState);\n }\n\n /**\n * Update state using a function (public override of protected parent method)\n */\n public update(updater: (current: S) => S): void {\n super['update'](updater);\n }\n\n /**\n * Patch state with partial updates (shallow merge)\n * Only available when state is an object type\n * Arrow function to maintain correct 'this' binding in React\n *\n * @example\n * ```typescript\n * // Update single field\n * this.patch({ count: 5 });\n *\n * // Update multiple fields\n * this.patch({ count: 5, name: 'Updated' });\n * ```\n */\n public patch = ((partial: S extends object ? Partial<S> : never): void => {\n if (typeof this.state !== 'object' || this.state === null) {\n throw new Error('patch() is only available for object state types');\n }\n this.update((current) => ({ ...current, ...partial }) as S);\n }) as S extends object ? (partial: Partial<S>) => void : never;\n}\n\n/**\n * Example: Counter Cubit\n */\nexport class CounterCubit extends Cubit<number> {\n constructor() {\n super(0, { name: 'CounterCubit' });\n }\n\n increment = (): void => {\n this.emit(this.state + 1);\n };\n\n decrement = (): void => {\n this.emit(this.state - 1);\n };\n\n reset = (): void => {\n this.emit(0);\n };\n\n addAmount = (amount: number): void => {\n this.emit(this.state + amount);\n };\n}\n\n/**\n * Example: Complex State Cubit\n */\nexport interface TodoState {\n todos: Array<{ id: string; text: string; done: boolean }>;\n filter: 'all' | 'active' | 'completed';\n isLoading: boolean;\n}\n\nexport class TodoCubit extends Cubit<TodoState> {\n static keepAlive = true;\n private nextId = 0;\n\n constructor() {\n super(\n {\n todos: [],\n filter: 'all',\n isLoading: false,\n },\n { name: 'TodoCubit' },\n );\n }\n\n addTodo = (text: string): void => {\n this.update((state) => ({\n ...state,\n todos: [\n ...state.todos,\n { id: `todo-${Date.now()}-${this.nextId++}`, text, done: false },\n ],\n }));\n };\n\n toggleTodo = (id: string): void => {\n this.update((state) => ({\n ...state,\n todos: state.todos.map((todo) =>\n todo.id === id ? { ...todo, done: !todo.done } : todo,\n ),\n }));\n };\n\n removeTodo = (id: string): void => {\n this.update((state) => ({\n ...state,\n todos: state.todos.filter((todo) => todo.id !== id),\n }));\n };\n\n setFilter = (filter: TodoState['filter']): void => {\n this.patch({ filter }); // Using patch() for simple field update\n };\n\n setLoading = (isLoading: boolean): void => {\n this.patch({ isLoading }); // Using patch() for simple field update\n };\n\n get visibleTodos() {\n const todos = this.state.todos;\n const filter = this.state.filter;\n\n switch (filter) {\n case 'active':\n return todos.filter((t) => !t.done);\n case 'completed':\n return todos.filter((t) => t.done);\n case 'all':\n default:\n return todos;\n }\n }\n\n get activeTodoCount() {\n return this.state.todos.filter((t) => !t.done).length;\n }\n}\n","/**\n * Vertex - Event-driven state container (Bloc pattern)\n *\n * Simplified version that includes its own event handling,\n * since events are only needed for the Vertex pattern.\n */\n\nimport { StateContainer, StateContainerConfig } from './StateContainer';\nimport { BaseEvent } from '../types/events';\n\n/**\n * Event handler signature (synchronous only)\n */\nexport type EventHandler<E extends BaseEvent, S> = (\n event: E,\n emit: (state: S) => void,\n) => void;\n\n/**\n * Type-safe event constructor\n */\nexport type EventConstructor<T extends BaseEvent = BaseEvent> = new (\n ...args: never[]\n) => T;\n\n/**\n * Event handler registration\n */\ninterface EventHandlerRegistration<E extends BaseEvent, S> {\n eventClass: EventConstructor<E>;\n handler: EventHandler<E, S>;\n}\n\n/**\n * Vertex is an event-driven state container (Bloc pattern)\n *\n * Includes its own simple event system since events are only needed\n * for the Vertex pattern, not for the base StateContainer.\n */\nexport abstract class Vertex<\n S,\n E extends BaseEvent = BaseEvent,\n> extends StateContainer<S> {\n private eventHandlers = new Map<string, EventHandlerRegistration<E, S>[]>();\n private isProcessing = false;\n private eventQueue: E[] = [];\n\n /**\n * Create a new Vertex\n * @param initialState Initial state value\n * @param config Configuration options\n */\n constructor(initialState: S, config?: StateContainerConfig) {\n super(initialState, config);\n }\n\n /**\n * Register an event handler\n * Arrow function to maintain correct 'this' binding\n */\n protected on = <T extends E>(\n EventClass: EventConstructor<T>,\n handler: EventHandler<T, S>,\n ): void => {\n const className = EventClass.name;\n const registrations = this.eventHandlers.get(className) || [];\n registrations.push({\n eventClass: EventClass as EventConstructor<E>,\n handler: handler as EventHandler<E, S>,\n });\n this.eventHandlers.set(className, registrations);\n };\n\n /**\n * Add an event to be processed\n * Arrow function to maintain correct 'this' binding in React\n */\n public add = (event: E): void => {\n // Notify lifecycle listeners\n StateContainer._registry.emit('eventAdded', this, event);\n\n this.processEvent(event);\n };\n\n /**\n * Process an event (synchronously)\n */\n private processEvent(event: E): void {\n // Queue event if already processing\n if (this.isProcessing) {\n this.eventQueue.push(event);\n return;\n }\n\n this.isProcessing = true;\n\n try {\n this.handleEvent(event);\n\n // Process queued events\n while (this.eventQueue.length > 0) {\n const nextEvent = this.eventQueue.shift()!;\n this.handleEvent(nextEvent);\n }\n } finally {\n this.isProcessing = false;\n }\n }\n\n /**\n * Handle a single event (synchronously)\n */\n private handleEvent(event: E): void {\n const className = event.constructor.name;\n const registrations = this.eventHandlers.get(className);\n\n if (!registrations || registrations.length === 0) {\n if (this.debug) {\n console.warn(`No handler registered for event: ${className}`);\n }\n return;\n }\n\n // Create emit function that captures current context\n const emitFn = (state: S) => {\n this.emit(state);\n };\n\n // Execute all handlers for this event type (synchronously)\n for (const registration of registrations) {\n try {\n registration.handler(event, emitFn);\n } catch (error) {\n if (this.debug) {\n console.error(`Error handling event ${className}:`, error);\n }\n // Optionally emit error state\n this.onEventError(event, error as Error);\n }\n }\n }\n\n /**\n * Hook for handling event processing errors\n */\n protected onEventError(event: E, error: Error): void {\n // Override in subclass to handle errors\n }\n}\n\n/**\n * Example: Counter Events\n */\nexport class IncrementEvent implements BaseEvent {\n readonly type = 'increment';\n readonly timestamp = Date.now();\n\n constructor(public readonly amount: number = 1) {}\n}\n\nexport class DecrementEvent implements BaseEvent {\n readonly type = 'decrement';\n readonly timestamp = Date.now();\n\n constructor(public readonly amount: number = 1) {}\n}\n\nexport class ResetEvent implements BaseEvent {\n readonly type = 'reset';\n readonly timestamp = Date.now();\n}\n\n/**\n * Example: Counter Vertex\n * Demonstrates proper typing and event handling\n */\nexport class CounterVertex extends Vertex<number> {\n constructor() {\n super(0);\n\n this.on(IncrementEvent, (event, emit) => {\n emit(this.state + event.amount);\n });\n\n this.on(DecrementEvent, (event, emit) => {\n emit(this.state - event.amount);\n });\n\n this.on(ResetEvent, (_, emit) => {\n emit(0);\n });\n }\n\n // Arrow functions for React compatibility\n increment = (amount = 1) => {\n this.add(new IncrementEvent(amount));\n };\n\n decrement = (amount = 1) => {\n this.add(new DecrementEvent(amount));\n };\n\n reset = () => {\n this.add(new ResetEvent());\n };\n}\n\n/**\n * Auth State and Events for testing async handlers\n */\nexport interface AuthState {\n isAuthenticated: boolean;\n isLoading: boolean;\n user: { id: string; name: string; email: string } | null;\n error: string | null;\n}\n\nexport class LoginEvent implements BaseEvent {\n readonly type = 'login';\n readonly timestamp = Date.now();\n constructor(\n public readonly email: string,\n public readonly password: string,\n ) {}\n}\n\nexport class LogoutEvent implements BaseEvent {\n readonly type = 'logout';\n readonly timestamp = Date.now();\n}\n\nexport class AuthVertex extends Vertex<AuthState> {\n constructor() {\n super({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n\n // Synchronous login handler (async operations should be done before calling this)\n this.on(LoginEvent, (event, emit) => {\n // Set loading\n emit({ ...this.state, isLoading: true, error: null });\n\n // Simulate sync auth (in real app, async work would be done before dispatching event)\n // Check credentials\n if (event.email === 'user@example.com' && event.password === 'password') {\n emit({\n isAuthenticated: true,\n isLoading: false,\n user: { id: '123', name: 'Test User', email: 'user@example.com' },\n error: null,\n });\n } else {\n emit({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: 'Invalid credentials',\n });\n }\n });\n\n this.on(LogoutEvent, (_, emit) => {\n emit({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n });\n }\n\n login = (email: string, password: string) => {\n this.add(new LoginEvent(email, password));\n };\n\n logout = () => {\n this.add(new LogoutEvent());\n };\n}\n","/**\n * Functional proxy tracker for automatic dependency tracking\n *\n * This module provides a functional approach to proxy-based dependency tracking.\n * Unlike the class-based ProxyTracker, this uses a state object pattern that's\n * easier to integrate with functional programming patterns and framework hooks.\n */\n\n/**\n * Array methods that should trigger tracking of the entire array\n */\nconst ARRAY_METHODS = new Set([\n 'map',\n 'filter',\n 'forEach',\n 'find',\n 'some',\n 'every',\n 'reduce',\n]);\n\n/**\n * Check if a value can be proxied\n *\n * Returns true for plain objects and arrays only.\n * Excludes built-in objects like Date, Map, Set, etc.\n */\nexport function isProxyable(value: unknown): value is object {\n if (typeof value !== 'object' || value === null) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === Array.prototype;\n}\n\n/**\n * State container for proxy tracking\n */\nexport interface ProxyTrackerState<T> {\n /** Set of all tracked property paths */\n trackedPaths: Set<string>;\n /** Whether tracking is currently active */\n isTracking: boolean;\n /** Cache of created proxies to avoid duplicates */\n proxyCache: WeakMap<object, any>;\n /** Cache of bound functions to maintain referential equality */\n boundFunctionsCache: WeakMap<Function, Function> | null;\n /** Last state object that was proxied (for cache invalidation) */\n lastProxiedState: T | null;\n /** Last proxy created (for cache reuse) */\n lastProxy: T | null;\n /** Maximum depth for nested proxy creation */\n maxDepth: number;\n}\n\n/**\n * Create a new proxy tracker state\n *\n * @example\n * const state = createProxyTrackerState<MyState>();\n * startProxyTracking(state);\n * const proxy = createProxyForTarget(state, myObject);\n * // ... use proxy ...\n * const paths = stopProxyTracking(state);\n */\nexport function createProxyTrackerState<T>(): ProxyTrackerState<T> {\n return {\n trackedPaths: new Set<string>(),\n isTracking: false,\n proxyCache: new WeakMap<object, any>(),\n boundFunctionsCache: null,\n lastProxiedState: null,\n lastProxy: null,\n maxDepth: 10,\n };\n}\n\n/**\n * Start tracking property accesses\n *\n * Clears previous tracked paths and enables tracking mode.\n */\nexport function startProxyTracking<T>(state: ProxyTrackerState<T>): void {\n state.isTracking = true;\n state.trackedPaths.clear();\n}\n\n/**\n * Stop tracking and return the tracked paths\n *\n * Returns a new Set containing all tracked paths.\n */\nexport function stopProxyTracking<T>(state: ProxyTrackerState<T>): Set<string> {\n state.isTracking = false;\n return new Set(state.trackedPaths);\n}\n\n/**\n * Create a proxy for an array with property access tracking\n *\n * Tracks:\n * - Array element access (arr[0])\n * - Length access (arr.length)\n * - Array method calls (arr.map, arr.filter, etc.)\n */\nexport function createArrayProxy<T, U>(\n state: ProxyTrackerState<T>,\n target: U[],\n path: string,\n depth: number = 0,\n): U[] {\n const proxy = new Proxy(target, {\n get: (arr, prop: string | symbol) => {\n if (typeof prop === 'symbol') {\n return Reflect.get(arr, prop);\n }\n\n const value = Reflect.get(arr, prop);\n\n if (typeof value === 'function') {\n if (ARRAY_METHODS.has(prop)) {\n if (state.isTracking && path) {\n state.trackedPaths.add(path);\n }\n }\n\n if (!state.boundFunctionsCache) {\n state.boundFunctionsCache = new WeakMap<Function, Function>();\n }\n const cached = state.boundFunctionsCache.get(value);\n if (cached) {\n return cached;\n }\n const bound = value.bind(arr);\n state.boundFunctionsCache.set(value, bound);\n return bound;\n }\n\n let fullPath: string;\n if (prop === 'length') {\n fullPath = path ? `${path}.length` : 'length';\n } else if (typeof prop === 'string') {\n const index = Number(prop);\n if (!isNaN(index) && index >= 0) {\n fullPath = path ? `${path}[${index}]` : `[${index}]`;\n } else {\n fullPath = path ? `${path}.${prop}` : prop;\n }\n } else {\n return value;\n }\n\n if (isProxyable(value)) {\n return createProxyInternal(state, value as T, fullPath, depth + 1);\n }\n\n if (state.isTracking) {\n state.trackedPaths.add(fullPath);\n }\n\n return value;\n },\n });\n\n state.proxyCache.set(target, proxy);\n return proxy;\n}\n\n/**\n * Create a proxy for an object with property access tracking\n *\n * This is the core proxy creation function that recursively creates proxies\n * for nested objects and arrays.\n *\n * Tracks:\n * - Property access (obj.prop)\n * - Nested property access (obj.nested.prop)\n * - 'in' operator usage ('prop' in obj)\n * - Object.keys, Object.entries, etc.\n */\nexport function createProxyInternal<T>(\n state: ProxyTrackerState<T>,\n target: T,\n path: string = '',\n depth: number = 0,\n): T {\n if (!state.isTracking || !isProxyable(target)) {\n return target;\n }\n\n if (depth >= state.maxDepth) {\n return target;\n }\n\n if (state.proxyCache.has(target)) {\n return state.proxyCache.get(target);\n }\n\n if (Array.isArray(target)) {\n return createArrayProxy(\n state,\n target as unknown as any[],\n path,\n depth,\n ) as unknown as T;\n }\n\n const proxy = new Proxy(target, {\n get: (obj, prop: string | symbol) => {\n if (typeof prop === 'symbol') {\n return Reflect.get(obj, prop);\n }\n\n const value = Reflect.get(obj, prop);\n\n if (typeof value === 'function') {\n if (!state.boundFunctionsCache) {\n state.boundFunctionsCache = new WeakMap<Function, Function>();\n }\n const cached = state.boundFunctionsCache.get(value);\n if (cached) {\n return cached;\n }\n const bound = value.bind(obj);\n state.boundFunctionsCache.set(value, bound);\n return bound;\n }\n\n const fullPath = path ? `${path}.${String(prop)}` : String(prop);\n\n if (isProxyable(value)) {\n const proxiedValue = createProxyInternal(\n state,\n value as T,\n fullPath,\n depth + 1,\n );\n return proxiedValue;\n }\n\n if (typeof prop === 'string' && state.isTracking) {\n if (!prop.startsWith('_') && !prop.startsWith('$$')) {\n state.trackedPaths.add(fullPath);\n }\n }\n\n return value;\n },\n\n has: (obj, prop: string | symbol) => {\n if (typeof prop === 'string' && state.isTracking) {\n const fullPath = path ? `${path}.${prop}` : prop;\n state.trackedPaths.add(fullPath);\n }\n return Reflect.has(obj, prop);\n },\n\n ownKeys: (obj) => {\n if (state.isTracking && path) {\n state.trackedPaths.add(path);\n }\n return Reflect.ownKeys(obj);\n },\n });\n\n state.proxyCache.set(target, proxy);\n return proxy as T;\n}\n\n/**\n * Create a proxy for a target with caching\n *\n * If the target hasn't changed since the last call, returns the cached proxy.\n * Otherwise, creates a new proxy and caches it.\n *\n * This is the main entry point for creating tracked proxies.\n */\nexport function createProxyForTarget<T>(\n state: ProxyTrackerState<T>,\n target: T,\n): T {\n if (state.lastProxiedState === target && state.lastProxy) {\n return state.lastProxy;\n }\n\n // Clear caches when state changes to prevent stale bound functions\n // This is critical for array methods like .map() which get bound to the target\n state.proxyCache = new WeakMap<object, any>();\n state.boundFunctionsCache = null;\n\n const proxy = createProxyInternal(state, target, '', 0);\n state.lastProxiedState = target;\n state.lastProxy = proxy;\n return proxy;\n}\n","/**\n * Path utilities for dependency tracking\n *\n * Provides utilities for parsing property paths and extracting values\n * from nested objects using path strings.\n */\n\n/**\n * Parse a property path string into an array of segments\n *\n * Handles both dot notation (a.b.c) and bracket notation (a[0].b)\n *\n * @example\n * parsePath('user.name') // ['user', 'name']\n * parsePath('items[0].name') // ['items', '0', 'name']\n * parsePath('data.users[2].address.city') // ['data', 'users', '2', 'address', 'city']\n */\nexport function parsePath(path: string): string[] {\n const segments: string[] = [];\n let current = '';\n let i = 0;\n\n while (i < path.length) {\n const char = path[i];\n if (char === '.') {\n if (current) segments.push(current);\n current = '';\n } else if (char === '[') {\n if (current) segments.push(current);\n current = '';\n // Skip bracket\n i++;\n // Read until ]\n while (i < path.length && path[i] !== ']') {\n current += path[i++];\n }\n if (current) segments.push(current);\n current = '';\n } else {\n current += char;\n }\n i++;\n }\n\n if (current) segments.push(current);\n return segments;\n}\n\n/**\n * Get a value from an object using a path of segments\n *\n * @example\n * const obj = { user: { name: 'Alice', age: 30 } }\n * getValueAtPath(obj, ['user', 'name']) // 'Alice'\n * getValueAtPath(obj, ['user', 'age']) // 30\n * getValueAtPath(obj, ['user', 'missing']) // undefined\n */\nexport function getValueAtPath(obj: any, segments: string[]): any {\n if (obj == null) return undefined;\n\n let current = obj;\n for (let i = 0; i < segments.length; i++) {\n current = current[segments[i]];\n if (current == null) return undefined;\n }\n return current;\n}\n\n/**\n * Shallow equality comparison for arrays\n *\n * Compares two arrays element-by-element using Object.is\n *\n * @example\n * shallowEqual([1, 2, 3], [1, 2, 3]) // true\n * shallowEqual([1, 2, 3], [1, 2, 4]) // false\n * shallowEqual([1, 2], [1, 2, 3]) // false\n */\nexport function shallowEqual(arr1: unknown[], arr2: unknown[]): boolean {\n if (arr1.length !== arr2.length) return false;\n for (let i = 0; i < arr1.length; i++) {\n if (!Object.is(arr1[i], arr2[i])) return false;\n }\n return true;\n}\n","/**\n * Dependency tracking for state management\n *\n * Provides high-level dependency tracking that combines proxy tracking with\n * change detection to determine when a component needs to re-render.\n */\n\nimport type { AnyObject } from '../types/branded';\nimport {\n type ProxyTrackerState,\n createProxyTrackerState,\n startProxyTracking,\n stopProxyTracking,\n createProxyForTarget,\n} from './proxy-tracker';\nimport { parsePath, getValueAtPath } from './path-utils';\n\n/**\n * Information about a tracked path\n */\nexport interface PathInfo {\n /** Parsed path segments */\n segments: string[];\n /** Last known value at this path */\n value: any;\n}\n\n/**\n * State for dependency tracking\n */\nexport interface TrackerState<T extends AnyObject> {\n /** Internal proxy tracker state */\n proxyTrackerState: ProxyTrackerState<T>;\n /** Paths tracked in the previous render */\n previousRenderPaths: Set<string>;\n /** Paths tracked in the current render */\n currentRenderPaths: Set<string>;\n /** Cache of parsed paths and their values */\n pathCache: Map<string, PathInfo>;\n /** Last state object that was checked for changes */\n lastCheckedState: T | null;\n /** Values from the last change check (optimization) */\n lastCheckedValues: Map<string, any>;\n /** Counter for periodic cleanup of unused paths */\n cleanupCounter: number;\n}\n\n/**\n * How often to clean up unused paths from the cache\n */\nconst CLEANUP_INTERVAL = 10;\n\n/**\n * Create a new tracker state\n */\nexport function createTrackerState<T extends AnyObject>(): TrackerState<T> {\n return {\n proxyTrackerState: createProxyTrackerState<T>(),\n previousRenderPaths: new Set<string>(),\n currentRenderPaths: new Set<string>(),\n pathCache: new Map<string, PathInfo>(),\n lastCheckedState: null,\n lastCheckedValues: new Map<string, any>(),\n cleanupCounter: 0,\n };\n}\n\n/**\n * Start tracking property accesses\n */\nexport function startTracking<T extends AnyObject>(\n tracker: TrackerState<T>,\n): void {\n startProxyTracking(tracker.proxyTrackerState);\n}\n\n/**\n * Create a proxy for the given state\n */\nexport function createProxy<T extends AnyObject>(\n tracker: TrackerState<T>,\n state: T,\n): T {\n return createProxyForTarget(tracker.proxyTrackerState, state);\n}\n\n/**\n * Capture the paths that were tracked during a render\n *\n * This should be called after each render to record which paths were accessed.\n * It also performs periodic cleanup of unused paths to prevent memory leaks.\n */\nexport function captureTrackedPaths<T extends AnyObject>(\n tracker: TrackerState<T>,\n state: T,\n): void {\n tracker.previousRenderPaths = tracker.currentRenderPaths;\n tracker.currentRenderPaths = stopProxyTracking(tracker.proxyTrackerState);\n\n if (\n tracker.previousRenderPaths.size === 0 &&\n tracker.currentRenderPaths.size === 0\n ) {\n return;\n }\n\n const trackedPathsUnion = new Set(tracker.previousRenderPaths);\n for (const path of tracker.currentRenderPaths) {\n trackedPathsUnion.add(path);\n }\n\n const canReuseCache = tracker.lastCheckedState === state;\n\n for (const path of trackedPathsUnion) {\n if (!tracker.pathCache.has(path)) {\n const segments = parsePath(path);\n const value =\n canReuseCache && tracker.lastCheckedValues.has(path)\n ? tracker.lastCheckedValues.get(path)\n : getValueAtPath(state, segments);\n\n tracker.pathCache.set(path, { segments, value });\n } else {\n const info = tracker.pathCache.get(path)!;\n info.value =\n canReuseCache && tracker.lastCheckedValues.has(path)\n ? tracker.lastCheckedValues.get(path)\n : getValueAtPath(state, info.segments);\n }\n }\n\n tracker.cleanupCounter++;\n if (tracker.cleanupCounter >= CLEANUP_INTERVAL) {\n tracker.cleanupCounter = 0;\n for (const path of tracker.pathCache.keys()) {\n if (!trackedPathsUnion.has(path)) {\n tracker.pathCache.delete(path);\n }\n }\n }\n\n tracker.lastCheckedValues.clear();\n}\n\n/**\n * Check if any tracked paths have changed\n *\n * This is called when state changes to determine if a re-render is needed.\n * Returns true if any tracked path has a different value than before.\n */\nexport function hasChanges<T extends AnyObject>(\n tracker: TrackerState<T>,\n state: T,\n): boolean {\n if (tracker.pathCache.size === 0) {\n return true;\n }\n\n tracker.lastCheckedValues.clear();\n\n for (const [path, info] of tracker.pathCache.entries()) {\n const currentValue = getValueAtPath(state, info.segments);\n tracker.lastCheckedValues.set(path, currentValue);\n\n if (!Object.is(currentValue, info.value)) {\n tracker.lastCheckedState = state;\n return true;\n }\n }\n\n tracker.lastCheckedState = state;\n return false;\n}\n\n/**\n * Check if tracker has any tracked data\n *\n * Returns true if there are any tracked paths or cached paths.\n */\nexport function hasTrackedData<T extends AnyObject>(\n tracker: TrackerState<T>,\n): boolean {\n return (\n tracker.proxyTrackerState.trackedPaths.size > 0 ||\n tracker.pathCache.size > 0 ||\n tracker.previousRenderPaths.size > 0\n );\n}\n","export enum LogLevel {\n ERROR = 0,\n WARN = 1,\n INFO = 2,\n DEBUG = 3,\n}\n\nexport interface LogEntry {\n level: string;\n context: string;\n message: string;\n data?: any;\n timestamp: number;\n}\n\nexport interface LogConfig {\n enabled: boolean;\n level: LogLevel;\n output: (entry: LogEntry) => void;\n}\n\n/**\n * Creates a logger instance with given configuration\n *\n * @param config - Logger configuration\n * @returns Logger instance with debug, info, warn, error, and configure methods\n *\n * @example\n * ```ts\n * const logger = createLogger({\n * enabled: true,\n * level: LogLevel.DEBUG,\n * output: (entry) => console.log(JSON.stringify(entry))\n * });\n * logger.debug('MyComponent', 'Rendering', { props: { foo: 'bar' } });\n * ```\n */\nexport function createLogger(config: LogConfig) {\n const shouldLog = (level: LogLevel): boolean => {\n return config.enabled && config.level >= level;\n };\n\n const log = (\n level: string,\n context: string,\n message: string,\n data?: any,\n ): void => {\n try {\n const entry: LogEntry = {\n level,\n context,\n message,\n timestamp: Date.now(),\n ...(data !== undefined && { data: serialize(data) }),\n };\n config.output(entry);\n } catch (e) {\n console.error('[BlacLogger] Error logging:', e);\n }\n };\n\n const serialize = (data: any): any => {\n try {\n return JSON.parse(JSON.stringify(data));\n } catch {\n return String(data);\n }\n };\n\n return {\n debug: (context: string, message: string, data?: any) => {\n if (shouldLog(LogLevel.DEBUG)) {\n log('DEBUG', context, message, data);\n }\n },\n info: (context: string, message: string, data?: any) => {\n if (shouldLog(LogLevel.INFO)) {\n log('INFO', context, message, data);\n }\n },\n warn: (context: string, message: string, data?: any) => {\n if (shouldLog(LogLevel.WARN)) {\n log('WARN', context, message, data);\n }\n },\n error: (context: string, message: string, data?: any) => {\n if (shouldLog(LogLevel.ERROR)) {\n log('ERROR', context, message, data);\n }\n },\n configure: (opts: Partial<LogConfig>) => {\n Object.assign(config, opts);\n },\n };\n}\n\n// Track current configuration for proper merging\nlet currentConfig: LogConfig = {\n enabled: false, // Off by default (matches current implementation)\n level: LogLevel.INFO,\n output: (entry) => console.log(JSON.stringify(entry)),\n};\n\n// Default logger instance\nlet defaultLogger = createLogger(currentConfig);\n\n// Export individual methods for tree-shaking\nexport const debug = (context: string, message: string, data?: any) =>\n defaultLogger.debug(context, message, data);\nexport const info = (context: string, message: string, data?: any) =>\n defaultLogger.info(context, message, data);\nexport const warn = (context: string, message: string, data?: any) =>\n defaultLogger.warn(context, message, data);\nexport const error = (context: string, message: string, data?: any) =>\n defaultLogger.error(context, message, data);\n\n/**\n * Configuration function that recreates the default logger\n *\n * @param opts - Partial logger configuration\n *\n * @example\n * ```ts\n * configureLogger({ enabled: true, level: LogLevel.DEBUG });\n * ```\n */\nexport function configureLogger(opts: Partial<LogConfig>): void {\n // Merge with existing config\n currentConfig = {\n ...currentConfig,\n ...opts,\n };\n defaultLogger = createLogger(currentConfig);\n}\n","/**\n * ProxyTracker - Automatic dependency tracking through Proxies\n *\n * Tracks property access on state objects to automatically determine\n * which parts of the state a component depends on.\n */\n\nimport { debug, info, warn, error } from '../logging/Logger';\n\n/**\n * Check if a value is an object that can be proxied\n */\nfunction isProxyable(value: unknown): value is object {\n return (\n value !== null &&\n typeof value === 'object' &&\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 !(value instanceof Promise)\n );\n}\n\n/**\n * Tracks property access on state objects\n */\nexport class ProxyTracker<T> {\n private trackedPaths = new Set<string>();\n private isTracking = false;\n private proxyCache = new WeakMap<object, any>();\n private maxDepth = 10; // Prevent infinite recursion\n\n /**\n * Create a proxy that tracks property access\n */\n createProxy(target: T, path: string = '', depth: number = 0): T {\n // Return target as-is if not tracking or not proxyable\n if (!this.isTracking || !isProxyable(target)) {\n return target;\n }\n\n // Prevent infinite recursion or max depth exceeded\n if (depth >= this.maxDepth) {\n return target;\n }\n\n // Check cache to avoid creating duplicate proxies\n if (this.proxyCache.has(target)) {\n return this.proxyCache.get(target);\n }\n\n // Handle arrays specially to track index access\n if (Array.isArray(target)) {\n return this.createArrayProxy(\n target as unknown as any[],\n path,\n depth,\n ) as unknown as T;\n }\n\n // Create object proxy for all objects\n const proxy = new Proxy(target, {\n get: (obj, prop: string | symbol) => {\n const value = Reflect.get(obj, prop);\n\n // Handle functions - bind them to original object\n if (typeof value === 'function') {\n return value.bind(obj);\n }\n\n // Build the full path\n const fullPath = path ? `${path}.${String(prop)}` : String(prop);\n\n // If the value is a nested object, recursively proxy it\n // DON'T track intermediate objects, only track when we access leaf values\n if (isProxyable(value)) {\n const proxiedValue = this.createProxy(\n value as T,\n fullPath,\n depth + 1,\n );\n return proxiedValue;\n }\n\n // Track ONLY leaf properties (non-objects)\n if (typeof prop === 'string' && this.isTracking) {\n // Don't track internal properties\n if (!prop.startsWith('_') && !prop.startsWith('$$')) {\n this.trackedPaths.add(fullPath);\n debug('ProxyTracker', 'Tracked property access', {\n path: fullPath,\n valueType: typeof value,\n });\n }\n }\n\n return value;\n },\n\n // Track 'in' operator\n has: (obj, prop: string | symbol) => {\n if (typeof prop === 'string' && this.isTracking) {\n const fullPath = path ? `${path}.${prop}` : prop;\n this.trackedPaths.add(fullPath);\n debug('ProxyTracker', 'Tracked \"in\" operator access', {\n path: fullPath,\n });\n }\n return Reflect.has(obj, prop);\n },\n\n // Track Object.keys, Object.entries, etc.\n ownKeys: (obj) => {\n if (this.isTracking && path) {\n // Track that we're iterating over this object\n this.trackedPaths.add(path);\n debug('ProxyTracker', 'Tracked object keys iteration', {\n path: path,\n });\n }\n return Reflect.ownKeys(obj);\n },\n });\n\n this.proxyCache.set(target, proxy);\n return proxy as T;\n }\n\n /**\n * Create a proxy for arrays with special handling\n */\n private createArrayProxy<U>(\n target: U[],\n path: string,\n depth: number = 0,\n ): U[] {\n const proxy = new Proxy(target, {\n get: (arr, prop: string | symbol) => {\n const value = Reflect.get(arr, prop);\n\n // Handle array methods\n if (typeof value === 'function') {\n // For methods like map, filter, etc., track array access\n if (\n [\n 'map',\n 'filter',\n 'forEach',\n 'find',\n 'some',\n 'every',\n 'reduce',\n ].includes(String(prop))\n ) {\n if (this.isTracking && path) {\n this.trackedPaths.add(path);\n debug('ProxyTracker', 'Tracked array method access', {\n path: path,\n method: String(prop),\n });\n }\n }\n return value.bind(arr);\n }\n\n // Build the full path for array access\n let fullPath: string;\n if (prop === 'length') {\n fullPath = path ? `${path}.length` : 'length';\n } else if (typeof prop === 'string') {\n const index = Number(prop);\n if (!isNaN(index) && index >= 0) {\n fullPath = path ? `${path}[${index}]` : `[${index}]`;\n } else {\n fullPath = path ? `${path}.${prop}` : prop;\n }\n } else {\n return value;\n }\n\n // Recursively proxy nested objects in arrays\n // DON'T track intermediate objects, only track when we access leaf values\n if (isProxyable(value)) {\n return this.createProxy(value as T, fullPath, depth + 1);\n }\n\n // Track ONLY leaf properties (non-objects) and array length\n if (this.isTracking) {\n this.trackedPaths.add(fullPath);\n debug('ProxyTracker', 'Tracked array property access', {\n path: fullPath,\n valueType: typeof value,\n });\n }\n\n return value;\n },\n });\n\n this.proxyCache.set(target, proxy);\n return proxy;\n }\n\n /**\n * Start tracking property access\n */\n startTracking(): void {\n this.isTracking = true;\n this.trackedPaths.clear();\n debug('ProxyTracker', 'Started tracking');\n }\n\n /**\n * Stop tracking and return tracked paths\n */\n stopTracking(): Set<string> {\n this.isTracking = false;\n debug('ProxyTracker', 'Stopped tracking', {\n pathCount: this.trackedPaths.size,\n paths: Array.from(this.trackedPaths),\n });\n return new Set(this.trackedPaths);\n }\n\n /**\n * Get currently tracked paths\n */\n getTrackedPaths(): ReadonlySet<string> {\n return new Set(this.trackedPaths);\n }\n\n /**\n * Check if currently tracking\n */\n isCurrentlyTracking(): boolean {\n return this.isTracking;\n }\n\n /**\n * Clear proxy cache (useful for memory management)\n */\n clearCache(): void {\n this.proxyCache = new WeakMap();\n }\n\n /**\n * Set maximum tracking depth\n */\n setMaxDepth(depth: number): void {\n this.maxDepth = Math.max(1, depth);\n }\n\n /**\n * Add a path manually (useful for forcing dependencies)\n */\n addPath(path: string): void {\n this.trackedPaths.add(path);\n }\n\n /**\n * Remove a path manually\n */\n removePath(path: string): void {\n this.trackedPaths.delete(path);\n }\n\n /**\n * Clear all tracked paths\n */\n clearPaths(): void {\n this.trackedPaths.clear();\n }\n}\n\n/**\n * Global proxy tracker instance for convenience\n */\nexport const globalProxyTracker = new ProxyTracker();\n\n/**\n * Utility function to track property access in a callback\n */\nexport function trackAccess<T, R>(\n state: T,\n callback: (proxiedState: T) => R,\n): { result: R; trackedPaths: Set<string> } {\n const tracker = new ProxyTracker<T>();\n\n tracker.startTracking();\n const proxiedState = tracker.createProxy(state);\n const result = callback(proxiedState);\n const trackedPaths = tracker.stopTracking();\n\n return { result, trackedPaths };\n}\n","/**\n * Default configuration constants for BlaC\n *\n * Centralized location for all magic numbers and default values.\n */\n\n/**\n * Default configuration constants for BlaC\n */\nexport const BLAC_DEFAULTS = {\n /**\n * Default cleanup interval for subscriptions (30 seconds)\n */\n CLEANUP_INTERVAL_MS: 30_000,\n\n /**\n * Cleanup interval for weak reference stage (10 seconds)\n */\n WEAKREF_CLEANUP_INTERVAL_MS: 10_000,\n\n /**\n * Default maximum subscriptions per container\n */\n MAX_SUBSCRIPTIONS: 1_000,\n\n /**\n * Maximum subscriptions for high-performance mode\n */\n MAX_SUBSCRIPTIONS_HIGH_PERF: 10_000,\n\n /**\n * Default timeout for pipeline execution (5 seconds)\n */\n PIPELINE_TIMEOUT_MS: 5_000,\n\n /**\n * Cleanup interval for high-performance mode (5 seconds)\n */\n CLEANUP_INTERVAL_HIGH_PERF_MS: 5_000,\n\n /**\n * Maximum number of stages in a pipeline\n */\n MAX_PIPELINE_STAGES: 30,\n} as const;\n"],"mappings":"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"}