@oxog/state 1.0.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.
@@ -0,0 +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"]}
package/package.json ADDED
@@ -0,0 +1,86 @@
1
+ {
2
+ "name": "@oxog/state",
3
+ "version": "1.0.0",
4
+ "description": "Zero-dependency reactive state management for any framework",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ }
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "sideEffects": false,
25
+ "scripts": {
26
+ "build": "tsup",
27
+ "test": "vitest run",
28
+ "test:watch": "vitest",
29
+ "test:coverage": "vitest run --coverage",
30
+ "lint": "eslint src/",
31
+ "format": "prettier --write .",
32
+ "typecheck": "tsc --noEmit",
33
+ "prepublishOnly": "npm run build && npm run test:coverage"
34
+ },
35
+ "keywords": [
36
+ "state",
37
+ "state-management",
38
+ "store",
39
+ "reactive",
40
+ "react",
41
+ "hooks",
42
+ "zustand-alternative",
43
+ "redux-alternative",
44
+ "signals",
45
+ "framework-agnostic",
46
+ "typescript",
47
+ "zero-dependency"
48
+ ],
49
+ "author": "Ersin Koç",
50
+ "license": "MIT",
51
+ "repository": {
52
+ "type": "git",
53
+ "url": "git+https://github.com/ersinkoc/state.git"
54
+ },
55
+ "bugs": {
56
+ "url": "https://github.com/ersinkoc/state/issues"
57
+ },
58
+ "homepage": "https://state.oxog.dev",
59
+ "engines": {
60
+ "node": ">=18"
61
+ },
62
+ "peerDependencies": {
63
+ "react": ">=18.0.0"
64
+ },
65
+ "peerDependenciesMeta": {
66
+ "react": {
67
+ "optional": true
68
+ }
69
+ },
70
+ "devDependencies": {
71
+ "@testing-library/jest-dom": "^6.9.1",
72
+ "@testing-library/react": "^14.3.1",
73
+ "@types/node": "^20.0.0",
74
+ "@types/react": "^18.0.0",
75
+ "@vitest/coverage-v8": "^2.0.0",
76
+ "eslint": "^9.0.0",
77
+ "happy-dom": "^20.0.11",
78
+ "jsdom": "^24.0.0",
79
+ "prettier": "^3.0.0",
80
+ "react": "^18.0.0",
81
+ "react-dom": "^18.3.1",
82
+ "tsup": "^8.0.0",
83
+ "typescript": "^5.0.0",
84
+ "vitest": "^2.0.0"
85
+ }
86
+ }