zustand-kit 1.0.2 → 1.1.0

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/README.md CHANGED
@@ -108,26 +108,22 @@ function Settings() {
108
108
 
109
109
  ### Redux DevTools 集成
110
110
 
111
- 在开发环境下,所有全局状态会自动集成到统一的 Redux DevTools 视图中,便于调试:
111
+ 在开发环境下,所有全局状态会自动集成到统一的 Redux DevTools 视图中,便于调试。DevTools 采用全局配置,默认根据环境变量自动启用/禁用:
112
112
 
113
113
  ```tsx
114
- import { useGlobalState } from 'zustand-kit';
114
+ import { useGlobalState, configureDevtools } from 'zustand-kit';
115
115
 
116
- // 开发环境自动启用 DevTools(默认行为)
116
+ // 默认行为:开发环境自动启用,生产环境自动禁用
117
117
  const [data, setData] = useGlobalState('data', { count: 0 });
118
118
 
119
- // 禁用 DevTools(即使在开发环境)
120
- const [privateData, setPrivateData] = useGlobalState('private', {}, {
121
- enableDevtools: false
122
- });
119
+ // 全局禁用 DevTools(在应用入口配置)
120
+ configureDevtools(false);
123
121
 
124
- // 强制启用 DevTools(生产环境,不推荐)
125
- const [debugData, setDebugData] = useGlobalState('debug', {}, {
126
- enableDevtools: true
127
- });
122
+ // 全局启用 DevTools(在应用入口配置,如在生产环境调试,不推荐)
123
+ configureDevtools(true);
128
124
  ```
129
125
 
130
- **注意:** 所有全局状态会聚合到一个名为 `GlobalStates (All)` 的 DevTools 实例中,每个状态以其 key 作为属性显示,方便统一查看和调试所有状态。
126
+ **注意:** 所有全局状态会聚合到一个名为 `GlobalStates (All)` 的 DevTools 实例中,每个状态以其 key 作为属性显示,方便统一查看和调试所有状态。建议在应用入口处调用 `configureDevtools()` 进行全局配置。
131
127
 
132
128
  ### 选择器模式(性能优化)
133
129
 
@@ -242,12 +238,27 @@ resetGlobalState('counter');
242
238
  - `options?: UseGlobalStateOptions` - 可选配置
243
239
  - `storage?: 'localStorage' | 'sessionStorage' | 'none'` - 持久化类型(默认 'none')
244
240
  - `storageKey?: string` - 存储键前缀(默认 'global-state')
245
- - `enableDevtools?: boolean` - 是否启用 Redux DevTools(开发环境默认 true,生产环境默认 false)
246
241
 
247
242
  **返回:** `[state, setState, resetState]`
248
243
 
249
244
  **注意:** 对于对象类型的状态,`setState` 支持部分更新。例如:`setUser({ name: 'Jane' })` 只会更新 `name` 字段,其他字段保持不变。
250
245
 
246
+ ### `configureDevtools(enabled)`
247
+
248
+ 全局配置 Redux DevTools 集成。
249
+
250
+ **参数:**
251
+ - `enabled: boolean` - 是否启用 Redux DevTools(默认:开发环境 true,生产环境 false)
252
+
253
+ **使用示例:**
254
+ ```typescript
255
+ import { configureDevtools } from 'zustand-kit';
256
+
257
+ // 在应用入口处配置
258
+ configureDevtools(false); // 禁用 DevTools
259
+ configureDevtools(true); // 启用 DevTools
260
+ ```
261
+
251
262
  ### `useGlobalSelector<T, R>(key, selector, equalityMode?)`
252
263
 
253
264
  使用选择器订阅状态的特定部分。支持自动检测返回值类型并选择合适的比较模式。
package/dist/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }var x=Object.defineProperty,E=Object.defineProperties;var N=Object.getOwnPropertyDescriptors;var h=Object.getOwnPropertySymbols;var O=Object.prototype.hasOwnProperty,D=Object.prototype.propertyIsEnumerable;var G=(t,e,o)=>e in t?x(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,T=(t,e)=>{for(var o in e||(e={}))O.call(e,o)&&G(t,o,e[o]);if(h)for(var o of h(e))D.call(e,o)&&G(t,o,e[o]);return t},A=(t,e)=>E(t,N(e));var _react = require('react'); var m = _interopRequireWildcard(_react);var _zustand = require('zustand');var _middleware = require('zustand/middleware');var _shallow = require('zustand/react/shallow');var a=new Map,i=null;function C(){return i||(i=_zustand.create.call(void 0, )(_middleware.devtools.call(void 0, ()=>({}),{name:"GlobalStates (All)"}))),i}function p(t,e){if(i){let o=i.getState();i.setState(A(T({},o),{[t]:e}))}}function X(){a.clear(),i=null}function k(t,e,o){let{storage:n="none",storageKey:u="global-state",enableDevtools:r=process.env.NODE_ENV!=="production"}=o||{};if(!a.has(t)){let c=typeof e=="object"&&e!==null&&!Array.isArray(e),V=(S,K)=>({value:e,setValue:l=>{typeof l=="function"?S(d=>{let f=l(d.value);return r&&p(t,f),{value:f}}):c&&typeof l=="object"&&l!==null?S(d=>{let f=T(T({},d.value),l);return r&&p(t,f),{value:f}}):(S({value:l}),r&&p(t,l))},reset:()=>{S({value:e}),r&&p(t,e)}}),g;if(n!=="none"){let S=n==="localStorage"?localStorage:sessionStorage;g=_zustand.create.call(void 0, )(_middleware.persist.call(void 0, V,{name:`${u}-${t}`,storage:_middleware.createJSONStorage.call(void 0, ()=>S)}))}else g=_zustand.create.call(void 0, V);a.set(t,g),r&&(C(),p(t,e))}let s=a.get(t),b=s(c=>c.value),B=_react.useMemo.call(void 0, ()=>c=>s.getState().setValue(c),[s]),R=_react.useMemo.call(void 0, ()=>()=>s.getState().reset(),[s]);return[b,B,R]}function Y(t,e,o){let n=a.get(t);if(!n)throw new Error(`Global state with key "${t}" not found. Initialize it with useGlobalState first.`);let u=_react.useRef.call(void 0, e);_react.useEffect.call(void 0, ()=>{u.current=e});let r=_react.useCallback.call(void 0, s=>u.current(s.value),[]);if(o===void 0){let s=r(n.getState());return s!==null&&typeof s=="object"&&!m.isValidElement(s)?n(_shallow.useShallow.call(void 0, r)):n(r)}return n(o==="shallow"?_shallow.useShallow.call(void 0, r):r)}function Z(t){let e=a.get(t);if(!e)throw new Error(`Global state with key "${t}" not found. Initialize it with useGlobalState first.`);return _react.useMemo.call(void 0, ()=>o=>e.getState().setValue(o),[e])}function q(t){let e=a.get(t);return e==null?void 0:e.getState().value}function ee(t,e){let o=a.get(t);if(!o){process.env.NODE_ENV!=="production"&&console.warn(`Global state with key "${t}" not found. Initialize it with useGlobalState first.`);return}o.getState().setValue(e)}function te(t,e){let o=a.get(t);if(!o)return process.env.NODE_ENV!=="production"&&console.warn(`Global state with key "${t}" not found. Initialize it with useGlobalState first.`),()=>{};let n=o.getState().value;return o.subscribe(u=>{let r=u.value;Object.is(r,n)||(e(r,n),n=r)})}function oe(t){let e=a.get(t);if(!e){process.env.NODE_ENV!=="production"&&console.warn(`Global state with key "${t}" not found. Initialize it with useGlobalState first.`);return}e.getState().reset()}var re=k;exports.__clearAllStates__ = X; exports.default = re; exports.getGlobalState = q; exports.resetGlobalState = oe; exports.setGlobalState = ee; exports.subscribeGlobalState = te; exports.useGlobalSelector = Y; exports.useGlobalSetter = Z; exports.useGlobalState = k;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }var O=Object.defineProperty,D=Object.defineProperties;var _=Object.getOwnPropertyDescriptors;var G=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,N=Object.prototype.propertyIsEnumerable;var m=(e,t,o)=>t in e?O(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,g=(e,t)=>{for(var o in t||(t={}))j.call(t,o)&&m(e,o,t[o]);if(G)for(var o of G(t))N.call(t,o)&&m(e,o,t[o]);return e},B=(e,t)=>D(e,_(t));var _react = require('react'); var R = _interopRequireWildcard(_react);var _zustand = require('zustand');var _middleware = require('zustand/middleware');var _shallow = require('zustand/react/shallow');var s=new Map,p=process.env.NODE_ENV!=="production";function V(e){process.env.NODE_ENV!=="production"&&console.warn(`Global state with key "${e}" not found. Initialize it with useGlobalState first.`)}function Z(e){p=e}var u=null;function K(){return u||(u=_zustand.create.call(void 0, )(_middleware.devtools.call(void 0, ()=>({}),{name:"GlobalStates (All)"}))),u}function T(e,t){if(u){let o=u.getState();u.setState(B(g({},o),{[e]:t}))}}function q(){s.clear(),u=null}function M(e,t,o){let{storage:n="none",storageKey:i="global-state"}=o||{};if(!s.has(e)){let S=typeof t=="object"&&t!==null&&!Array.isArray(t),U=(c,P)=>{let h=a=>{c({value:a}),p&&T(e,a)};return{value:t,setValue:a=>{typeof a=="function"?c(v=>{let f=a(v.value);return p&&T(e,f),{value:f}}):S&&typeof a=="object"&&a!==null?c(v=>{let f=g(g({},v.value),a);return p&&T(e,f),{value:f}}):h(a)},reset:()=>{h(t)}}},d;if(n!=="none"){let c=n==="localStorage"?localStorage:sessionStorage;d=_zustand.create.call(void 0, )(_middleware.persist.call(void 0, U,{name:`${i}-${e}`,storage:_middleware.createJSONStorage.call(void 0, ()=>c)}))}else d=_zustand.create.call(void 0, U);s.set(e,d),p&&(K(),T(e,t))}let r=s.get(e),l=r(S=>S.value),A=_react.useMemo.call(void 0, ()=>S=>r.getState().setValue(S),[r]),E=_react.useMemo.call(void 0, ()=>()=>r.getState().reset(),[r]);return[l,A,E]}function ee(e,t,o){let n=s.get(e);if(!n)throw new Error(`Global state with key "${e}" not found. Initialize it with useGlobalState first.`);let i=_react.useRef.call(void 0, t);i.current=t;let r=_react.useCallback.call(void 0, l=>i.current(l.value),[]);if(o===void 0){let l=r(n.getState());return l!==null&&typeof l=="object"&&!R.isValidElement(l)?n(_shallow.useShallow.call(void 0, r)):n(r)}return n(o==="shallow"?_shallow.useShallow.call(void 0, r):r)}function te(e){let t=s.get(e);if(!t)throw new Error(`Global state with key "${e}" not found. Initialize it with useGlobalState first.`);return _react.useMemo.call(void 0, ()=>o=>t.getState().setValue(o),[t])}function oe(e){let t=s.get(e);return t==null?void 0:t.getState().value}function re(e,t){let o=s.get(e);if(!o){V(e);return}o.getState().setValue(t)}function ne(e,t){let o=s.get(e);if(!o)return V(e),()=>{};let n=o.getState().value;return o.subscribe(i=>{let r=i.value;Object.is(r,n)||(t(r,n),n=r)})}function se(e){let t=s.get(e);if(!t){V(e);return}t.getState().reset()}var ae=M;exports.__clearAllStates__ = q; exports.configureDevtools = Z; exports.default = ae; exports.getGlobalState = oe; exports.resetGlobalState = se; exports.setGlobalState = re; exports.subscribeGlobalState = ne; exports.useGlobalSelector = ee; exports.useGlobalSetter = te; exports.useGlobalState = M;
package/dist/index.esm.js CHANGED
@@ -1 +1 @@
1
- var x=Object.defineProperty,E=Object.defineProperties;var N=Object.getOwnPropertyDescriptors;var h=Object.getOwnPropertySymbols;var O=Object.prototype.hasOwnProperty,D=Object.prototype.propertyIsEnumerable;var G=(t,e,o)=>e in t?x(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,T=(t,e)=>{for(var o in e||(e={}))O.call(e,o)&&G(t,o,e[o]);if(h)for(var o of h(e))D.call(e,o)&&G(t,o,e[o]);return t},A=(t,e)=>E(t,N(e));import*as m from"react";import{create as v}from"zustand";import{persist as _,createJSONStorage as $,devtools as I}from"zustand/middleware";import{useMemo as w,useRef as j,useCallback as y,useEffect as z}from"react";import{useShallow as U}from"zustand/react/shallow";var a=new Map,i=null;function C(){return i||(i=v()(I(()=>({}),{name:"GlobalStates (All)"}))),i}function p(t,e){if(i){let o=i.getState();i.setState(A(T({},o),{[t]:e}))}}function X(){a.clear(),i=null}function k(t,e,o){let{storage:n="none",storageKey:u="global-state",enableDevtools:r=process.env.NODE_ENV!=="production"}=o||{};if(!a.has(t)){let c=typeof e=="object"&&e!==null&&!Array.isArray(e),V=(S,K)=>({value:e,setValue:l=>{typeof l=="function"?S(d=>{let f=l(d.value);return r&&p(t,f),{value:f}}):c&&typeof l=="object"&&l!==null?S(d=>{let f=T(T({},d.value),l);return r&&p(t,f),{value:f}}):(S({value:l}),r&&p(t,l))},reset:()=>{S({value:e}),r&&p(t,e)}}),g;if(n!=="none"){let S=n==="localStorage"?localStorage:sessionStorage;g=v()(_(V,{name:`${u}-${t}`,storage:$(()=>S)}))}else g=v(V);a.set(t,g),r&&(C(),p(t,e))}let s=a.get(t),b=s(c=>c.value),B=w(()=>c=>s.getState().setValue(c),[s]),R=w(()=>()=>s.getState().reset(),[s]);return[b,B,R]}function Y(t,e,o){let n=a.get(t);if(!n)throw new Error(`Global state with key "${t}" not found. Initialize it with useGlobalState first.`);let u=j(e);z(()=>{u.current=e});let r=y(s=>u.current(s.value),[]);if(o===void 0){let s=r(n.getState());return s!==null&&typeof s=="object"&&!m.isValidElement(s)?n(U(r)):n(r)}return n(o==="shallow"?U(r):r)}function Z(t){let e=a.get(t);if(!e)throw new Error(`Global state with key "${t}" not found. Initialize it with useGlobalState first.`);return w(()=>o=>e.getState().setValue(o),[e])}function q(t){let e=a.get(t);return e==null?void 0:e.getState().value}function ee(t,e){let o=a.get(t);if(!o){process.env.NODE_ENV!=="production"&&console.warn(`Global state with key "${t}" not found. Initialize it with useGlobalState first.`);return}o.getState().setValue(e)}function te(t,e){let o=a.get(t);if(!o)return process.env.NODE_ENV!=="production"&&console.warn(`Global state with key "${t}" not found. Initialize it with useGlobalState first.`),()=>{};let n=o.getState().value;return o.subscribe(u=>{let r=u.value;Object.is(r,n)||(e(r,n),n=r)})}function oe(t){let e=a.get(t);if(!e){process.env.NODE_ENV!=="production"&&console.warn(`Global state with key "${t}" not found. Initialize it with useGlobalState first.`);return}e.getState().reset()}var re=k;export{X as __clearAllStates__,re as default,q as getGlobalState,oe as resetGlobalState,ee as setGlobalState,te as subscribeGlobalState,Y as useGlobalSelector,Z as useGlobalSetter,k as useGlobalState};
1
+ var O=Object.defineProperty,D=Object.defineProperties;var _=Object.getOwnPropertyDescriptors;var G=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,N=Object.prototype.propertyIsEnumerable;var m=(e,t,o)=>t in e?O(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,g=(e,t)=>{for(var o in t||(t={}))j.call(t,o)&&m(e,o,t[o]);if(G)for(var o of G(t))N.call(t,o)&&m(e,o,t[o]);return e},B=(e,t)=>D(e,_(t));import*as R from"react";import{create as b}from"zustand";import{persist as $,createJSONStorage as y,devtools as C}from"zustand/middleware";import{useMemo as w,useRef as I,useCallback as z}from"react";import{useShallow as x}from"zustand/react/shallow";var s=new Map,p=process.env.NODE_ENV!=="production";function V(e){process.env.NODE_ENV!=="production"&&console.warn(`Global state with key "${e}" not found. Initialize it with useGlobalState first.`)}function Z(e){p=e}var u=null;function K(){return u||(u=b()(C(()=>({}),{name:"GlobalStates (All)"}))),u}function T(e,t){if(u){let o=u.getState();u.setState(B(g({},o),{[e]:t}))}}function q(){s.clear(),u=null}function M(e,t,o){let{storage:n="none",storageKey:i="global-state"}=o||{};if(!s.has(e)){let S=typeof t=="object"&&t!==null&&!Array.isArray(t),U=(c,P)=>{let h=a=>{c({value:a}),p&&T(e,a)};return{value:t,setValue:a=>{typeof a=="function"?c(v=>{let f=a(v.value);return p&&T(e,f),{value:f}}):S&&typeof a=="object"&&a!==null?c(v=>{let f=g(g({},v.value),a);return p&&T(e,f),{value:f}}):h(a)},reset:()=>{h(t)}}},d;if(n!=="none"){let c=n==="localStorage"?localStorage:sessionStorage;d=b()($(U,{name:`${i}-${e}`,storage:y(()=>c)}))}else d=b(U);s.set(e,d),p&&(K(),T(e,t))}let r=s.get(e),l=r(S=>S.value),A=w(()=>S=>r.getState().setValue(S),[r]),E=w(()=>()=>r.getState().reset(),[r]);return[l,A,E]}function ee(e,t,o){let n=s.get(e);if(!n)throw new Error(`Global state with key "${e}" not found. Initialize it with useGlobalState first.`);let i=I(t);i.current=t;let r=z(l=>i.current(l.value),[]);if(o===void 0){let l=r(n.getState());return l!==null&&typeof l=="object"&&!R.isValidElement(l)?n(x(r)):n(r)}return n(o==="shallow"?x(r):r)}function te(e){let t=s.get(e);if(!t)throw new Error(`Global state with key "${e}" not found. Initialize it with useGlobalState first.`);return w(()=>o=>t.getState().setValue(o),[t])}function oe(e){let t=s.get(e);return t==null?void 0:t.getState().value}function re(e,t){let o=s.get(e);if(!o){V(e);return}o.getState().setValue(t)}function ne(e,t){let o=s.get(e);if(!o)return V(e),()=>{};let n=o.getState().value;return o.subscribe(i=>{let r=i.value;Object.is(r,n)||(t(r,n),n=r)})}function se(e){let t=s.get(e);if(!t){V(e);return}t.getState().reset()}var ae=M;export{q as __clearAllStates__,Z as configureDevtools,ae as default,oe as getGlobalState,se as resetGlobalState,re as setGlobalState,ne as subscribeGlobalState,ee as useGlobalSelector,te as useGlobalSetter,M as useGlobalState};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zustand-kit",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "⚡️ A minimalist React global state management library based on Zustand with persistence, TypeScript and fine-grained subscriptions",
5
5
  "keywords": [
6
6
  "zustand",
package/types/index.d.ts CHANGED
@@ -1,3 +1,14 @@
1
+ /**
2
+ * Configure global DevTools integration
3
+ * @param enabled - Whether to enable Redux DevTools integration for all global states
4
+ * @example
5
+ * // Disable DevTools in development
6
+ * configureDevtools(false);
7
+ *
8
+ * // Enable DevTools in production (not recommended)
9
+ * configureDevtools(true);
10
+ */
11
+ export declare function configureDevtools(enabled: boolean): void;
1
12
  /**
2
13
  * Clear all global states (for testing purposes)
3
14
  * @internal
@@ -9,8 +20,9 @@ export declare function __clearAllStates__(): void;
9
20
  export type StorageType = 'localStorage' | 'sessionStorage' | 'none';
10
21
  /**
11
22
  * Helper type for setter value - supports partial updates for objects
23
+ * Simplified to allow partial updates without type assertions
12
24
  */
13
- type SetterValue<T> = T extends Record<string, unknown> ? Partial<T> | ((prev: T) => T) : T | ((prev: T) => T);
25
+ type SetterValue<T> = T | Partial<T> | ((prev: T) => T);
14
26
  /**
15
27
  * Options for useGlobalState
16
28
  */
@@ -25,11 +37,6 @@ export interface UseGlobalStateOptions {
25
37
  * @default 'global-state'
26
38
  */
27
39
  storageKey?: string;
28
- /**
29
- * Enable Redux DevTools integration (aggregated view only)
30
- * @default true in development, false in production
31
- */
32
- enableDevtools?: boolean;
33
40
  }
34
41
  /**
35
42
  * Universal global state hook - supports both simple values and objects
@@ -66,15 +73,9 @@ export interface UseGlobalStateOptions {
66
73
  * storageKey: 'my-app'
67
74
  * });
68
75
  *
69
- * // Disable aggregated DevTools in development
70
- * const [privateData, setPrivateData] = useGlobalState('private', {}, {
71
- * enableDevtools: false
72
- * });
73
- *
74
- * // Force enable aggregated DevTools in production (not recommended)
75
- * const [debugData, setDebugData] = useGlobalState('debug', {}, {
76
- * enableDevtools: true
77
- * });
76
+ * // Configure DevTools globally (before creating states)
77
+ * import { configureDevtools } from 'zustand-kit';
78
+ * configureDevtools(false); // Disable DevTools
78
79
  *
79
80
  * // For non-React usage, see: getGlobalState, setGlobalState, subscribeGlobalState, resetGlobalState
80
81
  */