UNPKG

@tanstack/store

Version:

Framework agnostic type-safe store w/ reactive framework adapters

1 lines 4.22 kB
{"version":3,"file":"store.cjs","names":["createAtom","toObserver"],"sources":["../src/store.ts"],"sourcesContent":["import { createAtom, toObserver } from './atom'\nimport type { Atom, Observer, Subscription } from './types'\n\nexport type StoreAction = (...args: Array<any>) => any\n\nexport type StoreActionMap = Record<string, StoreAction>\n\nexport type StoreActionsFactory<T, TActions extends StoreActionMap> = (store: {\n setState: Store<T>['setState']\n get: Store<T>['get']\n}) => TActions\n\ntype NonFunction<T> = T extends (...args: Array<any>) => any ? never : T\n\nexport class Store<T, TActions extends StoreActionMap = never> {\n private atom: Atom<T>\n public readonly actions!: TActions\n constructor(getValue: (prev?: NoInfer<T>) => T)\n constructor(initialValue: T)\n constructor(\n initialValue: NonFunction<T>,\n actionsFactory: StoreActionsFactory<T, TActions>,\n )\n constructor(\n valueOrFn: T | ((prev?: T) => T),\n actionsFactory?: StoreActionsFactory<T, TActions>,\n ) {\n // createAtom has overloads that return ReadonlyAtom<T> for functions and Atom<T> for values\n // Store always needs Atom<T> for setState, so we assert the return type\n this.atom = createAtom(\n valueOrFn as T | ((prev?: NoInfer<T>) => T),\n ) as Atom<T>\n\n // bind for safe destructuring\n this.get = this.get.bind(this)\n this.setState = this.setState.bind(this)\n this.subscribe = this.subscribe.bind(this)\n\n if (actionsFactory) {\n this.actions = actionsFactory(this)\n }\n }\n public setState(updater: (prev: T) => T) {\n this.atom.set(updater)\n }\n public get state() {\n return this.atom.get()\n }\n public get() {\n return this.state\n }\n public subscribe(\n observerOrFn: Observer<T> | ((value: T) => void),\n ): Subscription {\n return this.atom.subscribe(toObserver(observerOrFn))\n }\n}\n\nexport class ReadonlyStore<T> implements Omit<\n Store<T>,\n 'setState' | 'actions'\n> {\n private atom: Atom<T>\n constructor(getValue: (prev?: NoInfer<T>) => T)\n constructor(initialValue: T)\n constructor(valueOrFn: T | ((prev?: T) => T)) {\n // createAtom has overloads that return ReadonlyAtom<T> for functions and Atom<T> for values\n // Store always needs Atom<T> for setState, so we assert the return type\n this.atom = createAtom(\n valueOrFn as T | ((prev?: NoInfer<T>) => T),\n ) as Atom<T>\n }\n public get state() {\n return this.atom.get()\n }\n public get() {\n return this.state\n }\n public subscribe(\n observerOrFn: Observer<T> | ((value: T) => void),\n ): Subscription {\n return this.atom.subscribe(toObserver(observerOrFn))\n }\n}\n\nexport function createStore<T>(\n getValue: (prev?: NoInfer<T>) => T,\n): ReadonlyStore<T>\nexport function createStore<T>(initialValue: T): Store<T>\nexport function createStore<T, TActions extends StoreActionMap>(\n initialValue: NonFunction<T>,\n actions: StoreActionsFactory<T, TActions>,\n): Store<T, TActions>\nexport function createStore<T, TActions extends StoreActionMap>(\n valueOrFn: T | ((prev?: T) => T),\n actions?: StoreActionsFactory<T, TActions>,\n): Store<T, TActions> | Store<T> | ReadonlyStore<T> {\n if (typeof valueOrFn === 'function') {\n return new ReadonlyStore(valueOrFn as (prev?: NoInfer<T>) => T)\n }\n if (actions) {\n return new Store(valueOrFn as NonFunction<T>, actions)\n }\n return new Store(valueOrFn)\n}\n"],"mappings":";;;AAcA,IAAa,QAAb,MAA+D;CAS7D,YACE,WACA,gBACA;AAGA,OAAK,OAAOA,wBACV,UACD;AAGD,OAAK,MAAM,KAAK,IAAI,KAAK,KAAK;AAC9B,OAAK,WAAW,KAAK,SAAS,KAAK,KAAK;AACxC,OAAK,YAAY,KAAK,UAAU,KAAK,KAAK;AAE1C,MAAI,eACF,MAAK,UAAU,eAAe,KAAK;;CAGvC,AAAO,SAAS,SAAyB;AACvC,OAAK,KAAK,IAAI,QAAQ;;CAExB,IAAW,QAAQ;AACjB,SAAO,KAAK,KAAK,KAAK;;CAExB,AAAO,MAAM;AACX,SAAO,KAAK;;CAEd,AAAO,UACL,cACc;AACd,SAAO,KAAK,KAAK,UAAUC,wBAAW,aAAa,CAAC;;;AAIxD,IAAa,gBAAb,MAGE;CAIA,YAAY,WAAkC;AAG5C,OAAK,OAAOD,wBACV,UACD;;CAEH,IAAW,QAAQ;AACjB,SAAO,KAAK,KAAK,KAAK;;CAExB,AAAO,MAAM;AACX,SAAO,KAAK;;CAEd,AAAO,UACL,cACc;AACd,SAAO,KAAK,KAAK,UAAUC,wBAAW,aAAa,CAAC;;;AAYxD,SAAgB,YACd,WACA,SACkD;AAClD,KAAI,OAAO,cAAc,WACvB,QAAO,IAAI,cAAc,UAAsC;AAEjE,KAAI,QACF,QAAO,IAAI,MAAM,WAA6B,QAAQ;AAExD,QAAO,IAAI,MAAM,UAAU"}