zustand-di
Version:
dependency injection for zustand with react context
1 lines • 2.03 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n createElement,\n createContext as reactCreateContext,\n useContext,\n useRef,\n} from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport { useStoreWithEqualityFn } from \"zustand/traditional\";\n\n// Inspired from: https://github.com/pmndrs/zustand/blob/main/src/context.ts\nexport const createContext = <\n State,\n Store extends StoreApi<State> = StoreApi<State>\n>() => {\n const StoreContext = reactCreateContext<Store | undefined>(undefined);\n\n type Provider = React.FC<\n {\n createStore: () => Store;\n children: React.ReactNode;\n } & Record<string, unknown>\n >;\n\n const Provider: Provider = ({ createStore, ...rest }) => {\n const storeRef = useRef<Store>();\n return createElement(StoreContext.Provider, {\n value: (storeRef.current ||= createStore()),\n ...rest,\n });\n };\n\n const useStore = <StateSlice = ExtractState<Store>>(\n selector: (state: ExtractState<Store>) => StateSlice,\n equalityFn?: (left: StateSlice, right: StateSlice) => boolean\n ) => {\n const store = useContext(StoreContext);\n if (store) {\n return useStoreWithEqualityFn(store, selector, equalityFn);\n }\n throw new Error(\n \"Seems like you have not used zustand provider as an ancestor.\"\n );\n };\n\n return [Provider, useStore] as const;\n};\n\ntype ExtractState<Store> = Store extends { getState: () => infer T }\n ? T\n : never;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKO;AAEP,yBAAuC;AAGhC,IAAM,gBAAgB,MAGtB;AACL,QAAM,mBAAe,aAAAA,eAAsC,MAAS;AASpE,QAAM,WAAqB,CAAC,EAAE,aAAa,GAAG,KAAK,MAAM;AACvD,UAAM,eAAW,qBAAc;AAC/B,eAAO,4BAAc,aAAa,UAAU;AAAA,MAC1C,OAAQ,SAAS,YAAY,YAAY;AAAA,MACzC,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,CACf,UACA,eACG;AACH,UAAM,YAAQ,yBAAW,YAAY;AACrC,QAAI,OAAO;AACT,iBAAO,2CAAuB,OAAO,UAAU,UAAU;AAAA,IAC3D;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,UAAU,QAAQ;AAC5B;","names":["reactCreateContext"]}