storken
Version:
🚀 5KB LLM-native state management for React 18+ with TypeScript, universal API, and plugin system
1 lines • 19.4 kB
Source Map (JSON)
{"version":3,"sources":["../src/useStorken.ts","../src/storken.ts"],"names":["useRef","useState","useEffect","useSyncExternalStore","createHook","Sky","useStorken","key","args","stork","state","onStoreChange","loadingState","setLoadingState","updateLoading","index","listener","returnPack","plugins","Storken","options","name","func","obj","cb","getterValue","value","loading","loadingListener","val","newValue","opts","setRoot","result","plugin","config","reset","keys","keyValPairs","pair","dump","create","storkenConfig","Heaven"],"mappings":"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","sourcesContent":["import { useRef, useState, useEffect, useSyncExternalStore } from 'react'\nimport type { \n StorkenKey, \n StorkenArgs, \n StorkenHookReturn, \n ISky,\n IStorken\n} from './types'\n\n/**\n * Hook creator for Storken v3.0 with React 18 useSyncExternalStore support\n * @param Sky - Wrapper object which will be used to create and orchestrate for Storkens\n * @returns useStorken - Hook function with full type safety\n */\nexport const createHook = (Sky: ISky) => {\n /**\n * Modern React 18 compatible useStorken hook\n * @param key - Key of the Storken state\n * @param args - Arguments which will be used in Storken getter & setter functions\n * @returns Typed array with state, actions, loading status, and plugins\n */\n function useStorken<T = unknown>(\n key: StorkenKey,\n ...args: StorkenArgs\n ): StorkenHookReturn<T> {\n // Get or create Storken instance\n const stork = useRef<IStorken<T>>(\n Sky.bundles?.[key] as IStorken<T> || Sky.create<T>(key, ...args)\n ).current\n\n // Modern React 18 external store subscription\n const state = useSyncExternalStore(\n // Subscribe function\n (onStoreChange) => {\n const unsubscribe = stork.listen(\n [stork.value, onStoreChange],\n [stork.loading || false, () => {}], // Loading handled separately\n args\n )\n return unsubscribe\n },\n // Get snapshot function\n () => stork.value as T,\n // Get server snapshot function (for SSR)\n () => stork.opts?.initialValue as T\n )\n\n // Loading state management (separate from main state)\n const [loadingState, setLoadingState] = useState<boolean>(stork.opts?.loading || false)\n\n // Update loading state when storken loading changes\n useEffect(() => {\n const updateLoading = () => setLoadingState(stork.loading || false)\n stork.on('loading', updateLoading)\n return () => {\n // Clean up event listener\n if (stork.eventListeners?.loading) {\n const index = stork.eventListeners.loading.findIndex(\n (listener) => listener === updateLoading\n )\n if (index > -1) {\n stork.eventListeners.loading.splice(index, 1)\n }\n }\n }\n }, [stork])\n\n // Create return pack with proper typing\n const returnPack = [\n state,\n stork.set.bind(stork),\n stork.reset.bind(stork),\n loadingState,\n stork.update.bind(stork)\n ] as StorkenHookReturn<T>\n\n // Add object-style access for better DX\n returnPack.value = state\n returnPack.set = stork.set.bind(stork)\n returnPack.reset = stork.reset.bind(stork)\n returnPack.loading = loadingState\n returnPack.update = stork.update.bind(stork)\n\n // Load plugins\n const plugins = stork.loadPlugins(returnPack)\n if (plugins) {\n returnPack.push(plugins)\n returnPack.plugins = plugins\n }\n\n return returnPack\n }\n\n return useStorken\n}\n\n// Legacy export for backward compatibility\nexport default createHook","import { createHook } from './useStorken'\nimport type { \n StorkenKey, \n StorkenArgs, \n StorkenOptions,\n StorkenConfig,\n StorkenPlugins,\n StorkenEventListeners,\n StorkenEventListener,\n StorkenGetter,\n StorkenSetter,\n ISky,\n IStorken,\n ReactState,\n CreateReturn\n} from './types'\nimport { Dispatch, SetStateAction } from 'react'\n\nexport class Storken<T = unknown> implements IStorken<T> {\n readonly id: number\n readonly key: StorkenKey\n opts: StorkenOptions<T>\n args: StorkenArgs\n value: T\n Store: ISky\n namespace: string\n listeners: Dispatch<SetStateAction<T>>[] = []\n loadingListeners: Dispatch<SetStateAction<boolean>>[] = []\n eventListeners?: StorkenEventListeners = {}\n plugins?: Record<string, unknown> = {}\n loading?: boolean\n getted?: boolean = false\n\n constructor(options: StorkenOptions<T>, Sky: ISky) {\n const { key, args = [], plugins, ...opts } = options\n \n this.id = Date.now()\n this.key = key\n this.opts = options\n this.args = [...args]\n this.value = opts?.initialValue as T\n this.Store = Sky\n this.namespace = opts?.namespace || 'storken::'\n\n if (plugins instanceof Object) {\n this.plugins = Object.keys(plugins).reduce((obj, key) => {\n const [plugin, ...config] = Array.isArray(plugins[key])\n ? plugins[key]\n : [plugins[key]]\n\n obj[key] = plugin(this as any, ...config)\n return obj\n }, {} as Record<string, unknown>)\n }\n }\n\n on = (name: string, func: StorkenEventListener): void => {\n if (!this?.eventListeners) {\n this.eventListeners = {}\n }\n\n if (this?.eventListeners?.[name]) {\n this.eventListeners[name].push(func)\n } else {\n this.eventListeners[name] = [func]\n }\n }\n\n dispatchEvent = async (name: string, ...args: unknown[]): Promise<void> => {\n if (!this?.eventListeners?.[name]) { \n return undefined \n }\n for (const func of this.eventListeners[name]) {\n await func(...args)\n }\n }\n\n loadPlugins = (returnPack?: unknown[]): Record<string, unknown> | undefined => {\n const { plugins } = this\n if (!plugins) { \n return undefined \n }\n\n return Object.keys(plugins)?.reduce((obj, key) => {\n let cb = plugins[key]\n cb = cb instanceof Function ? cb(returnPack) : cb\n obj[key] = cb\n return obj\n }, {} as Record<string, unknown>)\n }\n\n setFromGetter = async (...args: unknown[]): Promise<T | undefined> => {\n if (!this.opts?.getter) { \n return undefined \n }\n if (this.opts?.disableGetterOnLoading && this.loading) { \n return Promise.resolve(this.value) \n }\n \n this.load(true)\n this.dispatchEvent('getting', ...args)\n\n const getterValue = await Promise.resolve(\n typeof this.opts.getter === 'function'\n ? this.opts.getter(this, ...args)\n : this.opts.getter\n )\n \n this.dispatchEvent('getted', getterValue, ...args)\n if (getterValue) {\n this.set(getterValue as T, {\n force: true,\n disableSetter: this.opts?.disableSetterOnGetter || true\n })\n }\n this.load(false)\n return getterValue\n }\n\n update = this.setFromGetter\n\n listen = (\n state: ReactState<T>,\n loadingState: ReactState<boolean>,\n args: StorkenArgs\n ): (() => void) => {\n const [value, listener] = state\n const [loading, loadingListener] = loadingState\n\n if (this.listeners.indexOf(listener) === -1) {\n this.listeners.push(listener)\n }\n\n if (this.loadingListeners.indexOf(loadingListener) === -1) {\n this.loadingListeners.push(loadingListener)\n }\n\n if (value !== this.value) {\n listener(this.value)\n }\n if (loading !== this.loading) {\n loadingListener(this.loading || false)\n }\n\n if (\n (!this.opts?.disableAutoGetter && !this.getted) ||\n !this.opts?.getOnlyOnMount\n ) {\n this.setFromGetter(...args)\n }\n\n this.dispatchEvent('effect', { state, loading: loadingState, args })\n\n const stork = this\n return () => {\n delete stork.listeners?.[stork.listeners.indexOf(listener)]\n delete stork.loadingListeners?.[\n stork.loadingListeners.indexOf(loadingListener)\n ]\n stork.listeners = stork.listeners.filter(Boolean)\n stork.loadingListeners = stork.loadingListeners.filter(Boolean)\n if (stork.opts?.getOnce && !stork.getted) {\n stork.getted = true\n }\n stork.dispatchEvent('unmounted')\n }\n }\n\n updateListeners = (val: T): void => {\n for (const listener of this.listeners) {\n if (listener) {\n listener(val)\n }\n }\n }\n\n updateLoadingListeners = (val: boolean): void => {\n for (const listener of this.loadingListeners) {\n if (listener) {\n listener(val)\n }\n }\n }\n\n set = async (\n newValue: T | ((prev: T) => T),\n opts: { disableSetter?: boolean; force?: boolean } = {}\n ): Promise<void> => {\n this.dispatchEvent('willSet', newValue, opts)\n \n const val = newValue instanceof Function\n ? await Promise.resolve(newValue(this.value))\n : newValue\n\n if (this.value === val && !opts?.force) {\n return\n }\n\n const setRoot = (value: T) => {\n this.value = value\n this.updateListeners(value)\n this.dispatchEvent('set', value, this?.args, opts)\n }\n\n if (typeof this.opts?.setter === 'function' && !opts?.disableSetter) {\n this.load(true)\n Promise.resolve(\n this.opts.setter(this, val, ...(this?.args || []))\n ).then((result: any) => {\n setRoot(this.opts?.setWithSetter ? (result as T) : val)\n this.load(false)\n })\n } else {\n setRoot(val)\n }\n }\n\n load = async (loadingState: boolean | null): Promise<boolean> => {\n this.loading = loadingState || false\n this.dispatchEvent('loading', this.loading)\n this.updateLoadingListeners(this.loading)\n return this.loading\n }\n\n reset = (): Promise<void> => {\n return this.set(this.opts?.initialValue as T, { force: true })\n }\n}\n\nexport class Sky implements ISky {\n readonly bundles: Record<StorkenKey, IStorken<any>> = {}\n readonly config: StorkenConfig\n\n constructor(config: StorkenConfig = {}) {\n this.config = config\n }\n\n create = <T = any>(key: StorkenKey, ...args: StorkenArgs): IStorken<T> => {\n this.bundles[key] = new Storken<T>({\n key: key,\n args,\n plugins: this.config?.plugins,\n getter: this.config?.getters?.[key] as any,\n setter: this.config?.setters?.[key] as any,\n ...(this.config?.options || {}),\n ...(this.config?.storkenOptions?.[key] || {}),\n initialValue: this.config?.initialValues && Object.keys(this.config?.initialValues).includes(key as string)\n ? (this.config?.initialValues?.[key] as T)\n : (this.config?.options?.initialValue as T)\n }, this)\n\n return this.bundles[key] as IStorken<T>\n }\n\n get = <T = any>(key: StorkenKey, args?: StorkenArgs, obj?: boolean): T | IStorken<T> => {\n if (!this.bundles?.[key]) {\n this.create<T>(key, args)\n } else if (args) {\n this.bundles[key].args = args\n }\n\n return obj ? (this.bundles[key] as IStorken<T>) : (this.bundles[key].value as T)\n }\n\n getStorken = <T = any>(key: StorkenKey, ...args: StorkenArgs): IStorken<T> => {\n return this.get<T>(key, args, true) as IStorken<T>\n }\n\n getPlugin = <T = any>(key: StorkenKey, plugin: StorkenKey): unknown => {\n const stork = this.get<T>(key, undefined, true) as IStorken<T>\n return plugin ? stork.plugins?.[plugin as string] : stork.plugins\n }\n\n set = <T = any>(key: StorkenKey, value: T, ...args: StorkenArgs): void => {\n if (!this.bundles?.[key]) {\n this.create<T>(key, ...args)\n } else if (args) {\n this.bundles[key].args = args\n }\n\n this.bundles[key].set(value)\n }\n\n remove = async (key: StorkenKey, reset: boolean = true): Promise<void> => {\n if (!this.bundles?.[key]) {\n return\n }\n if (reset) {\n await this.bundles[key].reset()\n }\n delete this.bundles[key]\n }\n\n multiRemove = async (...keys: StorkenKey[]): Promise<void> => {\n for (const key of keys) {\n await this.remove(key)\n }\n }\n\n destroy = async (key: StorkenKey, value: unknown): Promise<void> => {\n if (!this.bundles?.[key]) {\n return\n }\n this.bundles[key].set(value)\n await this.remove(key)\n }\n\n multiDestroy = async (...keyValPairs: Array<{ key: StorkenKey; value: unknown }>): Promise<void> => {\n for (const pair of keyValPairs) {\n await this.destroy(pair?.key, pair?.value)\n }\n }\n\n restore = (dump: Record<StorkenKey, unknown>): void => {\n if (!dump) return\n for (const key in dump) {\n Object.assign(this.config, {\n ...this.config,\n initialValues: {\n ...(this.config?.initialValues || {}),\n [key]: dump[key]\n }\n })\n this.bundles[key] = this.create(key)\n }\n }\n\n dump = (): Record<StorkenKey, unknown> => {\n return Object.assign({}, this.bundles)\n }\n}\n\nexport const create = (storkenConfig: StorkenConfig = {}): CreateReturn => {\n const Heaven = new Sky(storkenConfig)\n const useStorken = createHook(Heaven)\n return [useStorken, Heaven.get, Heaven.set, Heaven] as const\n}\n\nexport default create"]}