UNPKG

neant

Version:

The simplest React state management library - direct mutations, direct destructuring, automatic fine-grained reactivity

1 lines 4.54 kB
{"version":3,"sources":["../src/store.ts","../src/index.ts"],"sourcesContent":["\nimport { Draft, produce } from \"immer\";\nimport { useDebugValue, useSyncExternalStore } from \"react\";\n\nexport type StateCreator<T> = (\n setState: (updater: ProduceParam<T>) => void,\n getState: () => T\n) => T;\n\ntype ExtractState<S> = S extends { getState: () => infer T } ? T : never;\n\nexport type UseBoundStore<S> = {\n (): ExtractState<S>;\n <U>(selector: (state: ExtractState<S>) => U): U;\n} & S;\n\nexport const create = <T>(createState: StateCreator<T>) => {\n const api = createStore(createState);\n\n const useBoundStore = (selector: any) => {\n const slice = useSyncExternalStore(\n api.subscribe,\n () => selector(api.getState()),\n () => selector(api.getState())\n );\n useDebugValue(slice);\n return slice;\n };\n\n Object.assign(useBoundStore, api);\n\n return useBoundStore as UseBoundStore<typeof api>;\n};\n\nexport interface StoreApi<T> {\n setState: (updater: ProduceParam<T>) => void;\n getState: () => T;\n subscribe: (listener: (state: T, prevState: T) => void) => () => void;\n}\n\ntype ProduceParam<T> = ((draft: Draft<T>) => void);\n\nexport const createStore = <T>(createState: StateCreator<T>): StoreApi<T> => {\n type TState = ReturnType<typeof createState>;\n type Listener = (state: TState, prevState: TState) => void;\n let state: TState;\n const listeners: Set<Listener> = new Set();\n\n const setState: StoreApi<TState>[\"setState\"] = (updater: ProduceParam<TState>) => {\n const nextState = produce(state, updater);\n const previousState = state;\n state = nextState;\n\n listeners.forEach((listener) => listener(state, previousState));\n };\n\n const getState: StoreApi<TState>[\"getState\"] = () => state;\n\n const subscribe: StoreApi<TState>[\"subscribe\"] = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n\n const api = { setState, getState, subscribe };\n state = createState(setState, getState);\n\n return api;\n};\n","import { create, StateCreator } from './store';\n\ntype WithDirectStateAccess<S> = S extends { getState: () => infer T }\n ? S & { use: { [K in keyof T]: () => T[K] } }\n : never;\n\nexport function createEnhancedStore<T>(\n createState: StateCreator<T>\n) {\n const store = create(createState);\n const state = store.getState() as object;\n\n const useModel = Object.keys(state).reduce((total, key) => {\n Object.defineProperty(total, key, {\n get() {\n return store((s) => s[key as keyof T]);\n },\n enumerable: true,\n });\n return total;\n }, {} as { [K in keyof T]: () => T[K] });\n\n (store as any).use = useModel;\n\n return store as WithDirectStateAccess<typeof store>;\n}\n\nexport type StoreType<T> = ReturnType<typeof createEnhancedStore<T>>;\nexport type StoreState<T> = ReturnType<StoreType<T>['getState']>;\n\nexport function createStore<T extends object>(\n createState: StateCreator<T>\n) {\n const store = createEnhancedStore(createState);\n\n function useAppStore(): T {\n return store.use as T;\n }\n\n return {\n useAppStore,\n subscribe: store.subscribe,\n getState: store.getState,\n setState: store.setState,\n }\n}"],"mappings":";;;AACA,SAAgB,eAAe;AAC/B,SAAS,eAAe,4BAA4B;AAc7C,IAAM,SAAS,CAAI,gBAAiC;AACzD,QAAM,MAAM,YAAY,WAAW;AAEnC,QAAM,gBAAgB,CAAC,aAAkB;AACvC,UAAM,QAAQ;AAAA,MACZ,IAAI;AAAA,MACJ,MAAM,SAAS,IAAI,SAAS,CAAC;AAAA,MAC7B,MAAM,SAAS,IAAI,SAAS,CAAC;AAAA,IAC/B;AACA,kBAAc,KAAK;AACnB,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,eAAe,GAAG;AAEhC,SAAO;AACT;AAUO,IAAM,cAAc,CAAI,gBAA8C;AAG3E,MAAI;AACJ,QAAM,YAA2B,oBAAI,IAAI;AAEzC,QAAM,WAAyC,CAAC,YAAkC;AAChF,UAAM,YAAY,QAAQ,OAAO,OAAO;AACxC,UAAM,gBAAgB;AACtB,YAAQ;AAER,cAAU,QAAQ,CAAC,aAAa,SAAS,OAAO,aAAa,CAAC;AAAA,EAChE;AAEA,QAAM,WAAyC,MAAM;AAErD,QAAM,YAA2C,CAAC,aAAa;AAC7D,cAAU,IAAI,QAAQ;AACtB,WAAO,MAAM,UAAU,OAAO,QAAQ;AAAA,EACxC;AAEA,QAAM,MAAM,EAAE,UAAU,UAAU,UAAU;AAC5C,UAAQ,YAAY,UAAU,QAAQ;AAEtC,SAAO;AACT;;;AC7DO,SAAS,oBACd,aACA;AACA,QAAM,QAAQ,OAAO,WAAW;AAChC,QAAM,QAAQ,MAAM,SAAS;AAE7B,QAAM,WAAW,OAAO,KAAK,KAAK,EAAE,OAAO,CAAC,OAAO,QAAQ;AACzD,WAAO,eAAe,OAAO,KAAK;AAAA,MAChC,MAAM;AACJ,eAAO,MAAM,CAAC,MAAM,EAAE,GAAc,CAAC;AAAA,MACvC;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,CAAmC;AAEvC,EAAC,MAAc,MAAM;AAErB,SAAO;AACT;AAKO,SAASA,aACd,aACA;AACA,QAAM,QAAQ,oBAAoB,WAAW;AAE7C,WAAS,cAAiB;AACxB,WAAO,MAAM;AAAA,EACf;AAEA,SAAO;AAAA,IACL;AAAA,IACA,WAAW,MAAM;AAAA,IACjB,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,EAClB;AACF;","names":["createStore"]}