@fun-tools/store 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -18,89 +18,151 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
 
20
20
  // src/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ configStore: () => configStore,
23
24
  createStore: () => createStore,
24
25
  createStoreProvider: () => createStoreProvider
25
26
  });
26
- module.exports = __toCommonJS(index_exports);
27
+ module.exports = __toCommonJS(src_exports);
27
28
 
28
- // src/createStore/index.ts
29
+ // src/react/createStore.ts
29
30
  var import_react = require("react");
30
31
 
31
- // src/createStore/utils.ts
32
- function cookAutoBuildHandlers(states, cb) {
33
- const withCallback = (fun) => {
34
- return (...args) => {
35
- const val = fun(...args);
36
- cb();
32
+ // src/utils/functions/runAction.ts
33
+ function runAction(action, val) {
34
+ if (typeof action === "function") {
35
+ return action(val);
36
+ }
37
+ return action;
38
+ }
39
+
40
+ // src/core/configStore/cookAutoBuildHandlers/Handlers/array.handlers.ts
41
+ function arrayHandlers(getState, setState) {
42
+ if (!Array.isArray(getState())) return {};
43
+ return {
44
+ push: (val) => {
45
+ setState([...getState(), val]);
46
+ return val;
47
+ },
48
+ pop: () => {
49
+ const state = getState();
50
+ setState([...state.slice(0, -1)]);
51
+ return state[state.length - 1];
52
+ },
53
+ shift: () => {
54
+ const state = getState();
55
+ setState([...state.slice(1)]);
56
+ return state[0];
57
+ },
58
+ unShift: (val) => {
59
+ const state = getState();
60
+ setState([val, ...state]);
37
61
  return val;
38
- };
62
+ },
63
+ update: (index, val) => {
64
+ const state = getState();
65
+ const newState = [...state];
66
+ newState[index] = runAction(val, state[index]);
67
+ setState(newState);
68
+ return newState[index];
69
+ },
70
+ remove: (index) => {
71
+ const state = getState();
72
+ const removed = state[index];
73
+ const newState = state.filter((_, i) => i !== index);
74
+ setState([...newState]);
75
+ return removed;
76
+ }
39
77
  };
78
+ }
79
+
80
+ // src/core/configStore/cookAutoBuildHandlers/Handlers/bool.handlers.ts
81
+ function boolHandlers(getState, setState) {
82
+ if (typeof getState() !== "boolean") return {};
83
+ return {
84
+ toggle: () => {
85
+ const state = getState();
86
+ setState(!state);
87
+ return state;
88
+ }
89
+ };
90
+ }
91
+
92
+ // src/core/configStore/cookAutoBuildHandlers/Handlers/object.handler.ts
93
+ function objectHandlers(getState, setState) {
94
+ if (typeof getState() !== "object") return {};
95
+ return {
96
+ update: (_path, val) => {
97
+ const state = getState();
98
+ const path = _path.toString().split(".");
99
+ const fn = (obj, index = 0) => {
100
+ var _a;
101
+ if (path.length === index) {
102
+ return runAction(val, obj);
103
+ }
104
+ const key = path[index];
105
+ return {
106
+ ...obj,
107
+ [key]: fn((_a = obj == null ? void 0 : obj[key]) != null ? _a : {}, index + 1)
108
+ };
109
+ };
110
+ const newState = fn(state);
111
+ setState(newState);
112
+ return newState;
113
+ },
114
+ updateMany: (val) => {
115
+ const state = getState();
116
+ const fn = (target, source) => {
117
+ if (typeof source !== "object" || source === null) return source;
118
+ if (Array.isArray(source)) return source;
119
+ const result = { ...target };
120
+ for (const key in source) {
121
+ if (Object.prototype.hasOwnProperty.call(target, key)) {
122
+ result[key] = fn(target[key], source[key]);
123
+ }
124
+ }
125
+ return result;
126
+ };
127
+ const newState = fn(state, val);
128
+ setState(newState);
129
+ return newState;
130
+ }
131
+ };
132
+ }
133
+
134
+ // src/core/configStore/cookAutoBuildHandlers/index.ts
135
+ function cookAutoBuildHandlers(states, notify) {
40
136
  const defaultStates = JSON.parse(JSON.stringify(states));
41
137
  return Object.fromEntries(
42
138
  Object.entries(states).map(([key, val]) => {
139
+ const getState = () => states[key];
140
+ const setState = (newStates) => {
141
+ states[key] = newStates;
142
+ notify();
143
+ };
43
144
  const handlers = {
44
- set: withCallback((action) => {
45
- states[key] = typeof action === "function" ? action(states[key]) : action;
46
- }),
47
- reset: withCallback(() => {
48
- states[key] = defaultStates[key];
49
- }),
50
- ...Array.isArray(val) ? {
51
- push: withCallback((val2) => {
52
- states[key] = [...states[key], val2];
53
- }),
54
- pop: withCallback(() => {
55
- states[key] = states[key].slice(0, -1);
56
- }),
57
- shift: withCallback(() => {
58
- states[key] = states[key].slice(1);
59
- }),
60
- unshift: withCallback((val2) => {
61
- states[key] = [val2, ...states[key]];
62
- }),
63
- filter: withCallback((cb2) => {
64
- states[key] = states[key].filter(cb2);
65
- }),
66
- map: withCallback((cb2) => {
67
- states[key] = states[key].map(cb2);
68
- })
69
- } : val && typeof val === "object" ? {
70
- update: withCallback((_path, val2) => {
71
- let temp = states[key];
72
- const path = _path.split(".");
73
- const fn = (obj, index = 0) => {
74
- var _a;
75
- if (path.length === index) return val2;
76
- const key2 = path[index];
77
- return {
78
- ...obj,
79
- [key2]: fn((_a = obj == null ? void 0 : obj[key2]) != null ? _a : {}, index + 1)
80
- };
81
- };
82
- states[key] = fn(states[key]);
83
- }),
84
- updateMany: withCallback((val2) => {
85
- const fn = (target, source) => {
86
- if (typeof source !== "object" || source === null) return source;
87
- if (Array.isArray(source)) return source;
88
- const result = { ...target };
89
- for (const key2 in source) {
90
- if (Object.prototype.hasOwnProperty.call(target, key2)) {
91
- result[key2] = fn(target[key2], source[key2]);
92
- }
93
- }
94
- return result;
95
- };
96
- states[key] = fn(states[key], val2);
97
- })
98
- } : {}
145
+ set: (action) => {
146
+ setState(runAction(action, getState()));
147
+ },
148
+ reset: () => {
149
+ setState(defaultStates[key]);
150
+ },
151
+ ...Array.isArray(val) ? arrayHandlers(getState, setState) : typeof val === "object" ? objectHandlers(getState, setState) : typeof val === "boolean" ? boolHandlers(getState, setState) : {}
99
152
  };
100
153
  return [key, handlers];
101
154
  })
102
155
  );
103
156
  }
157
+
158
+ // src/utils/functions/mapObject.ts
159
+ function mapObject(obj, cb) {
160
+ return Object.fromEntries(
161
+ Object.entries(obj).map(([key, val]) => [key, cb(val)])
162
+ );
163
+ }
164
+
165
+ // src/utils/functions/shallowEqual.ts
104
166
  function shallowEqual(a, b) {
105
167
  if (a === b) return true;
106
168
  if (typeof a !== "object" || typeof b !== "object") return false;
@@ -115,31 +177,23 @@ function shallowEqual(a, b) {
115
177
  return true;
116
178
  }
117
179
 
118
- // src/createStore/index.ts
119
- function createStore({
180
+ // src/core/configStore/index.ts
181
+ function configStore({
120
182
  states,
121
183
  syncHandlers,
122
184
  asyncHandlers
123
185
  }) {
124
- const allHandlers = Object.freeze(
125
- Object.fromEntries([
126
- ...Object.entries(syncHandlers != null ? syncHandlers : {}).map(([key, cb]) => [
127
- key,
128
- (action) => {
129
- cb(states, action);
130
- notify();
131
- }
132
- ]),
133
- ...Object.entries(asyncHandlers != null ? asyncHandlers : {}).map(([key, cb]) => [
134
- key,
135
- async (action) => {
136
- await cb(states, action);
137
- notify();
138
- }
139
- ]),
140
- ...Object.entries(cookAutoBuildHandlers(states, notify))
141
- ])
142
- );
186
+ const handlers = Object.freeze({
187
+ ...mapObject(syncHandlers != null ? syncHandlers : {}, (handler) => (...args) => {
188
+ handler(states, ...args);
189
+ notify();
190
+ }),
191
+ ...mapObject(asyncHandlers != null ? asyncHandlers : {}, (handler) => async (...args) => {
192
+ await handler(states, ...args);
193
+ notify();
194
+ }),
195
+ ...cookAutoBuildHandlers(states, notify)
196
+ });
143
197
  const consumers = /* @__PURE__ */ new Set();
144
198
  function consume(consumer) {
145
199
  consumers.add(consumer);
@@ -158,6 +212,16 @@ function createStore({
158
212
  snapshotCache.set(selector, newSnapshot);
159
213
  return Object.freeze(newSnapshot);
160
214
  }
215
+ return {
216
+ handlers,
217
+ consume,
218
+ getSnapshot
219
+ };
220
+ }
221
+
222
+ // src/react/createStore.ts
223
+ function createStore(option) {
224
+ const { handlers, consume, getSnapshot } = configStore(option);
161
225
  function useStore(selector) {
162
226
  return (0, import_react.useSyncExternalStore)(
163
227
  consume,
@@ -165,16 +229,14 @@ function createStore({
165
229
  () => getSnapshot(selector)
166
230
  );
167
231
  }
168
- function useHandlers() {
169
- return allHandlers;
170
- }
232
+ const useHandlers = () => handlers;
171
233
  return {
172
234
  useStore,
173
235
  useHandlers
174
236
  };
175
237
  }
176
238
 
177
- // src/createStoreProvider/index.tsx
239
+ // src/react/createStoreProvider.tsx
178
240
  var import_react2 = require("react");
179
241
  var import_jsx_runtime = require("react/jsx-runtime");
180
242
  function createStoreProvider(props) {
@@ -204,6 +266,7 @@ function createStoreProvider(props) {
204
266
  }
205
267
  // Annotate the CommonJS export names for ESM import in node:
206
268
  0 && (module.exports = {
269
+ configStore,
207
270
  createStore,
208
271
  createStoreProvider
209
272
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/createStore/index.ts","../src/createStore/utils.ts","../src/createStoreProvider/index.tsx"],"sourcesContent":["export { default as createStore } from \"./createStore\";\r\nexport { default as createStoreProvider } from \"./createStoreProvider\";\r\n\r\nexport * from \"./createStore/types\";","import { useSyncExternalStore } from \"react\";\r\nimport { cookAutoBuildHandlers, shallowEqual } from \"./utils\";\r\nimport { \r\n AsyncHandler, CreateStoreContextProps, \r\n CreateStoreReturn, \r\n HandlerRecord, States, SyncHandler \r\n} from \"./types\";\r\n\r\n\r\n\r\nexport default function createStore<\r\n S extends States,\r\n SH extends Record<string, SyncHandler<S>> = Record<string, SyncHandler<S>>,\r\n AH extends Record<string, AsyncHandler<S>> = Record<string, AsyncHandler<S>>\r\n>({\r\n states, syncHandlers, asyncHandlers\r\n}: CreateStoreContextProps<S, SH, AH>): CreateStoreReturn<S, SH, AH> {\r\n\r\n const allHandlers: HandlerRecord<S, SH, AH> = Object.freeze(\r\n Object.fromEntries([\r\n ...Object.entries(syncHandlers ?? {}).map(([key, cb]) => [\r\n key, (action?: any) => {cb(states, action); notify();}\r\n ]),\r\n ...Object.entries(asyncHandlers ?? {}).map(([key, cb]) => [\r\n key, async (action?: any) => {await cb(states, action); notify();}\r\n ]),\r\n ...Object.entries(cookAutoBuildHandlers(states, notify))\r\n ])\r\n ) as HandlerRecord<S, SH, AH>\r\n\r\n\r\n const consumers = new Set<() => void>();\r\n\r\n \r\n function consume(consumer: () => void) {\r\n consumers.add(consumer);\r\n return () => consumers.delete(consumer);\r\n }\r\n\r\n\r\n function notify() {\r\n consumers.forEach(con => con());\r\n }\r\n\r\n\r\n const snapshotCache = new WeakMap<(state: S) => object, object>();\r\n\r\n\r\n function getSnapshot<T extends object>(selector: (state: S) => T): T {\r\n const newSnapshot = selector(states);\r\n const cachedSnapshot = snapshotCache.get(selector);\r\n\r\n if(cachedSnapshot && shallowEqual(newSnapshot, cachedSnapshot)) {\r\n return cachedSnapshot as T;\r\n }\r\n \r\n snapshotCache.set(selector, newSnapshot);\r\n return Object.freeze(newSnapshot);\r\n }\r\n \r\n \r\n function useStore<T extends object>(selector: (state: S) => T): T {\r\n return useSyncExternalStore(\r\n consume,\r\n () => getSnapshot(selector),\r\n () => getSnapshot(selector)\r\n )\r\n }\r\n\r\n\r\n function useHandlers(): HandlerRecord<S, SH, AH> {\r\n return allHandlers;\r\n }\r\n\r\n\r\n return {\r\n useStore,\r\n useHandlers\r\n }\r\n}","import { AutoBuildHandler, AutoBuildHandlerRecord, States } from \"./types\";\r\n\r\nexport function cookAutoBuildHandlers<S extends States>(states: S, cb: () => void): AutoBuildHandlerRecord<S> {\r\n\r\n const withCallback = <R>(fun: (...args: any[]) => R) => {\r\n return (...args: any[]): R => {\r\n const val = fun(...args);\r\n cb();\r\n return val;\r\n }\r\n }\r\n\r\n\r\n const defaultStates: S = JSON.parse(JSON.stringify(states));\r\n\r\n \r\n return Object.fromEntries(\r\n Object.entries(states).map(([key, val]: [keyof S, S[keyof S]]) => {\r\n const handlers: AutoBuildHandler<S[keyof S]> = {\r\n set: withCallback((action) => {\r\n states[key] = typeof action === 'function' ? action(states[key]) : action;\r\n }),\r\n\r\n reset: withCallback(() => {\r\n states[key] = defaultStates[key];\r\n }),\r\n \r\n ...(\r\n Array.isArray(val) ? {\r\n push: withCallback((val) => {\r\n states[key] = [...states[key], val] as S[keyof S]\r\n }),\r\n \r\n pop: withCallback(() => {\r\n states[key] = states[key].slice(0, -1)\r\n }),\r\n\r\n shift: withCallback(() => {\r\n states[key] = states[key].slice(1)\r\n }),\r\n \r\n unshift: withCallback((val) => {\r\n states[key] = [val, ...states[key]] as S[keyof S]\r\n }),\r\n\r\n filter: withCallback((cb) => {\r\n states[key] = states[key].filter(cb)\r\n }),\r\n\r\n map: withCallback((cb) => {\r\n states[key] = states[key].map(cb)\r\n })\r\n\r\n } : val && typeof val === \"object\" ? {\r\n update: withCallback((_path, val) => {\r\n let temp: any = states[key];\r\n const path = _path.split('.');\r\n\r\n const fn = (obj: any, index = 0): S[keyof S] => {\r\n if (path.length === index) return val;\r\n const key = path[index];\r\n\r\n return {\r\n ...obj,\r\n [key]: fn(obj?.[key] ?? {}, index + 1)\r\n };\r\n }\r\n\r\n states[key] = fn(states[key]);\r\n }),\r\n\r\n updateMany: withCallback((val) => {\r\n const fn = (target: any, source: any) => {\r\n if (typeof source !== \"object\" || source === null) return source;\r\n if (Array.isArray(source)) return source;\r\n\r\n const result = { ...target };\r\n\r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(target, key)) {\r\n result[key] = fn(target[key], source[key]);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n states[key] = fn(states[key], val);\r\n })\r\n } : {}\r\n )\r\n } as unknown as AutoBuildHandler<S[keyof S]>\r\n \r\n return [key, handlers]\r\n })\r\n ) as unknown as AutoBuildHandlerRecord<S>\r\n}\r\n\r\n\r\nexport function shallowEqual(a: any, b: any) {\r\n if(a === b) return true;\r\n \r\n if(typeof a !== 'object' || typeof b !== 'object') return false;\r\n\r\n if(Array.isArray(a) !== Array.isArray(b)) return false;\r\n\r\n const key1 = Object.keys(a);\r\n const key2 = Object.keys(b);\r\n\r\n if(key1.length !== key2.length) return false;\r\n\r\n for(let key of key1) {\r\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\r\n if (!Object.is(a[key], b[key])) return false;\r\n }\r\n\r\n return true;\r\n}","import React, { createContext, ReactNode, useContext, useRef } from \"react\";\r\nimport createStore from \"../createStore\";\r\nimport { AsyncHandler, CreateStoreContextProps, CreateStoreReturn, HandlerRecord, States, SyncHandler } from \"../createStore/types\";\r\n\r\n\r\n\r\nexport default function createStoreProvider<\r\n S extends States,\r\n SH extends Record<string, SyncHandler<S>> = Record<string, SyncHandler<S>>,\r\n AH extends Record<string, AsyncHandler<S>> = Record<string, AsyncHandler<S>>\r\n>(props: CreateStoreContextProps<S, SH, AH>) { \r\n\r\n const Context = createContext<CreateStoreReturn<S, SH, AH> | null>(null);\r\n \r\n function Provider({children}: {children: ReactNode}): React.JSX.Element {\r\n const store = useRef<CreateStoreReturn<S, SH, AH> | null>(null);\r\n\r\n if(!store.current) {\r\n store.current = createStore(props);\r\n }\r\n\r\n return (\r\n <Context.Provider value={store.current}>\r\n {children}\r\n </Context.Provider>\r\n )\r\n }\r\n\r\n \r\n function useStore<T extends object>(selector: (states: S) => T): T {\r\n const store = useContext(Context);\r\n if(!store) throw Error('Store Provider is missing !!');\r\n return store.useStore<T>(selector);\r\n }\r\n\r\n\r\n function useHandlers(): HandlerRecord<S, SH, AH> {\r\n const store = useContext(Context);\r\n if(!store) throw Error('Store Provider is missing !!');\r\n return store.useHandlers();\r\n }\r\n\r\n\r\n return {\r\n Provider,\r\n useStore,\r\n useHandlers\r\n } \r\n}"],"mappings":"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","names":["val","cb","key","import_react"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/react/createStore.ts","../src/utils/functions/runAction.ts","../src/core/configStore/cookAutoBuildHandlers/Handlers/array.handlers.ts","../src/core/configStore/cookAutoBuildHandlers/Handlers/bool.handlers.ts","../src/core/configStore/cookAutoBuildHandlers/Handlers/object.handler.ts","../src/core/configStore/cookAutoBuildHandlers/index.ts","../src/utils/functions/mapObject.ts","../src/utils/functions/shallowEqual.ts","../src/core/configStore/index.ts","../src/react/createStoreProvider.tsx"],"sourcesContent":["export * from './react';\r\nexport * from './core';","import { useSyncExternalStore } from \"react\";\r\nimport configStore from \"../core/configStore\";\r\nimport { ConfigStoreProps, GSH, GAH, States, UseHandlers } from \"../core/configStore/types\";\r\n\r\nexport default function createStore<\r\n S extends States, \r\n SH extends GSH<S> = GSH<S>, \r\n AH extends GAH<S> = GAH<S>\r\n>(option: ConfigStoreProps<S, SH, AH>) {\r\n const {handlers, consume, getSnapshot} = configStore<S, SH, AH>(option);\r\n\r\n function useStore<T>(selector: (state: S) => T): T {\r\n return useSyncExternalStore(\r\n consume,\r\n () => getSnapshot(selector),\r\n () => getSnapshot(selector)\r\n )\r\n }\r\n\r\n const useHandlers = (): UseHandlers<S, SH, AH> => handlers;\r\n\r\n return {\r\n useStore,\r\n useHandlers\r\n }\r\n}\r\n\r\nexport type CreateStore<S extends States, SH extends GSH<S> = GSH<S>, AH extends GAH<S> = GAH<S>> = ReturnType<typeof createStore<S, SH, AH>>","export type Action<T> = ((val: T) => T) | T;\r\n\r\nexport default function runAction<T>(action: Action<T>, val: T): T {\r\n if(typeof action === 'function') {\r\n return (action as (val: T) => T)(val);\r\n }\r\n\r\n return action;\r\n}","import runAction, { Action } from \"@/utils/functions/runAction\";\r\n\r\n\r\nexport type ArrayHandlers<S extends Array<any>, V = S extends Array<infer T> ? T : never> = S extends Array<V> ? {\r\n push: (val: V) => V;\r\n pop: () => V;\r\n shift: () => V;\r\n unShift: (val: V) => V;\r\n update: (index: number, val: Action<V>) => V;\r\n remove: (index: number) => V;\r\n} : {}\r\n\r\n\r\nexport default function arrayHandlers<S extends Array<any>, V = S extends Array<infer T> ? T : never>(\r\n getState: () => S, setState: (value: S) => void\r\n): ArrayHandlers<S, V> {\r\n\r\n if(!Array.isArray(getState())) return {} as ArrayHandlers<S, V>;\r\n\r\n return {\r\n push: (val: V) => {\r\n setState([...getState(), val] as S);\r\n return val;\r\n },\r\n\r\n pop: () => {\r\n const state = getState();\r\n setState([...state.slice(0, -1)] as S);\r\n return state[state.length - 1];\r\n },\r\n\r\n shift: () => {\r\n const state = getState();\r\n setState([...state.slice(1)] as S);\r\n return state[0];\r\n },\r\n\r\n unShift: (val: V) => {\r\n const state = getState();\r\n setState([val, ...state] as S);\r\n return val;\r\n },\r\n\r\n update: (index: number, val: Action<V>) => {\r\n const state = getState();\r\n const newState = [...state];\r\n newState[index] = runAction(val, state[index]);\r\n setState(newState as S);\r\n return newState[index];\r\n },\r\n\r\n remove: (index: number) => {\r\n const state = getState();\r\n const removed = state[index];\r\n const newState = state.filter((_, i) => i !== index);\r\n setState([...newState] as S);\r\n return removed;\r\n }\r\n }\r\n}","\r\n\r\nexport type BoolHandlers<S> = S extends boolean ? {\r\n toggle: () => boolean;\r\n} : {};\r\n\r\nexport default function boolHandlers<S extends boolean>(getState: () => S, setState: (value: S) => void): BoolHandlers<S> {\r\n\r\n if(typeof getState() !== 'boolean') return {} as BoolHandlers<S>;\r\n\r\n return {\r\n toggle: () => {\r\n const state = getState();\r\n setState(!state as S);\r\n\r\n return state;\r\n }\r\n }\r\n}\r\n","import { OBJECT_KEYS, OBJECT_VALUE, SUB_OBJECT } from \"@/utils/types/object.type\";\r\nimport runAction, { Action } from \"@/utils/functions/runAction\";\r\n\r\n\r\nexport type ObjectHandlers<S> = S extends object ? {\r\n update: <K extends OBJECT_KEYS<S>>(_path: K, val: Action<OBJECT_VALUE<S, K>>) => S;\r\n updateMany: (val: SUB_OBJECT<S>) => S;\r\n} : {};\r\n\r\nexport default function objectHandlers<S extends object>(getState: () => S, setState: (value: S) => void): ObjectHandlers<S> {\r\n\r\n if(typeof getState() !== 'object') return {} as ObjectHandlers<S>;\r\n\r\n return {\r\n update: <K extends OBJECT_KEYS<S>>(_path: K, val: Action<OBJECT_VALUE<S, K>>): S => {\r\n const state = getState();\r\n\r\n const path = _path.toString().split('.');\r\n\r\n const fn = (obj: any, index = 0): S | OBJECT_VALUE<S, K> => {\r\n if (path.length === index) {\r\n return runAction(val, obj);\r\n }\r\n const key = path[index];\r\n\r\n return {\r\n ...obj,\r\n [key]: fn(obj?.[key] ?? {}, index + 1)\r\n };\r\n }\r\n\r\n const newState = fn(state) as S;\r\n setState(newState);\r\n\r\n return newState\r\n },\r\n\r\n updateMany: (val: SUB_OBJECT<S>): S => {\r\n const state = getState();\r\n \r\n const fn = (target: any, source: any) => {\r\n if (typeof source !== \"object\" || source === null) return source;\r\n if (Array.isArray(source)) return source;\r\n\r\n const result = { ...target };\r\n\r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(target, key)) {\r\n result[key] = fn(target[key], source[key]);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n const newState = fn(state, val) as S;\r\n setState(newState);\r\n\r\n return newState;\r\n }\r\n } as ObjectHandlers<S>\r\n}","import runAction, { Action } from \"@/utils/functions/runAction\";\r\nimport arrayHandlers from \"./Handlers/array.handlers\";\r\nimport boolHandlers from \"./Handlers/bool.handlers\";\r\nimport objectHandlers from \"./Handlers/object.handler\";\r\n\r\nfunction cookAutoBuildHandlers<S extends Record<string, any>>(states: S, notify: () => void) {\r\n\r\n const defaultStates: S = JSON.parse(JSON.stringify(states));\r\n \r\n return Object.fromEntries(\r\n Object.entries(states).map(([key, val]: [keyof S, S[keyof S]]) => {\r\n\r\n const getState = () => states[key];\r\n\r\n const setState = (newStates: S[keyof S]) => {\r\n states[key] = newStates;\r\n notify();\r\n }\r\n\r\n const handlers = {\r\n set: (action: Action<typeof val>) => {\r\n setState(runAction(action, getState()));\r\n },\r\n\r\n reset: () => {\r\n setState(defaultStates[key]);\r\n },\r\n \r\n ...(\r\n Array.isArray(val) ? arrayHandlers(getState, setState)\r\n : typeof val === \"object\" ? objectHandlers(getState, setState)\r\n : typeof val === 'boolean' ? boolHandlers(getState, setState)\r\n : {}\r\n )\r\n }\r\n \r\n return [key, handlers]\r\n })\r\n )\r\n}\r\n\r\n\r\ntype CookAutoBuildHandlers<S extends Record<string, any>> = ReturnType<typeof cookAutoBuildHandlers<S>>\r\n\r\nexport {\r\n CookAutoBuildHandlers,\r\n cookAutoBuildHandlers as default\r\n}","\r\nexport default function mapObject<O extends object, R>(obj: O, cb: (val: any) => R) {\r\n return Object.fromEntries(\r\n Object.entries(obj).map(([key, val]) => (\r\n [key, cb(val)]\r\n ))\r\n ) as { [K in keyof O]: R };\r\n}","export default function shallowEqual(a: any, b: any) {\r\n if(a === b) return true;\r\n \r\n if(typeof a !== 'object' || typeof b !== 'object') return false;\r\n\r\n if(Array.isArray(a) !== Array.isArray(b)) return false;\r\n\r\n const key1 = Object.keys(a);\r\n const key2 = Object.keys(b);\r\n\r\n if(key1.length !== key2.length) return false;\r\n\r\n for(let key of key1) {\r\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\r\n if (!Object.is(a[key], b[key])) return false;\r\n }\r\n\r\n return true;\r\n}","import cookAutoBuildHandlers from \"./cookAutoBuildHandlers\";\r\nimport mapObject from \"@/utils/functions/mapObject\";\r\nimport shallowEqual from \"@/utils/functions/shallowEqual\";\r\nimport { \r\n ConfigStoreProps, GAH, GSH, States,\r\n UseHandlers, \r\n} from \"./types\";\r\n\r\n\r\n\r\nexport default function configStore<\r\n S extends States, \r\n SH extends GSH<S> = GSH<S>,\r\n AH extends GAH<S> = GAH<S>\r\n>({\r\n states, syncHandlers, asyncHandlers\r\n}: ConfigStoreProps<S, SH, AH>) {\r\n\r\n \r\n const handlers = Object.freeze({\r\n ...mapObject(syncHandlers ?? {}, (handler: any) => (...args: any[]) => { handler(states, ...args); notify(); }),\r\n ...mapObject(asyncHandlers ?? {}, (handler: any) => async (...args: any[]) => { await handler(states, ...args); notify(); }),\r\n ...cookAutoBuildHandlers(states, notify),\r\n }) as UseHandlers<S, SH, AH>;\r\n\r\n\r\n const consumers = new Set<() => void>();\r\n\r\n \r\n function consume(consumer: () => void) {\r\n consumers.add(consumer);\r\n return () => consumers.delete(consumer);\r\n }\r\n\r\n\r\n function notify() {\r\n consumers.forEach(con => con());\r\n }\r\n\r\n\r\n const snapshotCache = new WeakMap<(state: S) => any, any>();\r\n\r\n\r\n function getSnapshot<T>(selector: (state: S) => T): T {\r\n const newSnapshot = selector(states);\r\n const cachedSnapshot = snapshotCache.get(selector);\r\n\r\n if(cachedSnapshot && shallowEqual(newSnapshot, cachedSnapshot)) {\r\n return cachedSnapshot as T;\r\n }\r\n \r\n snapshotCache.set(selector, newSnapshot);\r\n return Object.freeze(newSnapshot);\r\n }\r\n\r\n\r\n return {\r\n handlers,\r\n consume,\r\n getSnapshot\r\n }\r\n}","import React, { createContext, ReactNode, useContext, useRef } from \"react\";\r\nimport { ConfigStoreProps, GSH, GAH, UseHandlers } from \"../core/configStore/types\";\r\nimport createStore, { CreateStore } from \"./createStore\";\r\n\r\n\r\n\r\nexport default function createStoreProvider<\r\n S extends Record<string, any>, \r\n SH extends GSH<S> = GSH<S>, \r\n AH extends GAH<S> = GAH<S>\r\n>(props: ConfigStoreProps<S, SH, AH>) { \r\n\r\n const Context = createContext<CreateStore<S, SH, AH> | null>(null);\r\n \r\n function Provider({children}: {children: ReactNode}): React.JSX.Element {\r\n const store = useRef<CreateStore<S, SH, AH> | null>(null);\r\n\r\n if(!store.current) {\r\n store.current = createStore(props);\r\n }\r\n\r\n return (\r\n <Context.Provider value={store.current}>\r\n {children}\r\n </Context.Provider>\r\n )\r\n }\r\n\r\n \r\n function useStore<T>(selector: (states: S) => T): T {\r\n const store = useContext(Context);\r\n if(!store) throw Error('Store Provider is missing !!');\r\n return store.useStore(selector);\r\n }\r\n\r\n\r\n function useHandlers(): UseHandlers<S, SH, AH> {\r\n const store = useContext(Context);\r\n if(!store) throw Error('Store Provider is missing !!');\r\n return store.useHandlers();\r\n }\r\n\r\n\r\n return {\r\n Provider,\r\n useStore,\r\n useHandlers\r\n } \r\n}\r\n\r\n\r\nexport type CreateStoreProvider<S extends Record<string, any>> = ReturnType<typeof createStoreProvider<S>>"],"mappings":"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","names":["import_react"]}
package/dist/index.d.cts CHANGED
@@ -1,63 +1,72 @@
1
1
  import React, { ReactNode } from 'react';
2
2
 
3
+ type Action<T> = ((val: T) => T) | T;
4
+
5
+ type ArrayHandlers<S extends Array<any>, V = S extends Array<infer T> ? T : never> = S extends Array<V> ? {
6
+ push: (val: V) => V;
7
+ pop: () => V;
8
+ shift: () => V;
9
+ unShift: (val: V) => V;
10
+ update: (index: number, val: Action<V>) => V;
11
+ remove: (index: number) => V;
12
+ } : {};
13
+
14
+ type BoolHandlers<S> = S extends boolean ? {
15
+ toggle: () => boolean;
16
+ } : {};
17
+
3
18
  type OBJECT_KEYS<T extends object> = {
4
19
  [K in keyof T]: K extends string | number ? T[K] extends object ? K | `${K}.${OBJECT_KEYS<T[K]>}` : K : never;
5
20
  }[keyof T];
6
21
  type OBJECT_VALUE<O extends Record<string, any>, P extends string | number> = (P extends `${infer K}.${infer P}` ? K extends keyof O ? OBJECT_VALUE<O[K], P> : never : P extends keyof O ? O[P] : never);
22
+ type SUB_OBJECT<O extends Record<string, any>> = {
23
+ [K in keyof O]?: O[K] extends Record<string, any> ? SUB_OBJECT<O[K]> : O[K];
24
+ };
25
+
26
+ type ObjectHandlers<S> = S extends object ? {
27
+ update: <K extends OBJECT_KEYS<S>>(_path: K, val: Action<OBJECT_VALUE<S, K>>) => S;
28
+ updateMany: (val: SUB_OBJECT<S>) => S;
29
+ } : {};
7
30
 
8
31
  type States = Record<string, any>;
9
- type Action<T> = T | ((val: T) => T);
10
- type Handler<S, V> = (V extends (state: S) => infer R ? ((state: S) => R) : V extends (state: S, action: infer A) => infer R ? ((state: S, action: A) => R) : never);
11
- type SyncHandler<S> = Handler<S, (state: S, action: any) => any>;
12
- type AsyncHandler<S> = Handler<S, (state: S, action: any) => Promise<any>>;
13
- type SyncHandlerRecord<S, SH extends Record<string, SyncHandler<S>> = Record<string, SyncHandler<S>>> = {
14
- [K in keyof SH]: Handler<S, SH[K]>;
15
- };
16
- type AsyncHandlerRecord<S, AH extends Record<string, AsyncHandler<S>> = Record<string, AsyncHandler<S>>> = {
17
- [K in keyof AH]: Handler<S, AH[K]>;
18
- };
19
- type CreateStoreContextProps<S extends States, SH extends Record<string, SyncHandler<S>> = Record<string, SyncHandler<S>>, AH extends Record<string, AsyncHandler<S>> = Record<string, AsyncHandler<S>>> = {
32
+ type ConfigStoreProps<S extends States, SH extends GSH<S> = GSH<S>, AH extends GAH<S> = GAH<S>> = {
20
33
  states: S;
21
34
  syncHandlers?: SH;
22
35
  asyncHandlers?: AH;
23
36
  };
24
- type AutoBuildHandler<V> = {
25
- set: (cb: Action<V>) => void;
26
- reset: () => void;
27
- } & (V extends Array<infer T> ? {
28
- push: (val: T) => void;
29
- pop: () => T | null;
30
- shift: () => T | null;
31
- unshift: (val: T) => void;
32
- filter: (cb: (item: T) => boolean) => void;
33
- map: (cb: (item: T) => T) => void;
34
- } : V extends States ? {
35
- update: (key: OBJECT_KEYS<V>, val: OBJECT_VALUE<V, OBJECT_KEYS<V>>) => void;
36
- updateMany: (val: Partial<V>) => void;
37
- } : {});
38
- type AutoBuildHandlerRecord<S extends States> = {
39
- [K in keyof S]: AutoBuildHandler<S[K]>;
40
- };
41
- type ExtractActionType<T> = T extends (state: States, action: infer A) => void ? A : never;
42
- type ReturnHandlers<S, V> = (V extends (state: S) => infer R ? (() => R) : V extends (state: S, action: infer A) => infer R ? ((action: A) => R) : never);
43
- type HandlerRecord<S extends States, SH extends Record<string, SyncHandler<S>> = Record<string, SyncHandler<S>>, AH extends Record<string, AsyncHandler<S>> = Record<string, AsyncHandler<S>>> = AutoBuildHandlerRecord<S> & {
44
- [K in keyof SH]: ReturnHandlers<S, SH[K]>;
45
- } & {
46
- [K in keyof AH]: ReturnHandlers<S, AH[K]>;
37
+ type CookedHandler<S, V> = (V extends (first: any, ...args: infer A) => infer R ? ((...args: A) => R) : never);
38
+ type GSH<S> = Record<string, (states: S, ...args: any[]) => any>;
39
+ type GAH<S> = Record<string, (states: S, ...args: any[]) => Promise<any>>;
40
+ type SyncHandlerRecord<S extends States, H extends GSH<S>> = {
41
+ [K in keyof H]: CookedHandler<S, H[K]>;
47
42
  };
48
- type CreateStoreReturn<S extends States = States, SH extends Record<string, SyncHandler<S>> = Record<string, SyncHandler<S>>, AH extends Record<string, AsyncHandler<S>> = Record<string, AsyncHandler<S>>> = {
49
- useStore: <T extends object>(selector: (state: S) => T) => T;
50
- useHandlers: () => HandlerRecord<S, SH, AH>;
43
+ type AsyncHandlerRecord<S extends States, H extends GAH<S>> = {
44
+ [K in keyof H]: CookedHandler<S, H[K]>;
51
45
  };
46
+ type UseHandlers<S extends States, SH extends GSH<S> = GSH<S>, AH extends GAH<S> = GAH<S>> = (SyncHandlerRecord<S, SH> & AsyncHandlerRecord<S, AH> & ({
47
+ [K in keyof S]: {
48
+ set: (action: Action<S[K]>) => void;
49
+ reset: () => void;
50
+ } & (S[K] extends Array<infer T> ? (ArrayHandlers<S[K], T>) : S[K] extends object ? (ObjectHandlers<S[K]>) : S[K] extends boolean ? (BoolHandlers<S[K]>) : {});
51
+ }));
52
52
 
53
- declare function createStore<S extends States, SH extends Record<string, SyncHandler<S>> = Record<string, SyncHandler<S>>, AH extends Record<string, AsyncHandler<S>> = Record<string, AsyncHandler<S>>>({ states, syncHandlers, asyncHandlers }: CreateStoreContextProps<S, SH, AH>): CreateStoreReturn<S, SH, AH>;
53
+ declare function createStore<S extends States, SH extends GSH<S> = GSH<S>, AH extends GAH<S> = GAH<S>>(option: ConfigStoreProps<S, SH, AH>): {
54
+ useStore: <T>(selector: (state: S) => T) => T;
55
+ useHandlers: () => UseHandlers<S, SH, AH>;
56
+ };
54
57
 
55
- declare function createStoreProvider<S extends States, SH extends Record<string, SyncHandler<S>> = Record<string, SyncHandler<S>>, AH extends Record<string, AsyncHandler<S>> = Record<string, AsyncHandler<S>>>(props: CreateStoreContextProps<S, SH, AH>): {
58
+ declare function createStoreProvider<S extends Record<string, any>, SH extends GSH<S> = GSH<S>, AH extends GAH<S> = GAH<S>>(props: ConfigStoreProps<S, SH, AH>): {
56
59
  Provider: ({ children }: {
57
60
  children: ReactNode;
58
61
  }) => React.JSX.Element;
59
- useStore: <T extends object>(selector: (states: S) => T) => T;
60
- useHandlers: () => HandlerRecord<S, SH, AH>;
62
+ useStore: <T>(selector: (states: S) => T) => T;
63
+ useHandlers: () => UseHandlers<S, SH, AH>;
64
+ };
65
+
66
+ declare function configStore<S extends States, SH extends GSH<S> = GSH<S>, AH extends GAH<S> = GAH<S>>({ states, syncHandlers, asyncHandlers }: ConfigStoreProps<S, SH, AH>): {
67
+ handlers: UseHandlers<S, SH, AH>;
68
+ consume: (consumer: () => void) => () => boolean;
69
+ getSnapshot: <T>(selector: (state: S) => T) => T;
61
70
  };
62
71
 
63
- export { type Action, type AsyncHandler, type AsyncHandlerRecord, type AutoBuildHandler, type AutoBuildHandlerRecord, type CreateStoreContextProps, type CreateStoreReturn, type ExtractActionType, type Handler, type HandlerRecord, type States, type SyncHandler, type SyncHandlerRecord, createStore, createStoreProvider };
72
+ export { configStore, createStore, createStoreProvider };
package/dist/index.d.ts CHANGED
@@ -1,63 +1,72 @@
1
1
  import React, { ReactNode } from 'react';
2
2
 
3
+ type Action<T> = ((val: T) => T) | T;
4
+
5
+ type ArrayHandlers<S extends Array<any>, V = S extends Array<infer T> ? T : never> = S extends Array<V> ? {
6
+ push: (val: V) => V;
7
+ pop: () => V;
8
+ shift: () => V;
9
+ unShift: (val: V) => V;
10
+ update: (index: number, val: Action<V>) => V;
11
+ remove: (index: number) => V;
12
+ } : {};
13
+
14
+ type BoolHandlers<S> = S extends boolean ? {
15
+ toggle: () => boolean;
16
+ } : {};
17
+
3
18
  type OBJECT_KEYS<T extends object> = {
4
19
  [K in keyof T]: K extends string | number ? T[K] extends object ? K | `${K}.${OBJECT_KEYS<T[K]>}` : K : never;
5
20
  }[keyof T];
6
21
  type OBJECT_VALUE<O extends Record<string, any>, P extends string | number> = (P extends `${infer K}.${infer P}` ? K extends keyof O ? OBJECT_VALUE<O[K], P> : never : P extends keyof O ? O[P] : never);
22
+ type SUB_OBJECT<O extends Record<string, any>> = {
23
+ [K in keyof O]?: O[K] extends Record<string, any> ? SUB_OBJECT<O[K]> : O[K];
24
+ };
25
+
26
+ type ObjectHandlers<S> = S extends object ? {
27
+ update: <K extends OBJECT_KEYS<S>>(_path: K, val: Action<OBJECT_VALUE<S, K>>) => S;
28
+ updateMany: (val: SUB_OBJECT<S>) => S;
29
+ } : {};
7
30
 
8
31
  type States = Record<string, any>;
9
- type Action<T> = T | ((val: T) => T);
10
- type Handler<S, V> = (V extends (state: S) => infer R ? ((state: S) => R) : V extends (state: S, action: infer A) => infer R ? ((state: S, action: A) => R) : never);
11
- type SyncHandler<S> = Handler<S, (state: S, action: any) => any>;
12
- type AsyncHandler<S> = Handler<S, (state: S, action: any) => Promise<any>>;
13
- type SyncHandlerRecord<S, SH extends Record<string, SyncHandler<S>> = Record<string, SyncHandler<S>>> = {
14
- [K in keyof SH]: Handler<S, SH[K]>;
15
- };
16
- type AsyncHandlerRecord<S, AH extends Record<string, AsyncHandler<S>> = Record<string, AsyncHandler<S>>> = {
17
- [K in keyof AH]: Handler<S, AH[K]>;
18
- };
19
- type CreateStoreContextProps<S extends States, SH extends Record<string, SyncHandler<S>> = Record<string, SyncHandler<S>>, AH extends Record<string, AsyncHandler<S>> = Record<string, AsyncHandler<S>>> = {
32
+ type ConfigStoreProps<S extends States, SH extends GSH<S> = GSH<S>, AH extends GAH<S> = GAH<S>> = {
20
33
  states: S;
21
34
  syncHandlers?: SH;
22
35
  asyncHandlers?: AH;
23
36
  };
24
- type AutoBuildHandler<V> = {
25
- set: (cb: Action<V>) => void;
26
- reset: () => void;
27
- } & (V extends Array<infer T> ? {
28
- push: (val: T) => void;
29
- pop: () => T | null;
30
- shift: () => T | null;
31
- unshift: (val: T) => void;
32
- filter: (cb: (item: T) => boolean) => void;
33
- map: (cb: (item: T) => T) => void;
34
- } : V extends States ? {
35
- update: (key: OBJECT_KEYS<V>, val: OBJECT_VALUE<V, OBJECT_KEYS<V>>) => void;
36
- updateMany: (val: Partial<V>) => void;
37
- } : {});
38
- type AutoBuildHandlerRecord<S extends States> = {
39
- [K in keyof S]: AutoBuildHandler<S[K]>;
40
- };
41
- type ExtractActionType<T> = T extends (state: States, action: infer A) => void ? A : never;
42
- type ReturnHandlers<S, V> = (V extends (state: S) => infer R ? (() => R) : V extends (state: S, action: infer A) => infer R ? ((action: A) => R) : never);
43
- type HandlerRecord<S extends States, SH extends Record<string, SyncHandler<S>> = Record<string, SyncHandler<S>>, AH extends Record<string, AsyncHandler<S>> = Record<string, AsyncHandler<S>>> = AutoBuildHandlerRecord<S> & {
44
- [K in keyof SH]: ReturnHandlers<S, SH[K]>;
45
- } & {
46
- [K in keyof AH]: ReturnHandlers<S, AH[K]>;
37
+ type CookedHandler<S, V> = (V extends (first: any, ...args: infer A) => infer R ? ((...args: A) => R) : never);
38
+ type GSH<S> = Record<string, (states: S, ...args: any[]) => any>;
39
+ type GAH<S> = Record<string, (states: S, ...args: any[]) => Promise<any>>;
40
+ type SyncHandlerRecord<S extends States, H extends GSH<S>> = {
41
+ [K in keyof H]: CookedHandler<S, H[K]>;
47
42
  };
48
- type CreateStoreReturn<S extends States = States, SH extends Record<string, SyncHandler<S>> = Record<string, SyncHandler<S>>, AH extends Record<string, AsyncHandler<S>> = Record<string, AsyncHandler<S>>> = {
49
- useStore: <T extends object>(selector: (state: S) => T) => T;
50
- useHandlers: () => HandlerRecord<S, SH, AH>;
43
+ type AsyncHandlerRecord<S extends States, H extends GAH<S>> = {
44
+ [K in keyof H]: CookedHandler<S, H[K]>;
51
45
  };
46
+ type UseHandlers<S extends States, SH extends GSH<S> = GSH<S>, AH extends GAH<S> = GAH<S>> = (SyncHandlerRecord<S, SH> & AsyncHandlerRecord<S, AH> & ({
47
+ [K in keyof S]: {
48
+ set: (action: Action<S[K]>) => void;
49
+ reset: () => void;
50
+ } & (S[K] extends Array<infer T> ? (ArrayHandlers<S[K], T>) : S[K] extends object ? (ObjectHandlers<S[K]>) : S[K] extends boolean ? (BoolHandlers<S[K]>) : {});
51
+ }));
52
52
 
53
- declare function createStore<S extends States, SH extends Record<string, SyncHandler<S>> = Record<string, SyncHandler<S>>, AH extends Record<string, AsyncHandler<S>> = Record<string, AsyncHandler<S>>>({ states, syncHandlers, asyncHandlers }: CreateStoreContextProps<S, SH, AH>): CreateStoreReturn<S, SH, AH>;
53
+ declare function createStore<S extends States, SH extends GSH<S> = GSH<S>, AH extends GAH<S> = GAH<S>>(option: ConfigStoreProps<S, SH, AH>): {
54
+ useStore: <T>(selector: (state: S) => T) => T;
55
+ useHandlers: () => UseHandlers<S, SH, AH>;
56
+ };
54
57
 
55
- declare function createStoreProvider<S extends States, SH extends Record<string, SyncHandler<S>> = Record<string, SyncHandler<S>>, AH extends Record<string, AsyncHandler<S>> = Record<string, AsyncHandler<S>>>(props: CreateStoreContextProps<S, SH, AH>): {
58
+ declare function createStoreProvider<S extends Record<string, any>, SH extends GSH<S> = GSH<S>, AH extends GAH<S> = GAH<S>>(props: ConfigStoreProps<S, SH, AH>): {
56
59
  Provider: ({ children }: {
57
60
  children: ReactNode;
58
61
  }) => React.JSX.Element;
59
- useStore: <T extends object>(selector: (states: S) => T) => T;
60
- useHandlers: () => HandlerRecord<S, SH, AH>;
62
+ useStore: <T>(selector: (states: S) => T) => T;
63
+ useHandlers: () => UseHandlers<S, SH, AH>;
64
+ };
65
+
66
+ declare function configStore<S extends States, SH extends GSH<S> = GSH<S>, AH extends GAH<S> = GAH<S>>({ states, syncHandlers, asyncHandlers }: ConfigStoreProps<S, SH, AH>): {
67
+ handlers: UseHandlers<S, SH, AH>;
68
+ consume: (consumer: () => void) => () => boolean;
69
+ getSnapshot: <T>(selector: (state: S) => T) => T;
61
70
  };
62
71
 
63
- export { type Action, type AsyncHandler, type AsyncHandlerRecord, type AutoBuildHandler, type AutoBuildHandlerRecord, type CreateStoreContextProps, type CreateStoreReturn, type ExtractActionType, type Handler, type HandlerRecord, type States, type SyncHandler, type SyncHandlerRecord, createStore, createStoreProvider };
72
+ export { configStore, createStore, createStoreProvider };