zustic 1.0.0 → 1.0.1

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.d.mts CHANGED
@@ -1,3 +1,7 @@
1
+ type CreateParamsType<T> = (set: (partial: Partial<T> | ((state: T) => Partial<T>)) => void, get: () => T) => T;
2
+ type SetSateParams<T> = Partial<T> | ((state: T) => Partial<T>);
3
+ type Middleware<T> = (set: (partial: SetSateParams<T>) => void, get: () => T) => (next: (partial: SetSateParams<T>) => void) => (partial: SetSateParams<T>) => void;
4
+
1
5
  /**
2
6
  * Create a store with state and actions.
3
7
  *
@@ -13,7 +17,7 @@
13
17
  * count: 1,
14
18
  * inc: () => set((state) => ({ count: state.count + 1 })),
15
19
  * dec: () => set((state) => ({ count: state.count - 1 })),
16
- * })));
20
+ * }));
17
21
  *
18
22
  * // In a React component:
19
23
  * const Counter = () => {
@@ -28,9 +32,19 @@
28
32
  * }
29
33
  * ```
30
34
  *
35
+ * Example of Middleware
36
+ * ```
37
+ * const logger = <T extends object>(): Middleware<T> => (set, get) => (next) => async (partial) => {
38
+ * console.log('prev:', get());
39
+ * await next(partial);
40
+ * console.log('next:', get());
41
+ * };
42
+ *
43
+ * ```
44
+ *
31
45
  * @param initializer Function that receives `set` and returns the initial state object.
32
46
  * @returns A hook that provides access to the store state and actions.
33
47
  */
34
- declare function create<T extends object>(initializer: (set: (partial: Partial<T> | ((state: T) => Partial<T>)) => void) => T): () => T;
48
+ declare function create<T extends object>(initializer: CreateParamsType<T>, middlewares?: Middleware<T>[]): () => T;
35
49
 
36
- export { create };
50
+ export { type Middleware, create };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,7 @@
1
+ type CreateParamsType<T> = (set: (partial: Partial<T> | ((state: T) => Partial<T>)) => void, get: () => T) => T;
2
+ type SetSateParams<T> = Partial<T> | ((state: T) => Partial<T>);
3
+ type Middleware<T> = (set: (partial: SetSateParams<T>) => void, get: () => T) => (next: (partial: SetSateParams<T>) => void) => (partial: SetSateParams<T>) => void;
4
+
1
5
  /**
2
6
  * Create a store with state and actions.
3
7
  *
@@ -13,7 +17,7 @@
13
17
  * count: 1,
14
18
  * inc: () => set((state) => ({ count: state.count + 1 })),
15
19
  * dec: () => set((state) => ({ count: state.count - 1 })),
16
- * })));
20
+ * }));
17
21
  *
18
22
  * // In a React component:
19
23
  * const Counter = () => {
@@ -28,9 +32,19 @@
28
32
  * }
29
33
  * ```
30
34
  *
35
+ * Example of Middleware
36
+ * ```
37
+ * const logger = <T extends object>(): Middleware<T> => (set, get) => (next) => async (partial) => {
38
+ * console.log('prev:', get());
39
+ * await next(partial);
40
+ * console.log('next:', get());
41
+ * };
42
+ *
43
+ * ```
44
+ *
31
45
  * @param initializer Function that receives `set` and returns the initial state object.
32
46
  * @returns A hook that provides access to the store state and actions.
33
47
  */
34
- declare function create<T extends object>(initializer: (set: (partial: Partial<T> | ((state: T) => Partial<T>)) => void) => T): () => T;
48
+ declare function create<T extends object>(initializer: CreateParamsType<T>, middlewares?: Middleware<T>[]): () => T;
35
49
 
36
- export { create };
50
+ export { type Middleware, create };
package/dist/index.js CHANGED
@@ -39,7 +39,7 @@ __export(index_exports, {
39
39
  });
40
40
  module.exports = __toCommonJS(index_exports);
41
41
  var import_react = require("react");
42
- function create(initializer) {
42
+ function create(initializer, middlewares = []) {
43
43
  let state;
44
44
  let listeners = [];
45
45
  const setState = (partial) => {
@@ -47,19 +47,26 @@ function create(initializer) {
47
47
  state = __spreadValues(__spreadValues({}, state), partialState);
48
48
  listeners.forEach((l) => l());
49
49
  };
50
- state = initializer(setState);
50
+ const getState = () => state;
51
+ const setStateWithMiddleware = applyMiddleware(setState, getState, middlewares);
52
+ state = initializer(setStateWithMiddleware, getState);
51
53
  const subscribe = (listener) => {
52
54
  listeners.push(listener);
53
55
  return () => {
54
56
  listeners = listeners.filter((l) => l !== listener);
55
57
  };
56
58
  };
57
- const getSnapshot = () => state;
58
- return function useStore() {
59
- const snapshot = (0, import_react.useSyncExternalStore)(subscribe, getSnapshot);
60
- return snapshot;
61
- };
59
+ return () => (0, import_react.useSyncExternalStore)(subscribe, getState);
62
60
  }
61
+ var applyMiddleware = (set, get, middlewares) => {
62
+ if (!middlewares || middlewares.length === 0) {
63
+ return set;
64
+ }
65
+ return middlewares.reduceRight(
66
+ (next, mw) => mw(set, get)(next),
67
+ set
68
+ );
69
+ };
63
70
  // Annotate the CommonJS export names for ESM import in node:
64
71
  0 && (module.exports = {
65
72
  create
package/dist/index.mjs CHANGED
@@ -18,7 +18,7 @@ var __spreadValues = (a, b) => {
18
18
 
19
19
  // src/index.ts
20
20
  import { useSyncExternalStore } from "react";
21
- function create(initializer) {
21
+ function create(initializer, middlewares = []) {
22
22
  let state;
23
23
  let listeners = [];
24
24
  const setState = (partial) => {
@@ -26,19 +26,26 @@ function create(initializer) {
26
26
  state = __spreadValues(__spreadValues({}, state), partialState);
27
27
  listeners.forEach((l) => l());
28
28
  };
29
- state = initializer(setState);
29
+ const getState = () => state;
30
+ const setStateWithMiddleware = applyMiddleware(setState, getState, middlewares);
31
+ state = initializer(setStateWithMiddleware, getState);
30
32
  const subscribe = (listener) => {
31
33
  listeners.push(listener);
32
34
  return () => {
33
35
  listeners = listeners.filter((l) => l !== listener);
34
36
  };
35
37
  };
36
- const getSnapshot = () => state;
37
- return function useStore() {
38
- const snapshot = useSyncExternalStore(subscribe, getSnapshot);
39
- return snapshot;
40
- };
38
+ return () => useSyncExternalStore(subscribe, getState);
41
39
  }
40
+ var applyMiddleware = (set, get, middlewares) => {
41
+ if (!middlewares || middlewares.length === 0) {
42
+ return set;
43
+ }
44
+ return middlewares.reduceRight(
45
+ (next, mw) => mw(set, get)(next),
46
+ set
47
+ );
48
+ };
42
49
  export {
43
50
  create
44
51
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zustic",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "A fast, minimal state management solution for React ecosystems. Works seamlessly with React, Next.js, and React Native, offering predictable state updates with a tiny footprint.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",