@bkincz/clutch 1.0.2 โ 1.1.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/.tsbuildinfo +1 -1
- package/dist/index.d.mts +33 -3
- package/dist/index.d.ts +33 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/readme.md +10 -10
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/machine.ts","../src/hooks.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/*\n * IMPORTS\n ***************************************************************************************************/\nimport { produce, enablePatches, applyPatches, type Patch, type Draft } from 'immer'\n\nenablePatches()\n\n/*\n * CONSTANTS\n ***************************************************************************************************/\nconst DEFAULT_AUTO_SAVE_INTERVAL = 5 // in minutes\nconst DEFAULT_MAX_HISTORY_SIZE = 50\nconst DEFAULT_VERSION = '1.0.0'\nconst NOTIFICATION_DEBOUNCE_MS = 16\n\n/*\n * ERROR TYPES\n ***************************************************************************************************/\nexport class StateMachineError extends Error {\n\tpublic readonly code: string\n\n\tconstructor(message: string, code: string) {\n\t\tsuper(message)\n\t\tthis.name = 'StateMachineError'\n\t\tthis.code = code\n\t}\n}\n\nexport class StateValidationError extends StateMachineError {\n\tconstructor(message: string) {\n\t\tsuper(message, 'VALIDATION_ERROR')\n\t}\n}\n\nexport class StatePersistenceError extends StateMachineError {\n\tconstructor(message: string) {\n\t\tsuper(message, 'PERSISTENCE_ERROR')\n\t}\n}\n\n/*\n * TYPES\n ***************************************************************************************************/\nexport interface StateConfig<T extends object> {\n\tinitialState: T\n\tpersistenceKey?: string\n\tautoSaveInterval?: number\n\tmaxHistorySize?: number\n\tenablePersistence?: boolean\n\tenableAutoSave?: boolean\n\tenableLogging?: boolean\n\tvalidateState?: (state: T) => boolean\n}\n\ninterface InternalStateConfig<T extends object> {\n\tinitialState: T\n\tpersistenceKey: string | null\n\tautoSaveInterval: number\n\tmaxHistorySize: number\n\tenablePersistence: boolean\n\tenableAutoSave: boolean\n\tenableLogging: boolean\n\tvalidateState: (state: T) => boolean\n}\n\nexport interface StateSnapshot {\n\tpatches: Patch[]\n\tinversePatches: Patch[]\n\ttimestamp: number\n\tdescription?: string\n}\n\nexport interface PersistedState<T> {\n\tstate: T\n\ttimestamp: number\n\tversion: string\n\tchecksum?: string\n}\n\nexport interface StateHistoryInfo {\n\tcanUndo: boolean\n\tcanRedo: boolean\n\thistoryLength: number\n\tcurrentIndex: number\n\tlastAction: string | null\n\tmemoryUsage: number\n}\n\n// Compact logger - will be optimized out in production builds\n/* eslint-disable no-console */\nconst createLogger = (enabled: boolean) => ({\n\tdebug: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.debug(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\tinfo: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.info(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\twarn: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.warn(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\terror: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.error(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n})\n/* eslint-enable no-console */\n\n/*\n * FUNCTIONS\n ***************************************************************************************************/\nfunction debounce<T extends (...args: unknown[]) => void>(func: T, wait: number): T {\n\tlet timeout: ReturnType<typeof setTimeout>\n\treturn ((...args: Parameters<T>) => {\n\t\tclearTimeout(timeout)\n\t\ttimeout = setTimeout(() => func(...args), wait)\n\t}) as T\n}\n\n// Compact utility functions\nconst calculateMemoryUsage = (data: unknown): number => {\n\ttry {\n\t\treturn new Blob([JSON.stringify(data)]).size\n\t} catch {\n\t\treturn 0\n\t}\n}\n\nconst generateChecksum = (data: unknown): string => {\n\ttry {\n\t\tconst str = JSON.stringify(data)\n\t\tlet hash = 0\n\t\tfor (let i = 0; i < str.length; i++) {\n\t\t\thash = ((hash << 5) - hash + str.charCodeAt(i)) & hash\n\t\t}\n\t\treturn hash.toString(36)\n\t} catch {\n\t\treturn ''\n\t}\n}\n\n/*\n * STATE MACHINE\n ***************************************************************************************************/\nexport abstract class StateMachine<T extends object> {\n\tprotected state: T\n\tprotected config: InternalStateConfig<T>\n\tprotected listeners: Set<(state: T) => void> = new Set()\n\tprotected history: StateSnapshot[] = []\n\tprotected historyIndex = -1\n\tprotected isDirty = false\n\tprotected autoSaveTimer: ReturnType<typeof setInterval> | null = null\n\tprotected isDestroyed = false\n\tprotected logger: ReturnType<typeof createLogger>\n\tprotected debouncedNotify: () => void\n\n\tconstructor(config: StateConfig<T>) {\n\t\tthis.validateConfig(config)\n\n\t\tthis.config = {\n\t\t\tinitialState: config.initialState,\n\t\t\tpersistenceKey: config.persistenceKey || null,\n\t\t\tautoSaveInterval: config.autoSaveInterval ?? DEFAULT_AUTO_SAVE_INTERVAL,\n\t\t\tmaxHistorySize: config.maxHistorySize ?? DEFAULT_MAX_HISTORY_SIZE,\n\t\t\tenablePersistence: config.enablePersistence ?? true,\n\t\t\tenableAutoSave: config.enableAutoSave ?? true,\n\t\t\tenableLogging: config.enableLogging ?? false,\n\t\t\tvalidateState: config.validateState ?? (() => true),\n\t\t}\n\n\t\tthis.logger = createLogger(this.config.enableLogging)\n\t\tthis.debouncedNotify = debounce(() => this.notifyListeners(), NOTIFICATION_DEBOUNCE_MS)\n\n\t\ttry {\n\t\t\tthis.state = this.loadPersistedState() || config.initialState\n\t\t\tthis.validateCurrentState()\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to load persisted state, using initial state', error)\n\t\t\tthis.state = config.initialState\n\t\t\t// Validate the fallback initial state\n\t\t\tthis.validateCurrentState()\n\t\t}\n\n\t\tif (this.config.enableAutoSave) {\n\t\t\tthis.startAutoSave()\n\t\t}\n\n\t\tthis.logger.info('StateMachine initialized', {\n\t\t\tpersistenceKey: this.config.persistenceKey,\n\t\t\tautoSaveInterval: this.config.autoSaveInterval,\n\t\t\tmaxHistorySize: this.config.maxHistorySize,\n\t\t})\n\t}\n\n\t// TODO: Remove this and separate it from class in the future\n\tprotected abstract saveToServer(state: T): Promise<void>\n\tprotected abstract loadFromServer(): Promise<T | null>\n\n\t/*\n\t * PUBLIC\n\t ***************************************************************************************************/\n\n\t/*\n\t * CORE METHODS\n\t */\n\tpublic getState(): T {\n\t\tthis.assertNotDestroyed()\n\t\treturn this.state\n\t}\n\n\tpublic subscribe(listener: (state: T) => void): () => void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof listener !== 'function') {\n\t\t\tthrow new StateValidationError('Listener must be a function')\n\t\t}\n\n\t\tthis.listeners.add(listener)\n\n\t\ttry {\n\t\t\tlistener(this.state)\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Initial listener call failed', error)\n\t\t}\n\n\t\tthis.logger.debug('Listener subscribed', {\n\t\t\ttotalListeners: this.listeners.size,\n\t\t})\n\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener)\n\t\t\tthis.logger.debug('Listener unsubscribed', {\n\t\t\t\ttotalListeners: this.listeners.size,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic mutate(recipe: (draft: Draft<T>) => void, description?: string): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof recipe !== 'function') {\n\t\t\tthrow new StateValidationError('Recipe must be a function')\n\t\t}\n\n\t\ttry {\n\t\t\tlet patches: Patch[] = []\n\t\t\tlet inversePatches: Patch[] = []\n\n\t\t\tconst nextState = produce(this.state, recipe, (p, ip) => {\n\t\t\t\tpatches = p\n\t\t\t\tinversePatches = ip\n\t\t\t})\n\n\t\t\tif (patches.length > 0) {\n\t\t\t\tthis.validateState(nextState)\n\t\t\t\tthis.saveToHistory(patches, inversePatches, description)\n\t\t\t\tthis.setState(nextState)\n\n\t\t\t\tthis.logger.debug('State mutated', {\n\t\t\t\t\tdescription,\n\t\t\t\t\tpatchCount: patches.length,\n\t\t\t\t\thistorySize: this.history.length,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger.error('State mutation failed', { description, error })\n\n\t\t\t// Re-throw validation errors without wrapping them\n\t\t\tif (error instanceof StateValidationError) {\n\t\t\t\tthrow error\n\t\t\t}\n\n\t\t\tthrow new StateMachineError(\n\t\t\t\t`State mutation failed: ${\n\t\t\t\t\terror instanceof Error ? error.message : 'Unknown error'\n\t\t\t\t}`,\n\t\t\t\t'MUTATION_ERROR'\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic batch(mutations: Array<(draft: Draft<T>) => void>, description?: string): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!Array.isArray(mutations)) {\n\t\t\tthrow new StateValidationError('Mutations must be an array')\n\t\t}\n\n\t\tif (mutations.length === 0) {\n\t\t\tthis.logger.debug('Empty batch operation ignored')\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst allPatches: Patch[] = []\n\t\t\tconst allInversePatches: Patch[] = []\n\n\t\t\tconst finalState = mutations.reduce((currentState, recipe, index) => {\n\t\t\t\tif (typeof recipe !== 'function') {\n\t\t\t\t\tthrow new StateValidationError(`Mutation at index ${index} must be a function`)\n\t\t\t\t}\n\n\t\t\t\tlet patches: Patch[] = []\n\t\t\t\tlet inversePatches: Patch[] = []\n\n\t\t\t\tconst nextState = produce(currentState, recipe, (p, ip) => {\n\t\t\t\t\tpatches = p\n\t\t\t\t\tinversePatches = ip\n\t\t\t\t})\n\n\t\t\t\tallPatches.push(...patches)\n\t\t\t\tallInversePatches.unshift(...inversePatches)\n\n\t\t\t\treturn nextState\n\t\t\t}, this.state)\n\n\t\t\tif (allPatches.length > 0) {\n\t\t\t\tthis.validateState(finalState)\n\t\t\t\tthis.saveToHistory(allPatches, allInversePatches, description || 'Batch operation')\n\t\t\t\tthis.setState(finalState)\n\n\t\t\t\tthis.logger.debug('Batch operation completed', {\n\t\t\t\t\tdescription,\n\t\t\t\t\tmutationCount: mutations.length,\n\t\t\t\t\tpatchCount: allPatches.length,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Batch operation failed', { description, error })\n\t\t\tthrow new StateMachineError(\n\t\t\t\t`Batch operation failed: ${\n\t\t\t\t\terror instanceof Error ? error.message : 'Unknown error'\n\t\t\t\t}`,\n\t\t\t\t'BATCH_ERROR'\n\t\t\t)\n\t\t}\n\t}\n\n\t/*\n\t * UNDO/REDO METHODS\n\t */\n\tpublic undo(): boolean {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.canUndo()) {\n\t\t\tthis.logger.debug('Undo operation ignored - no history available')\n\t\t\treturn false\n\t\t}\n\n\t\ttry {\n\t\t\tconst snapshot = this.history[this.historyIndex]\n\t\t\tif (!snapshot) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst newState = applyPatches(this.state, snapshot.inversePatches) as T\n\n\t\t\tthis.validateState(newState)\n\t\t\tthis.historyIndex--\n\t\t\tthis.setState(newState, false)\n\n\t\t\tthis.logger.debug('Undo operation completed', {\n\t\t\t\tdescription: snapshot.description,\n\t\t\t\tnewHistoryIndex: this.historyIndex,\n\t\t\t})\n\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Undo operation failed', error)\n\t\t\treturn false\n\t\t}\n\t}\n\n\tpublic redo(): boolean {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.canRedo()) {\n\t\t\tthis.logger.debug('Redo operation ignored - no future history available')\n\t\t\treturn false\n\t\t}\n\n\t\ttry {\n\t\t\tthis.historyIndex++\n\t\t\tconst snapshot = this.history[this.historyIndex]\n\t\t\tif (!snapshot) {\n\t\t\t\tthis.historyIndex--\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst newState = applyPatches(this.state, snapshot.patches) as T\n\n\t\t\tthis.validateState(newState)\n\t\t\tthis.setState(newState, false)\n\n\t\t\tthis.logger.debug('Redo operation completed', {\n\t\t\t\tdescription: snapshot.description,\n\t\t\t\tnewHistoryIndex: this.historyIndex,\n\t\t\t})\n\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Redo operation failed', error)\n\t\t\tthis.historyIndex--\n\t\t\treturn false\n\t\t}\n\t}\n\n\tpublic canUndo(): boolean {\n\t\treturn this.historyIndex >= 0\n\t}\n\n\tpublic canRedo(): boolean {\n\t\treturn this.historyIndex < this.history.length - 1\n\t}\n\n\t/*\n\t * HISTORY METHODS\n\t */\n\tpublic getHistoryInfo(): StateHistoryInfo {\n\t\treturn {\n\t\t\tcanUndo: this.canUndo(),\n\t\t\tcanRedo: this.canRedo(),\n\t\t\thistoryLength: this.history.length,\n\t\t\tcurrentIndex: this.historyIndex,\n\t\t\tlastAction: this.history[this.historyIndex]?.description || null,\n\t\t\tmemoryUsage: calculateMemoryUsage(this.history),\n\t\t}\n\t}\n\n\tpublic clearHistory(): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tconst oldLength = this.history.length\n\t\tthis.history = []\n\t\tthis.historyIndex = -1\n\n\t\tthis.logger.info('History cleared', { previousLength: oldLength })\n\t}\n\n\t/*\n\t * SAVE/LOAD METHODS\n\t */\n\tpublic async forceSave(): Promise<void> {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.isDirty) {\n\t\t\tthis.logger.debug('Force save skipped - no changes')\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tthis.logger.debug('Force save started')\n\n\t\t\tawait this.saveToServer(this.state)\n\t\t\tthis.persistToLocal()\n\t\t\tthis.isDirty = false\n\n\t\t\tthis.logger.info('Force save completed successfully')\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Force save failed', error)\n\t\t\tthrow new StatePersistenceError(\n\t\t\t\t`Force save failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic hasUnsavedChanges(): boolean {\n\t\treturn this.isDirty\n\t}\n\n\tpublic setAutoSaveInterval(minutes: number): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof minutes !== 'number' || minutes <= 0) {\n\t\t\tthrow new StateValidationError('Auto-save interval must be a positive number')\n\t\t}\n\n\t\tthis.config.autoSaveInterval = minutes\n\t\tthis.restartAutoSave()\n\n\t\tthis.logger.info('Auto-save interval updated', { minutes })\n\t}\n\n\tpublic async loadFromServerManually(): Promise<boolean> {\n\t\tthis.assertNotDestroyed()\n\n\t\ttry {\n\t\t\tthis.logger.debug('Manual server load started')\n\n\t\t\tconst serverState = await this.loadFromServer()\n\t\t\tif (serverState) {\n\t\t\t\tthis.validateState(serverState)\n\t\t\t\tthis.state = serverState\n\t\t\t\tthis.isDirty = false\n\t\t\t\tthis.clearHistory()\n\t\t\t\tthis.notifyListeners()\n\t\t\t\tthis.persistToLocal()\n\n\t\t\t\tthis.logger.info('Manual server load completed successfully')\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tthis.logger.debug('No server state available')\n\t\t\treturn false\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Manual server load failed', error)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/*\n\t * CLEANUP METHODS\n\t */\n\tpublic destroy(): void {\n\t\tif (this.isDestroyed) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.logger.info('Destroying StateMachine')\n\n\t\tthis.isDestroyed = true\n\t\tthis.listeners.clear()\n\n\t\tif (this.autoSaveTimer) {\n\t\t\tclearInterval(this.autoSaveTimer)\n\t\t\tthis.autoSaveTimer = null\n\t\t}\n\n\t\t// Clear references to help garbage collection\n\t\tthis.history = []\n\t\tthis.listeners = new Set()\n\n\t\tthis.logger.info('StateMachine destroyed')\n\t}\n\n\t/*\n\t * PROTECTED METHODS\n\t ***************************************************************************************************/\n\n\tprotected setState(newState: T, markDirty = true): void {\n\t\tthis.state = newState\n\n\t\tif (markDirty) {\n\t\t\tthis.isDirty = true\n\t\t}\n\n\t\tthis.debouncedNotify()\n\t\tthis.persistToLocal()\n\t}\n\n\t/*\n\t * PRIVATE METHODS\n\t ***************************************************************************************************/\n\n\t/*\n\t * STATE VALIDATION\n\t */\n\tprivate assertNotDestroyed(): void {\n\t\tif (this.isDestroyed) {\n\t\t\tthrow new StateMachineError('Cannot operate on destroyed StateMachine', 'DESTROYED')\n\t\t}\n\t}\n\n\tprivate validateConfig(config: StateConfig<T>): void {\n\t\tif (\n\t\t\t!config.initialState ||\n\t\t\ttypeof config.initialState !== 'object' ||\n\t\t\tconfig.initialState === null\n\t\t) {\n\t\t\tthrow new StateValidationError('Initial state must be an object')\n\t\t}\n\n\t\tif (config.autoSaveInterval !== undefined && config.autoSaveInterval <= 0) {\n\t\t\tthrow new StateValidationError('Auto-save interval must be positive')\n\t\t}\n\n\t\tif (config.maxHistorySize !== undefined && config.maxHistorySize <= 0) {\n\t\t\tthrow new StateValidationError('Max history size must be positive')\n\t\t}\n\t}\n\n\tprivate validateCurrentState(): void {\n\t\tthis.validateState(this.state)\n\t}\n\n\tprotected validateState(state: T): void {\n\t\tif (!this.config.validateState(state)) {\n\t\t\tthrow new StateValidationError('State validation failed')\n\t\t}\n\t}\n\n\tprivate notifyListeners(): void {\n\t\tif (this.listeners.size === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst frozenState = this.state\n\t\tlet errorCount = 0\n\n\t\tthis.listeners.forEach(listener => {\n\t\t\ttry {\n\t\t\t\tlistener(frozenState)\n\t\t\t} catch (error) {\n\t\t\t\terrorCount++\n\t\t\t\tthis.logger.error('Listener notification failed', error)\n\t\t\t}\n\t\t})\n\n\t\tif (errorCount > 0) {\n\t\t\tthis.logger.warn(`${errorCount} listener(s) failed during notification`)\n\t\t}\n\t}\n\n\t/*\n\t * HISTORY\n\t */\n\tprivate saveToHistory(patches: Patch[], inversePatches: Patch[], description?: string): void {\n\t\tif (this.historyIndex < this.history.length - 1) {\n\t\t\tthis.history = this.history.slice(0, this.historyIndex + 1)\n\t\t}\n\n\t\tconst snapshot: StateSnapshot = {\n\t\t\tpatches,\n\t\t\tinversePatches,\n\t\t\ttimestamp: Date.now(),\n\t\t}\n\n\t\tif (description) {\n\t\t\tsnapshot.description = description\n\t\t}\n\n\t\tthis.history.push(snapshot)\n\n\t\tthis.historyIndex++\n\n\t\tif (this.history.length > this.config.maxHistorySize) {\n\t\t\tthis.history.shift()\n\t\t\tthis.historyIndex--\n\t\t\tthis.logger.debug('History trimmed to max size', {\n\t\t\t\tmaxSize: this.config.maxHistorySize,\n\t\t\t})\n\t\t}\n\t}\n\n\t/*\n\t * PERSISTENCE\n\t */\n\tprivate persistToLocal(): void {\n\t\tif (!this.config.enablePersistence || !this.config.persistenceKey) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst persistedState: PersistedState<T> = {\n\t\t\t\tstate: this.state,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tversion: DEFAULT_VERSION,\n\t\t\t\tchecksum: generateChecksum(this.state),\n\t\t\t}\n\n\t\t\tlocalStorage.setItem(this.config.persistenceKey, JSON.stringify(persistedState))\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to persist state to localStorage', error)\n\t\t}\n\t}\n\n\tprivate loadPersistedState(): T | null {\n\t\tif (!this.config.enablePersistence || !this.config.persistenceKey) {\n\t\t\treturn null\n\t\t}\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem(this.config.persistenceKey)\n\t\t\tif (!stored) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst persistedState: PersistedState<T> = JSON.parse(stored)\n\n\t\t\t// Validate checksum if present\n\t\t\tif (persistedState.checksum) {\n\t\t\t\tconst expectedChecksum = generateChecksum(persistedState.state)\n\t\t\t\tif (persistedState.checksum !== expectedChecksum) {\n\t\t\t\t\tthis.logger.warn('Persisted state checksum mismatch, ignoring')\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.logger.debug('Loaded persisted state', {\n\t\t\t\ttimestamp: persistedState.timestamp,\n\t\t\t\tversion: persistedState.version,\n\t\t\t})\n\n\t\t\treturn persistedState.state\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to load persisted state', error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\t/*\n\t * AUTO SAVE\n\t */\n\tprivate startAutoSave(): void {\n\t\tif (!this.config.enableAutoSave) {\n\t\t\treturn\n\t\t}\n\n\t\tconst interval = this.config.autoSaveInterval * 60 * 1000\n\n\t\tthis.autoSaveTimer = setInterval(async () => {\n\t\t\tif (this.isDirty && !this.isDestroyed) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.forceSave()\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.logger.error('Auto-save failed', error)\n\t\t\t\t}\n\t\t\t}\n\t\t}, interval)\n\n\t\tthis.logger.debug('Auto-save started', {\n\t\t\tintervalMinutes: this.config.autoSaveInterval,\n\t\t})\n\t}\n\n\tprivate restartAutoSave(): void {\n\t\tif (this.autoSaveTimer) {\n\t\t\tclearInterval(this.autoSaveTimer)\n\t\t}\n\t\tthis.startAutoSave()\n\t}\n}\n","/*\n * IMPORTS\n ***************************************************************************************************/\nimport { type DependencyList, useEffect, useState, useCallback } from 'react'\nimport { StateMachine, type StateHistoryInfo } from './machine'\n\n/*\n * TYPES\n ***************************************************************************************************/\nimport type { Draft } from 'immer'\n\n/*\n * HOOKS\n ***************************************************************************************************/\n\n/**\n * Basic hook to subscribe to a StateMachine instance\n */\nexport function useStateMachine<T extends object>(engine: StateMachine<T>) {\n\tconst [state, setState] = useState(() => engine.getState())\n\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(setState)\n\t\treturn unsubscribe\n\t}, [engine])\n\n\tconst mutate = useCallback(\n\t\t(recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tengine.mutate(recipe, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst batch = useCallback(\n\t\t(mutations: Array<(draft: Draft<T>) => void>, description?: string) => {\n\t\t\tengine.batch(mutations, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\treturn {\n\t\tstate,\n\t\tmutate,\n\t\tbatch,\n\t}\n}\n\n/**\n * Hook to subscribe to a specific slice of state with a selector function\n */\nexport function useStateSlice<T extends object, TSelected>(\n\tengine: StateMachine<T>,\n\tselector: (state: T) => TSelected,\n\tequalityFn?: (a: TSelected, b: TSelected) => boolean\n) {\n\tconst [selectedState, setSelectedState] = useState(() => selector(engine.getState()))\n\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(newState => {\n\t\t\tconst newSelected = selector(newState)\n\n\t\t\tif (equalityFn) {\n\t\t\t\tif (!equalityFn(selectedState, newSelected)) {\n\t\t\t\t\tsetSelectedState(newSelected)\n\t\t\t\t}\n\t\t\t} else if (selectedState !== newSelected) {\n\t\t\t\tsetSelectedState(newSelected)\n\t\t\t}\n\t\t})\n\n\t\treturn unsubscribe\n\t}, [engine, selector, selectedState, equalityFn])\n\n\treturn selectedState\n}\n\n/**\n * Hook that provides StateMachine actions/methods\n */\nexport function useStateActions<T extends object>(engine: StateMachine<T>) {\n\tconst mutate = useCallback(\n\t\t(recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tengine.mutate(recipe, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst batch = useCallback(\n\t\t(mutations: Array<(draft: Draft<T>) => void>, description?: string) => {\n\t\t\tengine.batch(mutations, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst undo = useCallback(() => {\n\t\treturn engine.undo()\n\t}, [engine])\n\n\tconst redo = useCallback(() => {\n\t\treturn engine.redo()\n\t}, [engine])\n\n\tconst forceSave = useCallback(async () => {\n\t\treturn engine.forceSave()\n\t}, [engine])\n\n\tconst loadFromServer = useCallback(async () => {\n\t\treturn engine.loadFromServerManually()\n\t}, [engine])\n\n\tconst clearHistory = useCallback(() => {\n\t\tengine.clearHistory()\n\t}, [engine])\n\n\treturn {\n\t\tmutate,\n\t\tbatch,\n\t\tundo,\n\t\tredo,\n\t\tforceSave,\n\t\tloadFromServer,\n\t\tclearHistory,\n\t}\n}\n\n/**\n * Hook specifically for undo/redo functionality\n */\nexport function useStateHistory<T extends object>(engine: StateMachine<T>) {\n\tconst [historyInfo, setHistoryInfo] = useState<StateHistoryInfo>(() => engine.getHistoryInfo())\n\n\tuseEffect(() => {\n\t\tconst updateHistory = () => {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\n\t\tconst unsubscribe = engine.subscribe(updateHistory)\n\t\treturn unsubscribe\n\t}, [engine])\n\n\tconst undo = useCallback(() => {\n\t\tconst success = engine.undo()\n\t\tif (success) {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\t\treturn success\n\t}, [engine])\n\n\tconst redo = useCallback(() => {\n\t\tconst success = engine.redo()\n\t\tif (success) {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\t\treturn success\n\t}, [engine])\n\n\tconst clearHistory = useCallback(() => {\n\t\tengine.clearHistory()\n\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t}, [engine])\n\n\treturn {\n\t\t...historyInfo,\n\t\tundo,\n\t\tredo,\n\t\tclearHistory,\n\t}\n}\n\n/**\n * Hook for managing save/load state and persistence\n */\nexport function useStatePersist<T extends object>(engine: StateMachine<T>) {\n\tconst [isSaving, setIsSaving] = useState(false)\n\tconst [isLoading, setIsLoading] = useState(false)\n\tconst [lastSaved, setLastSaved] = useState<Date | null>(null)\n\tconst [saveError, setSaveError] = useState<string | null>(null)\n\tconst [loadError, setLoadError] = useState<string | null>(null)\n\n\tconst hasUnsavedChanges = engine.hasUnsavedChanges()\n\n\tconst save = useCallback(async () => {\n\t\tif (isSaving) {\n\t\t\treturn false\n\t\t}\n\n\t\tsetIsSaving(true)\n\t\tsetSaveError(null)\n\n\t\ttry {\n\t\t\tawait engine.forceSave()\n\t\t\tsetLastSaved(new Date())\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : 'Save failed'\n\t\t\tsetSaveError(errorMessage)\n\t\t\treturn false\n\t\t} finally {\n\t\t\tsetIsSaving(false)\n\t\t}\n\t}, [engine, isSaving])\n\n\tconst load = useCallback(async () => {\n\t\tif (isLoading) {\n\t\t\treturn false\n\t\t}\n\n\t\tsetIsLoading(true)\n\t\tsetLoadError(null)\n\n\t\ttry {\n\t\t\tconst success = await engine.loadFromServerManually()\n\t\t\tif (success) {\n\t\t\t\tsetLastSaved(new Date())\n\t\t\t}\n\t\t\treturn success\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : 'Load failed'\n\t\t\tsetLoadError(errorMessage)\n\t\t\treturn false\n\t\t} finally {\n\t\t\tsetIsLoading(false)\n\t\t}\n\t}, [engine, isLoading])\n\n\tconst clearSaveError = useCallback(() => {\n\t\tsetSaveError(null)\n\t}, [])\n\n\tconst clearLoadError = useCallback(() => {\n\t\tsetLoadError(null)\n\t}, [])\n\n\treturn {\n\t\tisSaving,\n\t\tisLoading,\n\t\thasUnsavedChanges,\n\t\tlastSaved,\n\t\tsaveError,\n\t\tloadError,\n\t\tclearSaveError,\n\t\tclearLoadError,\n\t\tsave,\n\t\tload,\n\t}\n}\n\n/**\n * Comprehensive hook that combines all StateMachine functionality\n */\nexport function useStateMachineFull<T extends object>(engine: StateMachine<T>) {\n\tconst { state, mutate, batch } = useStateMachine(engine)\n\tconst actions = useStateActions(engine)\n\tconst history = useStateHistory(engine)\n\tconst persistence = useStatePersist(engine)\n\n\treturn {\n\t\tstate,\n\t\tmutate,\n\t\tbatch,\n\t\thistory: {\n\t\t\tcanUndo: history.canUndo,\n\t\t\tcanRedo: history.canRedo,\n\t\t\thistoryLength: history.historyLength,\n\t\t\tcurrentIndex: history.currentIndex,\n\t\t\tlastAction: history.lastAction,\n\t\t\tmemoryUsage: history.memoryUsage,\n\t\t\tundo: history.undo,\n\t\t\tredo: history.redo,\n\t\t\tclearHistory: history.clearHistory,\n\t\t},\n\t\tpersistence: {\n\t\t\tisSaving: persistence.isSaving,\n\t\t\tisLoading: persistence.isLoading,\n\t\t\thasUnsavedChanges: persistence.hasUnsavedChanges,\n\t\t\tlastSaved: persistence.lastSaved,\n\t\t\tsaveError: persistence.saveError,\n\t\t\tloadError: persistence.loadError,\n\t\t\tsave: persistence.save,\n\t\t\tload: persistence.load,\n\t\t\tclearSaveError: persistence.clearSaveError,\n\t\t\tclearLoadError: persistence.clearLoadError,\n\t\t},\n\t\tforceSave: actions.forceSave,\n\t\tloadFromServer: actions.loadFromServer,\n\t}\n}\n\n/**\n * Hook for creating optimistic updates with automatic rollback on failure\n * -- Still testing this, I'm not sure if this is a good solution.\n */\nexport function useOptimisticUpdate<T extends object>(engine: StateMachine<T>) {\n\tconst mutateOptimistic = useCallback(\n\t\tasync (\n\t\t\toptimisticUpdate: (draft: Draft<T>) => void,\n\t\t\tserverUpdate: () => Promise<void>,\n\t\t\tdescription?: string\n\t\t) => {\n\t\t\t// Apply optimistic update\n\t\t\tengine.mutate(optimisticUpdate, `${description} (optimistic)`)\n\n\t\t\ttry {\n\t\t\t\t// Attempt server update\n\t\t\t\tawait serverUpdate()\n\t\t\t\t// If successful, the optimistic update stands\n\t\t\t} catch (error) {\n\t\t\t\t// If failed, undo the optimistic update\n\t\t\t\tengine.undo()\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\t[engine]\n\t)\n\n\treturn { mutateOptimistic }\n}\n\n/**\n * Hook for debounced state updates (useful for search inputs, etc.)\n */\nexport function useDebouncedStateUpdate<T extends object>(engine: StateMachine<T>, delay = 300) {\n\tconst [debouncedMutate] = useState(() => {\n\t\tlet timeoutId: ReturnType<typeof setTimeout>\n\n\t\treturn (recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tclearTimeout(timeoutId)\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tengine.mutate(recipe, description)\n\t\t\t}, delay)\n\t\t}\n\t})\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tclearTimeout(debouncedMutate as unknown as ReturnType<typeof setTimeout>)\n\t\t}\n\t}, [debouncedMutate])\n\n\treturn { debouncedMutate }\n}\n\n/**\n * Hook for subscribing to state changes with cleanup on component unmount\n */\nexport function useStateSubscription<T extends object>(\n\tengine: StateMachine<T>,\n\tcallback: (state: T) => void,\n\tdeps: DependencyList = []\n) {\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(callback)\n\t\treturn unsubscribe\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [engine, callback, ...deps])\n}\n\n/**\n * Utility hook for shallow equality comparison\n */\nexport function useShallowEqual<T>(value: T): T {\n\tconst [state, setState] = useState(value)\n\n\tuseEffect(() => {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tconst keys1 = Object.keys(state as Record<string, unknown>)\n\t\t\tconst keys2 = Object.keys(value as Record<string, unknown>)\n\n\t\t\tif (keys1.length !== keys2.length) {\n\t\t\t\tsetState(value)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tfor (const key of keys1) {\n\t\t\t\tif (\n\t\t\t\t\t(state as Record<string, unknown>)[key] !==\n\t\t\t\t\t(value as Record<string, unknown>)[key]\n\t\t\t\t) {\n\t\t\t\t\tsetState(value)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (state !== value) {\n\t\t\tsetState(value)\n\t\t}\n\t}, [value, state])\n\n\treturn state\n}\n\n/**\n * Factory function to create typed hooks for a specific StateMachine\n */\nexport function createStateMachineHooks<T extends object>(engine: StateMachine<T>) {\n\treturn {\n\t\tuseState: () => useStateMachine(engine),\n\t\tuseSlice: <TSelected>(\n\t\t\tselector: (state: T) => TSelected,\n\t\t\tequalityFn?: (a: TSelected, b: TSelected) => boolean\n\t\t) => useStateSlice(engine, selector, equalityFn),\n\t\tuseActions: () => useStateActions(engine),\n\t\tuseHistory: () => useStateHistory(engine),\n\t\tusePersistence: () => useStatePersist(engine),\n\t\tuseComplete: () => useStateMachineFull(engine),\n\t\tuseOptimistic: () => useOptimisticUpdate(engine),\n\t\tuseDebounced: (delay?: number) => useDebouncedStateUpdate(engine, delay),\n\t\tuseSubscription: (callback: (state: T) => void, deps?: DependencyList) =>\n\t\t\tuseStateSubscription(engine, callback, deps),\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/machine.ts","../src/hooks.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/*\n * IMPORTS\n ***************************************************************************************************/\nimport { produce, enablePatches, applyPatches, type Patch, type Draft } from 'immer'\n\nenablePatches()\n\n/*\n * CONSTANTS\n ***************************************************************************************************/\nconst DEFAULT_AUTO_SAVE_INTERVAL = 5 // in minutes\nconst DEFAULT_MAX_HISTORY_SIZE = 50\nconst DEFAULT_VERSION = '1.0.0'\nconst NOTIFICATION_DEBOUNCE_MS = 16\n\n/*\n * ERROR TYPES\n ***************************************************************************************************/\nexport class StateMachineError extends Error {\n\tpublic readonly code: string\n\n\tconstructor(message: string, code: string) {\n\t\tsuper(message)\n\t\tthis.name = 'StateMachineError'\n\t\tthis.code = code\n\t}\n}\n\nexport class StateValidationError extends StateMachineError {\n\tconstructor(message: string) {\n\t\tsuper(message, 'VALIDATION_ERROR')\n\t}\n}\n\nexport class StatePersistenceError extends StateMachineError {\n\tconstructor(message: string) {\n\t\tsuper(message, 'PERSISTENCE_ERROR')\n\t}\n}\n\n/*\n * TYPES\n ***************************************************************************************************/\nexport interface StateConfig<T extends object> {\n\tinitialState: T\n\tpersistenceKey?: string\n\tautoSaveInterval?: number\n\tmaxHistorySize?: number\n\tenablePersistence?: boolean\n\tenableAutoSave?: boolean\n\tenableLogging?: boolean\n\tvalidateState?: (state: T) => boolean\n}\n\ninterface InternalStateConfig<T extends object> {\n\tinitialState: T\n\tpersistenceKey: string | null\n\tautoSaveInterval: number\n\tmaxHistorySize: number\n\tenablePersistence: boolean\n\tenableAutoSave: boolean\n\tenableLogging: boolean\n\tvalidateState: (state: T) => boolean\n}\n\nexport interface StateSnapshot {\n\tpatches: Patch[]\n\tinversePatches: Patch[]\n\ttimestamp: number\n\tdescription?: string\n}\n\nexport interface PersistedState<T> {\n\tstate: T\n\ttimestamp: number\n\tversion: string\n\tchecksum?: string\n}\n\nexport interface StateHistoryInfo {\n\tcanUndo: boolean\n\tcanRedo: boolean\n\thistoryLength: number\n\tcurrentIndex: number\n\tlastAction: string | null\n\tmemoryUsage: number\n}\n\n/*\n * LIFECYCLE EVENT TYPES\n ***************************************************************************************************/\nexport type LifecycleEvent = 'afterMutate' | 'error' | 'destroy'\n\nexport type MutationOperation = 'mutate' | 'batch' | 'undo' | 'redo'\n\nexport interface AfterMutatePayload<T> {\n\tstate: T\n\tpatches: Patch[]\n\tinversePatches: Patch[]\n\tdescription: string | undefined\n\toperation: MutationOperation\n}\n\nexport interface ErrorPayload {\n\terror: Error\n\toperation: MutationOperation | 'persist' | 'validate'\n}\n\nexport interface DestroyPayload<T> {\n\tfinalState: T\n}\n\nexport type LifecyclePayloadMap<T> = {\n\tafterMutate: AfterMutatePayload<T>\n\terror: ErrorPayload\n\tdestroy: DestroyPayload<T>\n}\n\nexport type LifecycleListener<T, E extends LifecycleEvent> = (\n\tpayload: LifecyclePayloadMap<T>[E]\n) => void\n\n// Compact logger - will be optimized out in production builds\n/* eslint-disable no-console */\nconst createLogger = (enabled: boolean) => ({\n\tdebug: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.debug(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\tinfo: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.info(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\twarn: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.warn(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\terror: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.error(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n})\n/* eslint-enable no-console */\n\n/*\n * FUNCTIONS\n ***************************************************************************************************/\nfunction debounce<T extends (...args: unknown[]) => void>(func: T, wait: number): T {\n\tlet timeout: ReturnType<typeof setTimeout>\n\treturn ((...args: Parameters<T>) => {\n\t\tclearTimeout(timeout)\n\t\ttimeout = setTimeout(() => func(...args), wait)\n\t}) as T\n}\n\n// Compact utility functions\nconst calculateMemoryUsage = (data: unknown): number => {\n\ttry {\n\t\treturn new Blob([JSON.stringify(data)]).size\n\t} catch {\n\t\treturn 0\n\t}\n}\n\nconst generateChecksum = (data: unknown): string => {\n\ttry {\n\t\tconst str = JSON.stringify(data)\n\t\tlet hash = 0\n\t\tfor (let i = 0; i < str.length; i++) {\n\t\t\thash = ((hash << 5) - hash + str.charCodeAt(i)) & hash\n\t\t}\n\t\treturn hash.toString(36)\n\t} catch {\n\t\treturn ''\n\t}\n}\n\n/*\n * STATE MACHINE\n ***************************************************************************************************/\nexport abstract class StateMachine<T extends object> {\n\tprotected state: T\n\tprotected config: InternalStateConfig<T>\n\tprotected listeners: Set<(state: T) => void> = new Set()\n\tprotected history: StateSnapshot[] = []\n\tprotected historyIndex = -1\n\tprotected isDirty = false\n\tprotected autoSaveTimer: ReturnType<typeof setInterval> | null = null\n\tprotected isDestroyed = false\n\tprotected logger: ReturnType<typeof createLogger>\n\tprotected debouncedNotify: () => void\n\tprotected eventListeners: Map<\n\t\tLifecycleEvent,\n\t\tSet<LifecycleListener<T, LifecycleEvent>>\n\t> | null = null\n\n\tconstructor(config: StateConfig<T>) {\n\t\tthis.validateConfig(config)\n\n\t\tthis.config = {\n\t\t\tinitialState: config.initialState,\n\t\t\tpersistenceKey: config.persistenceKey || null,\n\t\t\tautoSaveInterval: config.autoSaveInterval ?? DEFAULT_AUTO_SAVE_INTERVAL,\n\t\t\tmaxHistorySize: config.maxHistorySize ?? DEFAULT_MAX_HISTORY_SIZE,\n\t\t\tenablePersistence: config.enablePersistence ?? true,\n\t\t\tenableAutoSave: config.enableAutoSave ?? true,\n\t\t\tenableLogging: config.enableLogging ?? false,\n\t\t\tvalidateState: config.validateState ?? (() => true),\n\t\t}\n\n\t\tthis.logger = createLogger(this.config.enableLogging)\n\t\tthis.debouncedNotify = debounce(() => this.notifyListeners(), NOTIFICATION_DEBOUNCE_MS)\n\n\t\ttry {\n\t\t\tthis.state = this.loadPersistedState() || config.initialState\n\t\t\tthis.validateCurrentState()\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to load persisted state, using initial state', error)\n\t\t\tthis.state = config.initialState\n\n\t\t\t// Validate the fallback initial state\n\t\t\tthis.validateCurrentState()\n\t\t}\n\n\t\tif (this.config.enableAutoSave) {\n\t\t\tthis.startAutoSave()\n\t\t}\n\n\t\tthis.logger.info('StateMachine initialized', {\n\t\t\tpersistenceKey: this.config.persistenceKey,\n\t\t\tautoSaveInterval: this.config.autoSaveInterval,\n\t\t\tmaxHistorySize: this.config.maxHistorySize,\n\t\t})\n\t}\n\n\tprotected async saveToServer(_state: T): Promise<void> {}\n\tprotected async loadFromServer(): Promise<T | null> {\n\t\treturn null\n\t}\n\n\t/*\n\t * PUBLIC\n\t ***************************************************************************************************/\n\n\t/*\n\t * CORE METHODS\n\t */\n\tpublic getState(): T {\n\t\tthis.assertNotDestroyed()\n\t\treturn this.state\n\t}\n\n\tpublic subscribe(listener: (state: T) => void): () => void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof listener !== 'function') {\n\t\t\tthrow new StateValidationError('Listener must be a function')\n\t\t}\n\n\t\tthis.listeners.add(listener)\n\n\t\ttry {\n\t\t\tlistener(this.state)\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Initial listener call failed', error)\n\t\t}\n\n\t\tthis.logger.debug('Listener subscribed', {\n\t\t\ttotalListeners: this.listeners.size,\n\t\t})\n\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener)\n\t\t\tthis.logger.debug('Listener unsubscribed', {\n\t\t\t\ttotalListeners: this.listeners.size,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic mutate(recipe: (draft: Draft<T>) => void, description?: string): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof recipe !== 'function') {\n\t\t\tthrow new StateValidationError('Recipe must be a function')\n\t\t}\n\n\t\ttry {\n\t\t\tlet patches: Patch[] = []\n\t\t\tlet inversePatches: Patch[] = []\n\n\t\t\tconst nextState = produce(this.state, recipe, (p, ip) => {\n\t\t\t\tpatches = p\n\t\t\t\tinversePatches = ip\n\t\t\t})\n\n\t\t\tif (patches.length > 0) {\n\t\t\t\tthis.validateState(nextState)\n\t\t\t\tthis.saveToHistory(patches, inversePatches, description)\n\t\t\t\tthis.setState(nextState)\n\n\t\t\t\tthis.emit('afterMutate', {\n\t\t\t\t\tstate: nextState,\n\t\t\t\t\tpatches,\n\t\t\t\t\tinversePatches,\n\t\t\t\t\tdescription,\n\t\t\t\t\toperation: 'mutate',\n\t\t\t\t})\n\n\t\t\t\tthis.logger.debug('State mutated', {\n\t\t\t\t\tdescription,\n\t\t\t\t\tpatchCount: patches.length,\n\t\t\t\t\thistorySize: this.history.length,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger.error('State mutation failed', { description, error })\n\n\t\t\tthis.emit('error', {\n\t\t\t\terror: error instanceof Error ? error : new Error(String(error)),\n\t\t\t\toperation: 'mutate',\n\t\t\t})\n\n\t\t\t// Re-throw validation errors without wrapping them\n\t\t\tif (error instanceof StateValidationError) {\n\t\t\t\tthrow error\n\t\t\t}\n\n\t\t\tthrow new StateMachineError(\n\t\t\t\t`State mutation failed: ${\n\t\t\t\t\terror instanceof Error ? error.message : 'Unknown error'\n\t\t\t\t}`,\n\t\t\t\t'MUTATION_ERROR'\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic batch(mutations: Array<(draft: Draft<T>) => void>, description?: string): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!Array.isArray(mutations)) {\n\t\t\tthrow new StateValidationError('Mutations must be an array')\n\t\t}\n\n\t\tif (mutations.length === 0) {\n\t\t\tthis.logger.debug('Empty batch operation ignored')\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst allPatches: Patch[] = []\n\t\t\tconst allInversePatches: Patch[] = []\n\n\t\t\tconst finalState = mutations.reduce((currentState, recipe, index) => {\n\t\t\t\tif (typeof recipe !== 'function') {\n\t\t\t\t\tthrow new StateValidationError(`Mutation at index ${index} must be a function`)\n\t\t\t\t}\n\n\t\t\t\tlet patches: Patch[] = []\n\t\t\t\tlet inversePatches: Patch[] = []\n\n\t\t\t\tconst nextState = produce(currentState, recipe, (p, ip) => {\n\t\t\t\t\tpatches = p\n\t\t\t\t\tinversePatches = ip\n\t\t\t\t})\n\n\t\t\t\tallPatches.push(...patches)\n\t\t\t\tallInversePatches.unshift(...inversePatches)\n\n\t\t\t\treturn nextState\n\t\t\t}, this.state)\n\n\t\t\tif (allPatches.length > 0) {\n\t\t\t\tthis.validateState(finalState)\n\t\t\t\tthis.saveToHistory(allPatches, allInversePatches, description || 'Batch operation')\n\t\t\t\tthis.setState(finalState)\n\n\t\t\t\tthis.emit('afterMutate', {\n\t\t\t\t\tstate: finalState,\n\t\t\t\t\tpatches: allPatches,\n\t\t\t\t\tinversePatches: allInversePatches,\n\t\t\t\t\tdescription,\n\t\t\t\t\toperation: 'batch',\n\t\t\t\t})\n\n\t\t\t\tthis.logger.debug('Batch operation completed', {\n\t\t\t\t\tdescription,\n\t\t\t\t\tmutationCount: mutations.length,\n\t\t\t\t\tpatchCount: allPatches.length,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Batch operation failed', { description, error })\n\n\t\t\tthis.emit('error', {\n\t\t\t\terror: error instanceof Error ? error : new Error(String(error)),\n\t\t\t\toperation: 'batch',\n\t\t\t})\n\n\t\t\tthrow new StateMachineError(\n\t\t\t\t`Batch operation failed: ${\n\t\t\t\t\terror instanceof Error ? error.message : 'Unknown error'\n\t\t\t\t}`,\n\t\t\t\t'BATCH_ERROR'\n\t\t\t)\n\t\t}\n\t}\n\n\t/*\n\t * UNDO/REDO METHODS\n\t */\n\tpublic undo(): boolean {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.canUndo()) {\n\t\t\tthis.logger.debug('Undo operation ignored - no history available')\n\t\t\treturn false\n\t\t}\n\n\t\ttry {\n\t\t\tconst snapshot = this.history[this.historyIndex]\n\t\t\tif (!snapshot) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst newState = applyPatches(this.state, snapshot.inversePatches) as T\n\n\t\t\tthis.validateState(newState)\n\t\t\tthis.historyIndex--\n\t\t\tthis.setState(newState, false)\n\n\t\t\tthis.emit('afterMutate', {\n\t\t\t\tstate: newState,\n\t\t\t\tpatches: snapshot.inversePatches,\n\t\t\t\tinversePatches: snapshot.patches,\n\t\t\t\tdescription: snapshot.description,\n\t\t\t\toperation: 'undo',\n\t\t\t})\n\n\t\t\tthis.logger.debug('Undo operation completed', {\n\t\t\t\tdescription: snapshot.description,\n\t\t\t\tnewHistoryIndex: this.historyIndex,\n\t\t\t})\n\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Undo operation failed', error)\n\n\t\t\tthis.emit('error', {\n\t\t\t\terror: error instanceof Error ? error : new Error(String(error)),\n\t\t\t\toperation: 'undo',\n\t\t\t})\n\n\t\t\treturn false\n\t\t}\n\t}\n\n\tpublic redo(): boolean {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.canRedo()) {\n\t\t\tthis.logger.debug('Redo operation ignored - no future history available')\n\t\t\treturn false\n\t\t}\n\n\t\ttry {\n\t\t\tthis.historyIndex++\n\t\t\tconst snapshot = this.history[this.historyIndex]\n\t\t\tif (!snapshot) {\n\t\t\t\tthis.historyIndex--\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst newState = applyPatches(this.state, snapshot.patches) as T\n\n\t\t\tthis.validateState(newState)\n\t\t\tthis.setState(newState, false)\n\n\t\t\tthis.emit('afterMutate', {\n\t\t\t\tstate: newState,\n\t\t\t\tpatches: snapshot.patches,\n\t\t\t\tinversePatches: snapshot.inversePatches,\n\t\t\t\tdescription: snapshot.description,\n\t\t\t\toperation: 'redo',\n\t\t\t})\n\n\t\t\tthis.logger.debug('Redo operation completed', {\n\t\t\t\tdescription: snapshot.description,\n\t\t\t\tnewHistoryIndex: this.historyIndex,\n\t\t\t})\n\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Redo operation failed', error)\n\n\t\t\tthis.emit('error', {\n\t\t\t\terror: error instanceof Error ? error : new Error(String(error)),\n\t\t\t\toperation: 'redo',\n\t\t\t})\n\n\t\t\tthis.historyIndex--\n\t\t\treturn false\n\t\t}\n\t}\n\n\tpublic canUndo(): boolean {\n\t\treturn this.historyIndex >= 0\n\t}\n\n\tpublic canRedo(): boolean {\n\t\treturn this.historyIndex < this.history.length - 1\n\t}\n\n\t/*\n\t * HISTORY METHODS\n\t */\n\tpublic getHistoryInfo(): StateHistoryInfo {\n\t\treturn {\n\t\t\tcanUndo: this.canUndo(),\n\t\t\tcanRedo: this.canRedo(),\n\t\t\thistoryLength: this.history.length,\n\t\t\tcurrentIndex: this.historyIndex,\n\t\t\tlastAction: this.history[this.historyIndex]?.description || null,\n\t\t\tmemoryUsage: calculateMemoryUsage(this.history),\n\t\t}\n\t}\n\n\tpublic clearHistory(): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tconst oldLength = this.history.length\n\t\tthis.history = []\n\t\tthis.historyIndex = -1\n\n\t\tthis.logger.info('History cleared', { previousLength: oldLength })\n\t}\n\n\t/*\n\t * LIFECYCLE EVENT METHODS\n\t */\n\tpublic on<E extends LifecycleEvent>(event: E, listener: LifecycleListener<T, E>): () => void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.eventListeners) {\n\t\t\tthis.eventListeners = new Map()\n\t\t}\n\n\t\tlet listeners = this.eventListeners.get(event)\n\t\tif (!listeners) {\n\t\t\tlisteners = new Set()\n\t\t\tthis.eventListeners.set(event, listeners)\n\t\t}\n\n\t\tlisteners.add(listener as LifecycleListener<T, LifecycleEvent>)\n\n\t\tthis.logger.debug('Lifecycle listener added', {\n\t\t\tevent,\n\t\t\ttotalListeners: listeners.size,\n\t\t})\n\n\t\treturn () => {\n\t\t\tconst eventSet = this.eventListeners?.get(event)\n\t\t\tif (eventSet) {\n\t\t\t\teventSet.delete(listener as LifecycleListener<T, LifecycleEvent>)\n\n\t\t\t\tif (eventSet.size === 0) {\n\t\t\t\t\tthis.eventListeners?.delete(event)\n\t\t\t\t\tif (this.eventListeners?.size === 0) {\n\t\t\t\t\t\tthis.eventListeners = null\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.logger.debug('Lifecycle listener removed', { event })\n\t\t}\n\t}\n\n\t/*\n\t * SAVE/LOAD METHODS\n\t */\n\tpublic async forceSave(): Promise<void> {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.isDirty) {\n\t\t\tthis.logger.debug('Force save skipped - no changes')\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tthis.logger.debug('Force save started')\n\n\t\t\tawait this.saveToServer(this.state)\n\t\t\tthis.persistToLocal()\n\t\t\tthis.isDirty = false\n\n\t\t\tthis.logger.info('Force save completed successfully')\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Force save failed', error)\n\n\t\t\tthis.emit('error', {\n\t\t\t\terror: error instanceof Error ? error : new Error(String(error)),\n\t\t\t\toperation: 'persist',\n\t\t\t})\n\n\t\t\tthrow new StatePersistenceError(\n\t\t\t\t`Force save failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic hasUnsavedChanges(): boolean {\n\t\treturn this.isDirty\n\t}\n\n\tpublic setAutoSaveInterval(minutes: number): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof minutes !== 'number' || minutes <= 0) {\n\t\t\tthrow new StateValidationError('Auto-save interval must be a positive number')\n\t\t}\n\n\t\tthis.config.autoSaveInterval = minutes\n\t\tthis.restartAutoSave()\n\n\t\tthis.logger.info('Auto-save interval updated', { minutes })\n\t}\n\n\tpublic async loadFromServerManually(): Promise<boolean> {\n\t\tthis.assertNotDestroyed()\n\n\t\ttry {\n\t\t\tthis.logger.debug('Manual server load started')\n\n\t\t\tconst serverState = await this.loadFromServer()\n\t\t\tif (serverState) {\n\t\t\t\tthis.validateState(serverState)\n\t\t\t\tthis.state = serverState\n\t\t\t\tthis.isDirty = false\n\t\t\t\tthis.clearHistory()\n\t\t\t\tthis.notifyListeners()\n\t\t\t\tthis.persistToLocal()\n\n\t\t\t\tthis.logger.info('Manual server load completed successfully')\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tthis.logger.debug('No server state available')\n\t\t\treturn false\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Manual server load failed', error)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/*\n\t * CLEANUP METHODS\n\t */\n\tpublic destroy(): void {\n\t\tif (this.isDestroyed) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.logger.info('Destroying StateMachine')\n\t\tthis.emit('destroy', { finalState: this.state })\n\n\t\tthis.isDestroyed = true\n\t\tthis.listeners.clear()\n\n\t\tif (this.autoSaveTimer) {\n\t\t\tclearInterval(this.autoSaveTimer)\n\t\t\tthis.autoSaveTimer = null\n\t\t}\n\n\t\t// Clear references to help garbage collection\n\t\tthis.history = []\n\t\tthis.listeners = new Set()\n\t\tthis.eventListeners = null\n\n\t\tthis.logger.info('StateMachine destroyed')\n\t}\n\n\t/*\n\t * PROTECTED METHODS\n\t ***************************************************************************************************/\n\n\tprotected setState(newState: T, markDirty = true): void {\n\t\tthis.state = newState\n\n\t\tif (markDirty) {\n\t\t\tthis.isDirty = true\n\t\t}\n\n\t\tthis.debouncedNotify()\n\t\tthis.persistToLocal()\n\t}\n\n\tprotected emit<E extends LifecycleEvent>(event: E, payload: LifecyclePayloadMap<T>[E]): void {\n\t\tconst listeners = this.eventListeners?.get(event)\n\t\tif (!listeners?.size) {\n\t\t\treturn\n\t\t}\n\n\t\tlisteners.forEach(listener => {\n\t\t\ttry {\n\t\t\t\tlistener(payload)\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.error(`Lifecycle event listener error for '${event}'`, error)\n\t\t\t}\n\t\t})\n\t}\n\n\t/*\n\t * PRIVATE METHODS\n\t ***************************************************************************************************/\n\n\t/*\n\t * STATE VALIDATION\n\t */\n\tprivate assertNotDestroyed(): void {\n\t\tif (this.isDestroyed) {\n\t\t\tthrow new StateMachineError('Cannot operate on destroyed StateMachine', 'DESTROYED')\n\t\t}\n\t}\n\n\tprivate validateConfig(config: StateConfig<T>): void {\n\t\tif (\n\t\t\t!config.initialState ||\n\t\t\ttypeof config.initialState !== 'object' ||\n\t\t\tconfig.initialState === null\n\t\t) {\n\t\t\tthrow new StateValidationError('Initial state must be an object')\n\t\t}\n\n\t\tif (config.autoSaveInterval !== undefined && config.autoSaveInterval <= 0) {\n\t\t\tthrow new StateValidationError('Auto-save interval must be positive')\n\t\t}\n\n\t\tif (config.maxHistorySize !== undefined && config.maxHistorySize <= 0) {\n\t\t\tthrow new StateValidationError('Max history size must be positive')\n\t\t}\n\t}\n\n\tprivate validateCurrentState(): void {\n\t\tthis.validateState(this.state)\n\t}\n\n\tprotected validateState(state: T): void {\n\t\tif (!this.config.validateState(state)) {\n\t\t\tthrow new StateValidationError('State validation failed')\n\t\t}\n\t}\n\n\tprivate notifyListeners(): void {\n\t\tif (this.listeners.size === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst frozenState = this.state\n\t\tlet errorCount = 0\n\n\t\tthis.listeners.forEach(listener => {\n\t\t\ttry {\n\t\t\t\tlistener(frozenState)\n\t\t\t} catch (error) {\n\t\t\t\terrorCount++\n\t\t\t\tthis.logger.error('Listener notification failed', error)\n\t\t\t}\n\t\t})\n\n\t\tif (errorCount > 0) {\n\t\t\tthis.logger.warn(`${errorCount} listener(s) failed during notification`)\n\t\t}\n\t}\n\n\t/*\n\t * HISTORY\n\t */\n\tprivate saveToHistory(patches: Patch[], inversePatches: Patch[], description?: string): void {\n\t\tif (this.historyIndex < this.history.length - 1) {\n\t\t\tthis.history = this.history.slice(0, this.historyIndex + 1)\n\t\t}\n\n\t\tconst snapshot: StateSnapshot = {\n\t\t\tpatches,\n\t\t\tinversePatches,\n\t\t\ttimestamp: Date.now(),\n\t\t}\n\n\t\tif (description) {\n\t\t\tsnapshot.description = description\n\t\t}\n\n\t\tthis.history.push(snapshot)\n\n\t\tthis.historyIndex++\n\n\t\tif (this.history.length > this.config.maxHistorySize) {\n\t\t\tthis.history.shift()\n\t\t\tthis.historyIndex--\n\t\t\tthis.logger.debug('History trimmed to max size', {\n\t\t\t\tmaxSize: this.config.maxHistorySize,\n\t\t\t})\n\t\t}\n\t}\n\n\t/*\n\t * PERSISTENCE\n\t */\n\tprivate persistToLocal(): void {\n\t\tif (!this.config.enablePersistence || !this.config.persistenceKey) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst persistedState: PersistedState<T> = {\n\t\t\t\tstate: this.state,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tversion: DEFAULT_VERSION,\n\t\t\t\tchecksum: generateChecksum(this.state),\n\t\t\t}\n\n\t\t\tlocalStorage.setItem(this.config.persistenceKey, JSON.stringify(persistedState))\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to persist state to localStorage', error)\n\t\t}\n\t}\n\n\tprivate loadPersistedState(): T | null {\n\t\tif (!this.config.enablePersistence || !this.config.persistenceKey) {\n\t\t\treturn null\n\t\t}\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem(this.config.persistenceKey)\n\t\t\tif (!stored) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst persistedState: PersistedState<T> = JSON.parse(stored)\n\n\t\t\t// Validate checksum if present\n\t\t\tif (persistedState.checksum) {\n\t\t\t\tconst expectedChecksum = generateChecksum(persistedState.state)\n\t\t\t\tif (persistedState.checksum !== expectedChecksum) {\n\t\t\t\t\tthis.logger.warn('Persisted state checksum mismatch, ignoring')\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.logger.debug('Loaded persisted state', {\n\t\t\t\ttimestamp: persistedState.timestamp,\n\t\t\t\tversion: persistedState.version,\n\t\t\t})\n\n\t\t\treturn persistedState.state\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to load persisted state', error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\t/*\n\t * AUTO SAVE\n\t */\n\tprivate startAutoSave(): void {\n\t\tif (!this.config.enableAutoSave) {\n\t\t\treturn\n\t\t}\n\n\t\tconst interval = this.config.autoSaveInterval * 60 * 1000\n\n\t\tthis.autoSaveTimer = setInterval(async () => {\n\t\t\tif (this.isDirty && !this.isDestroyed) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.forceSave()\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.logger.error('Auto-save failed', error)\n\t\t\t\t}\n\t\t\t}\n\t\t}, interval)\n\n\t\tthis.logger.debug('Auto-save started', {\n\t\t\tintervalMinutes: this.config.autoSaveInterval,\n\t\t})\n\t}\n\n\tprivate restartAutoSave(): void {\n\t\tif (this.autoSaveTimer) {\n\t\t\tclearInterval(this.autoSaveTimer)\n\t\t}\n\t\tthis.startAutoSave()\n\t}\n}\n","/*\n * IMPORTS\n ***************************************************************************************************/\nimport { type DependencyList, useEffect, useState, useCallback, useRef } from 'react'\nimport {\n\tStateMachine,\n\ttype StateHistoryInfo,\n\ttype LifecycleEvent,\n\ttype LifecyclePayloadMap,\n} from './machine'\n\n/*\n * TYPES\n ***************************************************************************************************/\nimport type { Draft } from 'immer'\n\n/*\n * HOOKS\n ***************************************************************************************************/\n\n/**\n * Basic hook to subscribe to a StateMachine instance\n */\nexport function useStateMachine<T extends object>(engine: StateMachine<T>) {\n\tconst [state, setState] = useState(() => engine.getState())\n\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(setState)\n\t\treturn unsubscribe\n\t}, [engine])\n\n\tconst mutate = useCallback(\n\t\t(recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tengine.mutate(recipe, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst batch = useCallback(\n\t\t(mutations: Array<(draft: Draft<T>) => void>, description?: string) => {\n\t\t\tengine.batch(mutations, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\treturn {\n\t\tstate,\n\t\tmutate,\n\t\tbatch,\n\t}\n}\n\n/**\n * Hook to subscribe to a specific slice of state with a selector function\n */\nexport function useStateSlice<T extends object, TSelected>(\n\tengine: StateMachine<T>,\n\tselector: (state: T) => TSelected,\n\tequalityFn?: (a: TSelected, b: TSelected) => boolean\n) {\n\tconst [selectedState, setSelectedState] = useState(() => selector(engine.getState()))\n\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(newState => {\n\t\t\tconst newSelected = selector(newState)\n\n\t\t\tif (equalityFn) {\n\t\t\t\tif (!equalityFn(selectedState, newSelected)) {\n\t\t\t\t\tsetSelectedState(newSelected)\n\t\t\t\t}\n\t\t\t} else if (selectedState !== newSelected) {\n\t\t\t\tsetSelectedState(newSelected)\n\t\t\t}\n\t\t})\n\n\t\treturn unsubscribe\n\t}, [engine, selector, selectedState, equalityFn])\n\n\treturn selectedState\n}\n\n/**\n * Hook that provides StateMachine actions/methods\n */\nexport function useStateActions<T extends object>(engine: StateMachine<T>) {\n\tconst mutate = useCallback(\n\t\t(recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tengine.mutate(recipe, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst batch = useCallback(\n\t\t(mutations: Array<(draft: Draft<T>) => void>, description?: string) => {\n\t\t\tengine.batch(mutations, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst undo = useCallback(() => {\n\t\treturn engine.undo()\n\t}, [engine])\n\n\tconst redo = useCallback(() => {\n\t\treturn engine.redo()\n\t}, [engine])\n\n\tconst forceSave = useCallback(async () => {\n\t\treturn engine.forceSave()\n\t}, [engine])\n\n\tconst loadFromServer = useCallback(async () => {\n\t\treturn engine.loadFromServerManually()\n\t}, [engine])\n\n\tconst clearHistory = useCallback(() => {\n\t\tengine.clearHistory()\n\t}, [engine])\n\n\treturn {\n\t\tmutate,\n\t\tbatch,\n\t\tundo,\n\t\tredo,\n\t\tforceSave,\n\t\tloadFromServer,\n\t\tclearHistory,\n\t}\n}\n\n/**\n * Hook specifically for undo/redo functionality\n */\nexport function useStateHistory<T extends object>(engine: StateMachine<T>) {\n\tconst [historyInfo, setHistoryInfo] = useState<StateHistoryInfo>(() => engine.getHistoryInfo())\n\n\tuseEffect(() => {\n\t\tconst updateHistory = () => {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\n\t\tconst unsubscribe = engine.subscribe(updateHistory)\n\t\treturn unsubscribe\n\t}, [engine])\n\n\tconst undo = useCallback(() => {\n\t\tconst success = engine.undo()\n\t\tif (success) {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\t\treturn success\n\t}, [engine])\n\n\tconst redo = useCallback(() => {\n\t\tconst success = engine.redo()\n\t\tif (success) {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\t\treturn success\n\t}, [engine])\n\n\tconst clearHistory = useCallback(() => {\n\t\tengine.clearHistory()\n\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t}, [engine])\n\n\treturn {\n\t\t...historyInfo,\n\t\tundo,\n\t\tredo,\n\t\tclearHistory,\n\t}\n}\n\n/**\n * Hook for managing save/load state and persistence\n */\nexport function useStatePersist<T extends object>(engine: StateMachine<T>) {\n\tconst [isSaving, setIsSaving] = useState(false)\n\tconst [isLoading, setIsLoading] = useState(false)\n\tconst [lastSaved, setLastSaved] = useState<Date | null>(null)\n\tconst [saveError, setSaveError] = useState<string | null>(null)\n\tconst [loadError, setLoadError] = useState<string | null>(null)\n\n\tconst hasUnsavedChanges = engine.hasUnsavedChanges()\n\n\tconst save = useCallback(async () => {\n\t\tif (isSaving) {\n\t\t\treturn false\n\t\t}\n\n\t\tsetIsSaving(true)\n\t\tsetSaveError(null)\n\n\t\ttry {\n\t\t\tawait engine.forceSave()\n\t\t\tsetLastSaved(new Date())\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : 'Save failed'\n\t\t\tsetSaveError(errorMessage)\n\t\t\treturn false\n\t\t} finally {\n\t\t\tsetIsSaving(false)\n\t\t}\n\t}, [engine, isSaving])\n\n\tconst load = useCallback(async () => {\n\t\tif (isLoading) {\n\t\t\treturn false\n\t\t}\n\n\t\tsetIsLoading(true)\n\t\tsetLoadError(null)\n\n\t\ttry {\n\t\t\tconst success = await engine.loadFromServerManually()\n\t\t\tif (success) {\n\t\t\t\tsetLastSaved(new Date())\n\t\t\t}\n\t\t\treturn success\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : 'Load failed'\n\t\t\tsetLoadError(errorMessage)\n\t\t\treturn false\n\t\t} finally {\n\t\t\tsetIsLoading(false)\n\t\t}\n\t}, [engine, isLoading])\n\n\tconst clearSaveError = useCallback(() => {\n\t\tsetSaveError(null)\n\t}, [])\n\n\tconst clearLoadError = useCallback(() => {\n\t\tsetLoadError(null)\n\t}, [])\n\n\treturn {\n\t\tisSaving,\n\t\tisLoading,\n\t\thasUnsavedChanges,\n\t\tlastSaved,\n\t\tsaveError,\n\t\tloadError,\n\t\tclearSaveError,\n\t\tclearLoadError,\n\t\tsave,\n\t\tload,\n\t}\n}\n\n/**\n * Comprehensive hook that combines all StateMachine functionality\n */\nexport function useStateMachineFull<T extends object>(engine: StateMachine<T>) {\n\tconst { state, mutate, batch } = useStateMachine(engine)\n\tconst actions = useStateActions(engine)\n\tconst history = useStateHistory(engine)\n\tconst persistence = useStatePersist(engine)\n\n\treturn {\n\t\tstate,\n\t\tmutate,\n\t\tbatch,\n\t\thistory: {\n\t\t\tcanUndo: history.canUndo,\n\t\t\tcanRedo: history.canRedo,\n\t\t\thistoryLength: history.historyLength,\n\t\t\tcurrentIndex: history.currentIndex,\n\t\t\tlastAction: history.lastAction,\n\t\t\tmemoryUsage: history.memoryUsage,\n\t\t\tundo: history.undo,\n\t\t\tredo: history.redo,\n\t\t\tclearHistory: history.clearHistory,\n\t\t},\n\t\tpersistence: {\n\t\t\tisSaving: persistence.isSaving,\n\t\t\tisLoading: persistence.isLoading,\n\t\t\thasUnsavedChanges: persistence.hasUnsavedChanges,\n\t\t\tlastSaved: persistence.lastSaved,\n\t\t\tsaveError: persistence.saveError,\n\t\t\tloadError: persistence.loadError,\n\t\t\tsave: persistence.save,\n\t\t\tload: persistence.load,\n\t\t\tclearSaveError: persistence.clearSaveError,\n\t\t\tclearLoadError: persistence.clearLoadError,\n\t\t},\n\t\tforceSave: actions.forceSave,\n\t\tloadFromServer: actions.loadFromServer,\n\t}\n}\n\n/**\n * Hook for creating optimistic updates with automatic rollback on failure\n * -- Still testing this, I'm not sure if this is a good solution.\n */\nexport function useOptimisticUpdate<T extends object>(engine: StateMachine<T>) {\n\tconst mutateOptimistic = useCallback(\n\t\tasync (\n\t\t\toptimisticUpdate: (draft: Draft<T>) => void,\n\t\t\tserverUpdate: () => Promise<void>,\n\t\t\tdescription?: string\n\t\t) => {\n\t\t\t// Apply optimistic update\n\t\t\tengine.mutate(optimisticUpdate, `${description} (optimistic)`)\n\n\t\t\ttry {\n\t\t\t\t// Attempt server update\n\t\t\t\tawait serverUpdate()\n\t\t\t\t// If successful, the optimistic update stands\n\t\t\t} catch (error) {\n\t\t\t\t// If failed, undo the optimistic update\n\t\t\t\tengine.undo()\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\t[engine]\n\t)\n\n\treturn { mutateOptimistic }\n}\n\n/**\n * Hook for debounced state updates (useful for search inputs, etc.)\n */\nexport function useDebouncedStateUpdate<T extends object>(engine: StateMachine<T>, delay = 300) {\n\tconst [debouncedMutate] = useState(() => {\n\t\tlet timeoutId: ReturnType<typeof setTimeout>\n\n\t\treturn (recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tclearTimeout(timeoutId)\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tengine.mutate(recipe, description)\n\t\t\t}, delay)\n\t\t}\n\t})\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tclearTimeout(debouncedMutate as unknown as ReturnType<typeof setTimeout>)\n\t\t}\n\t}, [debouncedMutate])\n\n\treturn { debouncedMutate }\n}\n\n/**\n * Hook for subscribing to state changes with cleanup on component unmount\n */\nexport function useStateSubscription<T extends object>(\n\tengine: StateMachine<T>,\n\tcallback: (state: T) => void,\n\tdeps: DependencyList = []\n) {\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(callback)\n\t\treturn unsubscribe\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [engine, callback, ...deps])\n}\n\n/**\n * Hook for subscribing to lifecycle events (afterMutate, error, destroy)\n */\nexport function useLifecycleEvent<T extends object, E extends LifecycleEvent>(\n\tengine: StateMachine<T>,\n\tevent: E,\n\tlistener: (payload: LifecyclePayloadMap<T>[E]) => void\n) {\n\tconst listenerRef = useRef(listener)\n\tlistenerRef.current = listener\n\n\tuseEffect(() => {\n\t\treturn engine.on(event, payload => listenerRef.current(payload))\n\t}, [engine, event])\n}\n\n/**\n * Utility hook for shallow equality comparison\n */\nexport function useShallowEqual<T>(value: T): T {\n\tconst [state, setState] = useState(value)\n\n\tuseEffect(() => {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tconst keys1 = Object.keys(state as Record<string, unknown>)\n\t\t\tconst keys2 = Object.keys(value as Record<string, unknown>)\n\n\t\t\tif (keys1.length !== keys2.length) {\n\t\t\t\tsetState(value)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tfor (const key of keys1) {\n\t\t\t\tif (\n\t\t\t\t\t(state as Record<string, unknown>)[key] !==\n\t\t\t\t\t(value as Record<string, unknown>)[key]\n\t\t\t\t) {\n\t\t\t\t\tsetState(value)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (state !== value) {\n\t\t\tsetState(value)\n\t\t}\n\t}, [value, state])\n\n\treturn state\n}\n\n/**\n * Factory function to create typed hooks for a specific StateMachine\n */\nexport function createStateMachineHooks<T extends object>(engine: StateMachine<T>) {\n\treturn {\n\t\tuseState: () => useStateMachine(engine),\n\t\tuseSlice: <TSelected>(\n\t\t\tselector: (state: T) => TSelected,\n\t\t\tequalityFn?: (a: TSelected, b: TSelected) => boolean\n\t\t) => useStateSlice(engine, selector, equalityFn),\n\t\tuseActions: () => useStateActions(engine),\n\t\tuseHistory: () => useStateHistory(engine),\n\t\tusePersistence: () => useStatePersist(engine),\n\t\tuseComplete: () => useStateMachineFull(engine),\n\t\tuseOptimistic: () => useOptimisticUpdate(engine),\n\t\tuseDebounced: (delay?: number) => useDebouncedStateUpdate(engine, delay),\n\t\tuseSubscription: (callback: (state: T) => void, deps?: DependencyList) =>\n\t\t\tuseStateSubscription(engine, callback, deps),\n\t\tuseLifecycle: <E extends LifecycleEvent>(\n\t\t\tevent: E,\n\t\t\tlistener: (payload: LifecyclePayloadMap<T>[E]) => void\n\t\t) => useLifecycleEvent(engine, event, listener),\n\t}\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bkincz/clutch",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "A production-ready, TypeScript-first state management library built on Immer with advanced features",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"limit": "15 KB"
|
|
90
90
|
},
|
|
91
91
|
{
|
|
92
|
-
"path": "dist/index.mjs",
|
|
92
|
+
"path": "dist/index.mjs",
|
|
93
93
|
"limit": "15 KB"
|
|
94
94
|
}
|
|
95
95
|
],
|
package/readme.md
CHANGED
|
@@ -13,14 +13,14 @@ Thought I'd put it here for anyone that might want to use it as well.
|
|
|
13
13
|
|
|
14
14
|
## Features
|
|
15
15
|
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
16
|
+
- **Immutable Updates** - Powered by Immer for clean, mutable-style code that produces immutable state
|
|
17
|
+
- **Undo/Redo** - Built-in history management using efficient patch-based storage
|
|
18
|
+
- **Persistence** - Automatic localStorage backup with optional server synchronization
|
|
19
|
+
- **Performance** - Debounced notifications, memory tracking, and efficient batch operations
|
|
20
|
+
- **Type Safety** - Full TypeScript support with runtime validation
|
|
21
|
+
- **Debugging** - Comprehensive logging system with structured output
|
|
22
|
+
- **Memory Management** - Automatic cleanup and configurable history limits
|
|
23
|
+
- **Auto-Save** - Configurable automatic persistence to prevent data loss
|
|
24
24
|
|
|
25
25
|
## Installation
|
|
26
26
|
|
|
@@ -65,7 +65,7 @@ class TodoState extends StateMachine<AppState> {
|
|
|
65
65
|
});
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
// Optional:
|
|
68
|
+
// Optional: Override these methods only if you need server persistence
|
|
69
69
|
protected async saveToServer(state: AppState): Promise<void> {
|
|
70
70
|
await fetch("/api/state", {
|
|
71
71
|
method: "POST",
|
|
@@ -181,7 +181,7 @@ function UndoRedoButtons() {
|
|
|
181
181
|
|
|
182
182
|
### Batch Operations
|
|
183
183
|
|
|
184
|
-
Group multiple changes into a single
|
|
184
|
+
Group multiple changes into a single operation:
|
|
185
185
|
|
|
186
186
|
```typescript
|
|
187
187
|
state.batch([
|