UNPKG

stunk

Version:

Stunk is a lightweight, framework-agnostic state management library for JavaScript and TypeScript. It uses chunk-based state units for efficient updates, reactivity, and performance optimization in React, Vue, Svelte, and Vanilla JS/TS applications.

1 lines 45.2 kB
{"version":3,"sources":["../src/utils.ts","../src/core/core.ts","../src/core/asyncChunk.ts","../src/core/computed.ts","../src/core/selector.ts","../src/middleware/index.ts","../src/middleware/logger.ts","../src/middleware/validator.ts","../src/middleware/history.ts","../src/middleware/persistence.ts"],"names":["isValidChunkValue","value","isChunk","chunk","method","once","fn","called","result","combineAsyncChunks","chunks","initialData","acc","key","initialState","combined","asyncChunk","state","currentState","hasLoading","firstError","allErrors","chunkKey","chunkState","processMiddleware","initialValue","middleware","currentValue","index","current","middlewareFn","middlewareName","nextCalled","nextValue","val","error","errorMessage","shallowEqual","a","b","i","keysA","keysB","validateObjectShape","original","updated","path","originalKeys","updatedKeys","extraKeys","isBatching","dirtyChunks","chunkRegistry","chunkIdCounter","batch","callback","wasBatchingBefore","id","subscribers","chunkId","notify","subscriber","notifySubscribers","get","set","newValueOrUpdater","newValue","processedValue","subscribe","initialDerivedValue","derivedChunk","unsubscribe","newDerivedValue","originalDestroy","fetcher","options","onError","retryCount","retryDelay","refreshConfig","enabled","staleTime","cacheTime","refetchInterval","expectsParams","hasValidParams","params","p","baseChunk","currentParams","intervalId","cacheTimeoutId","isStale","clearCache","setCacheTimeout","fetchData","retries","force","data","now","resolve","cleanup","mutator","newData","computed","dependencies","computeFn","dependencyValues","dep","cachedValue","computedChunk","originalSet","isDirty","recompute","hasChanges","unsubs","unsub","select","sourceChunk","selector","useShallowEqual","prevSourceValue","currentResult","update","newSourceValue","newResult","middleware_exports","__export","logger","nonNegativeValidator","withHistory","withPersistence","next","maxHistory","history","currentIndex","isHistoryAction","historyChunk","removeCount","storage","serialize","deserialize","savedChunk","parsed","serialized"],"mappings":"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","file":"index.cjs","sourcesContent":["import { chunk, Chunk, Middleware, NamedMiddleware } from \"./core/core\";\n\nimport { AsyncChunk } from \"./core/asyncChunk\";\nimport { CombinedData, CombinedState } from \"./core/types\";\n\nexport function isValidChunkValue(value: unknown): boolean {\n return value !== null;\n}\n\nexport function isValidChunk<T>(value: unknown, validateBehavior = false): value is Chunk<T> {\n if (!isChunk(value)) {\n return false;\n }\n\n if (!validateBehavior) {\n return true;\n }\n\n try {\n const currentValue = value.get();\n value.set(currentValue);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isChunk<T>(value: unknown): value is Chunk<T> {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const chunk = value as Record<string, unknown>;\n const requiredMethods = [\n 'get',\n 'set',\n 'update',\n 'subscribe',\n 'derive',\n 'reset',\n 'destroy'\n ] as const;\n\n return requiredMethods.every(method =>\n typeof chunk[method] === 'function'\n );\n}\n\nexport function once<T>(fn: () => T): () => T {\n let called = false;\n let result: T;\n return () => {\n if (!called) {\n result = fn();\n called = true;\n }\n return result;\n };\n};\n\nexport function combineAsyncChunks<T extends Record<string, AsyncChunk<any>>>(\n chunks: T\n): Chunk<CombinedState<T>> {\n const initialData = Object.keys(chunks).reduce((acc, key) => {\n acc[key as keyof T] = null;\n return acc;\n }, {} as CombinedData<T>);\n\n const initialState: CombinedState<T> = {\n loading: Object.keys(chunks).length > 0,\n error: null,\n errors: {},\n data: initialData\n };\n\n const combined = chunk(initialState);\n\n const chunkValues = Object.values(chunks);\n\n Object.entries(chunks).forEach(([key, asyncChunk]) => {\n asyncChunk.subscribe((state) => {\n const currentState = combined.get();\n\n let hasLoading = false;\n let firstError: Error | null = null;\n const allErrors: Partial<{ [K in keyof T]: Error }> = {};\n\n Object.entries(chunks).forEach(([chunkKey, chunk]) => {\n const chunkState = chunk.get();\n if (chunkState.loading) hasLoading = true;\n if (chunkState.error) {\n if (!firstError) firstError = chunkState.error;\n allErrors[chunkKey as keyof T] = chunkState.error;\n }\n });\n\n combined.set({\n loading: hasLoading,\n error: firstError,\n errors: allErrors,\n data: {\n ...currentState.data,\n [key]: state.data\n },\n });\n });\n });\n\n return combined;\n}\n\nexport function processMiddleware<T>(initialValue: T, middleware: (Middleware<T> | NamedMiddleware<T>)[]): T {\n if (initialValue === null) {\n throw new Error(\"Value cannot be null.\");\n }\n\n let currentValue = initialValue;\n let index = 0;\n\n while (index < middleware.length) {\n const current = middleware[index];\n\n const middlewareFn = typeof current === 'function' ? current : current.fn;\n const middlewareName = typeof current === 'function' ? `index ${index}` : (current.name || `index ${index}`);\n let nextCalled = false;\n let nextValue: T | null = null;\n\n try {\n middlewareFn(currentValue, (val) => {\n nextCalled = true;\n nextValue = val;\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Middleware \"${middlewareName}\" threw an error: ${errorMessage}`);\n }\n\n if (!nextCalled) break;\n\n if (nextValue === null) {\n throw new Error(`Middleware at index ${index} returned null value.`);\n }\n\n currentValue = nextValue;\n index++;\n }\n\n return currentValue;\n}\n\nexport function shallowEqual<T>(a: T, b: T): boolean {\n if (a === b) {\n return true;\n }\n\n if (!a || !b || typeof a !== typeof b) {\n return false;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key) || (a as any)[key] !== (b as any)[key]) {\n return false;\n }\n }\n return true;\n }\n\n // For primitive types, return false. Strict equality already handled by initial check\n return false;\n}\n\nexport function validateObjectShape<T>(original: T, updated: T, path = ''): void {\n if (typeof original === 'object' && original !== null && typeof updated === 'object' && updated !== null) {\n if (Array.isArray(original) && Array.isArray(updated)) {\n if (original.length > 0 && typeof original[0] === 'object') {\n for (let i = 0; i < updated.length; i++) {\n validateObjectShape(original[0], updated[i], `${path}[${i}]`);\n }\n }\n } else if (!Array.isArray(original) && !Array.isArray(updated)) {\n const originalKeys = Object.keys(original as object);\n const updatedKeys = Object.keys(updated as object);\n const extraKeys = updatedKeys.filter(key => !originalKeys.includes(key));\n\n if (extraKeys.length > 0) {\n const fullPath = path || 'root';\n console.error(`🚨 Stunk: Unknown properties detected at '${fullPath}': ${extraKeys.join(', ')}. This might cause bugs.`);\n console.error('Expected keys:', originalKeys);\n console.error('Received keys:', updatedKeys);\n }\n\n // Recurse into common keys\n for (const key of originalKeys) {\n validateObjectShape((original as any)[key], (updated as any)[key], path ? `${path}.${key}` : key);\n }\n }\n }\n}\n","import { processMiddleware, validateObjectShape } from \"../utils\";\n\nexport type Subscriber<T> = (newValue: T) => void;\nexport type Middleware<T> = (value: T, next: (newValue: T) => void) => void;\nexport type NamedMiddleware<T> = {\n name?: string;\n fn: Middleware<T>;\n};\n\nexport interface Chunk<T> {\n /** Get the current value of the chunk. */\n get: () => T;\n /** Set a new value for the chunk & Update existing value efficiently. */\n set: (newValueOrUpdater: T | ((currentValue: T) => T)) => void;\n /** Subscribe to changes in the chunk. Returns an unsubscribe function. */\n subscribe: (callback: Subscriber<T>) => () => void;\n /** Create a derived chunk based on this chunk's value. */\n derive: <D>(fn: (value: T) => D) => Chunk<D>;\n /** Reset the chunk to its initial value. */\n reset: () => void;\n /** Destroy the chunk and all its subscribers. */\n destroy: () => void;\n}\n\nlet isBatching = false;\nconst dirtyChunks = new Set<number>();\nconst chunkRegistry = new Map<number, { notify: () => void }>();\nlet chunkIdCounter = 0;\n\n/**\n * Batch multiple chunk updates into a single re-render.\n * Useful for updating multiple chunks at once without causing multiple re-renders.\n */\nexport function batch(callback: () => void) {\n const wasBatchingBefore = isBatching;\n isBatching = true;\n try {\n callback();\n } finally {\n if (!wasBatchingBefore) {\n isBatching = false;\n const chunks = Array.from(dirtyChunks); // Snapshot to avoid mutation issues\n dirtyChunks.clear(); // Clear early to prevent re-adds\n chunks.forEach(id => {\n const chunk = chunkRegistry.get(id);\n if (chunk) chunk.notify();\n });\n }\n }\n}\n\nexport function chunk<T>(initialValue: T, middleware: (Middleware<T> | NamedMiddleware<T>)[] = []): Chunk<T> {\n if (initialValue === null) {\n throw new Error(\"Initial value cannot be null.\");\n }\n\n let value = initialValue;\n const subscribers = new Set<Subscriber<T>>();\n const chunkId = chunkIdCounter++;\n\n const notify = () => {\n subscribers.forEach(subscriber => subscriber(value));\n };\n\n chunkRegistry.set(chunkId, { notify });\n\n const notifySubscribers = () => {\n if (subscribers.size === 0) return; // Skip if no subscribers\n if (isBatching) {\n dirtyChunks.add(chunkId);\n } else {\n notify();\n }\n };\n\n const get = () => value;\n\n const set = (newValueOrUpdater: T | ((currentValue: T) => T)) => {\n let newValue: T;\n\n if (typeof newValueOrUpdater === 'function') {\n const updaterFn = newValueOrUpdater as (currentValue: T) => T;\n newValue = updaterFn(value);\n } else {\n newValue = newValueOrUpdater;\n }\n\n validateObjectShape(value, newValue);\n\n const processedValue = processMiddleware(newValue, middleware);\n\n if (processedValue !== value) {\n value = processedValue as T & {};\n notifySubscribers();\n }\n };\n\n const subscribe = (callback: Subscriber<T>) => {\n if (typeof callback !== \"function\") {\n throw new Error(\"Callback must be a function.\");\n }\n subscribers.add(callback);\n callback(value);\n return () => subscribers.delete(callback);\n };\n\n const reset = () => {\n value = initialValue;\n notifySubscribers();\n };\n\n const destroy = () => {\n subscribers.clear();\n value = initialValue;\n dirtyChunks.delete(chunkId);\n chunkRegistry.delete(chunkId);\n };\n\n const derive = <D>(fn: (value: T) => D) => {\n if (typeof fn !== \"function\") {\n throw new Error(\"Derive function must be a function.\");\n }\n\n const initialDerivedValue = fn(value);\n const derivedChunk = chunk(initialDerivedValue);\n\n const unsubscribe = subscribe(() => {\n const newDerivedValue = fn(value);\n derivedChunk.set(newDerivedValue);\n });\n\n // Add a cleanup method to the derived chunk\n const originalDestroy = derivedChunk.destroy;\n derivedChunk.destroy = () => {\n unsubscribe();\n originalDestroy();\n };\n\n return derivedChunk;\n };\n\n return { get, set, subscribe, derive, reset, destroy };\n}\n","import { chunk, Chunk } from \"./core\";\nimport { AsyncChunkOpt } from \"./types\";\n\nexport interface AsyncState<T, E extends Error> {\n loading: boolean;\n error: E | null;\n data: T | null;\n lastFetched?: number;\n}\n\nexport interface RefreshConfig {\n /** Time in milliseconds after which data becomes stale */\n staleTime?: number;\n /** Time in milliseconds to cache data before considering it expired */\n cacheTime?: number;\n /** Auto-refresh interval in milliseconds */\n refetchInterval?: number;\n}\n\n// Extend existing options without breaking changes\nexport interface AsyncChunkOptExtended<T, E extends Error> extends AsyncChunkOpt<T, E> {\n refresh?: RefreshConfig;\n /** Enable/disable the fetcher - useful for conditional fetching */\n enabled?: boolean;\n}\n\nexport interface AsyncChunk<T, E extends Error = Error> extends Chunk<AsyncState<T, E>> {\n /** Reload the data from the source. */\n reload: () => Promise<void>;\n\n /** Smart refresh - respects stale time */\n refresh: () => Promise<void>;\n\n /** Mutate the data directly. */\n mutate: (mutator: (currentData: T | null) => T) => void;\n\n /** Reset the state to the initial value. */\n reset: () => void;\n\n /** Clean up intervals and timeouts */\n cleanup: () => void;\n}\n\n// Overloaded function signatures for backward compatibility\nexport function asyncChunk<T, E extends Error = Error>(\n fetcher: () => Promise<T>,\n options?: AsyncChunkOptExtended<T, E>\n): AsyncChunk<T, E>;\n\nexport function asyncChunk<T, E extends Error = Error, P extends any[] = []>(\n fetcher: (...params: P) => Promise<T>,\n options?: AsyncChunkOptExtended<T, E>\n): AsyncChunk<T, E> & {\n /** Reload with new parameters */\n reload: (...params: P) => Promise<void>;\n /** Smart refresh with parameters */\n refresh: (...params: P) => Promise<void>;\n /** Set parameters for future calls */\n setParams: (...params: P) => void;\n};\n\nexport function asyncChunk<T, E extends Error = Error, P extends any[] = []>(\n fetcher: (...params: P) => Promise<T>,\n options: AsyncChunkOptExtended<T, E> = {}\n) {\n const {\n initialData = null,\n onError,\n retryCount = 0,\n retryDelay = 1000,\n refresh: refreshConfig = {},\n enabled = true,\n } = options;\n\n const { staleTime = 0, cacheTime = 5 * 60 * 1000, refetchInterval } = refreshConfig;\n\n // let's expect params\n const expectsParams = fetcher.length > 0;\n\n const initialState: AsyncState<T, E> = {\n loading: enabled && !expectsParams,\n error: null,\n data: initialData,\n lastFetched: undefined,\n };\n\n const hasValidParams = (params?: P): boolean => {\n if (!expectsParams) return true;\n\n if (params === undefined) return false;\n if (Array.isArray(params)) {\n return params.every(p => p !== undefined && p !== null);\n }\n return true;\n };\n\n const baseChunk = chunk(initialState);\n let currentParams: P | undefined;\n let intervalId: number | null = null;\n let cacheTimeoutId: number | null = null;\n\n const isStale = () => {\n const state = baseChunk.get();\n if (!state.lastFetched) return true;\n return Date.now() - state.lastFetched > staleTime;\n };\n\n const isCacheExpired = () => {\n const state = baseChunk.get();\n if (!state.lastFetched) return true;\n return Date.now() - state.lastFetched > cacheTime;\n };\n\n const clearCache = () => {\n baseChunk.set({\n ...baseChunk.get(),\n data: initialData,\n lastFetched: undefined,\n });\n };\n\n const setCacheTimeout = () => {\n if (cacheTimeoutId) {\n clearTimeout(cacheTimeoutId);\n }\n if (cacheTime > 0) {\n cacheTimeoutId = setTimeout(clearCache, cacheTime);\n }\n };\n\n const fetchData = async (params?: P, retries = retryCount, force = false): Promise<void> => {\n if (!enabled) return;\n\n // Store params for reuse\n if (params !== undefined) {\n currentParams = params;\n }\n\n // Don't fetch if we don't have valid parameters (only matters if params expected)\n if (!hasValidParams(currentParams)) {\n baseChunk.set({ ...baseChunk.get(), loading: false });\n return;\n }\n\n // Don't fetch if data is fresh and not forcing\n if (!force && !isStale() && baseChunk.get().data !== null && staleTime > 0) {\n return;\n }\n\n baseChunk.set({ ...baseChunk.get(), loading: true, error: null });\n\n try {\n const data = expectsParams\n ? await fetcher(...currentParams!)\n : await fetcher(...([] as unknown as P));\n const now = Date.now();\n\n baseChunk.set({\n loading: false,\n error: null,\n data,\n lastFetched: now\n });\n\n setCacheTimeout();\n } catch (error) {\n if (retries > 0) {\n await new Promise(resolve => setTimeout(resolve, retryDelay));\n return fetchData(params, retries - 1, force);\n }\n\n baseChunk.set({\n loading: false,\n error: error as E,\n data: baseChunk.get().data,\n lastFetched: baseChunk.get().lastFetched\n });\n\n if (onError) {\n onError(error as E);\n }\n }\n };\n\n // Setup auto-refresh\n if (refetchInterval && refetchInterval > 0 && enabled) {\n intervalId = setInterval(() => {\n if (enabled) {\n fetchData(currentParams, 0, false);\n }\n }, refetchInterval);\n }\n\n // Initial fetch\n if (enabled && !expectsParams) {\n fetchData();\n }\n\n const cleanup = () => {\n if (intervalId) {\n clearInterval(intervalId);\n intervalId = null;\n }\n if (cacheTimeoutId) {\n clearTimeout(cacheTimeoutId);\n cacheTimeoutId = null;\n }\n };\n\n const asyncChunkInstance = {\n ...baseChunk,\n\n reload: async (...params: P) => {\n await fetchData(params.length > 0 ? params : undefined, retryCount, true);\n },\n\n refresh: async (...params: P) => {\n await fetchData(params.length > 0 ? params : undefined, retryCount, false);\n },\n\n mutate: (mutator: (currentData: T | null) => T) => {\n const currentState = baseChunk.get();\n const newData = mutator(currentState.data);\n baseChunk.set({ ...currentState, data: newData });\n },\n\n reset: () => {\n cleanup();\n baseChunk.set({\n ...initialState,\n loading: enabled\n });\n if (enabled) {\n fetchData();\n\n if (refetchInterval && refetchInterval > 0) {\n intervalId = setInterval(() => {\n if (enabled) {\n fetchData(currentParams, 0, false);\n }\n }, refetchInterval);\n }\n }\n },\n\n cleanup,\n\n // Only add setParams if parameters were used\n setParams: (...params: P) => {\n currentParams = params;\n if (enabled && hasValidParams(params)) {\n fetchData(params);\n }\n },\n\n };\n\n return asyncChunkInstance;\n}\n","import { Chunk, chunk } from \"./core\";\n\nimport { shallowEqual } from \"../utils\";\n\n// Helper type to extract the value type from a Chunk\nexport type ChunkValue<T> = T extends Chunk<infer U> ? U : never;\n\n// Helper type to transform an array of Chunks into an array of their value types\nexport type DependencyValues<T extends Chunk<any>[]> = {\n [K in keyof T]: T[K] extends Chunk<any> ? ChunkValue<T[K]> : never;\n};\n\nexport interface Computed<T> extends Chunk<T> {\n /**\n * Checks if the computed value needs to be recalculated due to dependency changes.\n * @returns True if the computed value is dirty, false otherwise.\n */\n isDirty: () => boolean;\n /** Manually forces recalculation of the computed value from its dependencies. */\n recompute: () => void;\n}\n\nexport function computed<TDeps extends Chunk<any>[], TResult>(\n dependencies: [...TDeps],\n computeFn: (...args: DependencyValues<TDeps>) => TResult\n): Computed<TResult> {\n const dependencyValues = dependencies.map(dep => dep.get());\n let cachedValue = computeFn(...dependencyValues as DependencyValues<TDeps>);\n\n const computedChunk = chunk(cachedValue);\n const originalSet = computedChunk.set;\n\n let isDirty = false;\n\n // Direct synchronous recomputation\n const recompute = () => {\n let hasChanges = false;\n\n for (let i = 0; i < dependencies.length; i++) {\n const newValue = dependencies[i].get();\n if (newValue !== dependencyValues[i]) {\n dependencyValues[i] = newValue;\n hasChanges = true;\n }\n }\n\n if (hasChanges) {\n const newValue = computeFn(...dependencyValues as DependencyValues<TDeps>);\n // Fast path for primitives only. Avoids shallowEqual for performance.\n if (newValue !== cachedValue) {\n // Only use shallowEqual for objects when needed\n if (typeof newValue !== 'object' || typeof cachedValue !== 'object' || !shallowEqual(newValue, cachedValue)) {\n cachedValue = newValue;\n originalSet(newValue);\n }\n }\n isDirty = false;\n }\n };\n\n const unsubs = dependencies.map(dep =>\n dep.subscribe(() => {\n isDirty = true;\n recompute();\n })\n );\n\n return {\n ...computedChunk,\n get: () => {\n if (isDirty) recompute();\n return cachedValue;\n },\n recompute,\n isDirty: () => isDirty,\n set: () => { throw new Error('Cannot set values directly on computed. Modify the source chunk instead.'); },\n reset: () => {\n dependencies.forEach(dep => {\n if (typeof dep.reset === 'function') {\n dep.reset();\n }\n });\n isDirty = true;\n recompute();\n return cachedValue;\n },\n destroy: () => { unsubs.forEach(unsub => unsub()); computedChunk.destroy?.(); }\n };\n}\n","import { shallowEqual } from \"../utils\";\nimport { Chunk, chunk } from \"./core\";\n\nexport interface SelectOptions {\n /**\n * Configuration options for selector functions.\n * @property {boolean} [useShallowEqual] - When true, performs a shallow equality check\n * on the derived selector results to prevent unnecessary updates.\n */\n useShallowEqual?: boolean;\n}\n\n/**\n * Creates a derived read-only chunk based on a selector function.\n * @param sourceChunk The source chunk to derive from.\n * @param selector A function that extracts part of the source value.\n * @param options Optional settings for shallow equality comparison.\n * @returns A read-only derived chunk.\n */\n\nexport function select<T, S>(\n sourceChunk: Chunk<T>,\n selector: (value: T) => S,\n options: SelectOptions = {}\n): Chunk<S> {\n const { useShallowEqual = false } = options;\n\n let prevSourceValue = sourceChunk.get();\n let currentResult = selector(prevSourceValue);\n\n const derivedChunk = chunk(currentResult);\n\n const update = () => {\n const newSourceValue = sourceChunk.get();\n const newResult = selector(newSourceValue);\n\n // Always update the reference to source value\n prevSourceValue = newSourceValue;\n\n // Check if the result has changed\n const resultChanged = useShallowEqual\n ? !shallowEqual(newResult, currentResult)\n : newResult !== currentResult;\n\n if (resultChanged) {\n currentResult = newResult;\n derivedChunk.set(newResult);\n }\n };\n\n const unsubscribe = sourceChunk.subscribe(update);\n\n return {\n get: () => derivedChunk.get(),\n set: () => {\n throw new Error('Cannot set values directly on a selector. Modify the source chunk instead.');\n },\n subscribe: derivedChunk.subscribe,\n derive: <D>(fn: (value: S) => D) => select(derivedChunk, fn, options), // Pass options to nested selectors\n reset: () => {\n throw new Error('Cannot reset a selector chunk. Reset the source chunk instead.');\n },\n destroy: () => {\n unsubscribe();\n derivedChunk.destroy();\n }\n };\n}\n","// Middleware passed to chunks\nexport { logger } from \"./logger\";\nexport { nonNegativeValidator } from \"./validator\";\n\n// Middleware used with chunks\nexport { withHistory } from \"./history\";\nexport { withPersistence } from './persistence';\n","import { Middleware } from \"../core/core\";\n\nexport const logger: Middleware<any> = (value, next) => {\n console.log(\"Setting value:\", value);\n next(value);\n};\n","import { chunk, Middleware } from \"../core/core\";\n\nexport const nonNegativeValidator: Middleware<number> = (value, next) => {\n if (value < 0) {\n throw new Error(\"Value must be non-negative!\");\n }\n next(value); // If validation passes, proceed with the update\n};\n","import { Chunk } from \"../core/core\";\n\nexport interface ChunkWithHistory<T> extends Chunk<T> {\n /**\n * Reverts to the previous state (if available).\n */\n undo: () => void;\n /**\n * Moves to the next state (if available).\n */\n redo: () => void;\n /**\n * Returns true if there is a previous state to revert to.\n */\n canUndo: () => boolean;\n /**\n * Returns true if there is a next state to move to.\n */\n canRedo: () => boolean;\n /**\n * Returns an array of all the values in the history.\n */\n getHistory: () => T[];\n /**\n * Clears the history, keeping only the current value.\n */\n clearHistory: () => void;\n}\n\nexport function withHistory<T>(\n baseChunk: Chunk<T>,\n options: { maxHistory?: number } = {}\n): ChunkWithHistory<T> {\n const { maxHistory = 100 } = options;\n const history: T[] = [baseChunk.get()];\n let currentIndex = 0;\n let isHistoryAction = false;\n\n const historyChunk: ChunkWithHistory<T> = {\n ...baseChunk,\n\n set: (newValueOrUpdater: T | ((currentValue: T) => T)) => {\n if (isHistoryAction) {\n baseChunk.set(newValueOrUpdater);\n return;\n }\n\n // Process the value or updater function\n let newValue: T;\n if (typeof newValueOrUpdater === 'function') {\n // Get current value and apply the updater function\n const currentValue = baseChunk.get();\n newValue = (newValueOrUpdater as ((currentValue: T) => T))(currentValue);\n } else {\n // Use directly as the new value\n newValue = newValueOrUpdater;\n }\n history.splice(currentIndex + 1);\n history.push(newValue);\n\n // Limit history size\n if (history.length > maxHistory) {\n console.warn(\"History limit reached. Removing oldest entries.\");\n const removeCount = history.length - maxHistory;\n history.splice(0, removeCount);\n currentIndex = Math.max(0, currentIndex - removeCount);\n }\n\n currentIndex = history.length - 1;\n baseChunk.set(newValue);\n },\n\n undo: () => {\n if (!historyChunk.canUndo()) return;\n\n isHistoryAction = true;\n currentIndex--;\n historyChunk.set(history[currentIndex]);\n isHistoryAction = false;\n },\n\n redo: () => {\n if (!historyChunk.canRedo()) return;\n\n isHistoryAction = true;\n currentIndex++;\n historyChunk.set(history[currentIndex]);\n isHistoryAction = false;\n },\n\n canUndo: () => currentIndex > 0,\n\n canRedo: () => currentIndex < history.length - 1,\n\n getHistory: () => [...history],\n\n clearHistory: () => {\n const currentValue = baseChunk.get();\n history.length = 0;\n history.push(currentValue);\n currentIndex = 0;\n },\n\n // Override destroy to clean up history\n destroy: () => {\n history.length = 0;\n baseChunk.destroy();\n }\n }\n\n return historyChunk;\n\n}\n","import { Chunk } from \"../core/core\";\n\nexport interface PersistOptions<T> {\n key: string;\n storage?: Storage;\n serialize?: (value: T) => string;\n deserialize?: (value: string) => T;\n}\n\nexport function withPersistence<T>(\n baseChunk: Chunk<T>,\n options: PersistOptions<T>\n): Chunk<T> {\n const {\n key,\n storage = localStorage,\n serialize = JSON.stringify,\n deserialize = JSON.parse,\n } = options;\n\n // Try to load initial state from storage\n try {\n const savedChunk = storage.getItem(key);\n if (savedChunk) {\n const parsed = deserialize(savedChunk);\n baseChunk.set(parsed)\n }\n } catch (error) {\n console.error('Failed to load persisted state:', error);\n }\n\n // Save to storage\n baseChunk.subscribe((newValue) => {\n try {\n const serialized = serialize(newValue);\n storage.setItem(key, serialized);\n\n } catch (error) {\n console.log('Failed to persist chunk', error)\n }\n })\n\n return baseChunk\n\n}\n"]}