@oxog/state 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/deep-clone.ts","../src/utils/deep-equal.ts","../src/utils/shallow-equal.ts","../src/utils/deep-merge.ts","../src/utils/is-function.ts","../src/utils/pick.ts","../src/utils/omit.ts","../src/utils/identity.ts","../src/kernel.ts","../src/batch-context.ts","../src/types.ts","../src/store.ts","../src/react.ts","../src/plugins/persist.ts","../src/plugins/devtools.ts","../src/plugins/history.ts","../src/plugins/sync.ts","../src/plugins/immer.ts","../src/plugins/selector.ts"],"names":["StoreErrorCode","listener","selector","history","deepClone"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Deep clone a value, creating copies of nested objects and arrays.\n *\n * Handles:\n * - Primitives (returned as-is)\n * - null and undefined (returned as-is)\n * - Date objects\n * - Arrays\n * - Plain objects\n * - Circular references\n * - Other objects (returned as-is, not cloned)\n *\n * @typeParam T - The type to clone\n * @param value - The value to clone\n * @param seen - Internal map for tracking circular references\n * @returns A deep clone of the value\n *\n * @example\n * ```typescript\n * const original = { a: 1, b: { c: 2 } };\n * const cloned = deepClone(original);\n * cloned.b.c = 3;\n * console.log(original.b.c); // 2 (unchanged)\n * ```\n */\nexport function deepClone<T>(value: T, seen?: WeakMap<object, unknown>): T {\n // Primitives, null, undefined - return as-is\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Date - create new Date instance\n if (value instanceof Date) {\n return new Date(value.getTime()) as T;\n }\n\n // Handle circular references\n if (!seen) {\n seen = new WeakMap();\n }\n if (seen.has(value)) {\n return seen.get(value) as T;\n }\n seen.set(value, value);\n\n // Array - map and recursively clone\n if (Array.isArray(value)) {\n const cloned = [] as unknown as T;\n seen.set(value, cloned);\n (value as unknown[]).forEach((item, index) => {\n (cloned as unknown[])[index] = deepClone(item, seen);\n });\n return cloned;\n }\n\n // Plain object - create new object and clone properties\n if (value.constructor === Object) {\n const cloned = {} as T;\n seen.set(value, cloned);\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n (cloned as any)[key] = deepClone((value as any)[key], seen);\n }\n }\n return cloned;\n }\n\n // For other objects (classes, etc.), return as-is\n // This handles RegExp, Map, Set, and custom classes\n return value;\n}\n","/**\n * Deep equality check for two values.\n *\n * Recursively compares objects and arrays.\n * Uses Object.is for primitive comparison.\n *\n * @param a - First value\n * @param b - Second value\n * @returns true if values are deeply equal\n *\n * @example\n * ```typescript\n * deepEqual(1, 1); // true\n * deepEqual({ a: { b: 1 } }, { a: { b: 1 } }); // true\n * deepEqual({ a: { b: 1 } }, { a: { b: 2 } }); // false\n * deepEqual([1, 2], [1, 2]); // true\n * deepEqual([1, 2], [1, 2, 3]); // false\n * ```\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n // Object.is handles NaN and -0/+0 correctly\n if (Object.is(a, b)) {\n return true;\n }\n\n // If either is null or not an object, not equal\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') {\n return false;\n }\n\n // Array comparison\n if (Array.isArray(a) !== Array.isArray(b)) {\n return false;\n }\n\n if (Array.isArray(a)) {\n const arrB = b as unknown[];\n if (a.length !== arrB.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], arrB[i])) {\n return false;\n }\n }\n return true;\n }\n\n // Object comparison\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n for (const key of keysA) {\n if (\n !Object.prototype.hasOwnProperty.call(b, key) ||\n !deepEqual((a as any)[key], (b as any)[key])\n ) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * Shallow equality check for two values.\n *\n * Uses Object.is for comparison, which handles NaN correctly\n * and distinguishes between +0 and -0.\n *\n * @param a - First value\n * @param b - Second value\n * @returns true if values are shallowly equal\n *\n * @example\n * ```typescript\n * shallowEqual(1, 1); // true\n * shallowEqual({ a: 1 }, { a: 1 }); // true\n * shallowEqual({ a: 1 }, { a: 2 }); // false\n * shallowEqual(NaN, NaN); // true\n * ```\n */\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n // Object.is handles NaN and -0/+0 correctly\n if (Object.is(a, b)) {\n return true;\n }\n\n // If either is not an object (or is null), not equal\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\n return false;\n }\n\n // Compare keys\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !Object.is((a as any)[key], (b as any)[key])) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * Deep merge a partial object into a target object.\n *\n * Creates a new object with nested objects merged recursively.\n * Arrays are replaced, not merged.\n *\n * @typeParam T - The target type\n * @param target - The target object\n * @param source - The partial source to merge\n * @returns A new merged object\n *\n * @example\n * ```typescript\n * const target = { a: 1, b: { c: 2, d: 3 } };\n * const source = { b: { c: 10 }, e: 4 };\n * const merged = deepMerge(target, source);\n * // { a: 1, b: { c: 10, d: 3 }, e: 4 }\n * ```\n */\n\nimport type { DeepPartial } from '../types.js';\nimport { deepClone } from './deep-clone.js';\n\nexport function deepMerge<T>(target: T, source: Partial<T> | DeepPartial<T>): T {\n if (source === null) {\n return target;\n }\n if (typeof source !== 'object') {\n return source as T;\n }\n\n // Deep clone target to avoid reference issues with Date objects\n const output = deepClone(target) as any;\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = (source as any)[key];\n const targetValue = output[key];\n\n // Date objects - clone and replace\n if (sourceValue instanceof Date) {\n output[key] = new Date(sourceValue.getTime());\n continue;\n }\n\n // Both are plain objects (but not arrays) - recursively merge\n if (\n sourceValue !== null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n !(sourceValue instanceof Date) &&\n targetValue !== null &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue) &&\n !(targetValue instanceof Date)\n ) {\n output[key] = deepMerge(targetValue, sourceValue as any);\n } else {\n // Replace with cloned value\n output[key] = cloneValue(sourceValue);\n }\n }\n }\n\n return output;\n}\n\n/**\n * Clone a value for merging.\n */\nfunction cloneValue(value: unknown): unknown {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n if (value instanceof Date) {\n return new Date(value.getTime());\n }\n\n if (Array.isArray(value)) {\n return value.map((v) => cloneValue(v));\n }\n\n if (value.constructor === Object) {\n const cloned: Record<string, unknown> = {};\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n cloned[key] = cloneValue((value as any)[key]);\n }\n }\n return cloned;\n }\n\n return value;\n}\n","/**\n * Type guard to check if a value is a function.\n *\n * @param value - The value to check\n * @returns true if the value is a function\n *\n * @example\n * ```typescript\n * const value: unknown = () => {};\n * if (isFunction(value)) {\n * value(); // TypeScript knows this is a function\n * }\n * ```\n */\nexport function isFunction(value: unknown): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n","/**\n * Pick specified properties from an object.\n *\n * Creates a new object with only the specified keys.\n *\n * @typeParam T - The object type\n * @typeParam K - The keys to pick\n * @param obj - The source object\n * @param keys - The keys to pick\n * @returns A new object with only the picked keys\n *\n * @example\n * ```typescript\n * const user = { name: 'John', age: 30, city: 'NYC' };\n * const picked = pick(user, ['name', 'age']);\n * // { name: 'John', age: 30 }\n * ```\n */\nexport function pick<T extends object, K extends keyof T>(\n obj: T,\n keys: readonly K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n","/**\n * Omit specified properties from an object.\n *\n * Creates a new object without the specified keys.\n *\n * @typeParam T - The object type\n * @typeParam K - The keys to omit\n * @param obj - The source object\n * @param keys - The keys to omit\n * @returns A new object without the omitted keys\n *\n * @example\n * ```typescript\n * const user = { name: 'John', age: 30, city: 'NYC' };\n * const omitted = omit(user, ['age', 'city']);\n * // { name: 'John' }\n * ```\n */\nexport function omit<T extends object, K extends keyof T>(\n obj: T,\n keys: readonly K[]\n): Omit<T, K> {\n const result = { ...obj } as Omit<T, K>;\n for (const key of keys) {\n delete (result as any)[key];\n }\n return result;\n}\n","/**\n * Identity function that returns its input.\n *\n * Useful as a default selector when no transformation is needed.\n *\n * @typeParam T - The value type\n * @param value - The value to return\n * @returns The same value\n *\n * @example\n * ```typescript\n * const selector = identity;\n * selector(42); // 42\n * selector('hello'); // 'hello'\n * ```\n */\nexport function identity<T>(value: T): T {\n return value;\n}\n","import type { Plugin, Store } from './types.js';\n\n/**\n * Plugin instance with runtime state.\n */\ninterface PluginInstance<TState = unknown> {\n plugin: Plugin<TState>;\n options: unknown;\n}\n\n/**\n * Event handler type.\n */\ntype EventHandler = (data: unknown) => void;\n\n/**\n * Event bus for inter-plugin communication.\n */\nclass EventBus {\n private listeners: Map<string, Set<EventHandler>> = new Map();\n\n /**\n * Subscribe to an event.\n *\n * @param event - Event name\n * @param handler - Event handler\n * @returns Unsubscribe function\n */\n on(event: string, handler: EventHandler): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler);\n\n return () => {\n this.listeners.get(event)?.delete(handler);\n };\n }\n\n /**\n * Emit an event to all subscribers.\n *\n * @param event - Event name\n * @param data - Event data\n */\n emit(event: string, data: unknown): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(data);\n } catch (error) {\n console.error(`Error in ${event} handler:`, error);\n }\n }\n }\n }\n\n /** Clear all listeners. */\n destroy(): void {\n this.listeners.clear();\n }\n}\n\n/**\n * Kernel configuration.\n */\ninterface KernelConfig {\n name?: string;\n devtools?: boolean;\n}\n\n/**\n * Kernel managing plugins and events.\n */\nexport class Kernel {\n plugins: Map<string, PluginInstance<any>> = new Map();\n eventBus: EventBus = new EventBus();\n config: KernelConfig;\n errorHandlers: Set<(error: Error) => void> = new Set();\n private initializing = false;\n\n constructor(config?: KernelConfig) {\n this.config = config || {};\n }\n\n /**\n * Register a plugin.\n *\n * @param plugin - The plugin to register\n * @param options - Plugin options\n * @param store - The store instance\n * @throws {Error} If plugin already registered or dependencies missing\n */\n register<TState>(\n plugin: Plugin<TState>,\n options: unknown,\n store: Store<TState>\n ): void {\n // Validate plugin\n if (!plugin.name || !plugin.version || typeof plugin.install !== 'function') {\n throw new Error('Invalid plugin: must have name, version, and install function');\n }\n\n // Check for duplicate\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin '${plugin.name}' is already registered`);\n }\n\n // Check dependencies\n if (plugin.dependencies) {\n for (const dep of plugin.dependencies) {\n if (!this.plugins.has(dep)) {\n throw new Error(\n `Plugin '${plugin.name}' requires '${dep}' to be registered first`\n );\n }\n }\n }\n\n // Create plugin instance\n const instance: PluginInstance<TState> = {\n plugin,\n options,\n };\n\n // Install plugin\n try {\n plugin.install(store, options);\n } catch (error) {\n throw new Error(`Failed to install plugin '${plugin.name}': ${error}`);\n }\n\n this.plugins.set(plugin.name, instance);\n\n // If not in init phase and plugin has onInit, call it\n if (!this.initializing && plugin.onInit) {\n this.runOnInit(plugin, store);\n }\n }\n\n /**\n * Initialize all plugins.\n *\n * @param store - The store instance\n */\n async initializeAll<TState>(store: Store<TState>): Promise<void> {\n this.initializing = true;\n\n const plugins = Array.from(this.plugins.values());\n\n for (const { plugin } of plugins) {\n if (plugin.onInit) {\n await this.runOnInit(plugin, store);\n }\n }\n\n this.initializing = false;\n }\n\n /**\n * Run plugin's onInit safely.\n */\n private async runOnInit<TState>(plugin: Plugin<TState>, store: Store<TState>): Promise<void> {\n try {\n await plugin.onInit!(store);\n } catch (error) {\n console.error(`Error in ${plugin.name} onInit:`, error);\n }\n }\n\n /**\n * Unregister a plugin.\n *\n * @param name - Plugin name\n */\n async unregister(name: string): Promise<void> {\n const instance = this.plugins.get(name);\n if (!instance) {\n return;\n }\n\n if (instance.plugin.onDestroy) {\n try {\n await instance.plugin.onDestroy();\n } catch (error) {\n console.error(`Error in ${name} onDestroy:`, error);\n }\n }\n\n this.plugins.delete(name);\n }\n\n /**\n * Emit a state change event.\n *\n * @param state - New state\n * @param prevState - Previous state\n */\n emitStateChange<TState>(state: TState, prevState: TState): void {\n this.eventBus.emit('stateChange', { state, prevState });\n\n for (const { plugin } of this.plugins.values()) {\n if (plugin.onStateChange) {\n try {\n plugin.onStateChange(state, prevState);\n } catch (error) {\n console.error(`Error in ${plugin.name} onStateChange:`, error);\n }\n }\n }\n }\n\n /**\n * Emit an error event.\n *\n * @param error - The error\n */\n emitError(error: Error): void {\n this.eventBus.emit('error', error);\n\n for (const { plugin } of this.plugins.values()) {\n if (plugin.onError) {\n try {\n plugin.onError(error);\n } catch (err) {\n console.error(`Error in ${plugin.name} onError:`, err);\n }\n }\n }\n\n for (const handler of this.errorHandlers) {\n try {\n handler(error);\n } catch (err) {\n console.error('Error in error handler:', err);\n }\n }\n }\n\n /**\n * Add an error handler.\n *\n * @param handler - Error handler function\n * @returns Unsubscribe function\n */\n onError(handler: (error: Error) => void): () => void {\n this.errorHandlers.add(handler);\n return () => {\n this.errorHandlers.delete(handler);\n };\n }\n\n /**\n * Subscribe to an event.\n *\n * @param event - Event name\n * @param handler - Event handler\n * @returns Unsubscribe function\n */\n on(event: string, handler: EventHandler): () => void {\n return this.eventBus.on(event, handler);\n }\n\n /** Destroy the kernel and cleanup. */\n async destroy(): Promise<void> {\n const pluginNames = Array.from(this.plugins.keys());\n\n for (const name of pluginNames) {\n await this.unregister(name);\n }\n\n this.eventBus.destroy();\n this.errorHandlers.clear();\n }\n}\n\n/**\n * Create a new kernel.\n *\n * @param config - Kernel configuration\n * @returns A new Kernel instance\n */\nexport function createKernel(config?: KernelConfig): Kernel {\n return new Kernel(config);\n}\n","/**\n * Shared batch context singleton.\n * This ensures that all modules access the same batch context instance.\n * Using module-level variables and functions for maximum bundler compatibility.\n */\n\nimport type { Store } from './types.js';\n\n// Module-level state - these are guaranteed to be singletons\nlet batchDepth = 0;\nconst batchStores = new Set<Store<any>>();\nconst batchManagedStores = new Set<Store<any>>();\n\n/**\n * Check if currently batching.\n */\nexport function isBatching(): boolean {\n return batchDepth > 0;\n}\n\n/**\n * Get current batch depth.\n */\nexport function getBatchDepth(): number {\n return batchDepth;\n}\n\n/**\n * Increment batch depth.\n */\nexport function incrementBatchDepth(): number {\n return ++batchDepth;\n}\n\n/**\n * Decrement batch depth.\n */\nexport function decrementBatchDepth(): number {\n return --batchDepth;\n}\n\n/**\n * Get all batch stores.\n */\nexport function getBatchStores(): Set<Store<any>> {\n return batchStores;\n}\n\n/**\n * Get all managed stores.\n */\nexport function getBatchManagedStores(): Set<Store<any>> {\n return batchManagedStores;\n}\n\n/**\n * Clear all batch stores.\n */\nexport function clearBatchStores(): void {\n batchStores.clear();\n batchManagedStores.clear();\n}\n\n/**\n * Add a store to batch tracking.\n */\nexport function addBatchStore(store: Store<any>): void {\n batchStores.add(store);\n}\n\n/**\n * Add a store to managed tracking.\n */\nexport function addManagedStore(store: Store<any>): void {\n batchManagedStores.add(store);\n}\n\n/**\n * Check if a store is managed.\n */\nexport function isStoreManaged(store: Store<any>): boolean {\n return batchManagedStores.has(store);\n}\n\n// Legacy exports for compatibility\nexport const sharedBatchContext = {\n get depth() { return batchDepth; },\n get stores() { return batchStores; },\n get managedStores() { return batchManagedStores; },\n\n isBatching,\n batch<T>(store: Store<any>, fn: () => T): T {\n const wasAlreadyBatching = isStoreManaged(store);\n\n incrementBatchDepth();\n addBatchStore(store);\n\n // Call beginBatch on the store if it has one and we haven't already\n if (!wasAlreadyBatching && 'beginBatch' in store) {\n (store as any).beginBatch();\n addManagedStore(store);\n }\n\n try {\n const result = fn();\n decrementBatchDepth();\n\n if (getBatchDepth() === 0) {\n // Flush all pending notifications\n for (const s of getBatchManagedStores()) {\n if ('flushNotifications' in s) {\n (s as any).flushNotifications();\n }\n if ('endBatch' in s) {\n (s as any).endBatch();\n }\n }\n clearBatchStores();\n }\n\n return result;\n } catch (error) {\n decrementBatchDepth();\n // Cleanup on error\n if (getBatchDepth() === 0) {\n for (const s of getBatchManagedStores()) {\n if ('endBatch' in s) {\n (s as any).endBatch();\n }\n }\n clearBatchStores();\n }\n throw error;\n }\n },\n};\n\n// Type for BatchContext (legacy)\nexport interface BatchContext {\n depth: number;\n stores: Set<Store<any>>;\n managedStores: Set<Store<any>>;\n isBatching(): boolean;\n batch<T>(store: Store<any>, fn: () => T): T;\n}\n","/**\n * Deep partial type for nested optional properties.\n *\n * @typeParam T - The type to make partially deep\n *\n * @example\n * ```typescript\n * type User = {\n * name: string;\n * profile: { age: number; city: string; };\n * };\n *\n * const partial: DeepPartial<User> = {\n * name: 'John',\n * profile: { age: 30 } // city is optional\n * };\n * ```\n */\nexport type DeepPartial<T> = T extends object\n ? {\n [P in keyof T]?: DeepPartial<T[P]>;\n }\n : T;\n\n/**\n * Action function that receives state and optional arguments, returning a partial state update.\n *\n * @typeParam TState - The store state type\n * @typeParam TArgs - The action argument types tuple\n *\n * @example\n * ```typescript\n * type CounterAction = Action<{ count: number }, [number: number]>;\n *\n * const incrementBy: CounterAction = (state, amount) => ({\n * count: state.count + amount\n * });\n * ```\n */\nexport type Action<TState, TArgs extends unknown[] = []> = (\n state: TState,\n ...args: TArgs\n) => Partial<TState> | Promise<Partial<TState>>;\n\n/**\n * Collection of actions indexed by name.\n *\n * @typeParam TState - The store state type\n *\n * @example\n * ```typescript\n * const actions: Actions<{ count: number }> = {\n * increment: (state) => ({ count: state.count + 1 }),\n * decrement: (state) => ({ count: state.count - 1 })\n * };\n * ```\n */\nexport type Actions<TState> = Record<string, Action<TState>>;\n\n/**\n * Selector function to extract a slice of state.\n *\n * @typeParam TState - The store state type\n * @typeParam TSelected - The selected value type\n *\n * @example\n * ```typescript\n * const selectCount: Selector<{ count: number; name: string }, number> =\n * (state) => state.count;\n * ```\n */\nexport type Selector<TState, TSelected> = (state: TState) => TSelected;\n\n/**\n * Equality function for comparing two values.\n *\n * @typeParam T - The type to compare\n *\n * @example\n * ```typescript\n * const shallowEquality: EqualityFn<{ a: number }> = (a, b) =>\n * a.a === b.a;\n * ```\n */\nexport type EqualityFn<T> = (a: T, b: T) => boolean;\n\n/**\n * Listener function called when state changes.\n *\n * @typeParam TState - The store state type\n *\n * @example\n * ```typescript\n * const listener: Listener<{ count: number }> = (state, prevState) => {\n * console.log(`Count changed from ${prevState.count} to ${state.count}`);\n * };\n * ```\n */\nexport type Listener<TState> = (state: TState, prevState: TState) => void;\n\n/**\n * Storage interface for persisting state.\n *\n * @example\n * ```typescript\n * const sessionStorage: StorageLike = {\n * getItem: (key) => sessionStorage.getItem(key),\n * setItem: (key, value) => sessionStorage.setItem(key, value),\n * removeItem: (key) => sessionStorage.removeItem(key)\n * };\n * ```\n */\nexport interface StorageLike {\n /** Get an item from storage */\n getItem(key: string): string | null;\n /** Set an item in storage */\n setItem(key: string, value: string): void;\n /** Remove an item from storage */\n removeItem(key: string): void;\n}\n\n/**\n * Store configuration options.\n *\n * @typeParam TState - The store state type\n *\n * @example\n * ```typescript\n * const options: StoreOptions<{ count: number }> = {\n * name: 'Counter',\n * devtools: true\n * };\n * ```\n */\nexport interface StoreOptions<TState> {\n /** Initial state */\n initialState: TState;\n /** Store name for debugging */\n name?: string;\n /** Enable/disable devtools (default: true in development) */\n devtools?: boolean;\n}\n\n/**\n * Plugin interface for extending store functionality.\n *\n * @typeParam TState - The store state type\n *\n * @example\n * ```typescript\n * const loggerPlugin: Plugin<{ count: number }> = {\n * name: 'logger',\n * version: '1.0.0',\n * install(store) {\n * store.subscribe((state) => console.log('State:', state));\n * }\n * };\n * ```\n */\nexport interface Plugin<TState = unknown> {\n /** Unique plugin identifier (kebab-case) */\n name: string;\n /** Semantic version (e.g., \"1.0.0\") */\n version: string;\n /** Other plugins this plugin depends on */\n dependencies?: string[];\n /**\n * Called when plugin is registered.\n *\n * @param store - The store instance\n * @param options - Plugin-specific options\n */\n install: (store: Store<TState>, options?: unknown) => void;\n /**\n * Called after all plugins are installed.\n *\n * @param store - The store instance\n */\n onInit?: (store: Store<TState>) => void | Promise<void>;\n /**\n * Called when plugin is unregistered.\n */\n onDestroy?: () => void | Promise<void>;\n /**\n * Called on state change.\n *\n * @param state - New state\n * @param prevState - Previous state\n */\n onStateChange?: (state: TState, prevState: TState) => void;\n /**\n * Called on error in store.\n *\n * @param error - The error that occurred\n */\n onError?: (error: Error) => void;\n}\n\n/**\n * Store instance with state management methods.\n *\n * @typeParam TState - The store state type\n *\n * @example\n * ```typescript\n * const store: Store<{ count: number }> = createStore({ count: 0 });\n * const state = store.getState(); // { count: 0 }\n * store.setState({ count: 1 });\n * ```\n */\nexport interface Store<TState> {\n /** Get current state snapshot */\n getState(): TState;\n /**\n * Update state with partial object or function.\n *\n * @param partial - Partial state or updater function\n *\n * @example\n * ```typescript\n * store.setState({ count: 10 });\n * store.setState((state) => ({ count: state.count + 1 }));\n * ```\n */\n setState(partial: Partial<TState> | ((state: TState) => Partial<TState>)): void;\n /**\n * Deep merge state.\n *\n * @param partial - Partial state to merge\n *\n * @example\n * ```typescript\n * store.merge({ user: { name: 'John' } });\n * ```\n */\n merge(partial: DeepPartial<TState>): void;\n /** Reset to initial state */\n reset(): void;\n /**\n * Subscribe to state changes.\n *\n * @param listener - Function called on state changes\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * const unsubscribe = store.subscribe((state) => console.log(state));\n * unsubscribe();\n * ```\n */\n subscribe(listener: Listener<TState>): () => void;\n /**\n * Subscribe to state changes with selector.\n *\n * @param selector - Function to extract state slice\n * @param listener - Function called when selected value changes\n * @param equalityFn - Optional custom equality function\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * const unsubscribe = store.subscribe(\n * (state) => state.count,\n * (count) => console.log('Count:', count)\n * );\n * ```\n */\n subscribe<TSelected>(\n selector: Selector<TState, TSelected>,\n listener: Listener<TSelected>,\n equalityFn?: EqualityFn<TSelected>\n ): () => void;\n /**\n * Register a plugin.\n *\n * @param plugin - The plugin to register\n * @param options - Plugin-specific options\n * @returns The store instance for chaining\n *\n * @example\n * ```typescript\n * store.use(persist({ key: 'app' }));\n * ```\n */\n use<TPlugin extends Plugin<TState>>(plugin: TPlugin, options?: unknown): this;\n /** Destroy store and cleanup all resources */\n destroy(): void;\n}\n\n/**\n * Store builder interface for fluent API.\n *\n * @typeParam TState - The store state type\n *\n * @example\n * ```typescript\n * createStore({ count: 0 })\n * .action('increment', (s) => ({ count: s.count + 1 }))\n * .action('decrement', (s) => ({ count: s.count - 1 }));\n * ```\n */\nexport interface StoreBuilder<TState> extends Store<TState> {\n /**\n * Add an action to the store.\n *\n * @param name - Action name\n * @param fn - Action function\n * @returns The builder for chaining\n */\n action<K extends string>(\n name: K,\n fn: Action<TState & Record<K, Action<TState>>>\n ): this;\n}\n\n/**\n * History-enabled store with undo/redo methods.\n */\nexport interface HistoryStore<TState> extends Store<TState> {\n /** Undo last state change */\n undo(): void;\n /** Redo last undone state change */\n redo(): void;\n}\n\n/**\n * Error codes for store errors.\n */\nexport enum StoreErrorCode {\n /** Store was destroyed and cannot be used */\n STORE_DESTROYED = 'STORE_DESTROYED',\n /** Plugin with same name already registered */\n PLUGIN_EXISTS = 'PLUGIN_EXISTS',\n /** Required plugin dependency not found */\n PLUGIN_DEPENDENCY_MISSING = 'PLUGIN_DEPENDENCY_MISSING',\n /** Invalid state update argument */\n INVALID_STATE_UPDATE = 'INVALID_STATE_UPDATE',\n /** Action threw an error */\n ACTION_ERROR = 'ACTION_ERROR',\n}\n\n/**\n * Store error class.\n */\nexport class StoreError extends Error {\n constructor(\n public code: StoreErrorCode,\n message: string\n ) {\n super(message);\n this.name = 'StoreError';\n }\n}\n","import type {\n Actions,\n DeepPartial,\n EqualityFn,\n Listener,\n Plugin,\n Selector,\n Store,\n StoreBuilder,\n StoreErrorCode,\n StoreError,\n StoreOptions,\n} from './types.js';\nimport { deepClone, deepEqual, deepMerge, shallowEqual, isFunction, identity } from './utils/index.js';\nimport { createKernel, type Kernel } from './kernel.js';\nimport { sharedBatchContext as globalBatchContext, type BatchContext } from './batch-context.js';\n\n// Export types\nexport type { Store, StoreBuilder, StoreOptions };\nexport { StoreError, StoreErrorCode } from './types.js';\n\n/**\n * State update function or partial object.\n */\ntype StateUpdate<TState> = Partial<TState> | ((state: TState) => Partial<TState>);\n\n/**\n * Selector subscription with memoization.\n */\ninterface SelectorSubscription<TSelected> {\n value: TSelected;\n listeners: Set<Listener<TSelected>>;\n selector: Selector<any, TSelected>;\n equalityFn: EqualityFn<TSelected>;\n}\n\n/**\n * Internal store implementation.\n */\nclass StoreImpl<TState> implements Store<TState> {\n private state: TState;\n private readonly initialState: TState;\n private listeners: Set<Listener<TState>> = new Set();\n private selectorSubscriptions: Map<Selector<any, any>, SelectorSubscription<any>> = new Map();\n private kernel: Kernel;\n private destroyed = false;\n private batchDepth = 0;\n private pendingNotify = false;\n private queuedState: TState | null = null;\n private queuedPrevState: TState | null = null;\n private actions: Actions<TState> = {};\n\n constructor(initialState: TState, kernel: Kernel) {\n this.state = deepClone(initialState);\n this.initialState = deepClone(initialState);\n this.kernel = kernel;\n\n // Handle errors from kernel\n this.kernel.onError((error) => {\n console.error('Store error:', error);\n });\n }\n\n /** Get current state snapshot. */\n getState(): TState {\n this.checkNotDestroyed();\n return this.state;\n }\n\n /** Update state with partial object or function. */\n setState(partial: StateUpdate<TState>): void {\n this.checkNotDestroyed();\n\n const prevState = this.state;\n const update = typeof partial === 'function' ? (partial as (state: TState) => Partial<TState>)(this.state) : partial;\n this.state = { ...this.state, ...update };\n\n this.notifyOrQueue(this.state, prevState);\n }\n\n /** Deep merge state. */\n merge(partial: DeepPartial<TState>): void {\n this.checkNotDestroyed();\n\n const prevState = this.state;\n this.state = deepMerge(this.state, partial);\n\n this.notifyOrQueue(this.state, prevState);\n }\n\n /** Reset to initial state. */\n reset(): void {\n this.checkNotDestroyed();\n const prevState = this.state;\n this.state = deepClone(this.initialState);\n\n this.notifyOrQueue(this.state, prevState);\n }\n\n /** Subscribe to all state changes. */\n subscribe(listener: Listener<TState>): () => void;\n /** Subscribe with selector. */\n subscribe<TSelected>(\n selector: Selector<TState, TSelected>,\n listener: Listener<TSelected>,\n equalityFn?: EqualityFn<TSelected>\n ): () => void;\n subscribe(arg1: any, arg2?: any, arg3?: any): () => void {\n this.checkNotDestroyed();\n\n // If first arg is a plain function (no selector), it's a simple listener\n if (arg2 === undefined && typeof arg1 === 'function') {\n const listener: Listener<TState> = arg1;\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n // Otherwise, it's a selector-based subscription\n const selector: Selector<TState, any> = arg1;\n const listener: Listener<any> = arg2;\n const equalityFn: EqualityFn<any> = arg3 || shallowEqual;\n\n let subscription = this.selectorSubscriptions.get(selector);\n\n if (!subscription) {\n const initialValue = selector(this.state);\n subscription = {\n value: initialValue,\n listeners: new Set(),\n selector,\n equalityFn,\n };\n this.selectorSubscriptions.set(selector, subscription);\n }\n\n subscription.listeners.add(listener);\n\n return () => {\n const sub = this.selectorSubscriptions.get(selector);\n if (sub) {\n sub.listeners.delete(listener);\n if (sub.listeners.size === 0) {\n this.selectorSubscriptions.delete(selector);\n }\n }\n };\n }\n\n /** Register a plugin. */\n use<TPlugin extends Plugin<TState>>(plugin: TPlugin, options?: unknown): this {\n this.checkNotDestroyed();\n\n this.kernel.register(plugin, options, this);\n\n return this;\n }\n\n /** Destroy store and cleanup. */\n destroy(): void {\n if (this.destroyed) {\n return;\n }\n\n this.destroyed = true;\n this.kernel.destroy();\n this.listeners.clear();\n this.selectorSubscriptions.clear();\n this.actions = {};\n }\n\n /** Add an action (for fluent builder pattern). */\n addAction<K extends string>(name: K, fn: (state: TState, ...args: any[]) => Partial<TState>): this {\n (this.actions as any)[name] = fn;\n return this;\n }\n\n /** Get all actions. */\n getActions(): Actions<TState> {\n return this.actions;\n }\n\n /** Check if store is destroyed. */\n private checkNotDestroyed(): void {\n if (this.destroyed) {\n throw new Error('Cannot use destroyed store');\n }\n }\n\n /** Notify listeners or queue if batching. */\n private notifyOrQueue(state: TState, prevState: TState): void {\n // Check if we're in a global batch context\n const inGlobalBatch = globalBatchContext.isBatching();\n\n if (inGlobalBatch) {\n // Register this store with the global batch context\n const managedStores = globalBatchContext.managedStores;\n if (!managedStores.has(this)) {\n managedStores.add(this);\n }\n }\n\n // Check if either local batching or global batching is active\n if (this.batchDepth > 0 || inGlobalBatch) {\n // Queue notification - only set prevState on first state change\n this.queuedState = state;\n if (!this.pendingNotify) {\n this.queuedPrevState = prevState;\n }\n this.pendingNotify = true;\n } else {\n // Immediate notification\n this.notify(state, prevState);\n }\n }\n\n /** Notify all listeners. */\n private notify(state: TState, prevState: TState): void {\n // Notify state change listeners\n this.kernel.emitStateChange(state, prevState);\n\n // Notify all-state listeners\n for (const listener of this.listeners) {\n try {\n listener(state, prevState);\n } catch (error) {\n this.kernel.emitError(error as Error);\n }\n }\n\n // Notify selector listeners\n for (const subscription of this.selectorSubscriptions.values()) {\n const newValue = subscription.selector(state);\n\n if (!subscription.equalityFn(newValue, subscription.value)) {\n const prevValue = subscription.value;\n subscription.value = newValue;\n\n for (const listener of subscription.listeners) {\n try {\n listener(newValue, prevValue);\n } catch (error) {\n this.kernel.emitError(error as Error);\n }\n }\n }\n }\n }\n\n /** Flush pending notifications (end of batch). */\n flushNotifications(): void {\n if (this.pendingNotify) {\n this.notify(this.queuedState!, this.queuedPrevState!);\n this.pendingNotify = false;\n this.queuedState = null;\n this.queuedPrevState = null;\n }\n }\n\n /** Start batching. */\n beginBatch(): void {\n this.batchDepth++;\n }\n\n /** End batching. */\n endBatch(): void {\n this.batchDepth--;\n if (this.batchDepth === 0) {\n this.flushNotifications();\n }\n }\n}\n\n/**\n * Store builder for fluent API.\n */\nclass StoreBuilderImpl<TState> implements StoreBuilder<TState> {\n private store: StoreImpl<TState>;\n\n constructor(initialState: TState, kernel: Kernel) {\n this.store = new StoreImpl<TState>(initialState, kernel);\n }\n\n getState(): TState {\n return this.store.getState();\n }\n\n setState(partial: StateUpdate<TState>): void {\n this.store.setState(partial);\n }\n\n merge(partial: DeepPartial<TState>): void {\n this.store.merge(partial);\n }\n\n reset(): void {\n this.store.reset();\n }\n\n subscribe(listener: Listener<TState>): () => void;\n subscribe<TSelected>(\n selector: Selector<TState, TSelected>,\n listener: Listener<TSelected>,\n equalityFn?: EqualityFn<TSelected>\n ): () => void;\n subscribe(arg1: any, arg2?: any, arg3?: any): () => void {\n if (arg2 === undefined) {\n // It's a simple listener (no selector)\n return this.store.subscribe(arg1);\n } else {\n // It's a selector-based subscription\n return this.store.subscribe(arg1, arg2, arg3);\n }\n }\n\n use<TPlugin extends Plugin<TState>>(plugin: TPlugin, options?: unknown): this {\n this.store.use(plugin, options);\n return this;\n }\n\n destroy(): void {\n this.store.destroy();\n }\n\n action<K extends string>(\n name: K,\n fn: (state: any, ...args: any[]) => Partial<any>\n ): this {\n this.store.addAction(name, fn);\n\n // Also create a wrapper method on the builder\n (this as any)[name] = (...args: any[]) => {\n const currentState = this.getState();\n const result = fn(currentState, ...args);\n if (result instanceof Promise) {\n return result.then((partial) => {\n this.setState(partial);\n return partial;\n });\n }\n this.setState(result);\n return result;\n };\n\n return this;\n }\n\n /** Add action (internal use). */\n addAction<K extends string>(name: K, fn: (state: TState, ...args: any[]) => Partial<TState>): this {\n this.store.addAction(name, fn);\n return this;\n }\n\n /** Get actions (internal use). */\n getActions(): Actions<TState> {\n return this.store.getActions();\n }\n\n /** Start batching. */\n beginBatch(): void {\n this.store.beginBatch();\n }\n\n /** End batching. */\n endBatch(): void {\n this.store.endBatch();\n }\n\n /** Flush pending notifications. */\n flushNotifications(): void {\n this.store.flushNotifications();\n }\n}\n\n/**\n * Create a new reactive store.\n *\n * Supports three action definition styles:\n * - **Inline**: Actions defined within state object (functions starting with $)\n * - **Separate**: Actions passed as second argument\n * - **Fluent**: Actions added via `.action()` method\n *\n * @typeParam TState - The type of the store state\n * @param initialState - Initial state object, may include inline actions\n * @param actions - Optional separate actions object\n * @returns A new Store instance\n *\n * @example\n * ```typescript\n * // Style A: Inline actions (prefix with $)\n * const store = createStore({\n * count: 0,\n * $increment: (state) => ({ count: state.count + 1 }),\n * });\n *\n * // Style B: Separate actions\n * const store = createStore(\n * { count: 0 },\n * { increment: (state) => ({ count: state.count + 1 }) }\n * );\n *\n * // Style C: Fluent builder\n * const store = createStore({ count: 0 })\n * .action('increment', (state) => ({ count: state.count + 1 }));\n * ```\n */\nexport function createStore<TState>(\n initialState: TState,\n actions?: Actions<TState>\n): Store<TState> {\n const kernel = createKernel({ name: 'store' });\n\n // Handle inline actions (properties starting with $)\n const state: any = { ...initialState };\n const extractedActions: Actions<TState> = {};\n\n for (const key in state) {\n if (isFunction(state[key]) && key.startsWith('$')) {\n extractedActions[key.substring(1)] = state[key];\n delete state[key];\n }\n }\n\n // Merge with provided actions\n const allActions = { ...extractedActions, ...actions };\n\n // Create builder for fluent API or regular store\n const builder = new StoreBuilderImpl<TState>(state as TState, kernel);\n\n // Add actions if provided\n if (allActions) {\n for (const [name, fn] of Object.entries(allActions)) {\n // Cast to proper type - Actions can return Promise but we handle that separately\n builder.addAction(name, fn as any);\n }\n }\n\n // Wrap actions to work with state\n const actionList = builder.getActions();\n\n for (const [name, fn] of Object.entries(actionList)) {\n (builder as any)[name] = (...args: any[]) => {\n const currentState = builder.getState();\n // Call the action with state and args\n const result = (fn as any)(currentState, ...args);\n if (result instanceof Promise) {\n return result.then((partial) => {\n builder.setState(partial);\n return partial;\n });\n }\n builder.setState(result);\n return result;\n };\n }\n\n // Initialize plugins\n /* c8 ignore start */\n kernel.initializeAll(builder).catch((error) => {\n console.error('Error initializing plugins:', error);\n });\n /* c8 ignore stop */\n\n // Return a Proxy that forwards unknown calls to the underlying store\n // This allows plugins to add methods that are accessible on the builder\n return new Proxy(builder, {\n get(target, prop) {\n if (prop in target) {\n return (target as any)[prop];\n }\n // Forward to the underlying store\n const store = (target as any).store;\n if (store && typeof store[prop] === 'function') {\n return store[prop].bind(store);\n }\n if (store && prop in store) {\n return store[prop];\n }\n return undefined;\n },\n set(target, prop, value) {\n if (prop in target || typeof value === 'function') {\n (target as any)[prop] = value;\n return true;\n }\n // Forward to the underlying store\n const store = (target as any).store;\n /* c8 ignore start */\n if (store) {\n store[prop] = value;\n return true;\n }\n return false;\n /* c8 ignore stop */\n },\n }) as Store<TState>;\n}\n\n/**\n * Batch multiple state updates into a single notification.\n *\n * @param fn - Function containing state updates\n * @returns The return value of fn\n *\n * @example\n * ```typescript\n * import { batch } from '@oxog/state';\n *\n * // Without batch - 3 re-renders\n * store.setState({ a: 1 });\n * store.setState({ b: 2 });\n * store.setState({ c: 3 });\n *\n * // With batch - 1 re-render\n * batch(() => {\n * store.setState({ a: 1 });\n * store.setState({ b: 2 });\n * store.setState({ c: 3 });\n * });\n * ```\n */\nexport function batch<T>(fn: () => T): T {\n // This is a placeholder - in real implementation, we'd need to track which store\n // For now, batch happens per-store\n return fn();\n}\n\n// Export for testing\nexport { StoreImpl, BatchContext };\n","import { useSyncExternalStore, useDebugValue, useEffect, useRef } from 'react';\nimport type { EqualityFn, Selector, Store } from './types.js';\nimport { identity } from './utils/identity.js';\nimport { shallowEqual } from './utils/shallow-equal.js';\nimport { createStore as _createStore } from './store.js';\n\n// Global type declarations\ndeclare const window: {\n __REDUX_DEVTOOLS_EXTENSION__?: any;\n} | undefined;\n\n/**\n * React hook for subscribing to store state changes.\n *\n * Uses useSyncExternalStore for optimal performance and SSR compatibility.\n *\n * @typeParam TState - The store state type\n * @typeParam TSelected - The selected state type\n * @param store - The store instance\n * @param selector - Optional selector to extract a slice of state\n * @param equalityFn - Optional custom equality function\n * @returns The selected state slice\n *\n * @example\n * ```typescript\n * import { createStore, useStore } from '@oxog/state';\n *\n * const store = createStore({\n * count: 0,\n * name: 'John',\n * increment: (state) => ({ count: state.count + 1 }),\n * });\n *\n * function Counter() {\n * // Select entire state\n * const state = useStore(store);\n *\n * // Select with selector\n * const count = useStore(store, (state) => state.count);\n *\n * // Select with custom equality check\n * const user = useStore(\n * store,\n * (state) => state.user,\n * (a, b) => a?.id === b?.id\n * );\n *\n * // Select action\n * const increment = useStore(store, (state) => state.increment);\n *\n * return (\n * <button onClick={increment}>\n * Count: {count}\n * </button>\n * );\n * }\n * ```\n */\nexport function useStore<TState, TSelected = TState>(\n store: Store<TState>,\n selector: Selector<TState, TSelected> = identity as any,\n equalityFn: EqualityFn<TSelected> = shallowEqual as any\n): TSelected {\n // Get the latest selector\n const selectorRef = useRef(selector);\n const equalityFnRef = useRef(equalityFn);\n const storeRef = useRef(store);\n\n // Update refs if they change\n if (selectorRef.current !== selector) {\n selectorRef.current = selector;\n }\n if (equalityFnRef.current !== equalityFn) {\n equalityFnRef.current = equalityFn;\n }\n if (storeRef.current !== store) {\n storeRef.current = store;\n }\n\n // Get current snapshot\n const getSnapshot = () => {\n const state = storeRef.current.getState();\n return selectorRef.current(state);\n };\n\n // Get previous snapshot for comparison\n const getServerSnapshot = getSnapshot;\n\n // Subscribe to store changes\n const subscribe = (callback: () => void) => {\n const unsubscribe = storeRef.current.subscribe(\n (state) => selectorRef.current(state),\n (value, prevValue) => {\n if (!equalityFnRef.current(value, prevValue)) {\n callback();\n }\n },\n equalityFnRef.current\n );\n return unsubscribe;\n };\n\n // Use sync external store\n const selectedState = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n\n // Debug value for React DevTools\n useDebugValue(selectedState);\n\n return selectedState;\n}\n\n/**\n * React hook for creating and using a store.\n *\n * Creates a store on first render and destroys it on unmount.\n *\n * @typeParam TState - The store state type\n * @param initialState - The initial state\n * @returns The store instance\n *\n * @example\n * ```typescript\n * import { useCreateStore } from '@oxog/state';\n *\n * function Component() {\n * const store = useCreateStore({ count: 0 });\n * const count = useStore(store, (s) => s.count);\n *\n * return <div>{count}</div>;\n * }\n * ```\n */\nexport function useCreateStore<TState>(initialState: TState): Store<TState> {\n const storeRef = useRef<Store<TState>>();\n\n if (storeRef.current === undefined) {\n storeRef.current = _createStore(initialState);\n }\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (storeRef.current) {\n storeRef.current.destroy();\n storeRef.current = undefined;\n }\n };\n }, []);\n\n return storeRef.current!;\n}\n\n/**\n * React hook for getting a store action.\n *\n * Convenience hook for selecting action functions from a store.\n *\n * @typeParam TState - The store state type\n * @typeParam TAction - The action type\n * @param store - The store instance\n * @param actionName - The name of the action\n * @returns The action function\n *\n * @example\n * ```typescript\n * import { createStore, useAction } from '@oxog/state';\n *\n * const store = createStore({\n * count: 0,\n * increment: (state) => ({ count: state.count + 1 }),\n * decrement: (state) => ({ count: state.count - 1 }),\n * });\n *\n * function Counter() {\n * const increment = useAction(store, 'increment');\n * const decrement = useAction(store, 'decrement');\n * const count = useStore(store, (s) => s.count);\n *\n * return (\n * <>\n * <button onClick={decrement}>-</button>\n * <span>{count}</span>\n * <button onClick={increment}>+</button>\n * </>\n * );\n * }\n * ```\n */\nexport function useAction<TState, TAction extends (...args: any[]) => any>(\n store: Store<TState>,\n actionName: string\n): TAction {\n // Actions are methods on the store instance, not properties of state\n const storeRef = useRef(store);\n if (storeRef.current !== store) {\n storeRef.current = store;\n }\n\n // Get the action from the store instance\n const action = (storeRef.current as any)[actionName];\n\n // Return a stable reference to the action\n const actionRef = useRef(action);\n if (actionRef.current !== action) {\n actionRef.current = action;\n }\n\n return actionRef.current as TAction;\n}\n","/**\n * Persist plugin - Save and restore state from storage.\n *\n * Automatically persists state to localStorage, sessionStorage, or any\n * storage implementation. State is restored on store creation.\n *\n * @example\n * ```typescript\n * import { createStore, persist } from '@oxog/state';\n *\n * const store = createStore({ count: 0, user: null })\n * .use(persist({\n * key: 'my-app',\n * storage: localStorage,\n * whitelist: ['count'] // Only persist count\n * }));\n * ```\n */\n\n// Global type declarations\ninterface Storage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n clear?: () => void;\n length?: number;\n key?: (index: number) => string | null;\n}\n\ndeclare const window: {\n localStorage: Storage;\n sessionStorage: Storage;\n} | undefined;\n\nimport type { Plugin, Store } from '../types.js';\nimport type { PersistOptions, StorageLike } from './types.js';\nimport { pick, omit } from '../utils/index.js';\n\n/**\n * Default localStorage implementation.\n */\nconst defaultStorage: StorageLike = {\n getItem: (key: string): string | null => {\n /* c8 ignore next */\n if (typeof window === 'undefined') return null;\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n },\n setItem: (key: string, value: string): void => {\n /* c8 ignore next */\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, value);\n } catch {\n // Ignore storage errors\n }\n },\n /* c8 ignore next 3 */\n removeItem: (): void => {\n // No-op: removeItem is not used by persist plugin\n },\n};\n\n/**\n * SessionStorage implementation.\n */\nexport const sessionStorage: StorageLike = {\n getItem: (key: string): string | null => {\n /* c8 ignore next */\n if (typeof window === 'undefined') return null;\n try {\n return window.sessionStorage.getItem(key);\n } catch {\n return null;\n }\n },\n setItem: (key: string, value: string): void => {\n /* c8 ignore next */\n if (typeof window === 'undefined') return;\n try {\n window.sessionStorage.setItem(key, value);\n } catch {\n // Ignore storage errors\n }\n },\n removeItem: (key: string): void => {\n /* c8 ignore next */\n if (typeof window === 'undefined') return;\n try {\n window.sessionStorage.removeItem(key);\n } catch {\n // Ignore storage errors\n }\n },\n};\n\n/**\n * Create a persist plugin.\n *\n * @param options - Plugin options\n * @returns A persist plugin\n *\n * @example\n * ```typescript\n * import { persist, sessionStorage } from '@oxog/state';\n *\n * // Using localStorage (default)\n * const store = createStore({ count: 0 })\n * .use(persist({ key: 'counter' }));\n *\n * // Using sessionStorage\n * const store = createStore({ count: 0 })\n * .use(persist({ key: 'counter', storage: sessionStorage }));\n *\n * // With whitelist\n * const store = createStore({ count: 0, temp: '' })\n * .use(persist({ key: 'app', whitelist: ['count'] }));\n *\n * // With blacklist\n * const store = createStore({ count: 0, temp: '' })\n * .use(persist({ key: 'app', blacklist: ['temp'] }));\n * ```\n */\nexport function persist<TState>(options: PersistOptions<TState>): Plugin<TState> {\n const { key, storage = defaultStorage, whitelist, blacklist } = options;\n\n return {\n name: 'persist',\n version: '1.0.0',\n install(store: Store<TState>) {\n // Hydrate state from storage\n try {\n const saved = storage.getItem(key);\n if (saved) {\n const parsed = JSON.parse(saved);\n store.merge(parsed as any);\n }\n } catch (error) {\n console.error(`Failed to hydrate state from '${key}':`, error);\n }\n\n // Subscribe to state changes and persist\n store.subscribe((state) => {\n try {\n let toSave = state;\n\n if (whitelist) {\n toSave = pick(state as any, whitelist) as any;\n } else if (blacklist) {\n toSave = omit(state as any, blacklist) as any;\n }\n\n storage.setItem(key, JSON.stringify(toSave));\n } catch (error) {\n console.error(`Failed to persist state to '${key}':`, error);\n }\n });\n },\n onDestroy() {\n // Optionally clear storage on destroy\n // storage.removeItem(key);\n },\n };\n}\n\n/**\n * Create a custom storage from a storage object.\n *\n * @param storage - Any object with getItem, setItem, removeItem\n * @returns A StorageLike interface\n *\n * @example\n * ```typescript\n * import { createStorage } from '@oxog/state';\n *\n * const AsyncStorage = createStorage({\n * getItem: async (key) => await AsyncStorage.getItem(key),\n * setItem: async (key, value) => await AsyncStorage.setItem(key, value),\n * removeItem: async (key) => await AsyncStorage.removeItem(key),\n * });\n * ```\n */\nexport function createStorage(storage: StorageLike): StorageLike {\n return storage;\n}\n","/**\n * Devtools plugin - Redux DevTools integration.\n *\n * Connects to Redux DevTools extension for debugging state changes.\n *\n * @example\n * ```typescript\n * import { createStore, devtools } from '@oxog/state';\n *\n * const store = createStore({ count: 0 })\n * .use(devtools({ name: 'Counter' }));\n * ```\n */\n\n// Global type declarations\ndeclare const window: {\n __REDUX_DEVTOOLS_EXTENSION__?: DevtoolsExtension;\n} | undefined;\n\nimport type { Plugin, Store } from '../types.js';\nimport type { DevtoolsOptions } from './types.js';\n\n/**\n * DevTools connection interface.\n */\ninterface DevtoolsConnection {\n init(state: unknown): void;\n send(action: unknown, state: unknown): void;\n subscribe(callback: (message: any) => void): void;\n}\n\n/**\n * DevTools extension interface.\n */\ninterface DevtoolsExtension {\n connect(options: { name?: string }): DevtoolsConnection;\n}\n\n/**\n * Check if DevTools extension is available.\n */\nfunction hasDevtools(): boolean {\n return typeof window !== 'undefined' && !!window.__REDUX_DEVTOOLS_EXTENSION__;\n}\n\n/**\n * Get DevTools extension.\n */\nfunction getDevtools(): DevtoolsExtension | null {\n /* c8 ignore next 2 */\n if (typeof window === 'undefined') return null;\n return window.__REDUX_DEVTOOLS_EXTENSION__ || null;\n}\n\n/**\n * Create a DevTools plugin.\n *\n * @param options - Plugin options\n * @returns A DevTools plugin\n *\n * @example\n * ```typescript\n * import { devtools } from '@oxog/state';\n *\n * // Basic usage\n * const store = createStore({ count: 0 })\n * .use(devtools({ name: 'My Store' }));\n *\n * // Disabled in production\n * const store = createStore({ count: 0 })\n * .use(devtools({\n * name: 'My Store',\n * enabled: process.env.NODE_ENV === 'development'\n * }));\n * ```\n */\nexport function devtools<TState>(options: DevtoolsOptions = {}): Plugin<TState> {\n const { name = 'OxogState Store', enabled = true, maxAge = 50 } = options;\n let connection: DevtoolsConnection | null = null;\n let history: { state: TState; action: string }[] = [];\n\n return {\n name: 'devtools',\n version: '1.0.0',\n install(store: Store<TState>) {\n // Check if DevTools is available\n if (!enabled || !hasDevtools()) {\n return;\n }\n\n const extension = getDevtools();\n /* c8 ignore next */\n if (!extension) return;\n\n // Connect to DevTools\n connection = extension.connect({ name });\n\n // Initialize with current state\n connection.init(store.getState());\n\n // Subscribe to state changes\n store.subscribe((state, prevState) => {\n /* c8 ignore next */\n if (!connection) return;\n\n // Add to history\n history.push({ state, action: 'UPDATE' });\n if (history.length > maxAge) {\n history.shift();\n }\n\n // Send to DevTools\n connection.send({ type: 'UPDATE', prev: prevState }, state);\n });\n\n // Subscribe to DevTools messages\n connection.subscribe((message: any) => {\n if (message.type === 'DISPATCH' && message.payload) {\n switch (message.payload.type) {\n case 'JUMP_TO_STATE':\n case 'JUMP_TO_ACTION': {\n // Time travel\n const index = message.payload.type === 'JUMP_TO_ACTION'\n ? history.findIndex((h) => h.action === message.payload.action)\n : message.payload.index;\n\n if (index >= 0 && index < history.length) {\n const entry = history[index];\n if (entry) {\n store.setState(entry.state as any);\n }\n }\n break;\n }\n case 'COMMIT': {\n // Commit current state\n connection!.init(store.getState());\n history = [];\n break;\n }\n case 'ROLLBACK': {\n // Rollback to previous state\n if (history.length > 1) {\n const previous = history[history.length - 2];\n if (previous) {\n store.setState(previous.state as any);\n }\n }\n break;\n }\n case 'RESET': {\n // Reset to initial state\n store.reset();\n break;\n }\n }\n }\n });\n },\n onDestroy() {\n // Cleanup connection\n connection = null;\n history = [];\n },\n };\n}\n","/**\n * History plugin - Undo/redo functionality.\n *\n * Tracks state changes and provides undo/redo methods.\n *\n * @example\n * ```typescript\n * import { createStore, history } from '@oxog/state';\n *\n * const store = createStore({ count: 0 })\n * .use(history({ limit: 100 }));\n *\n * // Now store has undo() and redo() methods\n * store.setState({ count: 1 });\n * store.setState({ count: 2 });\n * store.undo(); // { count: 1 }\n * store.redo(); // { count: 2 }\n * ```\n */\n\nimport type { Plugin, Store } from '../types.js';\nimport type { HistoryOptions, HistoryStore } from './types.js';\n\n/**\n * History state for tracking past and future states.\n */\ninterface HistoryState<TState> {\n past: TState[];\n present: TState;\n future: TState[];\n}\n\n/**\n * Create a history plugin.\n *\n * @param options - Plugin options\n * @returns A history plugin\n *\n * @example\n * ```typescript\n * import { history } from '@oxog/state';\n *\n * // Default options\n * const store = createStore({ count: 0 })\n * .use(history());\n *\n * // Custom limit\n * const store = createStore({ count: 0 })\n * .use(history({ limit: 50 }));\n *\n * // Track specific keys only\n * const store = createStore({ count: 0, temp: '' })\n * .use(history({ keys: ['count'] }));\n * ```\n */\nexport function history<TState>(options: HistoryOptions<TState> = {}): Plugin<TState> {\n const { limit = 50, keys } = options;\n let historyState: HistoryState<TState> | null = null;\n let currentStore: Store<TState> | null = null;\n let isInternalUpdate = false; // Flag to skip recording during undo/redo\n\n return {\n name: 'history',\n version: '1.0.0',\n install(store: Store<TState>) {\n currentStore = store;\n\n // Initialize history\n historyState = {\n past: [],\n present: store.getState(),\n future: [],\n };\n\n // Subscribe to state changes\n store.subscribe((state) => {\n if (!historyState || isInternalUpdate) return;\n\n const previousPresent = historyState.present;\n const newPresent = state;\n\n // Check if state actually changed (respect keys if provided)\n let hasChanged = true;\n if (keys && keys.length > 0) {\n hasChanged = keys.some((key) => {\n return (previousPresent as any)[key] !== (newPresent as any)[key];\n });\n } else {\n hasChanged = previousPresent !== newPresent;\n }\n\n if (!hasChanged) return;\n\n // Add to history\n historyState.past.push(previousPresent);\n if (historyState.past.length > limit) {\n historyState.past.shift();\n }\n historyState.present = newPresent;\n historyState.future = [];\n });\n\n // Add undo method\n (store as any).undo = () => {\n if (!historyState || historyState.past.length === 0) return;\n\n const previous = historyState.past.pop()!;\n historyState.future.push(historyState.present);\n historyState.present = previous;\n\n // Update store state without triggering history recording\n isInternalUpdate = true;\n store.setState(previous as any);\n isInternalUpdate = false;\n };\n\n // Add redo method\n (store as any).redo = () => {\n if (!historyState || historyState.future.length === 0) return;\n\n const next = historyState.future.pop()!;\n historyState.past.push(historyState.present);\n historyState.present = next;\n\n // Update store state without triggering history recording\n isInternalUpdate = true;\n store.setState(next as any);\n isInternalUpdate = false;\n };\n\n // Add clear history method\n (store as any).clearHistory = () => {\n /* c8 ignore next */\n if (!historyState) return;\n historyState.past = [];\n historyState.future = [];\n };\n\n // Add canUndo method\n (store as any).canUndo = () => {\n return historyState !== null && historyState.past.length > 0;\n };\n\n // Add canRedo method\n (store as any).canRedo = () => {\n return historyState !== null && historyState.future.length > 0;\n };\n },\n onDestroy() {\n historyState = null;\n currentStore = null;\n },\n };\n}\n\n/**\n * Check if a store has history capabilities.\n *\n * @param store - The store to check\n * @returns true if store supports undo/redo\n *\n * @example\n * ```typescript\n * import { hasHistory } from '@oxog/state';\n *\n * if (hasHistory(store)) {\n * store.undo();\n * store.redo();\n * }\n * ```\n */\nexport function hasHistory<TState>(store: Store<TState>): store is HistoryStore<TState> {\n return (\n typeof (store as any).undo === 'function' &&\n typeof (store as any).redo === 'function'\n );\n}\n","/**\n * Sync plugin - Cross-tab state synchronization.\n *\n * Synchronizes state across browser tabs using BroadcastChannel API.\n *\n * @example\n * ```typescript\n * import { createStore, sync } from '@oxog/state';\n *\n * const store = createStore({ count: 0 })\n * .use(sync({ channel: 'my-app-state' }));\n *\n * // State changes will sync across all tabs\n * ```\n */\n\n// Global type declarations\ndeclare const BroadcastChannel: {\n prototype: BroadcastChannel;\n new (name: string): BroadcastChannel;\n} | undefined;\n\ninterface MessageEvent {\n data: any;\n type: string;\n target: EventTarget | null;\n srcElement: EventTarget | null;\n currentTarget: EventTarget | null;\n bubbles: boolean;\n cancelable: boolean;\n}\n\ninterface BroadcastChannel {\n name: string;\n postMessage(message: any): void;\n close(): void;\n onmessage: ((event: MessageEvent) => void) | null;\n onmessageerror: ((event: MessageEvent) => void) | null;\n addEventListener(\n type: 'message' | 'messageerror',\n listener: (event: MessageEvent) => void\n ): void;\n removeEventListener(\n type: 'message' | 'messageerror',\n listener: (event: MessageEvent) => void\n ): void;\n}\n\nimport type { Plugin, Store } from '../types.js';\nimport type { SyncOptions } from './types.js';\n\n/**\n * Create a sync plugin.\n *\n * @param options - Plugin options\n * @returns A sync plugin\n *\n * @example\n * ```typescript\n * import { sync } from '@oxog/state';\n *\n * // Default channel name\n * const store = createStore({ count: 0 })\n * .use(sync());\n *\n * // Custom channel name\n * const store = createStore({ count: 0 })\n * .use(sync({ channel: 'my-app' }));\n * ```\n */\nexport function sync<TState>(options: SyncOptions = {}): Plugin<TState> {\n const { channel = 'oxog-state' } = options;\n let broadcastChannel: BroadcastChannel | null = null;\n let currentStore: Store<TState> | null = null;\n let isLocalUpdate = false;\n\n return {\n name: 'sync',\n version: '1.0.0',\n install(store: Store<TState>) {\n currentStore = store;\n\n // Check if BroadcastChannel is available\n if (typeof BroadcastChannel === 'undefined') {\n console.warn('BroadcastChannel is not supported in this environment');\n return;\n }\n\n // Create broadcast channel\n broadcastChannel = new BroadcastChannel(channel);\n\n // Listen for messages from other tabs\n broadcastChannel.onmessage = (event: MessageEvent) => {\n if (!isLocalUpdate) {\n try {\n // Apply the remote state update\n store.setState(event.data as any);\n } catch (error) {\n console.error('Error applying sync state:', error);\n }\n }\n };\n\n // Note: State change broadcasting happens via onInit\n // Regular state changes don't need to be broadcast as they\n // are synchronized through the BroadcastChannel onmessage handler\n },\n\n onInit() {\n // Broadcast initial state to other tabs\n if (broadcastChannel && currentStore) {\n isLocalUpdate = true;\n try {\n broadcastChannel.postMessage(currentStore.getState());\n } catch (error) {\n console.error('Error broadcasting initial state:', error);\n }\n isLocalUpdate = false;\n }\n },\n\n onDestroy() {\n // Close the broadcast channel\n if (broadcastChannel) {\n broadcastChannel.close();\n broadcastChannel = null;\n }\n currentStore = null;\n },\n };\n}\n\n/**\n * Manually trigger a sync broadcast.\n *\n * @param store - The store to sync\n * @param channel - The channel to broadcast on\n *\n * @example\n * ```typescript\n * import { createStore, sync, triggerSync } from '@oxog/state';\n *\n * const store = createStore({ count: 0 })\n * .use(sync({ channel: 'my-app' }));\n *\n * // Manually trigger sync\n * triggerSync(store, 'my-app');\n * ```\n */\nexport function triggerSync<TState>(store: Store<TState>, channel = 'oxog-state'): void {\n if (typeof BroadcastChannel === 'undefined') {\n console.warn('BroadcastChannel is not supported in this environment');\n return;\n }\n\n const broadcastChannel = new BroadcastChannel(channel);\n broadcastChannel.postMessage(store.getState());\n broadcastChannel.close();\n}\n","/**\n * Immer plugin - Immutable updates with mutable syntax.\n *\n * Uses Proxy to enable writing immutable state updates with mutable syntax.\n *\n * @example\n * ```typescript\n * import { createStore, immer } from '@oxog/state';\n *\n * const store = createStore({\n * users: [{ name: 'John', age: 30 }]\n * }).use(immer());\n *\n * // Now you can write mutable-style updates\n * store.setState((draft) => {\n * draft.users[0].age = 31; // Mutate draft directly\n * });\n * ```\n */\n\nimport type { Plugin, Store } from '../types.js';\n\n/**\n * Create a proxy that tracks mutations.\n *\n * @param base - The base object\n * @param copies - Map of copied objects\n * @returns A proxied object\n */\nfunction createProxy<T extends object>(base: T, copies: Map<any, any>): T {\n /* c8 ignore next */\n return new Proxy(base || {}, {\n get(target, key) {\n const value = (target as any)[key];\n\n // If value is an object, return a proxy\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n // Check if we have a copy\n if (copies.has(value)) {\n return createProxy(copies.get(value), copies);\n }\n return createProxy(value, copies);\n }\n\n // Return primitive or array as-is\n return value;\n },\n\n set(target, key, value) {\n // Ensure we have a copy of the target\n if (!copies.has(target)) {\n copies.set(target, { ...target });\n }\n\n const copy = copies.get(target);\n copy[key] = value;\n return true;\n },\n\n deleteProperty(target, key) {\n if (!copies.has(target)) {\n copies.set(target, { ...target });\n }\n\n const copy = copies.get(target);\n delete copy[key];\n return true;\n },\n }) as T;\n}\n\n/**\n * Finalize the result by applying all copies.\n *\n * @param base - The base object\n * @param copies - Map of copied objects\n * @returns The final result (always a new object if base was in copies)\n */\nfunction finalize<T>(base: T, copies: Map<any, any>): T {\n if (!copies.has(base)) {\n // No copies were made, but we still need to ensure we don't return the same reference\n // Deep clone to ensure immutability\n return deepClone(base);\n }\n\n const copy = copies.get(base) as any;\n\n // Recursively finalize nested objects\n for (const key in copy) {\n if (Object.prototype.hasOwnProperty.call(copy, key)) {\n const value = copy[key];\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n copy[key] = finalize(value, copies);\n }\n }\n }\n\n return copy as T;\n}\n\n/**\n * Deep clone a value (simplified version for immer plugin).\n */\nfunction deepClone<T>(value: T): T {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((v) => deepClone(v)) as T;\n }\n\n const cloned = {} as T;\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n (cloned as any)[key] = deepClone((value as any)[key]);\n }\n }\n return cloned;\n}\n\n/**\n * Produce a new state by applying mutations to a draft.\n *\n * @param base - The base state\n * @param recipe - The mutation function\n * @returns The new state\n *\n * @example\n * ```typescript\n * import { produce } from '@oxog/state';\n *\n * const state = { users: [{ name: 'John', age: 30 }] };\n * const newState = produce(state, (draft) => {\n * draft.users[0].age = 31;\n * });\n * ```\n */\nexport function produce<T>(base: T, recipe: (draft: T) => void): T {\n const copies = new Map<any, any>();\n const draft = createProxy(base as object, copies) as T;\n\n recipe(draft);\n\n return finalize(base as object, copies) as T;\n}\n\n/**\n * Create an immer plugin.\n *\n * @returns An immer plugin\n *\n * @example\n * ```typescript\n * import { createStore, immer } from '@oxog/state';\n *\n * const store = createStore({\n * items: [{ id: 1, name: 'Item 1' }]\n * }).use(immer());\n *\n * // Now setState can accept a mutable recipe function\n * store.setState((draft) => {\n * draft.items[0].name = 'Updated Item';\n * draft.items.push({ id: 2, name: 'Item 2' });\n * });\n * ```\n */\nexport function immer<TState>(): Plugin<TState> {\n return {\n name: 'immer',\n version: '1.0.0',\n install(store: Store<TState>) {\n // Wrap setState to support recipe functions\n const originalSetState = store.setState.bind(store);\n\n store.setState = (update: any) => {\n if (typeof update === 'function') {\n // Assume this is a recipe function\n const newState = produce(store.getState(), update);\n originalSetState(newState as any);\n } else {\n originalSetState(update);\n }\n };\n },\n };\n}\n","/**\n * Selector plugin - Computed/derived values.\n *\n * Define computed values that automatically update when dependencies change.\n *\n * @example\n * ```typescript\n * import { createStore, selector } from '@oxog/state';\n *\n * const store = createStore({\n * items: [],\n * filter: 'all',\n * })\n * .use(selector({\n * // Computed: filtered items\n * filteredItems: (state) => {\n * if (state.filter === 'all') return state.items;\n * return state.items.filter((item: any) => item.status === state.filter);\n * },\n * // Computed: item count\n * itemCount: (state) => state.items.length,\n * }));\n *\n * // Access computed values\n * const state = store.getState();\n * console.log(state.filteredItems); // Computed value\n * ```\n */\n\nimport type { Plugin, Store } from '../types.js';\nimport type { SelectorOptions } from './types.js';\n\n/**\n * Create a selector plugin for computed values.\n *\n * @param options - Plugin options with selectors\n * @returns A selector plugin\n *\n * @example\n * ```typescript\n * import { selector } from '@oxog/state';\n *\n * const store = createStore({\n * items: [{ price: 10 }, { price: 20 }],\n * taxRate: 0.1,\n * })\n * .use(selector({\n * // Computed total\n * total: (state) =>\n * state.items.reduce((sum: number, item: any) => sum + item.price, 0),\n *\n * // Computed total with tax\n * totalWithTax: (state) => {\n * const total = state.items.reduce((sum: number, item: any) => sum + item.price, 0);\n * return total * (1 + state.taxRate);\n * },\n * }));\n * ```\n */\nexport function selector<TState>(options: SelectorOptions<TState>): Plugin<TState> {\n const { selectors } = options;\n\n return {\n name: 'selector',\n version: '1.0.0',\n install(store: Store<TState>) {\n // Save original getState before overriding\n const originalGetState = store.getState.bind(store);\n\n // Cache for computed values\n const cache = new Map<string, { value: any; state: any }>();\n\n // Computed state proxy\n const computedState = new Proxy({} as object, {\n get(_, prop: string) {\n const selectorFn = selectors[prop as keyof TState];\n\n if (selectorFn) {\n const currentState = originalGetState();\n const cacheKey = prop;\n\n // Check cache\n const cached = cache.get(cacheKey);\n if (cached && cached.state === currentState) {\n return cached.value;\n }\n\n // Compute value\n const value = selectorFn(currentState);\n cache.set(cacheKey, { value, state: currentState });\n return value;\n }\n\n // Return regular state value\n return (originalGetState() as any)[prop];\n },\n }) as TState;\n\n // Override getState to return computed state proxy\n store.getState = () => computedState;\n\n // Clear cache on state change\n store.subscribe(() => {\n cache.clear();\n });\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/deep-clone.ts","../src/utils/deep-equal.ts","../src/utils/shallow-equal.ts","../src/utils/deep-merge.ts","../src/utils/is-function.ts","../src/utils/pick.ts","../src/utils/omit.ts","../src/utils/identity.ts","../src/utils/index.ts","../src/kernel.ts","../src/batch-context.ts","../src/types.ts","../src/store.ts","../src/index.ts","../src/react.ts","../src/subscribe.ts","../src/computed.ts","../src/slices.ts","../src/federation.ts","../src/plugins/persist.ts","../src/plugins/devtools.ts","../src/plugins/history.ts","../src/plugins/sync.ts","../src/plugins/immer.ts","../src/plugins/selector.ts","../src/plugins/logger.ts","../src/plugins/effects.ts","../src/plugins/validate.ts","../src/testing.ts","../src/compat/middleware.ts"],"names":["StoreErrorCode","listener","selector","delay","state","computed","createDebounced","history","deepClone","createStore"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Deep clone a value, creating copies of nested objects and arrays.\n *\n * Handles:\n * - Primitives (returned as-is)\n * - null and undefined (returned as-is)\n * - Date objects\n * - Arrays\n * - Plain objects\n * - Circular references\n * - Other objects (returned as-is, not cloned)\n *\n * @typeParam T - The type to clone\n * @param value - The value to clone\n * @param seen - Internal map for tracking circular references\n * @returns A deep clone of the value\n *\n * @example\n * ```typescript\n * const original = { a: 1, b: { c: 2 } };\n * const cloned = deepClone(original);\n * cloned.b.c = 3;\n * console.log(original.b.c); // 2 (unchanged)\n * ```\n */\nexport function deepClone<T>(value: T, seen?: WeakMap<object, unknown>): T {\n // Primitives, null, undefined - return as-is\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Date - create new Date instance\n if (value instanceof Date) {\n return new Date(value.getTime()) as T;\n }\n\n // Handle circular references\n if (!seen) {\n seen = new WeakMap();\n }\n if (seen.has(value)) {\n return seen.get(value) as T;\n }\n seen.set(value, value);\n\n // Array - map and recursively clone\n if (Array.isArray(value)) {\n const cloned = [] as unknown as T;\n seen.set(value, cloned);\n (value as unknown[]).forEach((item, index) => {\n (cloned as unknown[])[index] = deepClone(item, seen);\n });\n return cloned;\n }\n\n // Plain object - create new object and clone properties\n if (value.constructor === Object) {\n const cloned = {} as T;\n seen.set(value, cloned);\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n (cloned as any)[key] = deepClone((value as any)[key], seen);\n }\n }\n return cloned;\n }\n\n // For other objects (classes, etc.), return as-is\n // This handles RegExp, Map, Set, and custom classes\n return value;\n}\n","/**\n * Deep equality check for two values.\n *\n * Recursively compares objects and arrays.\n * Uses Object.is for primitive comparison.\n *\n * @param a - First value\n * @param b - Second value\n * @returns true if values are deeply equal\n *\n * @example\n * ```typescript\n * deepEqual(1, 1); // true\n * deepEqual({ a: { b: 1 } }, { a: { b: 1 } }); // true\n * deepEqual({ a: { b: 1 } }, { a: { b: 2 } }); // false\n * deepEqual([1, 2], [1, 2]); // true\n * deepEqual([1, 2], [1, 2, 3]); // false\n * ```\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n // Object.is handles NaN and -0/+0 correctly\n if (Object.is(a, b)) {\n return true;\n }\n\n // If either is null or not an object, not equal\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') {\n return false;\n }\n\n // Array comparison\n if (Array.isArray(a) !== Array.isArray(b)) {\n return false;\n }\n\n if (Array.isArray(a)) {\n const arrB = b as unknown[];\n if (a.length !== arrB.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], arrB[i])) {\n return false;\n }\n }\n return true;\n }\n\n // Object comparison\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n for (const key of keysA) {\n if (\n !Object.prototype.hasOwnProperty.call(b, key) ||\n !deepEqual((a as any)[key], (b as any)[key])\n ) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * Shallow equality check for two values.\n *\n * Uses Object.is for comparison, which handles NaN correctly\n * and distinguishes between +0 and -0.\n *\n * @param a - First value\n * @param b - Second value\n * @returns true if values are shallowly equal\n *\n * @example\n * ```typescript\n * shallowEqual(1, 1); // true\n * shallowEqual({ a: 1 }, { a: 1 }); // true\n * shallowEqual({ a: 1 }, { a: 2 }); // false\n * shallowEqual(NaN, NaN); // true\n * ```\n */\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n // Object.is handles NaN and -0/+0 correctly\n if (Object.is(a, b)) {\n return true;\n }\n\n // If either is not an object (or is null), not equal\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\n return false;\n }\n\n // Compare keys\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !Object.is((a as any)[key], (b as any)[key])) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * Deep merge a partial object into a target object.\n *\n * Creates a new object with nested objects merged recursively.\n * Arrays are replaced, not merged.\n *\n * @typeParam T - The target type\n * @param target - The target object\n * @param source - The partial source to merge\n * @returns A new merged object\n *\n * @example\n * ```typescript\n * const target = { a: 1, b: { c: 2, d: 3 } };\n * const source = { b: { c: 10 }, e: 4 };\n * const merged = deepMerge(target, source);\n * // { a: 1, b: { c: 10, d: 3 }, e: 4 }\n * ```\n */\n\nimport type { DeepPartial } from '../types.js';\nimport { deepClone } from './deep-clone.js';\n\nexport function deepMerge<T>(target: T, source: Partial<T> | DeepPartial<T>): T {\n if (source === null) {\n return target;\n }\n if (typeof source !== 'object') {\n return source as T;\n }\n\n // Deep clone target to avoid reference issues with Date objects\n const output = deepClone(target) as any;\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = (source as any)[key];\n const targetValue = output[key];\n\n // Date objects - clone and replace\n if (sourceValue instanceof Date) {\n output[key] = new Date(sourceValue.getTime());\n continue;\n }\n\n // Both are plain objects (but not arrays) - recursively merge\n if (\n sourceValue !== null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n !(sourceValue instanceof Date) &&\n targetValue !== null &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue) &&\n !(targetValue instanceof Date)\n ) {\n output[key] = deepMerge(targetValue, sourceValue as any);\n } else {\n // Replace with cloned value\n output[key] = cloneValue(sourceValue);\n }\n }\n }\n\n return output;\n}\n\n/**\n * Clone a value for merging.\n */\nfunction cloneValue(value: unknown): unknown {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n if (value instanceof Date) {\n return new Date(value.getTime());\n }\n\n if (Array.isArray(value)) {\n return value.map((v) => cloneValue(v));\n }\n\n if (value.constructor === Object) {\n const cloned: Record<string, unknown> = {};\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n cloned[key] = cloneValue((value as any)[key]);\n }\n }\n return cloned;\n }\n\n return value;\n}\n","/**\n * Type guard to check if a value is a function.\n *\n * @param value - The value to check\n * @returns true if the value is a function\n *\n * @example\n * ```typescript\n * const value: unknown = () => {};\n * if (isFunction(value)) {\n * value(); // TypeScript knows this is a function\n * }\n * ```\n */\nexport function isFunction(value: unknown): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n","/**\n * Pick specified properties from an object.\n *\n * Creates a new object with only the specified keys.\n *\n * @typeParam T - The object type\n * @typeParam K - The keys to pick\n * @param obj - The source object\n * @param keys - The keys to pick\n * @returns A new object with only the picked keys\n *\n * @example\n * ```typescript\n * const user = { name: 'John', age: 30, city: 'NYC' };\n * const picked = pick(user, ['name', 'age']);\n * // { name: 'John', age: 30 }\n * ```\n */\nexport function pick<T extends object, K extends keyof T>(\n obj: T,\n keys: readonly K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n","/**\n * Omit specified properties from an object.\n *\n * Creates a new object without the specified keys.\n *\n * @typeParam T - The object type\n * @typeParam K - The keys to omit\n * @param obj - The source object\n * @param keys - The keys to omit\n * @returns A new object without the omitted keys\n *\n * @example\n * ```typescript\n * const user = { name: 'John', age: 30, city: 'NYC' };\n * const omitted = omit(user, ['age', 'city']);\n * // { name: 'John' }\n * ```\n */\nexport function omit<T extends object, K extends keyof T>(\n obj: T,\n keys: readonly K[]\n): Omit<T, K> {\n const result = { ...obj } as Omit<T, K>;\n for (const key of keys) {\n delete (result as any)[key];\n }\n return result;\n}\n","/**\n * Identity function that returns its input.\n *\n * Useful as a default selector when no transformation is needed.\n *\n * @typeParam T - The value type\n * @param value - The value to return\n * @returns The same value\n *\n * @example\n * ```typescript\n * const selector = identity;\n * selector(42); // 42\n * selector('hello'); // 'hello'\n * ```\n */\nexport function identity<T>(value: T): T {\n return value;\n}\n","/**\n * Utility functions for @oxog/state.\n *\n * @example\n * ```typescript\n * import {\n * deepClone,\n * deepEqual,\n * shallowEqual,\n * deepMerge,\n * isFunction,\n * pick,\n * omit,\n * identity\n * } from '@oxog/state';\n * ```\n */\n\nexport { deepClone } from './deep-clone.js';\nexport { deepEqual } from './deep-equal.js';\nexport { shallowEqual } from './shallow-equal.js';\nexport { deepMerge } from './deep-merge.js';\nexport { isFunction } from './is-function.js';\nexport { pick } from './pick.js';\nexport { omit } from './omit.js';\nexport { identity } from './identity.js';\n","import type { Plugin, Store } from './types.js';\n\n/**\n * Plugin instance with runtime state.\n */\ninterface PluginInstance<TState = unknown> {\n plugin: Plugin<TState>;\n options: unknown;\n}\n\n/**\n * Event handler type.\n */\ntype EventHandler = (data: unknown) => void;\n\n/**\n * Event bus for inter-plugin communication.\n */\nclass EventBus {\n private listeners: Map<string, Set<EventHandler>> = new Map();\n\n /**\n * Subscribe to an event.\n *\n * @param event - Event name\n * @param handler - Event handler\n * @returns Unsubscribe function\n */\n on(event: string, handler: EventHandler): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler);\n\n return () => {\n this.listeners.get(event)?.delete(handler);\n };\n }\n\n /**\n * Emit an event to all subscribers.\n *\n * @param event - Event name\n * @param data - Event data\n */\n emit(event: string, data: unknown): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(data);\n } catch (error) {\n console.error(`Error in ${event} handler:`, error);\n }\n }\n }\n }\n\n /** Clear all listeners. */\n destroy(): void {\n this.listeners.clear();\n }\n}\n\n/**\n * Kernel configuration.\n */\ninterface KernelConfig {\n name?: string;\n devtools?: boolean;\n}\n\n/**\n * Kernel managing plugins and events.\n */\nexport class Kernel {\n plugins: Map<string, PluginInstance<any>> = new Map();\n eventBus: EventBus = new EventBus();\n config: KernelConfig;\n errorHandlers: Set<(error: Error) => void> = new Set();\n private initializing = false;\n\n constructor(config?: KernelConfig) {\n this.config = config || {};\n }\n\n /**\n * Register a plugin.\n *\n * @param plugin - The plugin to register\n * @param options - Plugin options\n * @param store - The store instance\n * @throws {Error} If plugin already registered or dependencies missing\n */\n register<TState>(\n plugin: Plugin<TState>,\n options: unknown,\n store: Store<TState>\n ): void {\n // Validate plugin\n if (!plugin.name || !plugin.version || typeof plugin.install !== 'function') {\n throw new Error('Invalid plugin: must have name, version, and install function');\n }\n\n // Check for duplicate\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin '${plugin.name}' is already registered`);\n }\n\n // Check dependencies\n if (plugin.dependencies) {\n for (const dep of plugin.dependencies) {\n if (!this.plugins.has(dep)) {\n throw new Error(\n `Plugin '${plugin.name}' requires '${dep}' to be registered first`\n );\n }\n }\n }\n\n // Create plugin instance\n const instance: PluginInstance<TState> = {\n plugin,\n options,\n };\n\n // Install plugin\n try {\n plugin.install(store, options);\n } catch (error) {\n throw new Error(`Failed to install plugin '${plugin.name}': ${error}`);\n }\n\n this.plugins.set(plugin.name, instance);\n\n // If not in init phase and plugin has onInit, call it\n if (!this.initializing && plugin.onInit) {\n this.runOnInit(plugin, store);\n }\n }\n\n /**\n * Initialize all plugins.\n *\n * @param store - The store instance\n */\n async initializeAll<TState>(store: Store<TState>): Promise<void> {\n this.initializing = true;\n\n const plugins = Array.from(this.plugins.values());\n\n for (const { plugin } of plugins) {\n if (plugin.onInit) {\n await this.runOnInit(plugin, store);\n }\n }\n\n this.initializing = false;\n }\n\n /**\n * Run plugin's onInit safely.\n */\n private async runOnInit<TState>(plugin: Plugin<TState>, store: Store<TState>): Promise<void> {\n try {\n await plugin.onInit!(store);\n } catch (error) {\n console.error(`Error in ${plugin.name} onInit:`, error);\n }\n }\n\n /**\n * Unregister a plugin.\n *\n * @param name - Plugin name\n */\n async unregister(name: string): Promise<void> {\n const instance = this.plugins.get(name);\n if (!instance) {\n return;\n }\n\n if (instance.plugin.onDestroy) {\n try {\n await instance.plugin.onDestroy();\n } catch (error) {\n console.error(`Error in ${name} onDestroy:`, error);\n }\n }\n\n this.plugins.delete(name);\n }\n\n /**\n * Emit a state change event.\n *\n * @param state - New state\n * @param prevState - Previous state\n */\n emitStateChange<TState>(state: TState, prevState: TState): void {\n this.eventBus.emit('stateChange', { state, prevState });\n\n for (const { plugin } of this.plugins.values()) {\n if (plugin.onStateChange) {\n try {\n plugin.onStateChange(state, prevState);\n } catch (error) {\n console.error(`Error in ${plugin.name} onStateChange:`, error);\n }\n }\n }\n }\n\n /**\n * Emit an error event.\n *\n * @param error - The error\n */\n emitError(error: Error): void {\n this.eventBus.emit('error', error);\n\n for (const { plugin } of this.plugins.values()) {\n if (plugin.onError) {\n try {\n plugin.onError(error);\n } catch (err) {\n console.error(`Error in ${plugin.name} onError:`, err);\n }\n }\n }\n\n for (const handler of this.errorHandlers) {\n try {\n handler(error);\n } catch (err) {\n console.error('Error in error handler:', err);\n }\n }\n }\n\n /**\n * Add an error handler.\n *\n * @param handler - Error handler function\n * @returns Unsubscribe function\n */\n onError(handler: (error: Error) => void): () => void {\n this.errorHandlers.add(handler);\n return () => {\n this.errorHandlers.delete(handler);\n };\n }\n\n /**\n * Subscribe to an event.\n *\n * @param event - Event name\n * @param handler - Event handler\n * @returns Unsubscribe function\n */\n on(event: string, handler: EventHandler): () => void {\n return this.eventBus.on(event, handler);\n }\n\n /** Destroy the kernel and cleanup. */\n async destroy(): Promise<void> {\n const pluginNames = Array.from(this.plugins.keys());\n\n for (const name of pluginNames) {\n await this.unregister(name);\n }\n\n this.eventBus.destroy();\n this.errorHandlers.clear();\n }\n}\n\n/**\n * Create a new kernel.\n *\n * @param config - Kernel configuration\n * @returns A new Kernel instance\n */\nexport function createKernel(config?: KernelConfig): Kernel {\n return new Kernel(config);\n}\n","/**\n * Shared batch context singleton.\n * This ensures that all modules access the same batch context instance.\n * Using module-level variables and functions for maximum bundler compatibility.\n */\n\nimport type { Store } from './types.js';\n\n// Module-level state - these are guaranteed to be singletons\nlet batchDepth = 0;\nconst batchStores = new Set<Store<any>>();\nconst batchManagedStores = new Set<Store<any>>();\n\n/**\n * Check if currently batching.\n */\nexport function isBatching(): boolean {\n return batchDepth > 0;\n}\n\n/**\n * Get current batch depth.\n */\nexport function getBatchDepth(): number {\n return batchDepth;\n}\n\n/**\n * Increment batch depth.\n */\nexport function incrementBatchDepth(): number {\n return ++batchDepth;\n}\n\n/**\n * Decrement batch depth.\n */\nexport function decrementBatchDepth(): number {\n return --batchDepth;\n}\n\n/**\n * Get all batch stores.\n */\nexport function getBatchStores(): Set<Store<any>> {\n return batchStores;\n}\n\n/**\n * Get all managed stores.\n */\nexport function getBatchManagedStores(): Set<Store<any>> {\n return batchManagedStores;\n}\n\n/**\n * Clear all batch stores.\n */\nexport function clearBatchStores(): void {\n batchStores.clear();\n batchManagedStores.clear();\n}\n\n/**\n * Add a store to batch tracking.\n */\nexport function addBatchStore(store: Store<any>): void {\n batchStores.add(store);\n}\n\n/**\n * Add a store to managed tracking.\n */\nexport function addManagedStore(store: Store<any>): void {\n batchManagedStores.add(store);\n}\n\n/**\n * Check if a store is managed.\n */\nexport function isStoreManaged(store: Store<any>): boolean {\n return batchManagedStores.has(store);\n}\n\n// Legacy exports for compatibility\nexport const sharedBatchContext = {\n get depth() { return batchDepth; },\n get stores() { return batchStores; },\n get managedStores() { return batchManagedStores; },\n\n isBatching,\n batch<T>(store: Store<any>, fn: () => T): T {\n const wasAlreadyBatching = isStoreManaged(store);\n\n incrementBatchDepth();\n addBatchStore(store);\n\n // Call beginBatch on the store if it has one and we haven't already\n if (!wasAlreadyBatching && 'beginBatch' in store) {\n (store as any).beginBatch();\n addManagedStore(store);\n }\n\n try {\n const result = fn();\n decrementBatchDepth();\n\n if (getBatchDepth() === 0) {\n // Flush all pending notifications\n for (const s of getBatchManagedStores()) {\n if ('flushNotifications' in s) {\n (s as any).flushNotifications();\n }\n if ('endBatch' in s) {\n (s as any).endBatch();\n }\n }\n clearBatchStores();\n }\n\n return result;\n } catch (error) {\n decrementBatchDepth();\n // Cleanup on error\n if (getBatchDepth() === 0) {\n for (const s of getBatchManagedStores()) {\n if ('endBatch' in s) {\n (s as any).endBatch();\n }\n }\n clearBatchStores();\n }\n throw error;\n }\n },\n};\n\n// Type for BatchContext (legacy)\nexport interface BatchContext {\n depth: number;\n stores: Set<Store<any>>;\n managedStores: Set<Store<any>>;\n isBatching(): boolean;\n batch<T>(store: Store<any>, fn: () => T): T;\n}\n","/**\n * Deep partial type for nested optional properties.\n *\n * @typeParam T - The type to make partially deep\n *\n * @example\n * ```typescript\n * type User = {\n * name: string;\n * profile: { age: number; city: string; };\n * };\n *\n * const partial: DeepPartial<User> = {\n * name: 'John',\n * profile: { age: 30 } // city is optional\n * };\n * ```\n */\nexport type DeepPartial<T> = T extends object\n ? {\n [P in keyof T]?: DeepPartial<T[P]>;\n }\n : T;\n\n/**\n * Action function that receives state and optional arguments, returning a partial state update.\n *\n * @typeParam TState - The store state type\n * @typeParam TArgs - The action argument types tuple\n *\n * @example\n * ```typescript\n * type CounterAction = Action<{ count: number }, [number: number]>;\n *\n * const incrementBy: CounterAction = (state, amount) => ({\n * count: state.count + amount\n * });\n * ```\n */\nexport type Action<TState, TArgs extends unknown[] = []> = (\n state: TState,\n ...args: TArgs\n) => Partial<TState> | Promise<Partial<TState>>;\n\n/**\n * Collection of actions indexed by name.\n *\n * @typeParam TState - The store state type\n *\n * @example\n * ```typescript\n * const actions: Actions<{ count: number }> = {\n * increment: (state) => ({ count: state.count + 1 }),\n * decrement: (state) => ({ count: state.count - 1 })\n * };\n * ```\n */\nexport type Actions<TState> = Record<string, Action<TState>>;\n\n/**\n * Selector function to extract a slice of state.\n *\n * @typeParam TState - The store state type\n * @typeParam TSelected - The selected value type\n *\n * @example\n * ```typescript\n * const selectCount: Selector<{ count: number; name: string }, number> =\n * (state) => state.count;\n * ```\n */\nexport type Selector<TState, TSelected> = (state: TState) => TSelected;\n\n/**\n * Equality function for comparing two values.\n *\n * @typeParam T - The type to compare\n *\n * @example\n * ```typescript\n * const shallowEquality: EqualityFn<{ a: number }> = (a, b) =>\n * a.a === b.a;\n * ```\n */\nexport type EqualityFn<T> = (a: T, b: T) => boolean;\n\n/**\n * Listener function called when state changes.\n *\n * @typeParam TState - The store state type\n *\n * @example\n * ```typescript\n * const listener: Listener<{ count: number }> = (state, prevState) => {\n * console.log(`Count changed from ${prevState.count} to ${state.count}`);\n * };\n * ```\n */\nexport type Listener<TState> = (state: TState, prevState: TState) => void;\n\n/**\n * Storage interface for persisting state.\n *\n * @example\n * ```typescript\n * const sessionStorage: StorageLike = {\n * getItem: (key) => sessionStorage.getItem(key),\n * setItem: (key, value) => sessionStorage.setItem(key, value),\n * removeItem: (key) => sessionStorage.removeItem(key)\n * };\n * ```\n */\nexport interface StorageLike {\n /** Get an item from storage */\n getItem(key: string): string | null;\n /** Set an item in storage */\n setItem(key: string, value: string): void;\n /** Remove an item from storage */\n removeItem(key: string): void;\n}\n\n/**\n * Store configuration options.\n *\n * @typeParam TState - The store state type\n *\n * @example\n * ```typescript\n * const options: StoreOptions<{ count: number }> = {\n * name: 'Counter',\n * devtools: true\n * };\n * ```\n */\nexport interface StoreOptions<TState> {\n /** Initial state */\n initialState: TState;\n /** Store name for debugging */\n name?: string;\n /** Enable/disable devtools (default: true in development) */\n devtools?: boolean;\n}\n\n/**\n * Plugin interface for extending store functionality.\n *\n * @typeParam TState - The store state type\n *\n * @example\n * ```typescript\n * const loggerPlugin: Plugin<{ count: number }> = {\n * name: 'logger',\n * version: '1.0.0',\n * install(store) {\n * store.subscribe((state) => console.log('State:', state));\n * }\n * };\n * ```\n */\nexport interface Plugin<TState = unknown> {\n /** Unique plugin identifier (kebab-case) */\n name: string;\n /** Semantic version (e.g., \"1.0.0\") */\n version: string;\n /** Other plugins this plugin depends on */\n dependencies?: string[];\n /**\n * Called when plugin is registered.\n *\n * @param store - The store instance\n * @param options - Plugin-specific options\n */\n install: (store: Store<TState>, options?: unknown) => void;\n /**\n * Called after all plugins are installed.\n *\n * @param store - The store instance\n */\n onInit?: (store: Store<TState>) => void | Promise<void>;\n /**\n * Called when plugin is unregistered.\n */\n onDestroy?: () => void | Promise<void>;\n /**\n * Called on state change.\n *\n * @param state - New state\n * @param prevState - Previous state\n */\n onStateChange?: (state: TState, prevState: TState) => void;\n /**\n * Called on error in store.\n *\n * @param error - The error that occurred\n */\n onError?: (error: Error) => void;\n}\n\n/**\n * Store instance with state management methods.\n *\n * @typeParam TState - The store state type\n *\n * @example\n * ```typescript\n * const store: Store<{ count: number }> = createStore({ count: 0 });\n * const state = store.getState(); // { count: 0 }\n * store.setState({ count: 1 });\n * ```\n */\nexport interface Store<TState> {\n /** Get current state snapshot */\n getState(): TState;\n /**\n * Update state with partial object or function.\n *\n * @param partial - Partial state or updater function\n *\n * @example\n * ```typescript\n * store.setState({ count: 10 });\n * store.setState((state) => ({ count: state.count + 1 }));\n * ```\n */\n setState(partial: Partial<TState> | ((state: TState) => Partial<TState>)): void;\n /**\n * Deep merge state.\n *\n * @param partial - Partial state to merge\n *\n * @example\n * ```typescript\n * store.merge({ user: { name: 'John' } });\n * ```\n */\n merge(partial: DeepPartial<TState>): void;\n /** Reset to initial state */\n reset(): void;\n /**\n * Subscribe to state changes.\n *\n * @param listener - Function called on state changes\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * const unsubscribe = store.subscribe((state) => console.log(state));\n * unsubscribe();\n * ```\n */\n subscribe(listener: Listener<TState>): () => void;\n /**\n * Subscribe to state changes with selector.\n *\n * @param selector - Function to extract state slice\n * @param listener - Function called when selected value changes\n * @param equalityFn - Optional custom equality function\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * const unsubscribe = store.subscribe(\n * (state) => state.count,\n * (count) => console.log('Count:', count)\n * );\n * ```\n */\n subscribe<TSelected>(\n selector: Selector<TState, TSelected>,\n listener: Listener<TSelected>,\n equalityFn?: EqualityFn<TSelected>\n ): () => void;\n /**\n * Register a plugin.\n *\n * @param plugin - The plugin to register\n * @param options - Plugin-specific options\n * @returns The store instance for chaining\n *\n * @example\n * ```typescript\n * store.use(persist({ key: 'app' }));\n * ```\n */\n use<TPlugin extends Plugin<TState>>(plugin: TPlugin, options?: unknown): this;\n /** Destroy store and cleanup all resources */\n destroy(): void;\n}\n\n/**\n * Store builder interface for fluent API.\n *\n * @typeParam TState - The store state type\n *\n * @example\n * ```typescript\n * createStore({ count: 0 })\n * .action('increment', (s) => ({ count: s.count + 1 }))\n * .action('decrement', (s) => ({ count: s.count - 1 }));\n * ```\n */\nexport interface StoreBuilder<TState> extends Store<TState> {\n /**\n * Add an action to the store.\n *\n * @param name - Action name\n * @param fn - Action function\n * @returns The builder for chaining\n */\n action<K extends string>(\n name: K,\n fn: Action<TState & Record<K, Action<TState>>>\n ): this;\n}\n\n/**\n * History-enabled store with undo/redo methods.\n */\nexport interface HistoryStore<TState> extends Store<TState> {\n /** Undo last state change */\n undo(): void;\n /** Redo last undone state change */\n redo(): void;\n}\n\n/**\n * Error codes for store errors.\n */\nexport enum StoreErrorCode {\n /** Store was destroyed and cannot be used */\n STORE_DESTROYED = 'STORE_DESTROYED',\n /** Plugin with same name already registered */\n PLUGIN_EXISTS = 'PLUGIN_EXISTS',\n /** Required plugin dependency not found */\n PLUGIN_DEPENDENCY_MISSING = 'PLUGIN_DEPENDENCY_MISSING',\n /** Invalid state update argument */\n INVALID_STATE_UPDATE = 'INVALID_STATE_UPDATE',\n /** Action threw an error */\n ACTION_ERROR = 'ACTION_ERROR',\n}\n\n/**\n * Store error class.\n */\nexport class StoreError extends Error {\n constructor(\n public code: StoreErrorCode,\n message: string\n ) {\n super(message);\n this.name = 'StoreError';\n }\n}\n","import type {\n Actions,\n DeepPartial,\n EqualityFn,\n Listener,\n Plugin,\n Selector,\n Store,\n StoreBuilder,\n StoreErrorCode,\n StoreError,\n StoreOptions,\n} from './types.js';\nimport { deepClone, deepEqual, deepMerge, shallowEqual, isFunction, identity } from './utils/index.js';\nimport { createKernel, type Kernel } from './kernel.js';\nimport { sharedBatchContext as globalBatchContext, type BatchContext } from './batch-context.js';\n\n// Export types\nexport type { Store, StoreBuilder, StoreOptions };\nexport { StoreError, StoreErrorCode } from './types.js';\n\n/**\n * State update function or partial object.\n */\ntype StateUpdate<TState> = Partial<TState> | ((state: TState) => Partial<TState>);\n\n/**\n * Selector subscription with memoization.\n */\ninterface SelectorSubscription<TSelected> {\n value: TSelected;\n listeners: Set<Listener<TSelected>>;\n selector: Selector<any, TSelected>;\n equalityFn: EqualityFn<TSelected>;\n}\n\n/**\n * Internal store implementation.\n */\nclass StoreImpl<TState> implements Store<TState> {\n private state: TState;\n private readonly initialState: TState;\n private listeners: Set<Listener<TState>> = new Set();\n private selectorSubscriptions: Map<Selector<any, any>, SelectorSubscription<any>> = new Map();\n private kernel: Kernel;\n private destroyed = false;\n private batchDepth = 0;\n private pendingNotify = false;\n private queuedState: TState | null = null;\n private queuedPrevState: TState | null = null;\n private actions: Actions<TState> = {};\n\n constructor(initialState: TState, kernel: Kernel) {\n this.state = deepClone(initialState);\n this.initialState = deepClone(initialState);\n this.kernel = kernel;\n\n // Handle errors from kernel\n this.kernel.onError((error) => {\n console.error('Store error:', error);\n });\n }\n\n /** Get current state snapshot. */\n getState(): TState {\n this.checkNotDestroyed();\n return this.state;\n }\n\n /** Update state with partial object or function. */\n setState(partial: StateUpdate<TState>): void {\n this.checkNotDestroyed();\n\n const prevState = this.state;\n const update = typeof partial === 'function' ? (partial as (state: TState) => Partial<TState>)(this.state) : partial;\n this.state = { ...this.state, ...update };\n\n this.notifyOrQueue(this.state, prevState);\n }\n\n /** Deep merge state. */\n merge(partial: DeepPartial<TState>): void {\n this.checkNotDestroyed();\n\n const prevState = this.state;\n this.state = deepMerge(this.state, partial);\n\n this.notifyOrQueue(this.state, prevState);\n }\n\n /** Reset to initial state. */\n reset(): void {\n this.checkNotDestroyed();\n const prevState = this.state;\n this.state = deepClone(this.initialState);\n\n this.notifyOrQueue(this.state, prevState);\n }\n\n /** Subscribe to all state changes. */\n subscribe(listener: Listener<TState>): () => void;\n /** Subscribe with selector. */\n subscribe<TSelected>(\n selector: Selector<TState, TSelected>,\n listener: Listener<TSelected>,\n equalityFn?: EqualityFn<TSelected>\n ): () => void;\n subscribe(arg1: any, arg2?: any, arg3?: any): () => void {\n this.checkNotDestroyed();\n\n // If first arg is a plain function (no selector), it's a simple listener\n if (arg2 === undefined && typeof arg1 === 'function') {\n const listener: Listener<TState> = arg1;\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n // Otherwise, it's a selector-based subscription\n const selector: Selector<TState, any> = arg1;\n const listener: Listener<any> = arg2;\n const equalityFn: EqualityFn<any> = arg3 || shallowEqual;\n\n let subscription = this.selectorSubscriptions.get(selector);\n\n if (!subscription) {\n const initialValue = selector(this.state);\n subscription = {\n value: initialValue,\n listeners: new Set(),\n selector,\n equalityFn,\n };\n this.selectorSubscriptions.set(selector, subscription);\n }\n\n subscription.listeners.add(listener);\n\n return () => {\n const sub = this.selectorSubscriptions.get(selector);\n if (sub) {\n sub.listeners.delete(listener);\n if (sub.listeners.size === 0) {\n this.selectorSubscriptions.delete(selector);\n }\n }\n };\n }\n\n /** Register a plugin. */\n use<TPlugin extends Plugin<TState>>(plugin: TPlugin, options?: unknown): this {\n this.checkNotDestroyed();\n\n this.kernel.register(plugin, options, this);\n\n return this;\n }\n\n /** Destroy store and cleanup. */\n destroy(): void {\n if (this.destroyed) {\n return;\n }\n\n this.destroyed = true;\n this.kernel.destroy();\n this.listeners.clear();\n this.selectorSubscriptions.clear();\n this.actions = {};\n }\n\n /** Add an action (for fluent builder pattern). */\n addAction<K extends string>(name: K, fn: (state: TState, ...args: any[]) => Partial<TState>): this {\n (this.actions as any)[name] = fn;\n return this;\n }\n\n /** Get all actions. */\n getActions(): Actions<TState> {\n return this.actions;\n }\n\n /** Check if store is destroyed. */\n private checkNotDestroyed(): void {\n if (this.destroyed) {\n throw new Error('Cannot use destroyed store');\n }\n }\n\n /** Notify listeners or queue if batching. */\n private notifyOrQueue(state: TState, prevState: TState): void {\n // Check if we're in a global batch context\n const inGlobalBatch = globalBatchContext.isBatching();\n\n if (inGlobalBatch) {\n // Register this store with the global batch context\n const managedStores = globalBatchContext.managedStores;\n if (!managedStores.has(this)) {\n managedStores.add(this);\n }\n }\n\n // Check if either local batching or global batching is active\n if (this.batchDepth > 0 || inGlobalBatch) {\n // Queue notification - only set prevState on first state change\n this.queuedState = state;\n if (!this.pendingNotify) {\n this.queuedPrevState = prevState;\n }\n this.pendingNotify = true;\n } else {\n // Immediate notification\n this.notify(state, prevState);\n }\n }\n\n /** Notify all listeners. */\n private notify(state: TState, prevState: TState): void {\n // Notify state change listeners\n this.kernel.emitStateChange(state, prevState);\n\n // Notify all-state listeners\n for (const listener of this.listeners) {\n try {\n listener(state, prevState);\n } catch (error) {\n this.kernel.emitError(error as Error);\n }\n }\n\n // Notify selector listeners\n for (const subscription of this.selectorSubscriptions.values()) {\n const newValue = subscription.selector(state);\n\n if (!subscription.equalityFn(newValue, subscription.value)) {\n const prevValue = subscription.value;\n subscription.value = newValue;\n\n for (const listener of subscription.listeners) {\n try {\n listener(newValue, prevValue);\n } catch (error) {\n this.kernel.emitError(error as Error);\n }\n }\n }\n }\n }\n\n /** Flush pending notifications (end of batch). */\n flushNotifications(): void {\n if (this.pendingNotify) {\n this.notify(this.queuedState!, this.queuedPrevState!);\n this.pendingNotify = false;\n this.queuedState = null;\n this.queuedPrevState = null;\n }\n }\n\n /** Start batching. */\n beginBatch(): void {\n this.batchDepth++;\n }\n\n /** End batching. */\n endBatch(): void {\n this.batchDepth--;\n if (this.batchDepth === 0) {\n this.flushNotifications();\n }\n }\n}\n\n/**\n * Store builder for fluent API.\n */\nclass StoreBuilderImpl<TState> implements StoreBuilder<TState> {\n private store: StoreImpl<TState>;\n\n constructor(initialState: TState, kernel: Kernel) {\n this.store = new StoreImpl<TState>(initialState, kernel);\n }\n\n getState(): TState {\n return this.store.getState();\n }\n\n setState(partial: StateUpdate<TState>): void {\n this.store.setState(partial);\n }\n\n merge(partial: DeepPartial<TState>): void {\n this.store.merge(partial);\n }\n\n reset(): void {\n this.store.reset();\n }\n\n subscribe(listener: Listener<TState>): () => void;\n subscribe<TSelected>(\n selector: Selector<TState, TSelected>,\n listener: Listener<TSelected>,\n equalityFn?: EqualityFn<TSelected>\n ): () => void;\n subscribe(arg1: any, arg2?: any, arg3?: any): () => void {\n if (arg2 === undefined) {\n // It's a simple listener (no selector)\n return this.store.subscribe(arg1);\n } else {\n // It's a selector-based subscription\n return this.store.subscribe(arg1, arg2, arg3);\n }\n }\n\n use<TPlugin extends Plugin<TState>>(plugin: TPlugin, options?: unknown): this {\n this.store.use(plugin, options);\n return this;\n }\n\n destroy(): void {\n this.store.destroy();\n }\n\n action<K extends string>(\n name: K,\n fn: (state: any, ...args: any[]) => Partial<any>\n ): this {\n this.store.addAction(name, fn);\n\n // Also create a wrapper method on the builder\n (this as any)[name] = (...args: any[]) => {\n const currentState = this.getState();\n const result = fn(currentState, ...args);\n if (result instanceof Promise) {\n return result.then((partial) => {\n this.setState(partial);\n return partial;\n });\n }\n this.setState(result);\n return result;\n };\n\n return this;\n }\n\n /** Add action (internal use). */\n addAction<K extends string>(name: K, fn: (state: TState, ...args: any[]) => Partial<TState>): this {\n this.store.addAction(name, fn);\n return this;\n }\n\n /** Get actions (internal use). */\n getActions(): Actions<TState> {\n return this.store.getActions();\n }\n\n /** Start batching. */\n beginBatch(): void {\n this.store.beginBatch();\n }\n\n /** End batching. */\n endBatch(): void {\n this.store.endBatch();\n }\n\n /** Flush pending notifications. */\n flushNotifications(): void {\n this.store.flushNotifications();\n }\n}\n\n/**\n * Create a new reactive store.\n *\n * Supports three action definition styles:\n * - **Inline**: Actions defined within state object (functions starting with $)\n * - **Separate**: Actions passed as second argument\n * - **Fluent**: Actions added via `.action()` method\n *\n * @typeParam TState - The type of the store state\n * @param initialState - Initial state object, may include inline actions\n * @param actions - Optional separate actions object\n * @returns A new Store instance\n *\n * @example\n * ```typescript\n * // Style A: Inline actions (prefix with $)\n * const store = createStore({\n * count: 0,\n * $increment: (state) => ({ count: state.count + 1 }),\n * });\n *\n * // Style B: Separate actions\n * const store = createStore(\n * { count: 0 },\n * { increment: (state) => ({ count: state.count + 1 }) }\n * );\n *\n * // Style C: Fluent builder\n * const store = createStore({ count: 0 })\n * .action('increment', (state) => ({ count: state.count + 1 }));\n * ```\n */\nexport function createStore<TState>(\n initialState: TState,\n actions?: Actions<TState>\n): Store<TState> {\n const kernel = createKernel({ name: 'store' });\n\n // Handle inline actions (properties starting with $)\n const state: any = { ...initialState };\n const extractedActions: Actions<TState> = {};\n\n for (const key in state) {\n if (isFunction(state[key]) && key.startsWith('$')) {\n extractedActions[key.substring(1)] = state[key];\n delete state[key];\n }\n }\n\n // Merge with provided actions\n const allActions = { ...extractedActions, ...actions };\n\n // Create builder for fluent API or regular store\n const builder = new StoreBuilderImpl<TState>(state as TState, kernel);\n\n // Add actions if provided\n if (allActions) {\n for (const [name, fn] of Object.entries(allActions)) {\n // Cast to proper type - Actions can return Promise but we handle that separately\n builder.addAction(name, fn as any);\n }\n }\n\n // Wrap actions to work with state\n const actionList = builder.getActions();\n\n for (const [name, fn] of Object.entries(actionList)) {\n (builder as any)[name] = (...args: any[]) => {\n const currentState = builder.getState();\n // Call the action with state and args\n const result = (fn as any)(currentState, ...args);\n if (result instanceof Promise) {\n return result.then((partial) => {\n builder.setState(partial);\n return partial;\n });\n }\n builder.setState(result);\n return result;\n };\n }\n\n // Initialize plugins\n /* c8 ignore start */\n kernel.initializeAll(builder).catch((error) => {\n console.error('Error initializing plugins:', error);\n });\n /* c8 ignore stop */\n\n // Return a Proxy that forwards unknown calls to the underlying store\n // This allows plugins to add methods that are accessible on the builder\n return new Proxy(builder, {\n get(target, prop) {\n if (prop in target) {\n return (target as any)[prop];\n }\n // Forward to the underlying store\n const store = (target as any).store;\n if (store && typeof store[prop] === 'function') {\n return store[prop].bind(store);\n }\n if (store && prop in store) {\n return store[prop];\n }\n return undefined;\n },\n set(target, prop, value) {\n if (prop in target || typeof value === 'function') {\n (target as any)[prop] = value;\n return true;\n }\n // Forward to the underlying store\n const store = (target as any).store;\n /* c8 ignore start */\n if (store) {\n store[prop] = value;\n return true;\n }\n return false;\n /* c8 ignore stop */\n },\n }) as Store<TState>;\n}\n\n/**\n * Batch multiple state updates into a single notification.\n *\n * @param fn - Function containing state updates\n * @returns The return value of fn\n *\n * @example\n * ```typescript\n * import { batch } from '@oxog/state';\n *\n * // Without batch - 3 re-renders\n * store.setState({ a: 1 });\n * store.setState({ b: 2 });\n * store.setState({ c: 3 });\n *\n * // With batch - 1 re-render\n * batch(() => {\n * store.setState({ a: 1 });\n * store.setState({ b: 2 });\n * store.setState({ c: 3 });\n * });\n * ```\n */\nexport function batch<T>(fn: () => T): T {\n // This is a placeholder - in real implementation, we'd need to track which store\n // For now, batch happens per-store\n return fn();\n}\n\n// Export for testing\nexport { StoreImpl, BatchContext };\n","/**\n * @oxog/state - Zero-dependency reactive state management for any framework\n *\n * @packageDocumentation\n *\n * @example\n * ```typescript\n * import { createStore, useStore } from '@oxog/state';\n *\n * // Create a store\n * const store = createStore({\n * count: 0,\n * user: null,\n * increment: (state) => ({ count: state.count + 1 }),\n * });\n *\n * // Use in React\n * function Counter() {\n * const count = useStore(store, (s) => s.count);\n * const increment = useStore(store, (s) => s.increment);\n * return <button onClick={increment}>{count}</button>;\n * }\n *\n * // Use in vanilla JS\n * store.subscribe((state) => console.log(state.count));\n * ```\n *\n * @module @oxog/state\n */\n\n// Core\nexport { createStore, batch, StoreError, StoreErrorCode } from './store.js';\nexport type { Store, StoreBuilder, StoreOptions } from './store.js';\n\n// React\nexport {\n useStore,\n useCreateStore,\n useAction,\n useShallow,\n useStoreActions,\n useStoreSelector,\n useTransientSubscribe,\n useSetState,\n} from './react.js';\n\n// Enhanced subscription\nexport {\n subscribeWithOptions,\n createSubscriber,\n subscribeToMany,\n subscribeOnce,\n} from './subscribe.js';\nexport type { SubscribeOptions } from './subscribe.js';\n\n// Computed values\nexport {\n computed,\n combineComputed,\n memoizeSelector,\n} from './computed.js';\nexport type { Computed, ComputedOptions } from './computed.js';\n\n// Slices pattern\nexport {\n createSlice,\n combineSlices,\n createNamespacedSlice,\n extendStore,\n resetSlices,\n} from './slices.js';\nexport type {\n SetSlice,\n GetSlice,\n SliceCreator,\n SliceDefinition,\n} from './slices.js';\n\n// Store Federation\nexport {\n createFederation,\n createFederatedSelector,\n createFederatedComputed,\n waitForFederated,\n} from './federation.js';\nexport type {\n StoreState,\n FederatedState,\n FederationListener,\n TransactionFn,\n FederationOptions,\n Federation,\n} from './federation.js';\n\n// Plugins\nexport {\n persist,\n devtools,\n history,\n sync,\n immer,\n selector,\n logger,\n createLogger,\n effects,\n createEffect,\n createSimpleEffect,\n combineEffects,\n createDebouncedEffect,\n validate,\n createValidator,\n combineValidators,\n createFieldValidator,\n createAsyncValidator,\n sessionStorage,\n createStorage,\n hasHistory,\n triggerSync,\n produce,\n} from './plugins/index.js';\n\n// Types\nexport type {\n Action,\n Actions,\n DeepPartial,\n EqualityFn,\n Listener,\n Plugin,\n Selector,\n StorageLike,\n StoreError as StoreErrorClass,\n} from './types.js';\n\n// Utilities\nexport {\n deepClone,\n deepEqual,\n shallowEqual,\n deepMerge,\n isFunction,\n pick,\n omit,\n identity,\n} from './utils/index.js';\n\n// Plugin types\nexport type {\n PersistOptions,\n DevtoolsOptions,\n HistoryOptions,\n SyncOptions,\n SelectorOptions,\n HistoryStore,\n} from './plugins/types.js';\nexport type { LogLevel, LoggerOptions } from './plugins/logger.js';\nexport type {\n EffectCleanup,\n EffectFn,\n EffectUtils,\n EffectDefinition,\n EffectsOptions,\n} from './plugins/effects.js';\nexport type {\n ValidationError,\n ValidationResult,\n ValidatorFn,\n ValidateOptions,\n ValidationAPI,\n ValidationTiming,\n} from './plugins/validate.js';\n\n// Testing utilities\nexport {\n createMockStorage,\n spyOnStore,\n assertState,\n createTestStore,\n delay,\n flushMicrotasks,\n mockAction,\n snapshot,\n stateDiff,\n} from './testing.js';\nexport type {\n MockStorage,\n StateChange,\n StoreSpy,\n StateAssertion,\n TestStoreOptions,\n TestStore,\n MockedAction,\n} from './testing.js';\n\n// Middleware compatibility\nexport {\n toMiddlewareApi,\n middlewareCompat,\n createWithMiddleware,\n createSimpleMiddleware,\n compose,\n} from './compat/index.js';\nexport type {\n MiddlewareSetState,\n MiddlewareGetState,\n MiddlewareSubscribe,\n MiddlewareStoreApi,\n StateCreatorFn,\n MiddlewareFn,\n ExtractStateType,\n SelectorFn,\n EqualityCheck,\n} from './compat/index.js';\n","import { useSyncExternalStore, useDebugValue, useEffect, useRef, useCallback } from 'react';\nimport type { EqualityFn, Selector, Store } from './types.js';\nimport { identity } from './utils/identity.js';\nimport { shallowEqual } from './utils/shallow-equal.js';\nimport { createStore as _createStore } from './store.js';\n\n// Global type declarations\ndeclare const window: {\n __REDUX_DEVTOOLS_EXTENSION__?: any;\n} | undefined;\n\n/**\n * React hook for subscribing to store state changes.\n *\n * Uses useSyncExternalStore for optimal performance and SSR compatibility.\n *\n * @typeParam TState - The store state type\n * @typeParam TSelected - The selected state type\n * @param store - The store instance\n * @param selector - Optional selector to extract a slice of state\n * @param equalityFn - Optional custom equality function\n * @returns The selected state slice\n *\n * @example\n * ```typescript\n * import { createStore, useStore } from '@oxog/state';\n *\n * const store = createStore({\n * count: 0,\n * name: 'John',\n * increment: (state) => ({ count: state.count + 1 }),\n * });\n *\n * function Counter() {\n * // Select entire state\n * const state = useStore(store);\n *\n * // Select with selector\n * const count = useStore(store, (state) => state.count);\n *\n * // Select with custom equality check\n * const user = useStore(\n * store,\n * (state) => state.user,\n * (a, b) => a?.id === b?.id\n * );\n *\n * // Select action\n * const increment = useStore(store, (state) => state.increment);\n *\n * return (\n * <button onClick={increment}>\n * Count: {count}\n * </button>\n * );\n * }\n * ```\n */\nexport function useStore<TState, TSelected = TState>(\n store: Store<TState>,\n selector: Selector<TState, TSelected> = identity as any,\n equalityFn: EqualityFn<TSelected> = shallowEqual as any\n): TSelected {\n // Get the latest selector\n const selectorRef = useRef(selector);\n const equalityFnRef = useRef(equalityFn);\n const storeRef = useRef(store);\n\n // Update refs if they change\n if (selectorRef.current !== selector) {\n selectorRef.current = selector;\n }\n if (equalityFnRef.current !== equalityFn) {\n equalityFnRef.current = equalityFn;\n }\n if (storeRef.current !== store) {\n storeRef.current = store;\n }\n\n // Get current snapshot\n const getSnapshot = () => {\n const state = storeRef.current.getState();\n return selectorRef.current(state);\n };\n\n // Get previous snapshot for comparison\n const getServerSnapshot = getSnapshot;\n\n // Subscribe to store changes\n const subscribe = (callback: () => void) => {\n const unsubscribe = storeRef.current.subscribe(\n (state) => selectorRef.current(state),\n (value, prevValue) => {\n if (!equalityFnRef.current(value, prevValue)) {\n callback();\n }\n },\n equalityFnRef.current\n );\n return unsubscribe;\n };\n\n // Use sync external store\n const selectedState = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n\n // Debug value for React DevTools\n useDebugValue(selectedState);\n\n return selectedState;\n}\n\n/**\n * React hook for creating and using a store.\n *\n * Creates a store on first render and destroys it on unmount.\n *\n * @typeParam TState - The store state type\n * @param initialState - The initial state\n * @returns The store instance\n *\n * @example\n * ```typescript\n * import { useCreateStore } from '@oxog/state';\n *\n * function Component() {\n * const store = useCreateStore({ count: 0 });\n * const count = useStore(store, (s) => s.count);\n *\n * return <div>{count}</div>;\n * }\n * ```\n */\nexport function useCreateStore<TState>(initialState: TState): Store<TState> {\n const storeRef = useRef<Store<TState>>();\n\n if (storeRef.current === undefined) {\n storeRef.current = _createStore(initialState);\n }\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (storeRef.current) {\n storeRef.current.destroy();\n storeRef.current = undefined;\n }\n };\n }, []);\n\n return storeRef.current!;\n}\n\n/**\n * React hook for getting a store action.\n *\n * Convenience hook for selecting action functions from a store.\n *\n * @typeParam TState - The store state type\n * @typeParam TAction - The action type\n * @param store - The store instance\n * @param actionName - The name of the action\n * @returns The action function\n *\n * @example\n * ```typescript\n * import { createStore, useAction } from '@oxog/state';\n *\n * const store = createStore({\n * count: 0,\n * increment: (state) => ({ count: state.count + 1 }),\n * decrement: (state) => ({ count: state.count - 1 }),\n * });\n *\n * function Counter() {\n * const increment = useAction(store, 'increment');\n * const decrement = useAction(store, 'decrement');\n * const count = useStore(store, (s) => s.count);\n *\n * return (\n * <>\n * <button onClick={decrement}>-</button>\n * <span>{count}</span>\n * <button onClick={increment}>+</button>\n * </>\n * );\n * }\n * ```\n */\nexport function useAction<TState, TAction extends (...args: any[]) => any>(\n store: Store<TState>,\n actionName: string\n): TAction {\n // Actions are methods on the store instance, not properties of state\n const storeRef = useRef(store);\n if (storeRef.current !== store) {\n storeRef.current = store;\n }\n\n // Get the action from the store instance\n const action = (storeRef.current as any)[actionName];\n\n // Return a stable reference to the action\n const actionRef = useRef(action);\n if (actionRef.current !== action) {\n actionRef.current = action;\n }\n\n return actionRef.current as TAction;\n}\n\n/**\n * Create a shallow equality wrapper for selectors.\n *\n * Use this hook to wrap selectors that return objects or arrays\n * and you want to avoid re-renders when the content hasn't changed.\n *\n * @param selector - The selector function to wrap\n * @returns A wrapped selector with shallow equality\n *\n * @example\n * ```typescript\n * import { useStore, useShallow } from '@oxog/state';\n *\n * function UserInfo() {\n * // Without useShallow - re-renders on every state change\n * const { name, email } = useStore(store, s => ({ name: s.name, email: s.email }));\n *\n * // With useShallow - only re-renders when name or email actually changes\n * const { name, email } = useStore(\n * store,\n * useShallow(s => ({ name: s.name, email: s.email }))\n * );\n * }\n * ```\n */\nexport function useShallow<TState, TSelected extends object>(\n selector: Selector<TState, TSelected>\n): Selector<TState, TSelected> {\n const prev = useRef<TSelected>();\n\n return (state: TState): TSelected => {\n const next = selector(state);\n\n if (prev.current === undefined) {\n prev.current = next;\n return next;\n }\n\n // Shallow compare\n if (shallowCompareObjects(prev.current, next)) {\n return prev.current;\n }\n\n prev.current = next;\n return next;\n };\n}\n\n/**\n * Shallow compare two objects.\n */\nfunction shallowCompareObjects<T extends object>(a: T, b: T): boolean {\n if (a === b) return true;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n if (a === null || b === null) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if ((a as any)[key] !== (b as any)[key]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Hook for selecting multiple actions from a store.\n *\n * Returns stable references to actions that don't change between renders.\n *\n * @param store - The store instance\n * @param actionNames - Names of actions to select\n * @returns An object with the selected actions\n *\n * @example\n * ```typescript\n * import { useStoreActions } from '@oxog/state';\n *\n * function Counter() {\n * const { increment, decrement, reset } = useStoreActions(\n * store,\n * 'increment',\n * 'decrement',\n * 'reset'\n * );\n *\n * return (\n * <>\n * <button onClick={decrement}>-</button>\n * <button onClick={increment}>+</button>\n * <button onClick={reset}>Reset</button>\n * </>\n * );\n * }\n * ```\n */\nexport function useStoreActions<\n TState,\n TKeys extends string[]\n>(\n store: Store<TState>,\n ...actionNames: TKeys\n): { [K in TKeys[number]]: (...args: any[]) => any } {\n const storeRef = useRef(store);\n const actionsRef = useRef<Record<string, Function>>({});\n\n // Update store ref if it changes\n if (storeRef.current !== store) {\n storeRef.current = store;\n // Reset actions cache when store changes\n actionsRef.current = {};\n }\n\n // Get or cache actions\n const result: any = {};\n for (const name of actionNames) {\n if (!actionsRef.current[name]) {\n actionsRef.current[name] = (storeRef.current as any)[name];\n }\n result[name] = actionsRef.current[name];\n }\n\n return result;\n}\n\n/**\n * Hook for selecting multiple values with independent selectors.\n *\n * Each selector is tracked independently, so the component only\n * re-renders when a selector's output actually changes.\n *\n * @param store - The store instance\n * @param selectors - Object of named selectors\n * @returns An object with selected values\n *\n * @example\n * ```typescript\n * import { useStoreSelector } from '@oxog/state';\n *\n * function Dashboard() {\n * const { userCount, activeUsers, totalRevenue } = useStoreSelector(store, {\n * userCount: s => s.users.length,\n * activeUsers: s => s.users.filter(u => u.active).length,\n * totalRevenue: s => s.orders.reduce((sum, o) => sum + o.total, 0),\n * });\n *\n * return (\n * <div>\n * <p>Users: {userCount} ({activeUsers} active)</p>\n * <p>Revenue: ${totalRevenue}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useStoreSelector<\n TState,\n TSelectors extends Record<string, Selector<TState, any>>\n>(\n store: Store<TState>,\n selectors: TSelectors\n): { [K in keyof TSelectors]: ReturnType<TSelectors[K]> } {\n const selectorsRef = useRef(selectors);\n const keysRef = useRef<string[]>(Object.keys(selectors));\n const prevResultRef = useRef<any>(null);\n\n // Update selectors ref\n if (selectorsRef.current !== selectors) {\n selectorsRef.current = selectors;\n keysRef.current = Object.keys(selectors);\n }\n\n // Memoized combined selector that returns stable reference when values unchanged\n const combinedSelector = useCallback((state: TState) => {\n const keys = keysRef.current;\n const currentSelectors = selectorsRef.current;\n const result: any = {};\n\n for (const key of keys) {\n const selector = currentSelectors[key];\n if (selector) {\n result[key] = selector(state);\n }\n }\n\n // Check if result is equal to previous (shallow compare each key)\n if (prevResultRef.current !== null) {\n let isEqual = true;\n for (const key of keys) {\n if (!shallowEqual(prevResultRef.current[key], result[key])) {\n isEqual = false;\n break;\n }\n }\n if (isEqual) {\n return prevResultRef.current;\n }\n }\n\n prevResultRef.current = result;\n return result;\n }, []);\n\n return useStore(store, combinedSelector);\n}\n\n/**\n * Hook for transient updates - subscribe without causing re-renders.\n *\n * Use this for side effects that don't need to update the UI.\n *\n * @param store - The store instance\n * @param selector - Selector function\n * @param callback - Callback to run on changes\n *\n * @example\n * ```typescript\n * import { useTransientSubscribe } from '@oxog/state';\n *\n * function Analytics() {\n * // Track page views without re-rendering\n * useTransientSubscribe(\n * store,\n * s => s.currentPage,\n * (page) => analytics.track('pageview', { page })\n * );\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useTransientSubscribe<TState, TSelected>(\n store: Store<TState>,\n selector: Selector<TState, TSelected>,\n callback: (value: TSelected, prevValue: TSelected) => void,\n equalityFn: EqualityFn<TSelected> = shallowEqual\n): void {\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const unsubscribe = store.subscribe(\n selector,\n (value, prevValue) => callbackRef.current(value, prevValue),\n equalityFn\n );\n\n return unsubscribe;\n }, [store, selector, equalityFn]);\n}\n\n/**\n * Hook that returns the store's setState function with stable reference.\n *\n * @param store - The store instance\n * @returns The setState function\n *\n * @example\n * ```typescript\n * function Form() {\n * const setState = useSetState(store);\n *\n * const handleChange = (e) => {\n * setState({ [e.target.name]: e.target.value });\n * };\n *\n * return <input onChange={handleChange} />;\n * }\n * ```\n */\nexport function useSetState<TState>(\n store: Store<TState>\n): (partial: Partial<TState> | ((state: TState) => Partial<TState>)) => void {\n const storeRef = useRef(store);\n if (storeRef.current !== store) {\n storeRef.current = store;\n }\n\n const setStateRef = useRef((partial: Partial<TState> | ((state: TState) => Partial<TState>)) => {\n storeRef.current.setState(partial);\n });\n\n return setStateRef.current;\n}\n","/**\n * Enhanced subscription system with advanced options.\n *\n * @module subscribe\n */\n\nimport type { Store, Selector, EqualityFn, Listener } from './types.js';\nimport { shallowEqual } from './utils/index.js';\n\n/**\n * Options for enhanced subscriptions.\n *\n * @typeParam T - The store state type\n * @typeParam U - The selected value type\n *\n * @example\n * ```typescript\n * const options: SubscribeOptions<State, number> = {\n * debounce: 100,\n * fireImmediately: true,\n * when: (state) => state.isReady\n * };\n * ```\n */\nexport interface SubscribeOptions<T, U = T> {\n /** Custom equality function for comparing selected values */\n equalityFn?: EqualityFn<U>;\n /** Fire callback immediately with current state */\n fireImmediately?: boolean;\n /** Debounce notifications (ms) */\n debounce?: number;\n /** Throttle notifications (ms) */\n throttle?: number;\n /** Only fire when condition is met */\n when?: (state: T, prevState: T) => boolean;\n}\n\n/**\n * Creates a debounced function.\n */\nfunction createDebounced<T extends (...args: any[]) => void>(\n fn: T,\n delay: number\n): T & { cancel: () => void } {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const debounced = ((...args: Parameters<T>) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n fn(...args);\n timeoutId = null;\n }, delay);\n }) as T & { cancel: () => void };\n\n debounced.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return debounced;\n}\n\n/**\n * Creates a throttled function.\n */\nfunction createThrottled<T extends (...args: any[]) => void>(\n fn: T,\n delay: number\n): T & { cancel: () => void } {\n let lastCall = 0;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: Parameters<T> | null = null;\n\n const throttled = ((...args: Parameters<T>) => {\n const now = Date.now();\n const remaining = delay - (now - lastCall);\n\n lastArgs = args;\n\n if (remaining <= 0) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastCall = now;\n fn(...args);\n } else if (!timeoutId) {\n timeoutId = setTimeout(() => {\n lastCall = Date.now();\n timeoutId = null;\n if (lastArgs) {\n fn(...lastArgs);\n }\n }, remaining);\n }\n }) as T & { cancel: () => void };\n\n throttled.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastArgs = null;\n };\n\n return throttled;\n}\n\n/**\n * Enhanced subscribe function with advanced options.\n *\n * @param store - The store to subscribe to\n * @param selectorOrListener - Selector function or direct listener\n * @param listenerOrOptions - Listener function or options (if no selector)\n * @param options - Subscription options\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * // With debounce\n * const unsubscribe = subscribeWithOptions(\n * store,\n * (state) => state.searchQuery,\n * (query) => performSearch(query),\n * { debounce: 300 }\n * );\n *\n * // With throttle and condition\n * const unsubscribe = subscribeWithOptions(\n * store,\n * (state) => state.scrollPosition,\n * (pos) => updateUI(pos),\n * { throttle: 16, when: (state) => state.isVisible }\n * );\n *\n * // Fire immediately\n * const unsubscribe = subscribeWithOptions(\n * store,\n * (state) => state.user,\n * (user) => console.log('User:', user),\n * { fireImmediately: true }\n * );\n * ```\n */\nexport function subscribeWithOptions<TState, TSelected>(\n store: Store<TState>,\n selector: Selector<TState, TSelected>,\n listener: Listener<TSelected>,\n options: SubscribeOptions<TState, TSelected> = {}\n): () => void {\n const {\n equalityFn = shallowEqual,\n fireImmediately = false,\n debounce,\n throttle,\n when,\n } = options;\n\n // Validate options\n if (debounce !== undefined && throttle !== undefined) {\n throw new Error('Cannot use both debounce and throttle options');\n }\n\n // Wrap listener with debounce/throttle if needed\n let wrappedListener: Listener<TSelected> & { cancel?: () => void } = listener;\n let cleanup: (() => void) | null = null;\n\n if (debounce !== undefined && debounce > 0) {\n const debouncedListener = createDebounced(listener, debounce);\n wrappedListener = debouncedListener;\n cleanup = () => debouncedListener.cancel();\n } else if (throttle !== undefined && throttle > 0) {\n const throttledListener = createThrottled(listener, throttle);\n wrappedListener = throttledListener;\n cleanup = () => throttledListener.cancel();\n }\n\n // Create conditional listener if 'when' is provided\n let finalListener: Listener<TSelected>;\n let prevState: TState = store.getState();\n\n if (when) {\n finalListener = (value, prevValue) => {\n const currentState = store.getState();\n if (when(currentState, prevState)) {\n wrappedListener(value, prevValue);\n }\n prevState = currentState;\n };\n } else {\n finalListener = wrappedListener;\n }\n\n // Fire immediately if requested\n if (fireImmediately) {\n const currentValue = selector(store.getState());\n finalListener(currentValue, currentValue);\n }\n\n // Subscribe with equality function\n const unsubscribe = store.subscribe(selector, finalListener, equalityFn);\n\n // Return unsubscribe function that also cleans up debounce/throttle\n return () => {\n unsubscribe();\n if (cleanup) {\n cleanup();\n }\n };\n}\n\n/**\n * Create a subscription factory with preset options.\n *\n * @param defaultOptions - Default options for all subscriptions\n * @returns A subscribe function with preset options\n *\n * @example\n * ```typescript\n * const debouncedSubscribe = createSubscriber({ debounce: 100 });\n *\n * const unsubscribe = debouncedSubscribe(\n * store,\n * (state) => state.input,\n * (input) => validate(input)\n * );\n * ```\n */\nexport function createSubscriber<TState>(\n defaultOptions: SubscribeOptions<TState, any> = {}\n): <TSelected>(\n store: Store<TState>,\n selector: Selector<TState, TSelected>,\n listener: Listener<TSelected>,\n options?: SubscribeOptions<TState, TSelected>\n) => () => void {\n return <TSelected>(\n store: Store<TState>,\n selector: Selector<TState, TSelected>,\n listener: Listener<TSelected>,\n options: SubscribeOptions<TState, TSelected> = {}\n ) => {\n return subscribeWithOptions(store, selector, listener, {\n ...defaultOptions,\n ...options,\n });\n };\n}\n\n/**\n * Subscribe to multiple selectors with a single listener.\n *\n * @param store - The store to subscribe to\n * @param selectors - Object of named selectors\n * @param listener - Listener called when any selector value changes\n * @param options - Subscription options\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * const unsubscribe = subscribeToMany(\n * store,\n * {\n * count: (s) => s.count,\n * name: (s) => s.name,\n * },\n * ({ count, name }) => console.log(`${name}: ${count}`)\n * );\n * ```\n */\nexport function subscribeToMany<TState, TSelectors extends Record<string, Selector<TState, any>>>(\n store: Store<TState>,\n selectors: TSelectors,\n listener: (values: { [K in keyof TSelectors]: ReturnType<TSelectors[K]> }) => void,\n options: Omit<SubscribeOptions<TState, any>, 'equalityFn'> = {}\n): () => void {\n const keys = Object.keys(selectors) as (keyof TSelectors)[];\n let prevValues: { [K in keyof TSelectors]: ReturnType<TSelectors[K]> } = {} as any;\n\n // Initialize prev values\n const state = store.getState();\n for (const key of keys) {\n const selector = selectors[key];\n if (selector) {\n prevValues[key] = selector(state);\n }\n }\n\n // Create combined selector\n const combinedSelector = (state: TState) => {\n const result: any = {};\n for (const key of keys) {\n const selector = selectors[key];\n if (selector) {\n result[key] = selector(state);\n }\n }\n return result;\n };\n\n // Custom equality - check each value\n const combinedEqualityFn = (\n a: { [K in keyof TSelectors]: ReturnType<TSelectors[K]> },\n b: { [K in keyof TSelectors]: ReturnType<TSelectors[K]> }\n ) => {\n for (const key of keys) {\n if (!shallowEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n };\n\n return subscribeWithOptions(\n store,\n combinedSelector,\n listener,\n { ...options, equalityFn: combinedEqualityFn }\n );\n}\n\n/**\n * Subscribe only once - automatically unsubscribes after first call.\n *\n * @param store - The store to subscribe to\n * @param selector - Selector function\n * @param listener - Listener called once when value changes\n * @param options - Subscription options\n * @returns Unsubscribe function (can be called to cancel before trigger)\n *\n * @example\n * ```typescript\n * // Wait for user to be loaded\n * subscribeOnce(\n * store,\n * (state) => state.user,\n * (user) => console.log('User loaded:', user),\n * { when: (state) => state.user !== null }\n * );\n * ```\n */\nexport function subscribeOnce<TState, TSelected>(\n store: Store<TState>,\n selector: Selector<TState, TSelected>,\n listener: Listener<TSelected>,\n options: SubscribeOptions<TState, TSelected> = {}\n): () => void {\n let unsubscribe: (() => void) | null = null;\n\n const onceListener: Listener<TSelected> = (value, prevValue) => {\n listener(value, prevValue);\n if (unsubscribe) {\n unsubscribe();\n }\n };\n\n unsubscribe = subscribeWithOptions(store, selector, onceListener, options);\n return unsubscribe;\n}\n","/**\n * Computed values (derived state) with memoization.\n *\n * @module computed\n */\n\nimport type { Store, Selector, EqualityFn } from './types.js';\nimport { shallowEqual } from './utils/index.js';\n\n/**\n * Options for computed values.\n *\n * @typeParam T - The store state type\n * @typeParam U - The computed value type\n */\nexport interface ComputedOptions<T, U> {\n /** Custom equality for caching */\n equals?: EqualityFn<U>;\n /** Lazy evaluation (only compute when accessed) */\n lazy?: boolean;\n /** Keep last N values in cache for time-travel debugging */\n cacheSize?: number;\n}\n\n/**\n * Computed value interface with getter and utilities.\n */\nexport interface Computed<U> {\n /** Get the computed value */\n (): U;\n /** Get value (alias) */\n get(): U;\n /** Force recomputation */\n invalidate(): void;\n /** Subscribe to value changes */\n subscribe(listener: (value: U, prevValue: U) => void): () => void;\n /** Get cache history (if cacheSize > 1) */\n getHistory(): U[];\n /** Destroy and cleanup */\n destroy(): void;\n}\n\n/**\n * Cache entry for computed values.\n */\ninterface CacheEntry<T, U> {\n input: T;\n output: U;\n}\n\n/**\n * Create a computed (derived) value from store state.\n *\n * Computed values are memoized and only recompute when dependencies change.\n *\n * @param store - The store to derive from\n * @param selector - Function to compute the derived value\n * @param options - Computed options\n * @returns A computed value accessor\n *\n * @example\n * ```typescript\n * const store = createStore({ items: [], filter: 'all' });\n *\n * // Simple computed\n * const filteredItems = computed(store, (state) => {\n * if (state.filter === 'all') return state.items;\n * return state.items.filter(item => item.status === state.filter);\n * });\n *\n * console.log(filteredItems()); // Get computed value\n *\n * // With caching for debugging\n * const total = computed(\n * store,\n * (state) => state.items.reduce((sum, item) => sum + item.price, 0),\n * { cacheSize: 10 }\n * );\n *\n * console.log(total.getHistory()); // See past values\n * ```\n */\nexport function computed<TState, TComputed>(\n store: Store<TState>,\n selector: Selector<TState, TComputed>,\n options: ComputedOptions<TState, TComputed> = {}\n): Computed<TComputed> {\n const { equals = shallowEqual, lazy = false, cacheSize = 1 } = options;\n\n // Cache storage\n const cache: CacheEntry<TState, TComputed>[] = [];\n let currentValue: TComputed | undefined;\n let isInitialized = false;\n let isDestroyed = false;\n\n // Listeners for value changes\n const listeners = new Set<(value: TComputed, prevValue: TComputed) => void>();\n\n // Unsubscribe from store\n let unsubscribe: (() => void) | null = null;\n\n /**\n * Compute and cache the value.\n */\n const compute = (): TComputed => {\n const state = store.getState();\n\n // Check cache\n for (const entry of cache) {\n if (entry.input === state || shallowEqual(entry.input, state)) {\n return entry.output;\n }\n }\n\n // Compute new value\n const newValue = selector(state);\n\n // Add to cache\n cache.unshift({ input: state, output: newValue });\n\n // Trim cache\n while (cache.length > cacheSize) {\n cache.pop();\n }\n\n return newValue;\n };\n\n /**\n * Initialize computed value and subscription.\n */\n const initialize = () => {\n if (isInitialized || isDestroyed) return;\n isInitialized = true;\n\n // Compute initial value\n currentValue = compute();\n\n // Subscribe to store changes\n unsubscribe = store.subscribe((state, prevState) => {\n const prevValue = currentValue!;\n const newValue = compute();\n\n if (!equals(newValue, prevValue)) {\n currentValue = newValue;\n\n // Notify listeners\n for (const listener of listeners) {\n try {\n listener(newValue, prevValue);\n } catch (error) {\n console.error('Computed listener error:', error);\n }\n }\n }\n });\n };\n\n // Initialize immediately if not lazy\n if (!lazy) {\n initialize();\n }\n\n /**\n * Get the computed value.\n */\n const get = (): TComputed => {\n if (isDestroyed) {\n throw new Error('Cannot access destroyed computed value');\n }\n\n // Lazy initialization\n if (!isInitialized) {\n initialize();\n }\n\n return currentValue!;\n };\n\n /**\n * Invalidate cache and force recomputation.\n */\n const invalidate = (): void => {\n if (isDestroyed) return;\n\n cache.length = 0;\n if (isInitialized) {\n const prevValue = currentValue!;\n currentValue = compute();\n\n if (!equals(currentValue, prevValue)) {\n for (const listener of listeners) {\n try {\n listener(currentValue, prevValue);\n } catch (error) {\n console.error('Computed listener error:', error);\n }\n }\n }\n }\n };\n\n /**\n * Subscribe to value changes.\n */\n const subscribe = (\n listener: (value: TComputed, prevValue: TComputed) => void\n ): (() => void) => {\n if (isDestroyed) {\n throw new Error('Cannot subscribe to destroyed computed value');\n }\n\n // Ensure initialized\n if (!isInitialized) {\n initialize();\n }\n\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n };\n\n /**\n * Get cache history.\n */\n const getHistory = (): TComputed[] => {\n return cache.map((entry) => entry.output);\n };\n\n /**\n * Destroy computed value.\n */\n const destroy = (): void => {\n if (isDestroyed) return;\n isDestroyed = true;\n\n if (unsubscribe) {\n unsubscribe();\n unsubscribe = null;\n }\n\n listeners.clear();\n cache.length = 0;\n currentValue = undefined;\n };\n\n // Create the computed function\n const computedFn = get as Computed<TComputed>;\n computedFn.get = get;\n computedFn.invalidate = invalidate;\n computedFn.subscribe = subscribe;\n computedFn.getHistory = getHistory;\n computedFn.destroy = destroy;\n\n return computedFn;\n}\n\n/**\n * Create a computed value that depends on other computed values.\n *\n * @param computeds - Array of computed values to depend on\n * @param combiner - Function to combine the computed values\n * @param options - Computed options\n * @returns A combined computed value\n *\n * @example\n * ```typescript\n * const subtotal = computed(store, (s) => s.items.reduce((sum, i) => sum + i.price, 0));\n * const tax = computed(store, (s) => s.taxRate);\n *\n * const total = combineComputed(\n * [subtotal, tax],\n * ([subtotalVal, taxVal]) => subtotalVal * (1 + taxVal)\n * );\n *\n * console.log(total()); // Subtotal + tax\n * ```\n */\nexport function combineComputed<TInputs extends Computed<any>[], TOutput>(\n computeds: [...TInputs],\n combiner: (values: { [K in keyof TInputs]: TInputs[K] extends Computed<infer U> ? U : never }) => TOutput,\n options: Omit<ComputedOptions<any, TOutput>, 'lazy'> = {}\n): Computed<TOutput> {\n const { equals = shallowEqual, cacheSize = 1 } = options;\n\n let currentValue: TOutput | undefined;\n let isDestroyed = false;\n const listeners = new Set<(value: TOutput, prevValue: TOutput) => void>();\n const unsubscribes: (() => void)[] = [];\n const cache: TOutput[] = [];\n\n /**\n * Compute combined value.\n */\n const compute = (): TOutput => {\n const values = computeds.map((c) => c()) as any;\n return combiner(values);\n };\n\n // Initialize\n currentValue = compute();\n cache.push(currentValue);\n\n // Subscribe to all source computeds\n for (const computed of computeds) {\n const unsub = computed.subscribe(() => {\n if (isDestroyed) return;\n\n const prevValue = currentValue!;\n const newValue = compute();\n\n if (!equals(newValue, prevValue)) {\n currentValue = newValue;\n cache.unshift(newValue);\n while (cache.length > cacheSize) {\n cache.pop();\n }\n\n for (const listener of listeners) {\n try {\n listener(newValue, prevValue);\n } catch (error) {\n console.error('Combined computed listener error:', error);\n }\n }\n }\n });\n unsubscribes.push(unsub);\n }\n\n const get = (): TOutput => {\n if (isDestroyed) {\n throw new Error('Cannot access destroyed computed value');\n }\n return currentValue!;\n };\n\n const invalidate = (): void => {\n if (isDestroyed) return;\n for (const computed of computeds) {\n computed.invalidate();\n }\n };\n\n const subscribe = (\n listener: (value: TOutput, prevValue: TOutput) => void\n ): (() => void) => {\n if (isDestroyed) {\n throw new Error('Cannot subscribe to destroyed computed value');\n }\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n\n const getHistory = (): TOutput[] => [...cache];\n\n const destroy = (): void => {\n if (isDestroyed) return;\n isDestroyed = true;\n for (const unsub of unsubscribes) {\n unsub();\n }\n listeners.clear();\n cache.length = 0;\n };\n\n const combinedFn = get as Computed<TOutput>;\n combinedFn.get = get;\n combinedFn.invalidate = invalidate;\n combinedFn.subscribe = subscribe;\n combinedFn.getHistory = getHistory;\n combinedFn.destroy = destroy;\n\n return combinedFn;\n}\n\n/**\n * Create a memoized selector for use with store.subscribe.\n *\n * @param selector - The selector function to memoize\n * @param equals - Custom equality function\n * @returns A memoized selector\n *\n * @example\n * ```typescript\n * const selectExpensiveComputation = memoizeSelector(\n * (state: State) => expensiveOperation(state.data)\n * );\n *\n * store.subscribe(selectExpensiveComputation, (result) => {\n * console.log('Result:', result);\n * });\n * ```\n */\nexport function memoizeSelector<TState, TSelected>(\n selector: Selector<TState, TSelected>,\n equals: EqualityFn<TSelected> = shallowEqual\n): Selector<TState, TSelected> {\n let lastState: TState | undefined;\n let lastResult: TSelected | undefined;\n let isInitialized = false;\n\n return (state: TState): TSelected => {\n if (!isInitialized || lastState !== state) {\n const newResult = selector(state);\n\n if (!isInitialized || !equals(newResult, lastResult!)) {\n lastResult = newResult;\n }\n\n lastState = state;\n isInitialized = true;\n }\n\n return lastResult!;\n };\n}\n","/**\n * Slices pattern for modular store composition.\n *\n * @module slices\n */\n\nimport type { Store } from './types.js';\nimport { createStore } from './store.js';\n\n/**\n * SetSlice function type for updating slice state.\n */\nexport type SetSlice<TState> = {\n (partial: Partial<TState>): void;\n (updater: (state: TState) => Partial<TState>): void;\n};\n\n/**\n * GetSlice function type for getting current state.\n */\nexport type GetSlice<TState> = () => TState;\n\n/**\n * Slice creator function signature.\n *\n * @typeParam TState - The full store state type\n * @typeParam TSlice - The slice state type\n */\nexport type SliceCreator<TState, TSlice extends Partial<TState>> = (\n set: SetSlice<TState>,\n get: GetSlice<TState>,\n store: Store<TState>\n) => TSlice;\n\n/**\n * Slice definition with state and actions.\n */\nexport interface SliceDefinition<TState, TSlice extends Partial<TState>> {\n /** Slice name for debugging */\n name: string;\n /** Slice creator function */\n creator: SliceCreator<TState, TSlice>;\n}\n\n/**\n * Create a slice definition for use with combineSlices.\n *\n * Slices are modular pieces of state and actions that can be combined\n * to create a complete store.\n *\n * @param name - Slice name for debugging\n * @param creator - Slice creator function\n * @returns A slice definition\n *\n * @example\n * ```typescript\n * // Define a counter slice\n * const counterSlice = createSlice('counter', (set, get) => ({\n * count: 0,\n * increment: () => set((s) => ({ count: s.count + 1 })),\n * decrement: () => set((s) => ({ count: s.count - 1 })),\n * reset: () => set({ count: 0 }),\n * }));\n *\n * // Define a user slice\n * const userSlice = createSlice('user', (set, get) => ({\n * user: null as User | null,\n * setUser: (user: User) => set({ user }),\n * logout: () => set({ user: null }),\n * }));\n *\n * // Combine slices into a store\n * const store = combineSlices(counterSlice, userSlice);\n *\n * // Use the store\n * store.increment();\n * store.setUser({ name: 'John' });\n * ```\n */\nexport function createSlice<TState, TSlice extends Partial<TState>>(\n name: string,\n creator: SliceCreator<TState, TSlice>\n): SliceDefinition<TState, TSlice> {\n return { name, creator };\n}\n\n/**\n * Internal slice creator type for type inference.\n */\ntype InferSlice<T> = T extends SliceDefinition<any, infer S> ? S : never;\n\n/**\n * Combined state type from multiple slices.\n */\ntype CombinedState<TSlices extends SliceDefinition<any, any>[]> = {\n [K in keyof TSlices]: InferSlice<TSlices[K]>;\n}[number] extends infer U\n ? U extends object\n ? { [K in keyof U as U extends Record<K, any> ? K : never]: U[K] }\n : never\n : never;\n\n/**\n * Combine multiple slices into a single store.\n *\n * @param slices - Slice definitions to combine\n * @returns A store with combined state and actions\n *\n * @example\n * ```typescript\n * const counterSlice = createSlice('counter', (set) => ({\n * count: 0,\n * increment: () => set((s) => ({ count: s.count + 1 })),\n * }));\n *\n * const userSlice = createSlice('user', (set) => ({\n * user: null,\n * setUser: (user) => set({ user }),\n * }));\n *\n * const store = combineSlices(counterSlice, userSlice);\n *\n * // Type-safe access to all slice methods\n * store.increment();\n * store.setUser({ name: 'John' });\n * ```\n */\nexport function combineSlices<TSlices extends SliceDefinition<any, any>[]>(\n ...slices: TSlices\n): Store<CombinedState<TSlices>> & CombinedState<TSlices> {\n // First pass: collect initial state from all slices\n const initialState: any = {};\n const actions: Record<string, Function> = {};\n\n // Create a temporary store to pass to slice creators\n // We'll replace its state after collecting from all slices\n let tempStore: Store<any> | null = null;\n\n const set: SetSlice<any> = (partial) => {\n if (tempStore) {\n if (typeof partial === 'function') {\n tempStore.setState(partial);\n } else {\n tempStore.setState(partial);\n }\n }\n };\n\n const get: GetSlice<any> = () => {\n return tempStore ? tempStore.getState() : initialState;\n };\n\n // Create placeholder store for initial state collection\n const placeholderStore = {\n getState: () => initialState,\n setState: () => {},\n subscribe: () => () => {},\n merge: () => {},\n reset: () => {},\n use: () => placeholderStore,\n destroy: () => {},\n } as Store<any>;\n\n // Collect initial state and actions from all slices\n for (const slice of slices) {\n const sliceResult = slice.creator(set, get, placeholderStore);\n\n for (const [key, value] of Object.entries(sliceResult)) {\n if (typeof value === 'function') {\n actions[key] = value;\n } else {\n initialState[key] = value;\n }\n }\n }\n\n // Create the actual store\n tempStore = createStore(initialState);\n\n // Re-run slice creators with the actual store to bind actions\n for (const slice of slices) {\n const sliceResult = slice.creator(\n (partial) => {\n if (typeof partial === 'function') {\n tempStore!.setState(partial);\n } else {\n tempStore!.setState(partial);\n }\n },\n () => tempStore!.getState(),\n tempStore\n );\n\n // Update actions with properly bound versions\n for (const [key, value] of Object.entries(sliceResult)) {\n if (typeof value === 'function') {\n actions[key] = value;\n }\n }\n }\n\n // Add actions to the store\n const store = tempStore as any;\n for (const [name, action] of Object.entries(actions)) {\n store[name] = action;\n }\n\n return store;\n}\n\n/**\n * Create a namespaced slice that prefixes all state keys.\n *\n * @param namespace - The namespace prefix\n * @param creator - Slice creator function\n * @returns A namespaced slice definition\n *\n * @example\n * ```typescript\n * const settingsSlice = createNamespacedSlice('settings', (set) => ({\n * theme: 'dark',\n * language: 'en',\n * setTheme: (theme) => set({ theme }),\n * }));\n *\n * // State will be: { settings: { theme: 'dark', language: 'en' } }\n * // Actions will be: setTheme\n * ```\n */\nexport function createNamespacedSlice<TSlice extends Record<string, any>>(\n namespace: string,\n creator: (\n set: (partial: Partial<TSlice>) => void,\n get: () => TSlice\n ) => TSlice\n): SliceDefinition<Record<string, any>, Record<string, any>> {\n return createSlice(namespace, (set, get, store) => {\n // Wrapper set that updates the namespaced state\n const namespacedSet = (partial: Partial<TSlice> | ((current: TSlice) => Partial<TSlice>)) => {\n const current = (get()[namespace] || {}) as TSlice;\n const update = typeof partial === 'function' ? partial(current) : partial;\n set({ [namespace]: { ...current, ...update } } as any);\n };\n\n // Wrapper get that returns namespaced state\n const namespacedGet = (): TSlice => {\n return (get()[namespace] || {}) as TSlice;\n };\n\n // Get slice result\n const sliceResult = creator(namespacedSet, namespacedGet);\n\n // Separate state and actions\n const state: any = {};\n const actions: any = {};\n\n for (const [key, value] of Object.entries(sliceResult)) {\n if (typeof value === 'function') {\n actions[key] = value;\n } else {\n state[key] = value;\n }\n }\n\n // Return namespaced state with actions at root\n return {\n [namespace]: state,\n ...actions,\n };\n });\n}\n\n/**\n * Extend an existing store with additional slices.\n *\n * @param store - The existing store\n * @param slices - Additional slices to add\n * @returns The extended store\n *\n * @example\n * ```typescript\n * const baseStore = createStore({ count: 0 });\n *\n * const extendedStore = extendStore(\n * baseStore,\n * createSlice('user', (set) => ({\n * user: null,\n * setUser: (user) => set({ user }),\n * }))\n * );\n * ```\n */\nexport function extendStore<TState, TSlices extends SliceDefinition<TState & any, any>[]>(\n store: Store<TState>,\n ...slices: TSlices\n): Store<TState & CombinedState<TSlices>> & CombinedState<TSlices> {\n const actions: Record<string, Function> = {};\n\n const set: SetSlice<any> = (partial) => {\n if (typeof partial === 'function') {\n store.setState(partial as any);\n } else {\n store.setState(partial as any);\n }\n };\n\n const get: GetSlice<any> = () => store.getState();\n\n // Process each slice\n for (const slice of slices) {\n const sliceResult = slice.creator(set, get, store as any);\n\n for (const [key, value] of Object.entries(sliceResult)) {\n if (typeof value === 'function') {\n actions[key] = value;\n } else {\n // Merge initial state\n store.setState({ [key]: value } as any);\n }\n }\n }\n\n // Add actions to store\n const extendedStore = store as any;\n for (const [name, action] of Object.entries(actions)) {\n extendedStore[name] = action;\n }\n\n return extendedStore;\n}\n\n/**\n * Reset specific slices to their initial state.\n *\n * @param store - The store\n * @param sliceNames - Names of slices to reset\n *\n * @example\n * ```typescript\n * // Reset only the user slice\n * resetSlices(store, 'user');\n *\n * // Reset multiple slices\n * resetSlices(store, 'user', 'cart');\n * ```\n */\nexport function resetSlices<TState>(\n store: Store<TState>,\n ...sliceNames: string[]\n): void {\n // This requires storing initial state per slice\n // For now, use store.reset() for full reset\n console.warn('resetSlices: Use store.reset() to reset all state');\n store.reset();\n}\n","/**\n * Store Federation - Multi-store coordination and communication.\n *\n * Enables coordinated updates across multiple stores with\n * atomic transactions and unified state access.\n *\n * @module federation\n */\n\nimport type { Store } from './types.js';\n\n/**\n * Extract state type from a Store.\n */\nexport type StoreState<S> = S extends Store<infer T> ? T : never;\n\n/**\n * Map of store names to their state types.\n */\nexport type FederatedState<Stores extends Record<string, Store<any>>> = {\n [K in keyof Stores]: StoreState<Stores[K]>;\n};\n\n/**\n * Federation listener callback.\n */\nexport type FederationListener<Stores extends Record<string, Store<any>>> = (\n state: FederatedState<Stores>,\n prevState: FederatedState<Stores>,\n changedStore: keyof Stores\n) => void;\n\n/**\n * Federation transaction function.\n */\nexport type TransactionFn<Stores extends Record<string, Store<any>>> = (\n stores: Stores\n) => void | Promise<void>;\n\n/**\n * Federation options.\n */\nexport interface FederationOptions {\n /** Name for debugging */\n name?: string;\n /** Enable transaction logging */\n debug?: boolean;\n}\n\n/**\n * Federation interface for coordinating multiple stores.\n */\nexport interface Federation<Stores extends Record<string, Store<any>>> {\n /** Access to individual stores */\n readonly stores: Stores;\n\n /** Get combined state from all stores */\n getState(): FederatedState<Stores>;\n\n /** Subscribe to any store change */\n subscribe(listener: FederationListener<Stores>): () => void;\n\n /** Atomic multi-store update (synchronous) */\n transaction(fn: TransactionFn<Stores>): void;\n\n /** Async transaction with rollback on error */\n transactionAsync(fn: TransactionFn<Stores>): Promise<void>;\n\n /** Get a specific store */\n getStore<K extends keyof Stores>(name: K): Stores[K];\n\n /** Destroy federation and unsubscribe from all stores */\n destroy(): void;\n}\n\n/**\n * Create a federation of multiple stores.\n *\n * @param stores - Object containing named stores\n * @param options - Federation options\n * @returns A federation instance\n *\n * @example\n * ```typescript\n * import { createStore, createFederation } from '@oxog/state';\n *\n * // Create individual stores\n * const userStore = createStore({\n * user: null,\n * setUser: (state, user) => ({ user }),\n * });\n *\n * const cartStore = createStore({\n * items: [],\n * addItem: (state, item) => ({ items: [...state.items, item] }),\n * clear: () => ({ items: [] }),\n * });\n *\n * const settingsStore = createStore({\n * theme: 'light',\n * setTheme: (state, theme) => ({ theme }),\n * });\n *\n * // Create federation\n * const federation = createFederation({\n * user: userStore,\n * cart: cartStore,\n * settings: settingsStore,\n * });\n *\n * // Get combined state\n * const state = federation.getState();\n * // { user: { user: null, ... }, cart: { items: [], ... }, settings: { theme: 'light', ... } }\n *\n * // Subscribe to any store change\n * federation.subscribe((state, prevState, changedStore) => {\n * console.log(`${changedStore} changed:`, state[changedStore]);\n * });\n *\n * // Atomic cross-store transaction\n * federation.transaction(({ user, cart }) => {\n * cart.setState({ items: [] });\n * user.setState({ user: null });\n * });\n * ```\n */\nexport function createFederation<Stores extends Record<string, Store<any>>>(\n stores: Stores,\n options: FederationOptions = {}\n): Federation<Stores> {\n const { name = 'federation', debug = false } = options;\n\n const listeners = new Set<FederationListener<Stores>>();\n const unsubscribers: (() => void)[] = [];\n let isInTransaction = false;\n let transactionChanges: (keyof Stores)[] = [];\n let previousStates: FederatedState<Stores> | null = null;\n\n // Get combined state\n const getState = (): FederatedState<Stores> => {\n const state = {} as FederatedState<Stores>;\n for (const key in stores) {\n const store = stores[key];\n if (store) {\n state[key] = store.getState();\n }\n }\n return state;\n };\n\n // Notify listeners\n const notify = (changedStore: keyof Stores) => {\n if (isInTransaction) {\n if (!transactionChanges.includes(changedStore)) {\n transactionChanges.push(changedStore);\n }\n return;\n }\n\n const state = getState();\n const prevState = previousStates || state;\n\n for (const listener of listeners) {\n try {\n listener(state, prevState, changedStore);\n } catch (error) {\n console.error(`Federation listener error:`, error);\n }\n }\n\n previousStates = state;\n };\n\n // Subscribe to all stores\n for (const key in stores) {\n const store = stores[key];\n if (store) {\n const unsubscribe = store.subscribe(() => {\n notify(key);\n });\n unsubscribers.push(unsubscribe);\n }\n }\n\n // Initialize previous states\n previousStates = getState();\n\n // Log helper\n const log = (message: string, ...args: any[]) => {\n if (debug) {\n console.log(`[${name}] ${message}`, ...args);\n }\n };\n\n return {\n stores,\n\n getState,\n\n subscribe(listener: FederationListener<Stores>) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n\n transaction(fn: TransactionFn<Stores>) {\n if (isInTransaction) {\n // Nested transaction - just execute\n fn(stores);\n return;\n }\n\n isInTransaction = true;\n transactionChanges = [];\n const snapshotStates = getState();\n\n log('Transaction started');\n\n try {\n const result = fn(stores);\n\n // Check if async (should use transactionAsync)\n if (result instanceof Promise) {\n throw new Error(\n 'Async operations in transaction() are not supported. Use transactionAsync() instead.'\n );\n }\n\n isInTransaction = false;\n\n // Notify for all changed stores\n if (transactionChanges.length > 0) {\n log('Transaction committed, changed stores:', transactionChanges);\n const state = getState();\n\n for (const listener of listeners) {\n try {\n // Notify once with the first changed store\n listener(state, snapshotStates, transactionChanges[0]!);\n } catch (error) {\n console.error(`Federation listener error:`, error);\n }\n }\n\n previousStates = state;\n }\n } catch (error) {\n isInTransaction = false;\n\n // Rollback all stores to snapshot\n log('Transaction failed, rolling back');\n for (const key in stores) {\n const store = stores[key];\n if (store) {\n store.setState(snapshotStates[key] as any);\n }\n }\n\n throw error;\n }\n },\n\n async transactionAsync(fn: TransactionFn<Stores>) {\n if (isInTransaction) {\n // Nested transaction\n await fn(stores);\n return;\n }\n\n isInTransaction = true;\n transactionChanges = [];\n const snapshotStates = getState();\n\n log('Async transaction started');\n\n try {\n await fn(stores);\n\n isInTransaction = false;\n\n // Notify for all changed stores\n if (transactionChanges.length > 0) {\n log('Async transaction committed, changed stores:', transactionChanges);\n const state = getState();\n\n for (const listener of listeners) {\n try {\n listener(state, snapshotStates, transactionChanges[0]!);\n } catch (error) {\n console.error(`Federation listener error:`, error);\n }\n }\n\n previousStates = state;\n }\n } catch (error) {\n isInTransaction = false;\n\n // Rollback all stores to snapshot\n log('Async transaction failed, rolling back');\n for (const key in stores) {\n const store = stores[key];\n if (store) {\n store.setState(snapshotStates[key] as any);\n }\n }\n\n throw error;\n }\n },\n\n getStore<K extends keyof Stores>(storeName: K): Stores[K] {\n return stores[storeName];\n },\n\n destroy() {\n log('Destroying federation');\n for (const unsubscribe of unsubscribers) {\n unsubscribe();\n }\n listeners.clear();\n },\n };\n}\n\n/**\n * Create a selector that combines state from multiple stores.\n *\n * @param federation - The federation instance\n * @param selector - Selector function\n * @returns A function that returns the selected value\n *\n * @example\n * ```typescript\n * const getCartTotal = createFederatedSelector(\n * federation,\n * (state) => {\n * const items = state.cart.items;\n * const discount = state.user.user?.discount || 0;\n * const total = items.reduce((sum, item) => sum + item.price, 0);\n * return total * (1 - discount);\n * }\n * );\n *\n * const total = getCartTotal();\n * ```\n */\nexport function createFederatedSelector<\n Stores extends Record<string, Store<any>>,\n R\n>(\n federation: Federation<Stores>,\n selector: (state: FederatedState<Stores>) => R\n): () => R {\n return () => selector(federation.getState());\n}\n\n/**\n * Create a computed value from federated state.\n *\n * @param federation - The federation instance\n * @param selector - Selector function\n * @param equalityFn - Optional equality function for caching\n * @returns Object with get() and subscribe() methods\n *\n * @example\n * ```typescript\n * const isLoggedIn = createFederatedComputed(\n * federation,\n * (state) => state.user.user !== null\n * );\n *\n * // Get current value\n * if (isLoggedIn.get()) {\n * showDashboard();\n * }\n *\n * // Subscribe to changes\n * isLoggedIn.subscribe((value) => {\n * console.log('Login status:', value);\n * });\n * ```\n */\nexport function createFederatedComputed<\n Stores extends Record<string, Store<any>>,\n R\n>(\n federation: Federation<Stores>,\n selector: (state: FederatedState<Stores>) => R,\n equalityFn: (a: R, b: R) => boolean = Object.is\n): {\n get(): R;\n subscribe(listener: (value: R, prevValue: R) => void): () => void;\n} {\n let cachedValue = selector(federation.getState());\n const listeners = new Set<(value: R, prevValue: R) => void>();\n\n federation.subscribe((state) => {\n const newValue = selector(state);\n if (!equalityFn(newValue, cachedValue)) {\n const prevValue = cachedValue;\n cachedValue = newValue;\n for (const listener of listeners) {\n listener(newValue, prevValue);\n }\n }\n });\n\n return {\n get() {\n return cachedValue;\n },\n subscribe(listener: (value: R, prevValue: R) => void) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n\n/**\n * Wait for a condition across federated stores.\n *\n * @param federation - The federation instance\n * @param predicate - Condition to wait for\n * @param timeout - Optional timeout in ms\n * @returns Promise that resolves when condition is met\n *\n * @example\n * ```typescript\n * // Wait for user to be logged in and cart to have items\n * await waitForFederated(\n * federation,\n * (state) => state.user.user !== null && state.cart.items.length > 0,\n * 5000 // 5 second timeout\n * );\n *\n * // Now proceed with checkout\n * checkout();\n * ```\n */\nexport function waitForFederated<Stores extends Record<string, Store<any>>>(\n federation: Federation<Stores>,\n predicate: (state: FederatedState<Stores>) => boolean,\n timeout?: number\n): Promise<FederatedState<Stores>> {\n return new Promise((resolve, reject) => {\n // Check if already satisfied\n const state = federation.getState();\n if (predicate(state)) {\n resolve(state);\n return;\n }\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let unsubscribe: (() => void) | undefined;\n\n const cleanup = () => {\n if (timeoutId) clearTimeout(timeoutId);\n if (unsubscribe) unsubscribe();\n };\n\n if (timeout) {\n timeoutId = setTimeout(() => {\n cleanup();\n reject(new Error(`waitForFederated timed out after ${timeout}ms`));\n }, timeout);\n }\n\n unsubscribe = federation.subscribe((state) => {\n if (predicate(state)) {\n cleanup();\n resolve(state);\n }\n });\n });\n}\n","/**\n * Persist plugin - Save and restore state from storage.\n *\n * Automatically persists state to localStorage, sessionStorage, or any\n * storage implementation. State is restored on store creation.\n *\n * @example\n * ```typescript\n * import { createStore, persist } from '@oxog/state';\n *\n * const store = createStore({ count: 0, user: null })\n * .use(persist({\n * key: 'my-app',\n * storage: localStorage,\n * whitelist: ['count'] // Only persist count\n * }));\n * ```\n */\n\n// Global type declarations\ninterface Storage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n clear?: () => void;\n length?: number;\n key?: (index: number) => string | null;\n}\n\ndeclare const window: {\n localStorage: Storage;\n sessionStorage: Storage;\n} | undefined;\n\nimport type { Plugin, Store } from '../types.js';\nimport type { PersistOptions, StorageLike } from './types.js';\nimport { pick, omit } from '../utils/index.js';\n\n/**\n * Default localStorage implementation.\n */\nconst defaultStorage: StorageLike = {\n getItem: (key: string): string | null => {\n /* c8 ignore next */\n if (typeof window === 'undefined') return null;\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n },\n setItem: (key: string, value: string): void => {\n /* c8 ignore next */\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, value);\n } catch {\n // Ignore storage errors\n }\n },\n /* c8 ignore next 3 */\n removeItem: (): void => {\n // No-op: removeItem is not used by persist plugin\n },\n};\n\n/**\n * SessionStorage implementation.\n */\nexport const sessionStorage: StorageLike = {\n getItem: (key: string): string | null => {\n /* c8 ignore next */\n if (typeof window === 'undefined') return null;\n try {\n return window.sessionStorage.getItem(key);\n } catch {\n return null;\n }\n },\n setItem: (key: string, value: string): void => {\n /* c8 ignore next */\n if (typeof window === 'undefined') return;\n try {\n window.sessionStorage.setItem(key, value);\n } catch {\n // Ignore storage errors\n }\n },\n removeItem: (key: string): void => {\n /* c8 ignore next */\n if (typeof window === 'undefined') return;\n try {\n window.sessionStorage.removeItem(key);\n } catch {\n // Ignore storage errors\n }\n },\n};\n\n/**\n * Create a debounced function for persist writes.\n */\nfunction createDebounced<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): T & { cancel: () => void } {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const debounced = ((...args: Parameters<T>) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n fn(...args);\n timeoutId = null;\n }, delay);\n }) as T & { cancel: () => void };\n\n debounced.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return debounced;\n}\n\n/**\n * Storage wrapper with versioning.\n */\ninterface PersistedData<T> {\n state: T;\n version: number;\n}\n\n/**\n * Create a persist plugin.\n *\n * @param options - Plugin options\n * @returns A persist plugin\n *\n * @example\n * ```typescript\n * import { persist, sessionStorage } from '@oxog/state';\n *\n * // Using localStorage (default)\n * const store = createStore({ count: 0 })\n * .use(persist({ key: 'counter' }));\n *\n * // Using sessionStorage\n * const store = createStore({ count: 0 })\n * .use(persist({ key: 'counter', storage: sessionStorage }));\n *\n * // With whitelist\n * const store = createStore({ count: 0, temp: '' })\n * .use(persist({ key: 'app', whitelist: ['count'] }));\n *\n * // With encryption\n * const store = createStore({ secret: 'data' })\n * .use(persist({\n * key: 'secure',\n * encrypt: (data) => btoa(data),\n * decrypt: (data) => atob(data),\n * }));\n *\n * // With debounce and migration\n * const store = createStore({ count: 0 })\n * .use(persist({\n * key: 'app',\n * writeDebounce: 1000,\n * version: 2,\n * migrate: (state, version) => {\n * if (version < 2) return { ...state, newField: 'default' };\n * return state;\n * },\n * }));\n * ```\n */\nexport function persist<TState>(options: PersistOptions<TState>): Plugin<TState> {\n const {\n key,\n storage = defaultStorage,\n whitelist,\n blacklist,\n partialize,\n merge: customMerge,\n version = 0,\n migrate,\n serialize = JSON.stringify,\n deserialize = JSON.parse,\n encrypt,\n decrypt,\n writeDebounce,\n onRehydrateStorage,\n onHydrationComplete,\n onPersistError,\n } = options;\n\n let cancelDebounce: (() => void) | null = null;\n\n return {\n name: 'persist',\n version: '1.0.0',\n install(store: Store<TState>) {\n // Hydrate state from storage\n try {\n let saved = storage.getItem(key);\n\n // Decrypt if needed\n if (saved && decrypt) {\n try {\n saved = decrypt(saved);\n } catch {\n // Decryption failed, treat as no saved data\n saved = null;\n }\n }\n\n if (saved) {\n let parsed: Partial<TState>;\n let persistedVersion = 0;\n\n // Try to parse with versioning\n try {\n const data = deserialize(saved) as PersistedData<Partial<TState>> | Partial<TState>;\n\n // Check if it's versioned data\n if (data && typeof data === 'object' && 'state' in data && 'version' in data) {\n parsed = (data as PersistedData<Partial<TState>>).state;\n persistedVersion = (data as PersistedData<Partial<TState>>).version;\n } else {\n parsed = data as Partial<TState>;\n }\n } catch {\n // Fallback to direct parse\n parsed = deserialize(saved);\n }\n\n // Call onRehydrateStorage\n if (onRehydrateStorage) {\n onRehydrateStorage(parsed as TState);\n }\n\n // Run migration if needed\n if (migrate && persistedVersion < version) {\n parsed = migrate(parsed, persistedVersion) as Partial<TState>;\n }\n\n // Merge with current state\n if (customMerge) {\n const currentState = store.getState();\n const mergedState = customMerge(parsed, currentState);\n store.setState(mergedState as any);\n } else {\n store.merge(parsed as any);\n }\n\n // Call onHydrationComplete\n if (onHydrationComplete) {\n onHydrationComplete(store.getState());\n }\n }\n } catch (error) {\n if (onPersistError) {\n onPersistError(error as Error);\n } else {\n console.error(`Failed to hydrate state from '${key}':`, error);\n }\n }\n\n // Persist function\n const persistState = (state: TState) => {\n try {\n let toSave: Partial<TState> = state;\n\n // Apply partialize first\n if (partialize) {\n toSave = partialize(state);\n } else if (whitelist) {\n toSave = pick(state as any, whitelist) as Partial<TState>;\n } else if (blacklist) {\n toSave = omit(state as any, blacklist) as unknown as Partial<TState>;\n }\n\n // Wrap with version\n const dataToStore: PersistedData<Partial<TState>> = {\n state: toSave,\n version,\n };\n\n // Serialize\n let serialized = serialize(dataToStore as any);\n\n // Encrypt if needed\n if (encrypt) {\n serialized = encrypt(serialized);\n }\n\n storage.setItem(key, serialized);\n } catch (error) {\n if (onPersistError) {\n onPersistError(error as Error);\n } else {\n console.error(`Failed to persist state to '${key}':`, error);\n }\n }\n };\n\n // Apply debounce if configured\n const debouncedPersist = writeDebounce && writeDebounce > 0\n ? createDebounced(persistState, writeDebounce)\n : persistState;\n\n if (writeDebounce && writeDebounce > 0) {\n cancelDebounce = () => (debouncedPersist as any).cancel?.();\n }\n\n // Subscribe to state changes and persist\n store.subscribe(debouncedPersist);\n },\n onDestroy() {\n // Cancel pending debounced writes\n if (cancelDebounce) {\n cancelDebounce();\n }\n },\n };\n}\n\n/**\n * Create a custom storage from a storage object.\n *\n * @param storage - Any object with getItem, setItem, removeItem\n * @returns A StorageLike interface\n *\n * @example\n * ```typescript\n * import { createStorage } from '@oxog/state';\n *\n * const AsyncStorage = createStorage({\n * getItem: async (key) => await AsyncStorage.getItem(key),\n * setItem: async (key, value) => await AsyncStorage.setItem(key, value),\n * removeItem: async (key) => await AsyncStorage.removeItem(key),\n * });\n * ```\n */\nexport function createStorage(storage: StorageLike): StorageLike {\n return storage;\n}\n","/**\n * Devtools plugin - Redux DevTools integration.\n *\n * Connects to Redux DevTools extension for debugging state changes.\n *\n * @example\n * ```typescript\n * import { createStore, devtools } from '@oxog/state';\n *\n * const store = createStore({ count: 0 })\n * .use(devtools({ name: 'Counter' }));\n * ```\n */\n\n// Global type declarations\ndeclare const window: {\n __REDUX_DEVTOOLS_EXTENSION__?: DevtoolsExtension;\n} | undefined;\n\nimport type { Plugin, Store } from '../types.js';\nimport type { DevtoolsOptions } from './types.js';\n\n/**\n * DevTools connection interface.\n */\ninterface DevtoolsConnection {\n init(state: unknown): void;\n send(action: unknown, state: unknown): void;\n subscribe(callback: (message: any) => void): void;\n}\n\n/**\n * DevTools extension interface.\n */\ninterface DevtoolsExtension {\n connect(options: { name?: string }): DevtoolsConnection;\n}\n\n/**\n * Check if DevTools extension is available.\n */\nfunction hasDevtools(): boolean {\n return typeof window !== 'undefined' && !!window.__REDUX_DEVTOOLS_EXTENSION__;\n}\n\n/**\n * Get DevTools extension.\n */\nfunction getDevtools(): DevtoolsExtension | null {\n /* c8 ignore next 2 */\n if (typeof window === 'undefined') return null;\n return window.__REDUX_DEVTOOLS_EXTENSION__ || null;\n}\n\n/**\n * Create a DevTools plugin.\n *\n * @param options - Plugin options\n * @returns A DevTools plugin\n *\n * @example\n * ```typescript\n * import { devtools } from '@oxog/state';\n *\n * // Basic usage\n * const store = createStore({ count: 0 })\n * .use(devtools({ name: 'My Store' }));\n *\n * // Disabled in production\n * const store = createStore({ count: 0 })\n * .use(devtools({\n * name: 'My Store',\n * enabled: process.env.NODE_ENV === 'development'\n * }));\n * ```\n */\nexport function devtools<TState>(options: DevtoolsOptions = {}): Plugin<TState> {\n const { name = 'OxogState Store', enabled = true, maxAge = 50 } = options;\n let connection: DevtoolsConnection | null = null;\n let history: { state: TState; action: string }[] = [];\n\n return {\n name: 'devtools',\n version: '1.0.0',\n install(store: Store<TState>) {\n // Check if DevTools is available\n if (!enabled || !hasDevtools()) {\n return;\n }\n\n const extension = getDevtools();\n /* c8 ignore next */\n if (!extension) return;\n\n // Connect to DevTools\n connection = extension.connect({ name });\n\n // Initialize with current state\n connection.init(store.getState());\n\n // Subscribe to state changes\n store.subscribe((state, prevState) => {\n /* c8 ignore next */\n if (!connection) return;\n\n // Add to history\n history.push({ state, action: 'UPDATE' });\n if (history.length > maxAge) {\n history.shift();\n }\n\n // Send to DevTools\n connection.send({ type: 'UPDATE', prev: prevState }, state);\n });\n\n // Subscribe to DevTools messages\n connection.subscribe((message: any) => {\n if (message.type === 'DISPATCH' && message.payload) {\n switch (message.payload.type) {\n case 'JUMP_TO_STATE':\n case 'JUMP_TO_ACTION': {\n // Time travel\n const index = message.payload.type === 'JUMP_TO_ACTION'\n ? history.findIndex((h) => h.action === message.payload.action)\n : message.payload.index;\n\n if (index >= 0 && index < history.length) {\n const entry = history[index];\n if (entry) {\n store.setState(entry.state as any);\n }\n }\n break;\n }\n case 'COMMIT': {\n // Commit current state\n connection!.init(store.getState());\n history = [];\n break;\n }\n case 'ROLLBACK': {\n // Rollback to previous state\n if (history.length > 1) {\n const previous = history[history.length - 2];\n if (previous) {\n store.setState(previous.state as any);\n }\n }\n break;\n }\n case 'RESET': {\n // Reset to initial state\n store.reset();\n break;\n }\n }\n }\n });\n },\n onDestroy() {\n // Cleanup connection\n connection = null;\n history = [];\n },\n };\n}\n","/**\n * History plugin - Undo/redo functionality.\n *\n * Tracks state changes and provides undo/redo methods.\n *\n * @example\n * ```typescript\n * import { createStore, history } from '@oxog/state';\n *\n * const store = createStore({ count: 0 })\n * .use(history({ limit: 100 }));\n *\n * // Now store has undo() and redo() methods\n * store.setState({ count: 1 });\n * store.setState({ count: 2 });\n * store.undo(); // { count: 1 }\n * store.redo(); // { count: 2 }\n * ```\n */\n\nimport type { Plugin, Store } from '../types.js';\nimport type { HistoryOptions, HistoryStore } from './types.js';\n\n/**\n * History state for tracking past and future states.\n */\ninterface HistoryState<TState> {\n past: TState[];\n present: TState;\n future: TState[];\n}\n\n/**\n * Create a history plugin.\n *\n * @param options - Plugin options\n * @returns A history plugin\n *\n * @example\n * ```typescript\n * import { history } from '@oxog/state';\n *\n * // Default options\n * const store = createStore({ count: 0 })\n * .use(history());\n *\n * // Custom limit\n * const store = createStore({ count: 0 })\n * .use(history({ limit: 50 }));\n *\n * // Track specific keys only\n * const store = createStore({ count: 0, temp: '' })\n * .use(history({ keys: ['count'] }));\n * ```\n */\nexport function history<TState>(options: HistoryOptions<TState> = {}): Plugin<TState> {\n const { limit = 50, keys } = options;\n let historyState: HistoryState<TState> | null = null;\n let currentStore: Store<TState> | null = null;\n let isInternalUpdate = false; // Flag to skip recording during undo/redo\n\n return {\n name: 'history',\n version: '1.0.0',\n install(store: Store<TState>) {\n currentStore = store;\n\n // Initialize history\n historyState = {\n past: [],\n present: store.getState(),\n future: [],\n };\n\n // Subscribe to state changes\n store.subscribe((state) => {\n if (!historyState || isInternalUpdate) return;\n\n const previousPresent = historyState.present;\n const newPresent = state;\n\n // Check if state actually changed (respect keys if provided)\n let hasChanged = true;\n if (keys && keys.length > 0) {\n hasChanged = keys.some((key) => {\n return (previousPresent as any)[key] !== (newPresent as any)[key];\n });\n } else {\n hasChanged = previousPresent !== newPresent;\n }\n\n if (!hasChanged) return;\n\n // Add to history\n historyState.past.push(previousPresent);\n if (historyState.past.length > limit) {\n historyState.past.shift();\n }\n historyState.present = newPresent;\n historyState.future = [];\n });\n\n // Add undo method\n (store as any).undo = () => {\n if (!historyState || historyState.past.length === 0) return;\n\n const previous = historyState.past.pop()!;\n historyState.future.push(historyState.present);\n historyState.present = previous;\n\n // Update store state without triggering history recording\n isInternalUpdate = true;\n store.setState(previous as any);\n isInternalUpdate = false;\n };\n\n // Add redo method\n (store as any).redo = () => {\n if (!historyState || historyState.future.length === 0) return;\n\n const next = historyState.future.pop()!;\n historyState.past.push(historyState.present);\n historyState.present = next;\n\n // Update store state without triggering history recording\n isInternalUpdate = true;\n store.setState(next as any);\n isInternalUpdate = false;\n };\n\n // Add clear history method\n (store as any).clearHistory = () => {\n /* c8 ignore next */\n if (!historyState) return;\n historyState.past = [];\n historyState.future = [];\n };\n\n // Add canUndo method\n (store as any).canUndo = () => {\n return historyState !== null && historyState.past.length > 0;\n };\n\n // Add canRedo method\n (store as any).canRedo = () => {\n return historyState !== null && historyState.future.length > 0;\n };\n },\n onDestroy() {\n historyState = null;\n currentStore = null;\n },\n };\n}\n\n/**\n * Check if a store has history capabilities.\n *\n * @param store - The store to check\n * @returns true if store supports undo/redo\n *\n * @example\n * ```typescript\n * import { hasHistory } from '@oxog/state';\n *\n * if (hasHistory(store)) {\n * store.undo();\n * store.redo();\n * }\n * ```\n */\nexport function hasHistory<TState>(store: Store<TState>): store is HistoryStore<TState> {\n return (\n typeof (store as any).undo === 'function' &&\n typeof (store as any).redo === 'function'\n );\n}\n","/**\n * Sync plugin - Cross-tab state synchronization.\n *\n * Synchronizes state across browser tabs using BroadcastChannel API.\n *\n * @example\n * ```typescript\n * import { createStore, sync } from '@oxog/state';\n *\n * const store = createStore({ count: 0 })\n * .use(sync({ channel: 'my-app-state' }));\n *\n * // State changes will sync across all tabs\n * ```\n */\n\n// Global type declarations\ndeclare const BroadcastChannel: {\n prototype: BroadcastChannel;\n new (name: string): BroadcastChannel;\n} | undefined;\n\ninterface MessageEvent {\n data: any;\n type: string;\n target: EventTarget | null;\n srcElement: EventTarget | null;\n currentTarget: EventTarget | null;\n bubbles: boolean;\n cancelable: boolean;\n}\n\ninterface BroadcastChannel {\n name: string;\n postMessage(message: any): void;\n close(): void;\n onmessage: ((event: MessageEvent) => void) | null;\n onmessageerror: ((event: MessageEvent) => void) | null;\n addEventListener(\n type: 'message' | 'messageerror',\n listener: (event: MessageEvent) => void\n ): void;\n removeEventListener(\n type: 'message' | 'messageerror',\n listener: (event: MessageEvent) => void\n ): void;\n}\n\nimport type { Plugin, Store } from '../types.js';\nimport type { SyncOptions } from './types.js';\n\n/**\n * Create a sync plugin.\n *\n * @param options - Plugin options\n * @returns A sync plugin\n *\n * @example\n * ```typescript\n * import { sync } from '@oxog/state';\n *\n * // Default channel name\n * const store = createStore({ count: 0 })\n * .use(sync());\n *\n * // Custom channel name\n * const store = createStore({ count: 0 })\n * .use(sync({ channel: 'my-app' }));\n * ```\n */\nexport function sync<TState>(options: SyncOptions = {}): Plugin<TState> {\n const { channel = 'oxog-state' } = options;\n let broadcastChannel: BroadcastChannel | null = null;\n let currentStore: Store<TState> | null = null;\n let isLocalUpdate = false;\n\n return {\n name: 'sync',\n version: '1.0.0',\n install(store: Store<TState>) {\n currentStore = store;\n\n // Check if BroadcastChannel is available\n if (typeof BroadcastChannel === 'undefined') {\n console.warn('BroadcastChannel is not supported in this environment');\n return;\n }\n\n // Create broadcast channel\n broadcastChannel = new BroadcastChannel(channel);\n\n // Listen for messages from other tabs\n broadcastChannel.onmessage = (event: MessageEvent) => {\n if (!isLocalUpdate) {\n try {\n // Apply the remote state update\n store.setState(event.data as any);\n } catch (error) {\n console.error('Error applying sync state:', error);\n }\n }\n };\n\n // Note: State change broadcasting happens via onInit\n // Regular state changes don't need to be broadcast as they\n // are synchronized through the BroadcastChannel onmessage handler\n },\n\n onInit() {\n // Broadcast initial state to other tabs\n if (broadcastChannel && currentStore) {\n isLocalUpdate = true;\n try {\n broadcastChannel.postMessage(currentStore.getState());\n } catch (error) {\n console.error('Error broadcasting initial state:', error);\n }\n isLocalUpdate = false;\n }\n },\n\n onDestroy() {\n // Close the broadcast channel\n if (broadcastChannel) {\n broadcastChannel.close();\n broadcastChannel = null;\n }\n currentStore = null;\n },\n };\n}\n\n/**\n * Manually trigger a sync broadcast.\n *\n * @param store - The store to sync\n * @param channel - The channel to broadcast on\n *\n * @example\n * ```typescript\n * import { createStore, sync, triggerSync } from '@oxog/state';\n *\n * const store = createStore({ count: 0 })\n * .use(sync({ channel: 'my-app' }));\n *\n * // Manually trigger sync\n * triggerSync(store, 'my-app');\n * ```\n */\nexport function triggerSync<TState>(store: Store<TState>, channel = 'oxog-state'): void {\n if (typeof BroadcastChannel === 'undefined') {\n console.warn('BroadcastChannel is not supported in this environment');\n return;\n }\n\n const broadcastChannel = new BroadcastChannel(channel);\n broadcastChannel.postMessage(store.getState());\n broadcastChannel.close();\n}\n","/**\n * Immer plugin - Immutable updates with mutable syntax.\n *\n * Uses Proxy to enable writing immutable state updates with mutable syntax.\n *\n * @example\n * ```typescript\n * import { createStore, immer } from '@oxog/state';\n *\n * const store = createStore({\n * users: [{ name: 'John', age: 30 }]\n * }).use(immer());\n *\n * // Now you can write mutable-style updates\n * store.setState((draft) => {\n * draft.users[0].age = 31; // Mutate draft directly\n * });\n * ```\n */\n\nimport type { Plugin, Store } from '../types.js';\n\n/**\n * Create a proxy that tracks mutations.\n *\n * @param base - The base object\n * @param copies - Map of copied objects\n * @returns A proxied object\n */\nfunction createProxy<T extends object>(base: T, copies: Map<any, any>): T {\n /* c8 ignore next */\n return new Proxy(base || {}, {\n get(target, key) {\n const value = (target as any)[key];\n\n // If value is an object, return a proxy\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n // Check if we have a copy\n if (copies.has(value)) {\n return createProxy(copies.get(value), copies);\n }\n return createProxy(value, copies);\n }\n\n // Return primitive or array as-is\n return value;\n },\n\n set(target, key, value) {\n // Ensure we have a copy of the target\n if (!copies.has(target)) {\n copies.set(target, { ...target });\n }\n\n const copy = copies.get(target);\n copy[key] = value;\n return true;\n },\n\n deleteProperty(target, key) {\n if (!copies.has(target)) {\n copies.set(target, { ...target });\n }\n\n const copy = copies.get(target);\n delete copy[key];\n return true;\n },\n }) as T;\n}\n\n/**\n * Finalize the result by applying all copies.\n *\n * @param base - The base object\n * @param copies - Map of copied objects\n * @returns The final result (always a new object if base was in copies)\n */\nfunction finalize<T>(base: T, copies: Map<any, any>): T {\n if (!copies.has(base)) {\n // No copies were made, but we still need to ensure we don't return the same reference\n // Deep clone to ensure immutability\n return deepClone(base);\n }\n\n const copy = copies.get(base) as any;\n\n // Recursively finalize nested objects\n for (const key in copy) {\n if (Object.prototype.hasOwnProperty.call(copy, key)) {\n const value = copy[key];\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n copy[key] = finalize(value, copies);\n }\n }\n }\n\n return copy as T;\n}\n\n/**\n * Deep clone a value (simplified version for immer plugin).\n */\nfunction deepClone<T>(value: T): T {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((v) => deepClone(v)) as T;\n }\n\n const cloned = {} as T;\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n (cloned as any)[key] = deepClone((value as any)[key]);\n }\n }\n return cloned;\n}\n\n/**\n * Produce a new state by applying mutations to a draft.\n *\n * @param base - The base state\n * @param recipe - The mutation function\n * @returns The new state\n *\n * @example\n * ```typescript\n * import { produce } from '@oxog/state';\n *\n * const state = { users: [{ name: 'John', age: 30 }] };\n * const newState = produce(state, (draft) => {\n * draft.users[0].age = 31;\n * });\n * ```\n */\nexport function produce<T>(base: T, recipe: (draft: T) => void): T {\n const copies = new Map<any, any>();\n const draft = createProxy(base as object, copies) as T;\n\n recipe(draft);\n\n return finalize(base as object, copies) as T;\n}\n\n/**\n * Create an immer plugin.\n *\n * @returns An immer plugin\n *\n * @example\n * ```typescript\n * import { createStore, immer } from '@oxog/state';\n *\n * const store = createStore({\n * items: [{ id: 1, name: 'Item 1' }]\n * }).use(immer());\n *\n * // Now setState can accept a mutable recipe function\n * store.setState((draft) => {\n * draft.items[0].name = 'Updated Item';\n * draft.items.push({ id: 2, name: 'Item 2' });\n * });\n * ```\n */\nexport function immer<TState>(): Plugin<TState> {\n return {\n name: 'immer',\n version: '1.0.0',\n install(store: Store<TState>) {\n // Wrap setState to support recipe functions\n const originalSetState = store.setState.bind(store);\n\n store.setState = (update: any) => {\n if (typeof update === 'function') {\n // Assume this is a recipe function\n const newState = produce(store.getState(), update);\n originalSetState(newState as any);\n } else {\n originalSetState(update);\n }\n };\n },\n };\n}\n","/**\n * Selector plugin - Computed/derived values.\n *\n * Define computed values that automatically update when dependencies change.\n *\n * @example\n * ```typescript\n * import { createStore, selector } from '@oxog/state';\n *\n * const store = createStore({\n * items: [],\n * filter: 'all',\n * })\n * .use(selector({\n * // Computed: filtered items\n * filteredItems: (state) => {\n * if (state.filter === 'all') return state.items;\n * return state.items.filter((item: any) => item.status === state.filter);\n * },\n * // Computed: item count\n * itemCount: (state) => state.items.length,\n * }));\n *\n * // Access computed values\n * const state = store.getState();\n * console.log(state.filteredItems); // Computed value\n * ```\n */\n\nimport type { Plugin, Store } from '../types.js';\nimport type { SelectorOptions } from './types.js';\n\n/**\n * Create a selector plugin for computed values.\n *\n * @param options - Plugin options with selectors\n * @returns A selector plugin\n *\n * @example\n * ```typescript\n * import { selector } from '@oxog/state';\n *\n * const store = createStore({\n * items: [{ price: 10 }, { price: 20 }],\n * taxRate: 0.1,\n * })\n * .use(selector({\n * // Computed total\n * total: (state) =>\n * state.items.reduce((sum: number, item: any) => sum + item.price, 0),\n *\n * // Computed total with tax\n * totalWithTax: (state) => {\n * const total = state.items.reduce((sum: number, item: any) => sum + item.price, 0);\n * return total * (1 + state.taxRate);\n * },\n * }));\n * ```\n */\nexport function selector<TState>(options: SelectorOptions<TState>): Plugin<TState> {\n const { selectors } = options;\n\n return {\n name: 'selector',\n version: '1.0.0',\n install(store: Store<TState>) {\n // Save original getState before overriding\n const originalGetState = store.getState.bind(store);\n\n // Cache for computed values\n const cache = new Map<string, { value: any; state: any }>();\n\n // Computed state proxy\n const computedState = new Proxy({} as object, {\n get(_, prop: string) {\n const selectorFn = selectors[prop as keyof TState];\n\n if (selectorFn) {\n const currentState = originalGetState();\n const cacheKey = prop;\n\n // Check cache\n const cached = cache.get(cacheKey);\n if (cached && cached.state === currentState) {\n return cached.value;\n }\n\n // Compute value\n const value = selectorFn(currentState);\n cache.set(cacheKey, { value, state: currentState });\n return value;\n }\n\n // Return regular state value\n return (originalGetState() as any)[prop];\n },\n }) as TState;\n\n // Override getState to return computed state proxy\n store.getState = () => computedState;\n\n // Clear cache on state change\n store.subscribe(() => {\n cache.clear();\n });\n },\n };\n}\n","/**\n * Logger plugin for console logging state changes.\n *\n * @module plugins/logger\n */\n\n// Global type declarations\ndeclare const window: {\n document: unknown;\n} | undefined;\n\nimport type { Plugin, Store } from '../types.js';\n\n/**\n * Log level for filtering messages.\n */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\n/**\n * Logger options.\n */\nexport interface LoggerOptions<TState = unknown> {\n /** Log level filter (default: 'debug') */\n level?: LogLevel;\n /** Custom logger (default: console) */\n logger?: Console;\n /** Use collapsed console groups (default: true) */\n collapsed?: boolean;\n /** Show state diff (default: true) */\n diff?: boolean;\n /** Colorize output (default: true in browsers) */\n colors?: boolean;\n /** Show timestamp (default: true) */\n timestamp?: boolean;\n /** Filter function to skip certain changes */\n filter?: (state: TState, prevState: TState) => boolean;\n /** Transform state before logging */\n stateTransformer?: (state: TState) => unknown;\n /** Custom action name (default: 'STATE_CHANGE') */\n actionName?: string | ((state: TState, prevState: TState) => string);\n /** Name for this logger instance */\n name?: string;\n /** Enabled flag (default: true) */\n enabled?: boolean;\n}\n\n/**\n * Log level priority.\n */\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\n/**\n * Console colors for different parts of the log.\n */\nconst COLORS = {\n title: '#9E9E9E',\n prevState: '#9E9E9E',\n action: '#03A9F4',\n nextState: '#4CAF50',\n error: '#F44336',\n diff: {\n added: '#4CAF50',\n removed: '#F44336',\n changed: '#2196F3',\n },\n};\n\n/**\n * Format timestamp.\n */\nfunction formatTime(date: Date): string {\n const hours = date.getHours().toString().padStart(2, '0');\n const minutes = date.getMinutes().toString().padStart(2, '0');\n const seconds = date.getSeconds().toString().padStart(2, '0');\n const ms = date.getMilliseconds().toString().padStart(3, '0');\n return `${hours}:${minutes}:${seconds}.${ms}`;\n}\n\n/**\n * Calculate diff between two states.\n */\nfunction calculateDiff<T>(prevState: T, nextState: T): Record<string, { prev: any; next: any }> {\n const diff: Record<string, { prev: any; next: any }> = {};\n\n if (typeof prevState !== 'object' || typeof nextState !== 'object') {\n if (prevState !== nextState) {\n diff['value'] = { prev: prevState, next: nextState };\n }\n return diff;\n }\n\n if (prevState === null || nextState === null) {\n if (prevState !== nextState) {\n diff['value'] = { prev: prevState, next: nextState };\n }\n return diff;\n }\n\n const allKeys = new Set([\n ...Object.keys(prevState as object),\n ...Object.keys(nextState as object),\n ]);\n\n for (const key of allKeys) {\n const prev = (prevState as any)[key];\n const next = (nextState as any)[key];\n\n if (prev !== next) {\n diff[key] = { prev, next };\n }\n }\n\n return diff;\n}\n\n/**\n * Check if running in browser.\n */\nfunction isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof window.document !== 'undefined';\n}\n\n/**\n * Create a logger plugin.\n *\n * @param options - Logger options\n * @returns A logger plugin\n *\n * @example\n * ```typescript\n * import { createStore, logger } from '@oxog/state';\n *\n * // Basic usage\n * const store = createStore({ count: 0 })\n * .use(logger());\n *\n * // With options\n * const store = createStore({ count: 0 })\n * .use(logger({\n * level: 'info',\n * collapsed: false,\n * diff: true,\n * name: 'CounterStore',\n * }));\n *\n * // Disabled in production\n * const store = createStore({ count: 0 })\n * .use(logger({\n * enabled: process.env.NODE_ENV !== 'production',\n * }));\n * ```\n */\nexport function logger<TState = unknown>(\n options: LoggerOptions<TState> = {}\n): Plugin<TState> {\n const {\n level = 'debug',\n logger: customLogger = console,\n collapsed = true,\n diff = true,\n colors = isBrowser(),\n timestamp = true,\n filter,\n stateTransformer,\n actionName = 'STATE_CHANGE',\n name = 'Store',\n enabled = true,\n } = options;\n\n const minLevel = LOG_LEVELS[level];\n\n return {\n name: 'logger',\n version: '1.0.0',\n\n install(store: Store<TState>) {\n if (!enabled) return;\n\n // Subscribe to state changes\n store.subscribe((state, prevState) => {\n // Check filter\n if (filter && !filter(state, prevState)) {\n return;\n }\n\n // Skip if log level too low\n if (LOG_LEVELS.info < minLevel) {\n return;\n }\n\n const now = new Date();\n const action = typeof actionName === 'function'\n ? actionName(state, prevState)\n : actionName;\n\n // Transform states if needed\n const displayPrevState = stateTransformer ? stateTransformer(prevState) : prevState;\n const displayNextState = stateTransformer ? stateTransformer(state) : state;\n\n // Build title\n const timeStr = timestamp ? ` @ ${formatTime(now)}` : '';\n const title = `${name} ${action}${timeStr}`;\n\n // Log with grouping\n if (colors && isBrowser()) {\n logWithColors(\n customLogger,\n title,\n displayPrevState,\n displayNextState,\n collapsed,\n diff ? calculateDiff(prevState, state) : undefined\n );\n } else {\n logPlain(\n customLogger,\n title,\n displayPrevState,\n displayNextState,\n collapsed,\n diff ? calculateDiff(prevState, state) : undefined\n );\n }\n });\n },\n };\n}\n\n/**\n * Log with colors (browser).\n */\nfunction logWithColors(\n log: Console,\n title: string,\n prevState: unknown,\n nextState: unknown,\n collapsed: boolean,\n diff?: Record<string, { prev: any; next: any }>\n): void {\n const titleStyle = `color: ${COLORS.title}; font-weight: lighter;`;\n const groupMethod = collapsed ? 'groupCollapsed' : 'group';\n\n log[groupMethod](`%c${title}`, titleStyle);\n\n log.log('%cprev state', `color: ${COLORS.prevState}; font-weight: bold;`, prevState);\n log.log('%cnext state', `color: ${COLORS.nextState}; font-weight: bold;`, nextState);\n\n if (diff && Object.keys(diff).length > 0) {\n log.log('%cdiff', `color: ${COLORS.action}; font-weight: bold;`);\n for (const [key, { prev, next }] of Object.entries(diff)) {\n log.log(\n ` %c${key}:`,\n `color: ${COLORS.diff.changed};`,\n prev,\n '→',\n next\n );\n }\n }\n\n log.groupEnd();\n}\n\n/**\n * Log without colors (Node.js or no color support).\n */\nfunction logPlain(\n log: Console,\n title: string,\n prevState: unknown,\n nextState: unknown,\n collapsed: boolean,\n diff?: Record<string, { prev: any; next: any }>\n): void {\n const hasGroupCollapsed = typeof log.groupCollapsed === 'function';\n const groupMethod = collapsed && hasGroupCollapsed ? 'groupCollapsed' : 'group';\n const hasGroup = typeof log[groupMethod] === 'function';\n\n if (hasGroup) {\n log[groupMethod](title);\n } else {\n log.log(`=== ${title} ===`);\n }\n\n log.log('prev state:', prevState);\n log.log('next state:', nextState);\n\n if (diff && Object.keys(diff).length > 0) {\n log.log('diff:');\n for (const [key, { prev, next }] of Object.entries(diff)) {\n log.log(` ${key}:`, prev, '→', next);\n }\n }\n\n if (hasGroup) {\n log.groupEnd();\n } else {\n log.log('===');\n }\n}\n\n/**\n * Create a logger with preset options.\n *\n * @param defaultOptions - Default options\n * @returns A logger factory function\n *\n * @example\n * ```typescript\n * const devLogger = createLogger({\n * enabled: process.env.NODE_ENV === 'development',\n * collapsed: true,\n * });\n *\n * const store = createStore({ count: 0 })\n * .use(devLogger({ name: 'Counter' }));\n * ```\n */\nexport function createLogger<TState = unknown>(\n defaultOptions: LoggerOptions<TState> = {}\n): (options?: LoggerOptions<TState>) => Plugin<TState> {\n return (options = {}) => logger({ ...defaultOptions, ...options });\n}\n","/**\n * Effects plugin for managing side effects.\n *\n * Provides a declarative way to handle async operations,\n * API calls, and other side effects in response to state changes.\n *\n * @module plugins/effects\n */\n\nimport type { Plugin, Store, Selector, EqualityFn } from '../types.js';\nimport { shallowEqual } from '../utils/index.js';\n\n/**\n * Effect cleanup function.\n */\nexport type EffectCleanup = () => void;\n\n/**\n * Effect function that runs when dependencies change.\n */\nexport type EffectFn<T> = (\n value: T,\n prevValue: T,\n utils: EffectUtils\n) => void | EffectCleanup | Promise<void | EffectCleanup>;\n\n/**\n * Utilities available to effects.\n */\nexport interface EffectUtils {\n /** Get current store state */\n getState: () => unknown;\n /** Set store state */\n setState: (partial: any) => void;\n /** Check if effect is still active (not cancelled) */\n isActive: () => boolean;\n /** Cancel this effect */\n cancel: () => void;\n /** Run a callback only if effect is active */\n onlyIfActive: <T>(fn: () => T) => T | undefined;\n}\n\n/**\n * Effect definition for the effects plugin.\n */\nexport interface EffectDefinition<TState, TSelected = TState> {\n /** Selector to watch */\n selector: Selector<TState, TSelected>;\n /** Effect function */\n effect: EffectFn<TSelected>;\n /** Custom equality function */\n equalityFn?: EqualityFn<TSelected>;\n /** Fire effect immediately with current value */\n fireImmediately?: boolean;\n /** Debounce effect (ms) */\n debounce?: number;\n /** Effect name for debugging */\n name?: string;\n}\n\n/**\n * Options for the effects plugin.\n */\nexport interface EffectsOptions<TState> {\n /** Array of effect definitions */\n effects: EffectDefinition<TState, any>[];\n /** Error handler for effect errors */\n onError?: (error: Error, effectName?: string) => void;\n}\n\n/**\n * Create a debounced function.\n */\nfunction createDebounced<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): T & { cancel: () => void } {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const debounced = ((...args: Parameters<T>) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n fn(...args);\n timeoutId = null;\n }, delay);\n }) as T & { cancel: () => void };\n\n debounced.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return debounced;\n}\n\n/**\n * Create an effects plugin.\n *\n * @param options - Effects configuration\n * @returns An effects plugin\n *\n * @example\n * ```typescript\n * import { createStore, effects } from '@oxog/state';\n *\n * const store = createStore({\n * userId: null,\n * user: null,\n * loading: false,\n * }).use(effects({\n * effects: [\n * {\n * name: 'fetchUser',\n * selector: (s) => s.userId,\n * effect: async (userId, _prev, { setState, isActive }) => {\n * if (!userId) return;\n *\n * setState({ loading: true });\n * try {\n * const user = await fetchUser(userId);\n * if (isActive()) {\n * setState({ user, loading: false });\n * }\n * } catch (error) {\n * if (isActive()) {\n * setState({ user: null, loading: false });\n * }\n * }\n * },\n * },\n * ],\n * }));\n * ```\n */\nexport function effects<TState>(options: EffectsOptions<TState>): Plugin<TState> {\n const { effects: effectDefs, onError } = options;\n\n return {\n name: 'effects',\n version: '1.0.0',\n\n install(store: Store<TState>) {\n const cleanups: (() => void)[] = [];\n const effectCleanups = new Map<number, EffectCleanup>();\n\n // Set up each effect\n for (let i = 0; i < effectDefs.length; i++) {\n const def = effectDefs[i];\n if (!def) continue;\n\n const {\n selector,\n effect,\n equalityFn = shallowEqual,\n fireImmediately = false,\n debounce,\n name,\n } = def;\n\n let isActive = true;\n let prevValue: any = selector(store.getState());\n\n // Create effect utilities\n const createUtils = (): EffectUtils => ({\n getState: () => store.getState(),\n setState: (partial) => store.setState(partial),\n isActive: () => isActive,\n cancel: () => {\n isActive = false;\n },\n onlyIfActive: <T>(fn: () => T): T | undefined => {\n if (isActive) {\n return fn();\n }\n return undefined;\n },\n });\n\n // Run effect function\n const runEffect = async (value: any, prev: any) => {\n // Clean up previous effect if any\n const prevCleanup = effectCleanups.get(i);\n if (prevCleanup) {\n try {\n prevCleanup();\n } catch (e) {\n // Ignore cleanup errors\n }\n effectCleanups.delete(i);\n }\n\n // Reset active flag\n isActive = true;\n\n try {\n const result = effect(value, prev, createUtils());\n\n // Handle async effects\n if (result instanceof Promise) {\n const cleanup = await result;\n if (cleanup && isActive) {\n effectCleanups.set(i, cleanup);\n }\n } else if (result) {\n effectCleanups.set(i, result);\n }\n } catch (error) {\n if (onError) {\n onError(error as Error, name);\n } else {\n console.error(`Effect error${name ? ` in '${name}'` : ''}:`, error);\n }\n }\n };\n\n // Wrap with debounce if needed\n const effectFn = debounce && debounce > 0\n ? createDebounced(runEffect, debounce)\n : runEffect;\n\n // Fire immediately if requested\n if (fireImmediately) {\n effectFn(prevValue, prevValue);\n }\n\n // Subscribe to changes\n const unsubscribe = store.subscribe(\n selector,\n (value, prev) => {\n if (!equalityFn(value, prev)) {\n prevValue = value;\n effectFn(value, prev);\n }\n },\n equalityFn\n );\n\n // Track cleanup\n cleanups.push(() => {\n unsubscribe();\n isActive = false;\n\n // Cancel debounced function\n if ('cancel' in effectFn) {\n (effectFn as any).cancel();\n }\n\n // Run cleanup\n const cleanup = effectCleanups.get(i);\n if (cleanup) {\n try {\n cleanup();\n } catch {\n // Ignore\n }\n }\n });\n }\n\n // Store cleanup function for onDestroy\n (store as any).__effectsCleanup = () => {\n for (const cleanup of cleanups) {\n cleanup();\n }\n effectCleanups.clear();\n };\n },\n\n };\n}\n\n/**\n * Create an effect definition helper.\n *\n * @param name - Effect name\n * @param selector - Selector to watch\n * @param effect - Effect function\n * @param options - Additional options\n * @returns Effect definition\n *\n * @example\n * ```typescript\n * const fetchUserEffect = createEffect(\n * 'fetchUser',\n * (s) => s.userId,\n * async (userId, _prev, { setState }) => {\n * const user = await api.getUser(userId);\n * setState({ user });\n * },\n * { fireImmediately: true }\n * );\n *\n * const store = createStore({ userId: null, user: null })\n * .use(effects({ effects: [fetchUserEffect] }));\n * ```\n */\nexport function createEffect<TState, TSelected>(\n name: string,\n selector: Selector<TState, TSelected>,\n effect: EffectFn<TSelected>,\n options: Omit<EffectDefinition<TState, TSelected>, 'name' | 'selector' | 'effect'> = {}\n): EffectDefinition<TState, TSelected> {\n return {\n name,\n selector,\n effect,\n ...options,\n };\n}\n\n/**\n * Create a simple effect that runs on any state change.\n *\n * @param effect - Effect function\n * @param options - Effect options\n * @returns Effect definition\n *\n * @example\n * ```typescript\n * const logEffect = createSimpleEffect(\n * (state, prevState) => {\n * console.log('State changed:', state);\n * }\n * );\n * ```\n */\nexport function createSimpleEffect<TState>(\n effect: (state: TState, prevState: TState, utils: EffectUtils) => void | EffectCleanup,\n options: Omit<EffectDefinition<TState, TState>, 'selector' | 'effect'> = {}\n): EffectDefinition<TState, TState> {\n return {\n selector: (s) => s,\n effect,\n equalityFn: () => false, // Always run\n ...options,\n };\n}\n\n/**\n * Combine multiple effect definitions.\n *\n * @param effectDefs - Effect definitions to combine\n * @returns Combined effects options\n *\n * @example\n * ```typescript\n * const store = createStore({ ... })\n * .use(effects(combineEffects(\n * fetchUserEffect,\n * saveToStorageEffect,\n * analyticsEffect,\n * )));\n * ```\n */\nexport function combineEffects<TState>(\n ...effectDefs: EffectDefinition<TState, any>[]\n): EffectsOptions<TState> {\n return {\n effects: effectDefs,\n };\n}\n\n/**\n * Create a debounced effect that only fires after a delay.\n *\n * @param delay - Debounce delay in ms\n * @param selector - Selector to watch\n * @param effect - Effect function\n * @returns Effect definition\n *\n * @example\n * ```typescript\n * const searchEffect = createDebouncedEffect(\n * 300,\n * (s) => s.searchQuery,\n * async (query, _prev, { setState }) => {\n * const results = await api.search(query);\n * setState({ searchResults: results });\n * }\n * );\n * ```\n */\nexport function createDebouncedEffect<TState, TSelected>(\n delay: number,\n selector: Selector<TState, TSelected>,\n effect: EffectFn<TSelected>,\n options: Omit<EffectDefinition<TState, TSelected>, 'selector' | 'effect' | 'debounce'> = {}\n): EffectDefinition<TState, TSelected> {\n return {\n selector,\n effect,\n debounce: delay,\n ...options,\n };\n}\n","/**\n * Validation plugin for state schema validation.\n *\n * Provides schema-agnostic validation with support for Zod, Yup,\n * or custom validation functions.\n *\n * @module plugins/validate\n */\n\nimport type { Plugin, Store } from '../types.js';\n\n/**\n * Validation error type.\n */\nexport interface ValidationError {\n /** Path to the invalid field */\n path: string[];\n /** Error message */\n message: string;\n /** Validation rule that failed */\n rule?: string;\n /** The invalid value */\n value?: unknown;\n}\n\n/**\n * Validation result.\n */\nexport interface ValidationResult {\n /** Whether validation passed */\n valid: boolean;\n /** List of validation errors */\n errors: ValidationError[];\n}\n\n/**\n * Custom validator function type.\n */\nexport type ValidatorFn<T> = (state: T) => boolean | ValidationResult | ValidationError[];\n\n/**\n * Zod-like schema interface.\n */\nexport interface ZodLikeSchema<T> {\n safeParse(data: unknown): {\n success: boolean;\n error?: {\n issues: Array<{\n path: (string | number)[];\n message: string;\n code?: string;\n }>;\n };\n data?: T;\n };\n}\n\n/**\n * Yup-like schema interface.\n */\nexport interface YupLikeSchema<T> {\n validateSync(data: unknown, options?: { abortEarly?: boolean }): T;\n validate(data: unknown, options?: { abortEarly?: boolean }): Promise<T>;\n}\n\n/**\n * Schema type - supports Zod, Yup, or custom validators.\n */\nexport type Schema<T> = ZodLikeSchema<T> | YupLikeSchema<T> | ValidatorFn<T>;\n\n/**\n * Validation timing options.\n */\nexport type ValidationTiming = 'change' | 'commit' | 'manual';\n\n/**\n * Validation plugin options.\n */\nexport interface ValidateOptions<T> {\n /** Schema to validate against (Zod, Yup, or custom function) */\n schema: Schema<T>;\n /** When to validate: 'change' (every setState), 'commit' (on batch commit), 'manual' (only when validate() called) */\n on?: ValidationTiming;\n /** Callback when validation fails */\n onError?: (errors: ValidationError[]) => void;\n /** Throw error on validation failure */\n throwOnError?: boolean;\n /** Only validate these paths (keys of state) */\n paths?: Array<keyof T>;\n /** Name for debugging */\n name?: string;\n}\n\n/**\n * Validation API added to store.\n */\nexport interface ValidationAPI {\n /** Manually trigger validation */\n validate(): ValidationResult;\n /** Check if current state is valid */\n isValid(): boolean;\n /** Get current validation errors */\n getErrors(): ValidationError[];\n /** Clear validation errors */\n clearErrors(): void;\n}\n\n/**\n * Detect if schema is Zod-like.\n */\nfunction isZodLike<T>(schema: Schema<T>): schema is ZodLikeSchema<T> {\n return (\n typeof schema === 'object' &&\n schema !== null &&\n 'safeParse' in schema &&\n typeof schema.safeParse === 'function'\n );\n}\n\n/**\n * Detect if schema is Yup-like.\n */\nfunction isYupLike<T>(schema: Schema<T>): schema is YupLikeSchema<T> {\n return (\n typeof schema === 'object' &&\n schema !== null &&\n 'validateSync' in schema &&\n typeof schema.validateSync === 'function'\n );\n}\n\n/**\n * Extract partial state for path-based validation.\n */\nfunction extractPaths<T>(state: T, paths: Array<keyof T>): Partial<T> {\n const result: Partial<T> = {};\n for (const path of paths) {\n if (path in (state as object)) {\n result[path] = (state as any)[path];\n }\n }\n return result;\n}\n\n/**\n * Validate state using the provided schema.\n */\nfunction validateState<T>(\n state: T,\n schema: Schema<T>,\n paths?: Array<keyof T>\n): ValidationResult {\n const stateToValidate = paths ? extractPaths(state, paths) : state;\n\n // Custom validator function\n if (typeof schema === 'function') {\n const result = schema(stateToValidate as T);\n\n // Boolean result\n if (typeof result === 'boolean') {\n return {\n valid: result,\n errors: result\n ? []\n : [{ path: [], message: 'Validation failed' }],\n };\n }\n\n // ValidationResult\n if ('valid' in result && 'errors' in result) {\n return result as ValidationResult;\n }\n\n // Array of errors\n if (Array.isArray(result)) {\n return {\n valid: result.length === 0,\n errors: result,\n };\n }\n\n return { valid: true, errors: [] };\n }\n\n // Zod-like schema\n if (isZodLike(schema)) {\n const result = schema.safeParse(stateToValidate);\n\n if (result.success) {\n return { valid: true, errors: [] };\n }\n\n const errors: ValidationError[] = (result.error?.issues || []).map((issue) => ({\n path: issue.path.map(String),\n message: issue.message,\n rule: issue.code,\n }));\n\n return { valid: false, errors };\n }\n\n // Yup-like schema\n if (isYupLike(schema)) {\n try {\n schema.validateSync(stateToValidate, { abortEarly: false });\n return { valid: true, errors: [] };\n } catch (error: any) {\n // Yup throws ValidationError with inner array\n const errors: ValidationError[] = [];\n\n if (error.inner && Array.isArray(error.inner)) {\n for (const err of error.inner) {\n errors.push({\n path: err.path ? err.path.split('.') : [],\n message: err.message,\n rule: err.type,\n value: err.value,\n });\n }\n } else {\n errors.push({\n path: error.path ? error.path.split('.') : [],\n message: error.message || 'Validation failed',\n rule: error.type,\n });\n }\n\n return { valid: false, errors };\n }\n }\n\n // Unknown schema type\n return { valid: true, errors: [] };\n}\n\n/**\n * Create a validation plugin.\n *\n * @param options - Validation options\n * @returns A validation plugin\n *\n * @example\n * ```typescript\n * import { createStore, validate } from '@oxog/state';\n * import { z } from 'zod';\n *\n * // With Zod schema\n * const userSchema = z.object({\n * name: z.string().min(1),\n * age: z.number().min(0),\n * email: z.string().email(),\n * });\n *\n * const store = createStore({ name: '', age: 0, email: '' })\n * .use(validate({\n * schema: userSchema,\n * on: 'change',\n * onError: (errors) => console.log('Validation errors:', errors),\n * }));\n *\n * // Manual validation\n * const result = store.validate();\n * if (!result.valid) {\n * console.log(result.errors);\n * }\n *\n * // Check if valid\n * if (store.isValid()) {\n * submitForm();\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With custom validator function\n * const store = createStore({ password: '', confirmPassword: '' })\n * .use(validate({\n * schema: (state) => {\n * const errors = [];\n * if (state.password.length < 8) {\n * errors.push({\n * path: ['password'],\n * message: 'Password must be at least 8 characters',\n * });\n * }\n * if (state.password !== state.confirmPassword) {\n * errors.push({\n * path: ['confirmPassword'],\n * message: 'Passwords must match',\n * });\n * }\n * return errors;\n * },\n * on: 'change',\n * }));\n * ```\n *\n * @example\n * ```typescript\n * // With partial validation\n * const store = createStore({ name: '', age: 0, temp: '' })\n * .use(validate({\n * schema: userSchema,\n * paths: ['name', 'age'], // Only validate these fields\n * }));\n * ```\n */\nexport function validate<TState>(\n options: ValidateOptions<TState>\n): Plugin<TState> {\n const {\n schema,\n on = 'change',\n onError,\n throwOnError = false,\n paths,\n name = 'validate',\n } = options;\n\n return {\n name,\n version: '1.0.0',\n\n install(store: Store<TState>) {\n let currentErrors: ValidationError[] = [];\n\n // Validation function\n const doValidate = (): ValidationResult => {\n const state = store.getState();\n const result = validateState(state, schema, paths);\n\n currentErrors = result.errors;\n\n if (!result.valid) {\n if (onError) {\n onError(result.errors);\n }\n\n if (throwOnError) {\n const errorMessages = result.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n throw new Error(`Validation failed: ${errorMessages}`);\n }\n }\n\n return result;\n };\n\n // Subscribe if validation timing is 'change'\n if (on === 'change') {\n store.subscribe(() => {\n doValidate();\n });\n }\n\n // Add validation API to store\n const validationAPI: ValidationAPI = {\n validate: doValidate,\n isValid: () => currentErrors.length === 0,\n getErrors: () => [...currentErrors],\n clearErrors: () => {\n currentErrors = [];\n },\n };\n\n // Extend store with validation API\n Object.assign(store, validationAPI);\n },\n };\n}\n\n/**\n * Create a simple boolean validator.\n *\n * @param predicate - Validation predicate function\n * @param message - Error message when validation fails\n * @returns A validator function\n *\n * @example\n * ```typescript\n * const isPositive = createValidator(\n * (state) => state.count >= 0,\n * 'Count must be positive'\n * );\n *\n * const store = createStore({ count: 0 })\n * .use(validate({ schema: isPositive }));\n * ```\n */\nexport function createValidator<T>(\n predicate: (state: T) => boolean,\n message: string\n): ValidatorFn<T> {\n return (state: T): ValidationResult => {\n const valid = predicate(state);\n return {\n valid,\n errors: valid ? [] : [{ path: [], message }],\n };\n };\n}\n\n/**\n * Combine multiple validators into one.\n *\n * @param validators - Array of validator functions\n * @returns Combined validator function\n *\n * @example\n * ```typescript\n * const combinedValidator = combineValidators(\n * createValidator((s) => s.name.length > 0, 'Name required'),\n * createValidator((s) => s.age >= 18, 'Must be 18+'),\n * );\n *\n * const store = createStore({ name: '', age: 0 })\n * .use(validate({ schema: combinedValidator }));\n * ```\n */\nexport function combineValidators<T>(\n ...validators: ValidatorFn<T>[]\n): ValidatorFn<T> {\n return (state: T): ValidationResult => {\n const allErrors: ValidationError[] = [];\n\n for (const validator of validators) {\n const result = validator(state);\n\n if (typeof result === 'boolean') {\n if (!result) {\n allErrors.push({ path: [], message: 'Validation failed' });\n }\n } else if ('valid' in result && 'errors' in result) {\n allErrors.push(...(result as ValidationResult).errors);\n } else if (Array.isArray(result)) {\n allErrors.push(...result);\n }\n }\n\n return {\n valid: allErrors.length === 0,\n errors: allErrors,\n };\n };\n}\n\n/**\n * Create a field-level validator.\n *\n * @param field - Field name to validate\n * @param predicate - Validation predicate for field value\n * @param message - Error message when validation fails\n * @returns A validator function\n *\n * @example\n * ```typescript\n * const emailValidator = createFieldValidator(\n * 'email',\n * (email) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email),\n * 'Invalid email format'\n * );\n *\n * const store = createStore({ email: '' })\n * .use(validate({ schema: emailValidator }));\n * ```\n */\nexport function createFieldValidator<T, K extends keyof T>(\n field: K,\n predicate: (value: T[K], state: T) => boolean,\n message: string\n): ValidatorFn<T> {\n return (state: T): ValidationResult => {\n const valid = predicate(state[field], state);\n return {\n valid,\n errors: valid ? [] : [{ path: [String(field)], message, value: state[field] }],\n };\n };\n}\n\n/**\n * Create an async validator (for server-side validation).\n *\n * @param validator - Async validation function\n * @returns A promise that resolves to validation result\n *\n * @example\n * ```typescript\n * const checkUsername = createAsyncValidator(async (state) => {\n * const exists = await api.checkUsername(state.username);\n * return exists\n * ? [{ path: ['username'], message: 'Username already taken' }]\n * : [];\n * });\n *\n * // Manual validation\n * const result = await checkUsername(store.getState());\n * ```\n */\nexport function createAsyncValidator<T>(\n validator: (state: T) => Promise<ValidationError[]>\n): (state: T) => Promise<ValidationResult> {\n return async (state: T): Promise<ValidationResult> => {\n const errors = await validator(state);\n return {\n valid: errors.length === 0,\n errors,\n };\n };\n}\n","/**\n * Testing utilities for @oxog/state.\n *\n * Provides helpers for testing stores, state changes,\n * and async effects in unit tests.\n *\n * @module testing\n */\n\nimport type { Store, Selector, EqualityFn } from './types.js';\nimport { createStore } from './store.js';\nimport { shallowEqual } from './utils/index.js';\n\n/**\n * Mock storage for testing persist plugin.\n */\nexport interface MockStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n clear(): void;\n getAll(): Record<string, string>;\n}\n\n/**\n * Create a mock storage for testing.\n *\n * @returns A mock storage implementation\n *\n * @example\n * ```typescript\n * import { createMockStorage, persist } from '@oxog/state';\n *\n * const mockStorage = createMockStorage();\n *\n * const store = createStore({ count: 0 })\n * .use(persist({ key: 'test', storage: mockStorage }));\n *\n * store.setState({ count: 5 });\n * expect(mockStorage.getItem('test')).toBe('{\"count\":5}');\n * ```\n */\nexport function createMockStorage(): MockStorage {\n const storage = new Map<string, string>();\n\n return {\n getItem(key: string): string | null {\n return storage.get(key) ?? null;\n },\n setItem(key: string, value: string): void {\n storage.set(key, value);\n },\n removeItem(key: string): void {\n storage.delete(key);\n },\n clear(): void {\n storage.clear();\n },\n getAll(): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, value] of storage) {\n result[key] = value;\n }\n return result;\n },\n };\n}\n\n/**\n * State change record for tracking.\n */\nexport interface StateChange<TState> {\n state: TState;\n prevState: TState;\n timestamp: number;\n}\n\n/**\n * Store spy for testing state changes.\n */\nexport interface StoreSpy<TState> {\n /** All recorded state changes */\n changes: StateChange<TState>[];\n /** Get the last state change */\n lastChange: () => StateChange<TState> | undefined;\n /** Get the last state */\n lastState: () => TState | undefined;\n /** Reset recorded changes */\n reset: () => void;\n /** Unsubscribe from store */\n unsubscribe: () => void;\n /** Wait for a specific state condition */\n waitFor: (\n predicate: (state: TState) => boolean,\n timeout?: number\n ) => Promise<TState>;\n /** Wait for a specific number of changes */\n waitForChanges: (count: number, timeout?: number) => Promise<StateChange<TState>[]>;\n}\n\n/**\n * Create a spy to track store state changes.\n *\n * @param store - The store to spy on\n * @returns A store spy object\n *\n * @example\n * ```typescript\n * import { createStore, spyOnStore } from '@oxog/state';\n *\n * const store = createStore({ count: 0 });\n * const spy = spyOnStore(store);\n *\n * store.setState({ count: 1 });\n * store.setState({ count: 2 });\n *\n * expect(spy.changes).toHaveLength(2);\n * expect(spy.lastState()?.count).toBe(2);\n * ```\n */\nexport function spyOnStore<TState>(store: Store<TState>): StoreSpy<TState> {\n const changes: StateChange<TState>[] = [];\n const waiters: Array<{\n resolve: (state: TState) => void;\n predicate: (state: TState) => boolean;\n }> = [];\n\n const unsubscribe = store.subscribe((state, prevState) => {\n changes.push({\n state,\n prevState,\n timestamp: Date.now(),\n });\n\n // Check waiters\n for (let i = waiters.length - 1; i >= 0; i--) {\n const waiter = waiters[i];\n if (waiter && waiter.predicate(state)) {\n waiter.resolve(state);\n waiters.splice(i, 1);\n }\n }\n });\n\n return {\n changes,\n lastChange: () => changes[changes.length - 1],\n lastState: () => changes[changes.length - 1]?.state,\n reset: () => {\n changes.length = 0;\n },\n unsubscribe,\n waitFor: (predicate, timeout = 5000) => {\n return new Promise((resolve, reject) => {\n // Check immediately\n const current = store.getState();\n if (predicate(current)) {\n resolve(current);\n return;\n }\n\n // Set up waiter\n const waiter = { resolve, predicate };\n waiters.push(waiter);\n\n // Set timeout\n const timeoutId = setTimeout(() => {\n const index = waiters.indexOf(waiter);\n if (index >= 0) {\n waiters.splice(index, 1);\n reject(new Error(`waitFor timeout after ${timeout}ms`));\n }\n }, timeout);\n\n // Clear timeout on resolve\n const originalResolve = waiter.resolve;\n waiter.resolve = (state) => {\n clearTimeout(timeoutId);\n originalResolve(state);\n };\n });\n },\n waitForChanges: (count, timeout = 5000) => {\n return new Promise((resolve, reject) => {\n const startCount = changes.length;\n\n const check = () => {\n if (changes.length >= startCount + count) {\n return changes.slice(startCount, startCount + count);\n }\n return null;\n };\n\n // Check immediately\n const immediate = check();\n if (immediate) {\n resolve(immediate);\n return;\n }\n\n // Set up interval check\n const intervalId = setInterval(() => {\n const result = check();\n if (result) {\n clearInterval(intervalId);\n clearTimeout(timeoutId);\n resolve(result);\n }\n }, 10);\n\n // Set timeout\n const timeoutId = setTimeout(() => {\n clearInterval(intervalId);\n reject(new Error(`waitForChanges timeout after ${timeout}ms`));\n }, timeout);\n });\n },\n };\n}\n\n/**\n * Test helper for asserting state values.\n */\nexport interface StateAssertion<TState> {\n /** Assert the current state equals expected */\n toEqual: (expected: Partial<TState>) => void;\n /** Assert a selector value equals expected */\n toHaveSelected: <T>(selector: Selector<TState, T>, expected: T) => void;\n /** Assert state matches a predicate */\n toMatch: (predicate: (state: TState) => boolean) => void;\n}\n\n/**\n * Create assertions for a store's state.\n *\n * @param store - The store to assert on\n * @returns State assertion helpers\n *\n * @example\n * ```typescript\n * import { createStore, assertState } from '@oxog/state';\n *\n * const store = createStore({ count: 0, name: 'test' });\n * const assert = assertState(store);\n *\n * assert.toEqual({ count: 0 });\n * assert.toHaveSelected(s => s.name, 'test');\n * assert.toMatch(s => s.count >= 0);\n * ```\n */\nexport function assertState<TState>(store: Store<TState>): StateAssertion<TState> {\n return {\n toEqual: (expected) => {\n const state = store.getState();\n for (const [key, value] of Object.entries(expected)) {\n if ((state as any)[key] !== value) {\n throw new Error(\n `Expected state.${key} to be ${JSON.stringify(value)}, ` +\n `but got ${JSON.stringify((state as any)[key])}`\n );\n }\n }\n },\n toHaveSelected: <T>(selector: Selector<TState, T>, expected: T) => {\n const actual = selector(store.getState());\n if (!shallowEqual(actual, expected)) {\n throw new Error(\n `Expected selector to return ${JSON.stringify(expected)}, ` +\n `but got ${JSON.stringify(actual)}`\n );\n }\n },\n toMatch: (predicate) => {\n const state = store.getState();\n if (!predicate(state)) {\n throw new Error(\n `State did not match predicate: ${JSON.stringify(state)}`\n );\n }\n },\n };\n}\n\n/**\n * Options for test store creation.\n */\nexport interface TestStoreOptions<TState> {\n /** Initial state */\n initialState: TState;\n /** Whether to enable spy automatically */\n spy?: boolean;\n}\n\n/**\n * Test store wrapper with built-in utilities.\n */\nexport interface TestStore<TState> {\n /** The underlying store */\n store: Store<TState>;\n /** State spy (if enabled) */\n spy?: StoreSpy<TState>;\n /** State assertions */\n assert: StateAssertion<TState>;\n /** Reset store to initial state */\n reset: () => void;\n /** Destroy store and cleanup */\n destroy: () => void;\n}\n\n/**\n * Create a test store with built-in utilities.\n *\n * @param options - Test store options\n * @returns A test store wrapper\n *\n * @example\n * ```typescript\n * import { createTestStore } from '@oxog/state';\n *\n * describe('Counter', () => {\n * let testStore: TestStore<{ count: number }>;\n *\n * beforeEach(() => {\n * testStore = createTestStore({ initialState: { count: 0 }, spy: true });\n * });\n *\n * afterEach(() => {\n * testStore.destroy();\n * });\n *\n * it('should increment count', () => {\n * testStore.store.setState({ count: 1 });\n * testStore.assert.toEqual({ count: 1 });\n * expect(testStore.spy?.changes).toHaveLength(1);\n * });\n * });\n * ```\n */\nexport function createTestStore<TState>(\n options: TestStoreOptions<TState>\n): TestStore<TState> {\n const { initialState, spy: enableSpy = true } = options;\n\n const store = createStore(initialState);\n const spy = enableSpy ? spyOnStore(store) : undefined;\n const assert = assertState(store);\n\n return {\n store,\n spy,\n assert,\n reset: () => {\n store.reset();\n spy?.reset();\n },\n destroy: () => {\n spy?.unsubscribe();\n store.destroy();\n },\n };\n}\n\n/**\n * Wait for a specified amount of time.\n *\n * @param ms - Milliseconds to wait\n * @returns A promise that resolves after the delay\n *\n * @example\n * ```typescript\n * await delay(100);\n * ```\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Run a function and wait for all pending microtasks.\n *\n * @param fn - Function to run\n * @returns A promise that resolves after microtasks complete\n *\n * @example\n * ```typescript\n * await flushMicrotasks(() => {\n * store.setState({ count: 1 });\n * });\n * ```\n */\nexport async function flushMicrotasks(fn?: () => void): Promise<void> {\n if (fn) {\n fn();\n }\n await Promise.resolve();\n}\n\n/**\n * Wrap a store action for testing with call tracking.\n */\nexport interface MockedAction<TArgs extends any[], TReturn> {\n /** Call the action */\n (...args: TArgs): TReturn;\n /** Number of times called */\n callCount: number;\n /** Arguments from each call */\n calls: TArgs[];\n /** Reset call tracking */\n reset: () => void;\n}\n\n/**\n * Create a mocked action for testing.\n *\n * @param fn - The original function\n * @returns A mocked action with call tracking\n *\n * @example\n * ```typescript\n * const mockIncrement = mockAction((amount: number) => {\n * store.setState(s => ({ count: s.count + amount }));\n * });\n *\n * mockIncrement(5);\n * mockIncrement(3);\n *\n * expect(mockIncrement.callCount).toBe(2);\n * expect(mockIncrement.calls).toEqual([[5], [3]]);\n * ```\n */\nexport function mockAction<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => TReturn\n): MockedAction<TArgs, TReturn> {\n const calls: TArgs[] = [];\n\n const mocked = ((...args: TArgs): TReturn => {\n calls.push(args);\n return fn(...args);\n }) as MockedAction<TArgs, TReturn>;\n\n Object.defineProperty(mocked, 'callCount', {\n get: () => calls.length,\n });\n\n mocked.calls = calls;\n mocked.reset = () => {\n calls.length = 0;\n };\n\n return mocked;\n}\n\n/**\n * Create a snapshot of the current store state.\n *\n * @param store - The store to snapshot\n * @returns A deep clone of the current state\n *\n * @example\n * ```typescript\n * const before = snapshot(store);\n * store.setState({ count: 5 });\n * const after = snapshot(store);\n *\n * expect(before.count).toBe(0);\n * expect(after.count).toBe(5);\n * ```\n */\nexport function snapshot<TState>(store: Store<TState>): TState {\n return JSON.parse(JSON.stringify(store.getState()));\n}\n\n/**\n * Compare two state snapshots and return differences.\n *\n * @param before - State before changes\n * @param after - State after changes\n * @returns Object containing changed keys and their values\n *\n * @example\n * ```typescript\n * const before = { count: 0, name: 'test' };\n * const after = { count: 5, name: 'test' };\n *\n * const diff = stateDiff(before, after);\n * // { count: { before: 0, after: 5 } }\n * ```\n */\nexport function stateDiff<TState extends Record<string, any>>(\n before: TState,\n after: TState\n): Record<string, { before: any; after: any }> {\n const diff: Record<string, { before: any; after: any }> = {};\n const allKeys = new Set([...Object.keys(before), ...Object.keys(after)]);\n\n for (const key of allKeys) {\n if (!shallowEqual(before[key], after[key])) {\n diff[key] = { before: before[key], after: after[key] };\n }\n }\n\n return diff;\n}\n","/**\n * Middleware Compatibility Layer\n *\n * Provides a generic middleware pattern for state management,\n * enabling compatibility with various middleware ecosystems.\n *\n * @module compat/middleware\n */\n\nimport type { Plugin, Store } from '../types.js';\n\n/**\n * Middleware-style SetState function.\n */\nexport type MiddlewareSetState<T> = {\n (partial: Partial<T> | ((state: T) => Partial<T>), replace?: boolean): void;\n};\n\n/**\n * Middleware-style GetState function.\n */\nexport type MiddlewareGetState<T> = () => T;\n\n/**\n * Middleware-style Subscribe function.\n */\nexport type MiddlewareSubscribe<T> = (listener: (state: T, prevState: T) => void) => () => void;\n\n/**\n * Generic StoreApi for middleware compatibility.\n */\nexport interface MiddlewareStoreApi<T> {\n setState: MiddlewareSetState<T>;\n getState: MiddlewareGetState<T>;\n subscribe: MiddlewareSubscribe<T>;\n destroy?: () => void;\n}\n\n/**\n * State creator function for middleware pattern.\n */\nexport type StateCreatorFn<T, Mps extends unknown[] = [], Mcs extends unknown[] = []> = (\n set: MiddlewareSetState<T>,\n get: MiddlewareGetState<T>,\n api: MiddlewareStoreApi<T>\n) => T;\n\n/**\n * Generic Middleware type.\n */\nexport type MiddlewareFn<\n T,\n Mps extends unknown[] = [],\n Mcs extends unknown[] = []\n> = (\n creator: StateCreatorFn<T, Mps, Mcs>\n) => StateCreatorFn<T, Mps, Mcs>;\n\n/**\n * Convert an @oxog/state store to middleware-compatible API.\n *\n * @param store - An @oxog/state store\n * @returns A middleware-compatible store API\n *\n * @example\n * ```typescript\n * import { createStore, toMiddlewareApi } from '@oxog/state';\n *\n * const store = createStore({ count: 0 });\n * const api = toMiddlewareApi(store);\n *\n * // Use middleware-style API\n * api.setState({ count: 1 });\n * api.setState((state) => ({ count: state.count + 1 }));\n * console.log(api.getState()); // { count: 2 }\n * ```\n */\nexport function toMiddlewareApi<T>(store: Store<T>): MiddlewareStoreApi<T> {\n return {\n setState: (partial, replace) => {\n if (typeof partial === 'function') {\n const currentState = store.getState();\n const newPartial = partial(currentState);\n if (replace) {\n store.setState(newPartial as any);\n } else {\n store.merge(newPartial as any);\n }\n } else {\n if (replace) {\n store.setState(partial as any);\n } else {\n store.merge(partial as any);\n }\n }\n },\n getState: () => store.getState(),\n subscribe: (listener) => store.subscribe(listener),\n destroy: () => store.destroy(),\n };\n}\n\n/**\n * Wrap a middleware to work as an @oxog/state plugin.\n *\n * @param middleware - A middleware function\n * @param options - Optional middleware options\n * @returns An @oxog/state plugin\n *\n * @example\n * ```typescript\n * import { createStore, middlewareCompat } from '@oxog/state';\n *\n * // Use external middleware with @oxog/state\n * const store = createStore({ count: 0 })\n * .use(middlewareCompat(someMiddleware, { name: 'MyStore' }));\n * ```\n */\nexport function middlewareCompat<T>(\n middleware: MiddlewareFn<T>,\n options?: Record<string, unknown>\n): Plugin<T> {\n return {\n name: 'middleware-compat',\n version: '1.0.0',\n\n install(store: Store<T>) {\n // Create middleware-compatible API\n const api = toMiddlewareApi(store);\n\n // Create a state creator that returns current state\n const stateCreator: StateCreatorFn<T> = (set, get) => {\n // Return current state - middleware can modify it\n return get();\n };\n\n // Apply the middleware\n const enhancedCreator = middleware(stateCreator);\n\n // Create enhanced API with middleware's modifications\n const enhancedState = enhancedCreator(api.setState, api.getState, api);\n\n // If middleware returned new state/methods, merge them\n if (enhancedState && typeof enhancedState === 'object') {\n const currentState = store.getState();\n const stateOnly: Partial<T> = {};\n\n // Extract only state values (not functions)\n for (const key in enhancedState) {\n const value = enhancedState[key];\n if (typeof value !== 'function') {\n stateOnly[key as keyof T] = value;\n }\n }\n\n // Merge new state if different\n if (Object.keys(stateOnly).length > 0) {\n const hasChanges = Object.keys(stateOnly).some(\n (key) => currentState[key as keyof T] !== stateOnly[key as keyof T]\n );\n if (hasChanges) {\n store.merge(stateOnly as any);\n }\n }\n }\n },\n };\n}\n\n/**\n * Create a store using middleware-style state creator.\n *\n * @param creator - Middleware-style state creator function\n * @returns A store API\n *\n * @example\n * ```typescript\n * import { createWithMiddleware } from '@oxog/state';\n *\n * const store = createWithMiddleware((set, get) => ({\n * count: 0,\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * decrement: () => set((state) => ({ count: state.count - 1 })),\n * reset: () => set({ count: 0 }),\n * getDoubled: () => get().count * 2,\n * }));\n *\n * store.getState().increment();\n * console.log(store.getState().count); // 1\n * ```\n */\nexport function createWithMiddleware<T extends object>(\n creator: StateCreatorFn<T>\n): MiddlewareStoreApi<T> & { use: <U>(plugin: Plugin<T>) => MiddlewareStoreApi<T> } {\n // Import createStore dynamically to avoid circular dependency\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { createStore } = require('../store.js');\n\n // Create temporary state holder\n let currentState: T | null = null;\n let storeRef: Store<T> | null = null;\n\n // Create middleware-style set/get\n const set: MiddlewareSetState<T> = (partial, replace) => {\n if (!storeRef) {\n throw new Error('Store not initialized');\n }\n\n if (typeof partial === 'function') {\n const newPartial = partial(storeRef.getState());\n if (replace) {\n storeRef.setState(newPartial as any);\n } else {\n storeRef.merge(newPartial as any);\n }\n } else {\n if (replace) {\n storeRef.setState(partial as any);\n } else {\n storeRef.merge(partial as any);\n }\n }\n };\n\n const get: MiddlewareGetState<T> = () => {\n if (storeRef) {\n return storeRef.getState();\n }\n if (currentState) {\n return currentState;\n }\n throw new Error('Store not initialized');\n };\n\n // Create placeholder API for initialization\n const placeholderApi: MiddlewareStoreApi<T> = {\n setState: set,\n getState: get,\n subscribe: () => () => {},\n };\n\n // Run creator to get initial state\n currentState = creator(set, get, placeholderApi);\n\n // Create actual store\n storeRef = createStore(currentState);\n\n // Create full API\n const api: MiddlewareStoreApi<T> & { use: <U>(plugin: Plugin<T>) => MiddlewareStoreApi<T> } = {\n setState: (partial, replace) => {\n if (typeof partial === 'function') {\n const newPartial = partial(storeRef!.getState());\n if (replace) {\n storeRef!.setState(newPartial as any);\n } else {\n storeRef!.merge(newPartial as any);\n }\n } else {\n if (replace) {\n storeRef!.setState(partial as any);\n } else {\n storeRef!.merge(partial as any);\n }\n }\n },\n getState: () => storeRef!.getState(),\n subscribe: (listener) => storeRef!.subscribe(listener),\n destroy: () => storeRef!.destroy(),\n use: (plugin) => {\n storeRef!.use(plugin);\n return api;\n },\n };\n\n return api;\n}\n\n/**\n * Create a simple middleware.\n *\n * @param name - Middleware name\n * @param enhancer - Function that enhances the state creator\n * @returns A middleware function\n *\n * @example\n * ```typescript\n * const loggerMiddleware = createSimpleMiddleware('logger', (creator) => (set, get, api) => {\n * const loggedSet: typeof set = (partial, replace) => {\n * console.log('Before:', get());\n * set(partial, replace);\n * console.log('After:', get());\n * };\n * return creator(loggedSet, get, api);\n * });\n *\n * const store = createStore({ count: 0 })\n * .use(middlewareCompat(loggerMiddleware));\n * ```\n */\nexport function createSimpleMiddleware<T>(\n name: string,\n enhancer: (\n creator: StateCreatorFn<T>\n ) => StateCreatorFn<T>\n): MiddlewareFn<T> {\n const middleware = enhancer as MiddlewareFn<T>;\n // Add name for debugging\n Object.defineProperty(middleware, 'name', { value: name });\n return middleware;\n}\n\n/**\n * Compose multiple middlewares.\n *\n * @param middlewares - Array of middlewares\n * @returns A single composed middleware\n *\n * @example\n * ```typescript\n * import { compose, middlewareCompat } from '@oxog/state';\n *\n * const composedMiddleware = compose(\n * loggerMiddleware,\n * devtoolsMiddleware,\n * persistMiddleware,\n * );\n *\n * const store = createStore({ count: 0 })\n * .use(middlewareCompat(composedMiddleware));\n * ```\n */\nexport function compose<T>(\n ...middlewares: MiddlewareFn<T>[]\n): MiddlewareFn<T> {\n return (creator) => {\n return middlewares.reduceRight((acc, middleware) => {\n return middleware(acc);\n }, creator);\n };\n}\n\n/**\n * Type helper for extracting state type from a store API.\n */\nexport type ExtractStateType<S> = S extends MiddlewareStoreApi<infer T> ? T : never;\n\n/**\n * Type helper for selector function.\n */\nexport type SelectorFn<T, U> = (state: T) => U;\n\n/**\n * Type helper for equality function.\n */\nexport type EqualityCheck<T> = (a: T, b: T) => boolean;\n\n// Legacy aliases for backward compatibility (deprecated)\n/** @deprecated Use MiddlewareSetState instead */\nexport type ZustandSetState<T> = MiddlewareSetState<T>;\n/** @deprecated Use MiddlewareGetState instead */\nexport type ZustandGetState<T> = MiddlewareGetState<T>;\n/** @deprecated Use MiddlewareSubscribe instead */\nexport type ZustandSubscribe<T> = MiddlewareSubscribe<T>;\n/** @deprecated Use MiddlewareStoreApi instead */\nexport type ZustandStoreApi<T> = MiddlewareStoreApi<T>;\n/** @deprecated Use StateCreatorFn instead */\nexport type ZustandStateCreator<T, Mps extends unknown[] = [], Mcs extends unknown[] = []> = StateCreatorFn<T, Mps, Mcs>;\n/** @deprecated Use MiddlewareFn instead */\nexport type ZustandMiddleware<T, Mps extends unknown[] = [], Mcs extends unknown[] = []> = MiddlewareFn<T, Mps, Mcs>;\n/** @deprecated Use toMiddlewareApi instead */\nexport const toZustandApi = toMiddlewareApi;\n/** @deprecated Use middlewareCompat instead */\nexport const zustandCompat = middlewareCompat;\n/** @deprecated Use createWithMiddleware instead */\nexport const createWithZustand = createWithMiddleware;\n/** @deprecated Use createSimpleMiddleware instead */\nexport const createMiddleware = createSimpleMiddleware;\n/** @deprecated Use compose instead */\nexport const composeMiddleware = compose;\n/** @deprecated Use ExtractStateType instead */\nexport type ExtractState<S> = ExtractStateType<S>;\n/** @deprecated Use SelectorFn instead */\nexport type ZustandSelector<T, U> = SelectorFn<T, U>;\n/** @deprecated Use EqualityCheck instead */\nexport type ZustandEqualityFn<T> = EqualityCheck<T>;\n"]}