zustand-lite 0.2.3 โ†’ 0.2.4

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
@@ -1,191 +1,335 @@
1
- # ๐Ÿง  Zustand Lite
2
-
3
- [![npm version](https://img.shields.io/npm/v/zustand-lite?color=blue)](https://www.npmjs.com/package/zustand-lite)
4
- [![bundle size](https://img.shields.io/bundlephobia/minzip/zustand-lite)](https://bundlephobia.com/package/zustand-lite)
5
- [![license](https://img.shields.io/npm/l/zustand-lite)](./LICENSE)
6
- [![Types](https://img.shields.io/badge/TypeScript-ready-blue?logo=typescript)](https://www.typescriptlang.org/)
7
- [![GitHub stars](https://img.shields.io/github/stars/PiotrSiatkowski/zustand-lite?style=social)](https://github.com/PiotrSiatkowski/zustand-lite)
8
-
9
- ---
10
-
11
- Zustand Lite is a **zero-boilerplate** state management wrapper built specifically for **frontend developers** who want powerful and scalable global state without the usual complexity. Designed for simplicity, it gives you everything you need out-of-the-box โ€” from selectors to setters to middleware โ€” while remaining lightweight and extensible. With seamless support for plugins, devtools, and state encapsulation, managing state becomes a breeze, not a chore.
12
-
13
- > A zero-boilerplate wrapper around [Zustand](https://github.com/pmndrs/zustand), focused on ergonomics, plugins, and powerful dynamic extension โ€” inspired by [zustand-x](https://github.com/udecode/zustand-x) and selector auto-generation patterns.
14
-
15
- ---
16
-
17
- ## ๐Ÿš€ Features
18
-
19
- - ๐Ÿ˜Š Write only code that matters -> save lines
20
- - โœ… Type-safe getter/setter generators for every field
21
- - ๐Ÿ”Œ First-class **plugin system**
22
- - ๐Ÿงฉ Optional **middleware integration** (devtools, persist)
23
- - ๐Ÿ›  Chainable API: `.extendGetters(...)`, `.extendSetters(...)`, `.restrictState(...)`
24
- - ๐Ÿ‘ Named devtools actions and store labeling
25
- - ๐Ÿงผ No runtime dependencies other than Zustand
26
-
27
- ---
28
-
29
- ## ๐Ÿ“ฆ Installation
30
-
31
- ```bash
32
- npm install zustand zustand-lite
33
- # or
34
- pnpm add zustand zustand-lite
35
- ```
36
-
37
- ---
38
-
39
- ## ๐Ÿ›  Basic Usage
40
-
41
- ```ts
42
- import { createStore } from 'zustand-lite';
43
-
44
- const initialState: {
45
- foo: string;
46
- bar: {
47
- x: number;
48
- y: number;
49
- }
50
- } = {
51
- foo: '',
52
- bar: {
53
- x: 0,
54
- y: 0,
55
- }
56
- };
57
-
58
- export const store = createStore(initialState)
59
- .extendGetters(({ get }) => ({
60
- area: () => get.bar().x * get.bar().y,
61
- }))
62
- .extendSetters(({ get, set }) => ({
63
- translateX: (dx: number) => set.bar(({ x: get.bar().x + dx, y: get.bar().y })),
64
- }))
65
- .restrictState(['bar']);
66
-
67
- // Usage
68
- store.use.area(); // React-friendly subscription, re-renders only when area changes.
69
- store.get.foo(); // Synchronous accessor
70
- store.set.translateX(2); // Safe setter
71
- store.api.getState(); // Native Zustand store API
72
- ```
73
-
74
- ---
75
-
76
- ## ๐Ÿง  API Overview
77
-
78
- ### `createStore(initialState, options)`
79
-
80
- Creates a typed store with optional plugins and middleware.
81
-
82
- **Options:**
83
-
84
- | Key | Type | Description |
85
- |--------------|----------------------------------------------------------------------------|----------------------------------------|
86
- | `name` | `string` | Name shown in Redux DevTools |
87
- | `plugins` | `StoreApiPlugin[]` | Array of plugins to extend the store |
88
- | `middlewares`| `{ devtools?: true or DevtoolsOptions, persist?: true or PersistOptions }` | Middleware configuration |
89
-
90
- ---
91
-
92
- ### Chainable Methods
93
-
94
- - **`.extendGetters(fn)`**
95
- Add additional derived getters based on current state.
96
-
97
- - **`.extendSetters(fn)`**
98
- Add additional typed setters.
99
-
100
- - **`.restrictState(keys?: string[])`**
101
- Hide selected fields from the public API, returning a minimal store (removes config methods as well).
102
-
103
- ---
104
-
105
- ### Store Interface
106
-
107
- After creation, your store includes:
108
-
109
- | Property | Purpose |
110
- |--------------------|---------------------------------------------------------|
111
- | `store.use.foo()` | React hook getter for subscribing to `foo` |
112
- | `store.get.foo()` | Direct synchronous access to `foo` |
113
- | `store.set.foo(v)` | Set a new value for `foo` |
114
- | `store.api` | The native Zustand store API (getState, setState, etc.) |
115
-
116
- ---
117
-
118
- ## ๐Ÿงฉ Plugin System
119
-
120
- You can define plugins that inject additional state or behavior:
121
-
122
- ```ts
123
- import { StoreApiPlugin } from 'zustand-lite';
124
-
125
- type Setters = {
126
- reset: () => void;
127
- };
128
-
129
- export const reset: StoreApiPlugin<{}, {}, Setters> = {
130
- extends: store => {
131
- return store.extendSetters(({ api }) => ({
132
- reset: () => {
133
- const initialState = api.getInitialState?.() ?? {};
134
- api.setState(() => initialState, true);
135
- },
136
- }));
137
- },
138
- };
139
- ```
140
-
141
- Apply it like this:
142
-
143
- ```ts
144
- const store = createStore({}, { plugins: [reset] });
145
- ```
146
-
147
- ---
148
-
149
- ## ๐Ÿงช DevTools Integration
150
-
151
- You can add the most useful middlewares:
152
-
153
- ```ts
154
- {
155
- name: 'MyApp/CounterStore',
156
- middlewares: {
157
- devtools: true,
158
- persist: {
159
- ...options,
160
- },
161
- }
162
- }
163
- ```
164
-
165
- ---
166
-
167
- ## ๐Ÿงฑ Built With
168
-
169
- - [Zustand](https://github.com/pmndrs/zustand)
170
- - Inspired by [zustand-x](https://github.com/udecode/zustand-x)
171
-
172
- ---
173
-
174
- ## ๐Ÿ“˜ License
175
-
176
- MIT โ€” free to use, extend, and improve.
177
-
178
- ---
179
-
180
- ## ๐Ÿค Contributing
181
-
182
- Pull requests, feedback, and ideas are welcome!
183
- If you'd like to publish your own plugins, we recommend namespacing them under:
184
-
185
- ```
186
- zustand-lite/plugin-*
187
- ```
188
-
189
- or adding them to the main repository under the plugins directory.
190
-
191
- ---
1
+ # ๐Ÿง  Zustand Lite
2
+
3
+ [![npm version](https://img.shields.io/npm/v/zustand-lite?color=blue)](https://www.npmjs.com/package/zustand-lite)
4
+ [![bundle size](https://img.shields.io/bundlephobia/minzip/zustand-lite)](https://bundlephobia.com/package/zustand-lite)
5
+ [![license](https://img.shields.io/npm/l/zustand-lite)](./LICENSE)
6
+ [![Types](https://img.shields.io/badge/TypeScript-ready-blue?logo=typescript)](https://www.typescriptlang.org/)
7
+ [![GitHub stars](https://img.shields.io/github/stars/PiotrSiatkowski/zustand-lite?style=social)](https://github.com/PiotrSiatkowski/zustand-lite)
8
+
9
+ Zustand Lite is a **zero-boilerplate** state management built specifically for frontend
10
+ developers who want **powerful and scalable** global state **without the usual complexity**.
11
+ Designed for simplicity, it gives you everything you need out-of-the-box โ€” from selectors to setters to middleware โ€” while remaining lightweight and extensible. With seamless support for plugins, devtools, and state encapsulation, managing state becomes a breeze, not a chore.
12
+
13
+ _A zero-boilerplate wrapper around [Zustand](https://github.com/pmndrs/zustand), focused on
14
+ ergonomics, plugins, and powerful dynamic extension โ€” inspired by [zustand-x](https://github.
15
+ com/udecode/zustand-x) and getters/setters auto-generation patterns._
16
+
17
+ ## ๐Ÿ› ๏ธ Why **zustandโ€‘lite**?
18
+
19
+ ### โœ… TL;DR
20
+
21
+ _**Zustand Lite** delivers a **simple**, **performant**, and **predictable** way to manage UI
22
+ state, letting your code stay focused on business logic, not infrastructure. Try it today and
23
+ see how effortless frontend state can be!_
24
+
25
+ While tools like Reactโ€‘Query handle server state, UI state often gets bogged down by excessive
26
+ boilerplate, tangled data flows, and hardโ€‘toโ€‘control side effects. **Zustand Lite** cuts through
27
+ the noise:
28
+
29
+ ## ๐Ÿš€ Features
30
+
31
+ - โš›๏ธ **Minimal & Typed**: Built on top of lightweight Zustand core, fully typed with TypeScript.
32
+ - ๐Ÿ”„ **Clean Separation**: State and operations are well separated to minimize confusion.
33
+ - ๐Ÿš€ **Blazing Performance**: Selective updates and lean subscriptions keep things snappy.
34
+ - ๐Ÿช„ **Zero Boilerplate**: No mock setups, no dependency arrays, just importing and using.
35
+ - ๐Ÿงช **Testโ€‘Friendly Design**: Easily tested, no context or mocks hacks required.
36
+ - ๐ŸŒฑ **Composable & Extensible**: Opinionated defaults that adapt as your application grows.
37
+ - ๐Ÿ”Œ **Shareable plugin system**: Plug custom logic directly into your store for extended capabilities.
38
+ - ๐Ÿงฉ **Optional middleware integration**: Seamlessly add devtools and persist, middlewares that matter.
39
+ - ๐Ÿ›  **Chainable API**: `extendGetters()`, `extendSetters()`, `restrictState()`- create store in composable steps.
40
+ - ๐Ÿ‘ **Redux devtools labeling**: Built in clear, traceable actions and labels for debugging.
41
+ - ๐Ÿงผ **No dependencies, only Zustand**: Keeps bundle size small and performance high.
42
+ - ๐Ÿ˜Š **Write only code you need**: Focus on business logic, not boilerplate.
43
+
44
+ ## โœจ Why it matters
45
+
46
+ Boilerplate is the killer of productivity and obscures your real goal: **business logic**, which is usually far simpler than it appears.
47
+ Thanks to **zustandโ€‘lite**, you can move faster without sacrificing clarity or flexibility:
48
+
49
+ 1. **No Context Providers** or React-specific setup
50
+ 2. **No Mocking** during tests
51
+ 3. **No bloated dependency arrays**
52
+ 4. **Type-safe, simple API** - designed for everyday use
53
+
54
+ ---
55
+
56
+ ## ๐Ÿ›  Common Recipes
57
+
58
+ ### Simple store
59
+
60
+ ```ts
61
+ import { createStore } from 'zustand-lite'
62
+
63
+ const initialState: { foo: string } = { foo: '' }
64
+
65
+ export const store = createStore(initialState)
66
+
67
+ // Subscribe for your data changes.
68
+ function Component() {
69
+ const foo = store.use.foo()
70
+ }
71
+
72
+ // Synchronous accessor, when you need it.
73
+ function onClick() {
74
+ console.log(store.get.foo())
75
+ }
76
+
77
+ // Setting value with one line as it should be.
78
+ function onClick() {
79
+ store.set.foo('new-value')
80
+ }
81
+ ```
82
+
83
+ ### Custom Setters
84
+ const store = createStore({ count: 0 })
85
+ .extendSetters(({ get, set }) => ({
86
+ increment: () => set.count(get.count() + 1)
87
+ }))
88
+
89
+ function Counter() {
90
+ const count = store.use.count()
91
+ return (
92
+ <button onClick={store.set.increment}>
93
+ Count: {count}
94
+ </button>
95
+ )
96
+ }
97
+
98
+ ### Advanced store
99
+
100
+ ```ts
101
+ const initialState: { foo: string; bar: { x: number; y: number } } = {
102
+ point: { x: 0, y: 0 },
103
+ rectangle: { a: 20, b: 10 },
104
+ }
105
+
106
+ export const store = createStore(initialState)
107
+ .extendGetters(({ get }) => ({
108
+ area: () => get.bar().x * get.bar().y
109
+ }))
110
+ .extendSetters(({ get, set }) => ({
111
+ translateX: (dx: number) => set.bar({ x: get.point().x + dx, y: get.point().y }),
112
+ }))
113
+ .restrictState(['rectangle'])
114
+ // ^ Seal the store, so that certain fields are unavailable for the outside.
115
+
116
+ // Subscribe for computed data changes.
117
+ function Component() {
118
+ const area = store.use.area()
119
+ }
120
+
121
+ // Make private value inaccessible.
122
+ function onClick() {
123
+ console.log(store.get.rectangle()) <- TS error
124
+ }
125
+
126
+ // Call custom action.
127
+ function onClick() {
128
+ store.set.translateX(7)
129
+ }
130
+
131
+ // Access native Zustand api.
132
+ function Component() {
133
+ const state = store.api.getState()
134
+ }
135
+ ```
136
+
137
+ ### Deep selectors
138
+
139
+ ```ts
140
+ const initialState: { my: { foo: { bar: string} } } = {
141
+ my: { foo: { bar: 'value' } },
142
+ }
143
+
144
+ export const store = createStore(initialState)
145
+ .myFooBar(({ get }) => ({
146
+ return get.my().foo.bar;
147
+ }))
148
+ .restrictState()
149
+
150
+ // Component will update only if deeply nested value will update.
151
+ function Component() {
152
+ const myFooBar = store.use.myFooBar()
153
+ }
154
+ ```
155
+
156
+ ### Overriding getters and setters
157
+
158
+ ```ts
159
+ const initialState: { point: { x: number; y: number }; rectangle: { a: number; b: number } } = {
160
+ point: { x: 0, y: 0 },
161
+ rectangle: { a: 20, b: 10 },
162
+ }
163
+
164
+ export const store = createStore(initialState)
165
+ .extendGetters(({ get }) => ({
166
+ // get.point() references to latest defined getter, so new definition overrides the old one
167
+ // still having access to the default one.
168
+ point: () => transformToDifferentCoordinates(get.point())
169
+ }))
170
+ .extendGetters(({ get }) => ({
171
+ // get.point() will reference to the already transformed point from the previous getter
172
+ // definition.
173
+ point: () => soSomethingWithTransformedPoint(get.point())
174
+ }))
175
+ .restrictState()
176
+ ```
177
+
178
+ ### Custom equality
179
+
180
+ ```ts
181
+ const initialState: { rectangle: { a: number; b: number } } = {
182
+ rectangle: { a: 20, b: 10 },
183
+ }
184
+
185
+ export const store = createStore(initialState).restrictState()
186
+
187
+ // By default shallow equality is being used.
188
+ function Component() {
189
+ const rectangle = store.use.rectangle(customEqualityFunction)
190
+ }
191
+ ```
192
+
193
+ ### Testing features
194
+
195
+ ```ts
196
+ function Component() {
197
+ const dependencyA = store.use.dependencyA()
198
+ }
199
+
200
+ // No need to mock the store or add additional providers, just interact with it in the test.
201
+ test('Testing Component', () => ({
202
+ store.set.dependencyA(someValue)
203
+ render(<Component />)
204
+ expect(somethingStoreDependant).toBe(someValue)
205
+ })
206
+ ```
207
+
208
+ ---
209
+
210
+ ## ๐Ÿง  API Overview
211
+
212
+ ### `createStore(initialState, options)`
213
+
214
+ Creates a typed store with optional plugins and middleware.
215
+
216
+ **Options:**
217
+
218
+ | Key | Type | Description |
219
+ | ------------- | -------------------------------------------------------------------------- | ------------------------------------ |
220
+ | `name` | `string` | Name shown in Redux DevTools |
221
+ | `plugins` | `StoreApiPlugin[]` | Array of plugins to extend the store |
222
+ | `middlewares` | `{ devtools?: true or DevtoolsOptions, persist?: true or PersistOptions }` | Middleware configuration |
223
+
224
+ ### Chainable Methods
225
+
226
+ - **`.extendGetters(fn)`**
227
+ Add additional derived getters based on current state.
228
+
229
+ - **`.extendSetters(fn)`**
230
+ Add additional typed setters.
231
+
232
+ - **`.restrictState(keys?: string[])`**
233
+ Hide selected fields from the public API, returning a minimal store (removes config methods as well).
234
+
235
+ ### Store Interface
236
+
237
+ After creation, your store includes:
238
+
239
+ | Property | Purpose |
240
+ | ------------------ | ------------------------------------------------------- |
241
+ | `store.use.foo()` | React hook getter for subscribing to `foo` |
242
+ | `store.get.foo()` | Direct synchronous access to `foo` |
243
+ | `store.set.foo(v)` | Set a new value for `foo` |
244
+ | `store.api` | The native Zustand store API (getState, setState, etc.) |
245
+
246
+ ---
247
+
248
+ ## ๐Ÿงฉ Plugin System
249
+
250
+ You can define plugins that inject additional state or behavior:
251
+
252
+ ```ts
253
+ import { StoreApiPlugin } from 'zustand-lite'
254
+
255
+ type Setters = { reset: () => void }
256
+
257
+ export const reset: StoreApiPlugin<{}, {}, Setters> = {
258
+ extends: (store) => {
259
+ // If plugin defines data, that and only that data is available inside
260
+ // setters and getters.
261
+ return store.extendSetters(({ api }) => ({
262
+ reset: () => {
263
+ const initialState = api.getInitialState?.() ?? {}
264
+ api.setState(() => initialState, true)
265
+ },
266
+ }))
267
+ },
268
+ }
269
+ ```
270
+
271
+ Apply it like this:
272
+
273
+ ```ts
274
+ const store = createStore({}, { plugins: [reset] })
275
+ ```
276
+
277
+ **Any plugin state, getters, setters will be available for usage inside your own store.**
278
+
279
+ ---
280
+
281
+ ## ๐Ÿงช Middlewares Integration
282
+
283
+ You can add the most useful middlewares:
284
+
285
+ ```ts
286
+ {
287
+ name: 'MyApp/CounterStore',
288
+ middlewares: {
289
+ devtools: true,
290
+ persist: {
291
+ ...options,
292
+ },
293
+ }
294
+ }
295
+ ```
296
+
297
+ ---
298
+
299
+ ## ๐Ÿ›  Planned improvements
300
+
301
+ - Configurable level of auto-generation. While I advise to keep store as flat as possible, good
302
+ structured data is important. For deeper properties it might be more convenient to auto
303
+ generate getters and setters for deeply nested properties as well.
304
+ - createPlugin function that will automatically infer types from the usage without the need of
305
+ specifying types yourself, avoiding repetitiveness.
306
+ - Ability to specify equality function for extended getters. It's possible now, but requires to
307
+ import hook from 'zustand' package, which is suboptimal.
308
+
309
+ ---
310
+
311
+ ## ๐Ÿงฑ Built With
312
+
313
+ - [Zustand](https://github.com/pmndrs/zustand)
314
+ - Inspired by [zustand-x](https://github.com/udecode/zustand-x)
315
+
316
+ ---
317
+
318
+ ## ๐Ÿ“˜ License
319
+
320
+ MIT โ€” free to use, extend, and improve.
321
+
322
+ ---
323
+
324
+ ## ๐Ÿค Contributing
325
+
326
+ Pull requests, feedback, and ideas are welcome!
327
+ If you'd like to publish your own plugins, we recommend namespacing them under:
328
+
329
+ ```
330
+ zustand-lite/plugin-*
331
+ ```
332
+
333
+ or adding them to the main repository under the plugins directory.
334
+
335
+ ---
package/dist/index.d.mts CHANGED
@@ -72,7 +72,7 @@ declare function createStore<T extends State, Plugins extends StoreApiPluginList
72
72
  devtools?: true | DevtoolsOptions;
73
73
  persist?: true | PersistOptions<any>;
74
74
  };
75
- }): StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>>;
75
+ }): Plugins extends [] ? StoreApi<T> : StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>>;
76
76
 
77
77
  type PluginResetSetters = {
78
78
  reset: () => void;
package/dist/index.d.ts CHANGED
@@ -72,7 +72,7 @@ declare function createStore<T extends State, Plugins extends StoreApiPluginList
72
72
  devtools?: true | DevtoolsOptions;
73
73
  persist?: true | PersistOptions<any>;
74
74
  };
75
- }): StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>>;
75
+ }): Plugins extends [] ? StoreApi<T> : StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>>;
76
76
 
77
77
  type PluginResetSetters = {
78
78
  reset: () => void;
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var m=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var b=(t,e)=>{for(var o in e)m(t,o,{get:e[o],enumerable:!0})},j=(t,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of O(e))!v.call(t,r)&&r!==o&&m(t,r,{get:()=>e[r],enumerable:!(s=D(e,r))||s.enumerable});return t};var k=t=>j(m({},"__esModule",{value:!0}),t);var w={};b(w,{createStore:()=>P,reset:()=>E});module.exports=k(w);var u=require("zustand/middleware"),B=require("zustand/vanilla");function K(){return new Error()?.stack?.split(`
2
- `)[3].trim().split(" ")[1].split(".")[1]??"setState"}function p(t,e){return{...t,setState:(o,s,r)=>{let n=t.setState;n(o,s,e?r??{type:K(),payload:o}:void 0)}}}function l(t){let e={},o=t.getState();return Object.keys(o).forEach(s=>{e[s]=()=>t.getState()[s]}),Object.getOwnPropertySymbols(o).forEach(s=>{e[s]=()=>t.getState()[s]}),e}function f(t,e){let o={};return Object.keys(t.getState()).forEach(s=>{o[s]=r=>{if(t.getState()[s]===r)return;let n=t.setState;n(a=>({...a,[s]:r}),!1,e?{type:s,payload:{[s]:r}}:void 0)}}),o}var c=require("zustand/shallow"),g=require("zustand/traditional");function T(t){let e={};return Object.keys(t.getState()).forEach(o=>{e[o]=(s=c.shallow)=>(0,g.useStoreWithEqualityFn)(t,r=>r[o],s)}),e}var x=require("zustand/shallow"),y=require("zustand/traditional");function G(t,e){let o={...e.use},s={...e.get};return Object.keys(t(e)).forEach(r=>{o[r]=(...n)=>(0,y.useStoreWithEqualityFn)(e.api,()=>t(e)[r](...n),x.shallow),s[r]=(...n)=>t(e)[r](...n)}),{...e,get:s,use:o}}function A(t,e){return{...e,set:{...e.set,...t(e)}}}function R(t,e,o){return{api:o.api,set:o.set,use:o.use,get:Object.keys(o.get).reduce((s,r)=>e[r]&&t.includes(r)?s:{...s,[r]:o.get[r]},{})}}function P(t,e){let{name:o="zustand-lite",plugins:s=[],middlewares:r={}}=e??{},n=t;s.forEach(i=>{i.creates&&(n={...n,...i.creates()})});let a=()=>n;r.devtools&&(a=(0,u.devtools)(a,r.devtools===!0?{name:"zustand-lite",store:o}:r.devtools)),r.persist&&(a=(0,u.persist)(a,r.persist===!0?{name:o}:r.persist));let S=(0,B.createStore)(a),d={api:p(S,!!r.devtools),get:l(S),set:f(S,!!r.devtools),use:T(S),extendGetters(i){return G(i,this)},extendSetters(i){return A(i,this)},restrictState(i=[]){return R(i,n,this)}};return s.forEach(i=>{i.extends&&(d=i.extends(d))}),d}var E={extends:t=>t.extendSetters(({api:e})=>({reset:()=>{let o=e.getInitialState?.()??{};e.setState(()=>o,!0)}}))};0&&(module.exports={createStore,reset});
1
+ "use strict";var p=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var b=(t,e)=>{for(var o in e)p(t,o,{get:e[o],enumerable:!0})},j=(t,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of O(e))!v.call(t,r)&&r!==o&&p(t,r,{get:()=>e[r],enumerable:!(s=D(e,r))||s.enumerable});return t};var k=t=>j(p({},"__esModule",{value:!0}),t);var w={};b(w,{createStore:()=>B,reset:()=>E});module.exports=k(w);var u=require("zustand/middleware"),R=require("zustand/vanilla");function K(){return new Error()?.stack?.split(`
2
+ `)[3].trim().split(" ")[1].split(".")[1]??"setState"}function m(t,e){return{...t,setState:(o,s,r)=>{t.setState(o,s,e?{type:r??K(),payload:o}:void 0)}}}function l(t){let e={},o=t.getState();return Object.keys(o).forEach(s=>{e[s]=()=>t.getState()[s]}),Object.getOwnPropertySymbols(o).forEach(s=>{e[s]=()=>t.getState()[s]}),e}function f(t,e){let o={};return Object.keys(t.getState()).forEach(s=>{o[s]=r=>{t.getState()[s]!==r&&t.setState(i=>({...i,[s]:r}),!1,e?{type:s,payload:{[s]:r}}:void 0)}}),o}var c=require("zustand/shallow"),g=require("zustand/traditional");function T(t){let e={};return Object.keys(t.getState()).forEach(o=>{e[o]=(s=c.shallow)=>(0,g.useStoreWithEqualityFn)(t,r=>r[o],s)}),e}var x=require("zustand/shallow"),y=require("zustand/traditional");function A(t,e){let o={...e.use},s={...e.get};return Object.keys(t(e)).forEach(r=>{o[r]=(...i)=>(0,y.useStoreWithEqualityFn)(e.api,()=>t(e)[r](...i),x.shallow),s[r]=(...i)=>t(e)[r](...i)}),{...e,get:s,use:o}}function G(t,e){return{...e,set:{...e.set,...t(e)}}}function P(t,e,o){return{api:o.api,set:o.set,use:o.use,get:Object.keys(o.get).reduce((s,r)=>e[r]&&t.includes(r)?s:{...s,[r]:o.get[r]},{})}}function B(t,e){let{name:o="zustand-lite",plugins:s=[],middlewares:r={}}=e??{},i=t;s.forEach(n=>{n.creates&&(i={...i,...n.creates()})});let a=()=>i;r.devtools&&(a=(0,u.devtools)(a,r.devtools===!0?{name:"zustand-lite",store:o}:r.devtools)),r.persist&&(a=(0,u.persist)(a,r.persist===!0?{name:o}:r.persist));let S=(0,R.createStore)(a),d={api:m(S,!!r.devtools),get:l(S),set:f(S,!!r.devtools),use:T(S),extendGetters(n){return A(n,this)},extendSetters(n){return G(n,this)},restrictState(n=[]){return P(n,i,this)}};return s.forEach(n=>{n.extends&&(d=n.extends(d))}),d}var E={extends:t=>t.extendSetters(({api:e})=>({reset:()=>{let o=e.getInitialState?.()??{};e.setState(()=>o,!0)}}))};0&&(module.exports={createStore,reset});
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/createStore.ts","../src/lib/generateApi.ts","../src/lib/generateGet.ts","../src/lib/generateSet.ts","../src/lib/generateUse.ts","../src/lib/extendGetters.ts","../src/lib/extendSetters.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["export type { StoreApiPlugin } from './types'\nexport { createStore } from './lib/createStore';\nexport { reset } from './plugins/reset'\n","/**\n * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party\n * zustand-x repository: https://github.com/udecode/zustand-x.\n **/\nimport { DevtoolsOptions, PersistOptions, devtools, persist } from 'zustand/middleware';\nimport { createStore as createVanillaStore } from 'zustand/vanilla';\n\nimport {\n AugmentedApiData,\n AugmentedGetters,\n AugmentedSetters,\n GettersBuilder,\n SettersBuilder,\n State,\n StoreApi,\n StoreApiPluginList,\n} from '../types';\nimport { generateApi } from \"./generateApi\";\nimport { generateGet } from './generateGet';\nimport { generateSet } from './generateSet';\nimport { generateUse } from './generateUse';\nimport { extendGetters } from './extendGetters';\nimport { extendSetters } from './extendSetters';\nimport { restrictState } from './restrictState';\n\nexport function createStore<T extends State, Plugins extends StoreApiPluginList = []>(\n initialState: T,\n options?: {\n name?: string;\n plugins?: [...Plugins];\n middlewares?: {\n devtools?: true | DevtoolsOptions;\n persist?: true | PersistOptions<any>;\n };\n },\n): StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>> {\n const { name = 'zustand-lite', plugins = [], middlewares = {} } = options ?? {};\n\n // Merge state from plugins to be available for future use.\n let mergedState: any = initialState;\n plugins.forEach(plugin => {\n if (plugin.creates) {\n mergedState = { ...mergedState, ...plugin.creates() };\n }\n });\n\n // Apply supported middlewares.\n let initializer: any = () => mergedState;\n\n if (middlewares.devtools) {\n initializer = devtools(\n initializer,\n middlewares.devtools === true ? { name: 'zustand-lite', store: name } : middlewares.devtools,\n );\n }\n\n if (middlewares.persist) {\n initializer = persist(\n initializer,\n middlewares.persist === true ? { name } : middlewares.persist,\n );\n }\n\n // Create a vanilla zustand store to wrap.\n const storeApi: any = createVanillaStore(initializer);\n\n // Create zustand-lite wrapper.\n let store: any = {\n api: generateApi(storeApi, !!middlewares.devtools),\n get: generateGet(storeApi),\n set: generateSet(storeApi, !!middlewares.devtools),\n use: generateUse(storeApi),\n extendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n return extendGetters(builder, this);\n },\n extendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n return extendSetters(builder, this);\n },\n restrictState<Key extends keyof T>(publicState: Key[] = []) {\n return restrictState(\n publicState,\n mergedState,\n this as StoreApi<\n AugmentedApiData<T, Plugins>,\n AugmentedGetters<Plugins>,\n AugmentedSetters<Plugins>\n >,\n );\n },\n };\n\n // Extend store getters and setters with plugins.\n plugins.forEach(plugin => {\n if (plugin.extends) {\n store = plugin.extends(store);\n }\n });\n\n return store;\n}\n","import { NamedSet } from 'zustand/middleware/devtools';\nimport { StoreApi } from 'zustand/vanilla';\n\nimport { State } from '../types';\n\nfunction logFunctionName() {\n return new Error()?.stack?.split('\\n')[3].trim().split(' ')[1].split('.')[1] ?? 'setState';\n}\n\nexport function generateApi<T extends State>(\n api: StoreApi<T>,\n hasDevtools: boolean,\n) {\n return {\n ...api,\n setState: (newState: T | ((state: T) => T), replace?: false, name?: string) => {\n const setState = api.setState as NamedSet<T>;\n setState(\n newState,\n replace,\n hasDevtools\n ? (name ?? { type: logFunctionName(), payload: newState })\n : undefined,\n );\n },\n };\n}\n","import { StoreApi } from 'zustand/vanilla';\n\nimport { GetRecord, State } from '../types';\n\nexport function generateGet<T extends State>(api: StoreApi<T>) {\n const getters: GetRecord<T> = {} as GetRecord<T>;\n\n const initialState = api.getState();\n\n Object.keys(initialState).forEach(key => {\n getters[key as keyof T] = () => api.getState()[key as keyof T];\n });\n\n Object.getOwnPropertySymbols(initialState).forEach(symbol => {\n getters[symbol as keyof T] = () => api.getState()[symbol as keyof T];\n });\n\n return getters;\n}\n","import { NamedSet } from 'zustand/middleware/devtools';\nimport { StoreApi } from 'zustand/vanilla';\n\nimport { SetRecord, State } from '../types';\n\nexport function generateSet<T extends State>(\n api: StoreApi<T>,\n hasDevtools: boolean,\n): SetRecord<T> {\n const setters: SetRecord<T> = {} as SetRecord<T>;\n\n Object.keys(api.getState()).forEach(key => {\n setters[key as keyof T] = (value: any) => {\n if (api.getState()[key] === value) {\n return;\n }\n\n const setState = api.setState as NamedSet<T>;\n setState(\n state => ({\n ...state,\n [key]: value,\n }),\n false,\n hasDevtools ? { type: key, payload: { [key]: value } } : undefined,\n );\n };\n });\n\n return setters;\n}\n","import { shallow } from 'zustand/shallow';\nimport { useStoreWithEqualityFn } from 'zustand/traditional';\n\nimport { StoreApi } from 'zustand';\n\nimport { EqualityChecker, GetRecord, State } from '../types';\n\nexport function generateUse<T extends State>(api: StoreApi<T>) {\n const getters: GetRecord<T> = {} as GetRecord<T>;\n\n Object.keys(api.getState()).forEach(key => {\n getters[key as keyof T] = (equalityFn: EqualityChecker<T[keyof T]> = shallow) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useStoreWithEqualityFn(api, (state: T) => state[key as keyof T], equalityFn);\n };\n });\n\n return getters;\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { Default, GettersBuilder, State, StoreApi } from '../types'\n\nexport function extendGetters<\n Builder extends GettersBuilder<T, Getters, Setters>,\n T extends State = Default,\n Getters = Default,\n Setters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n const use = { ...thisApi.use };\n const get = { ...thisApi.get };\n\n Object.keys(builder(thisApi)).forEach(key => {\n // @ts-ignore\n use[key] = (...args: any[]) =>\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useStoreWithEqualityFn(\n thisApi.api,\n () => {\n return builder(thisApi)[key](...args);\n },\n shallow,\n );\n\n // @ts-ignore\n get[key] = (...args: any[]) => {\n return builder(thisApi)[key](...args);\n };\n });\n\n return {\n ...thisApi,\n get,\n use,\n } as StoreApi<T, Getters & ReturnType<Builder>, Setters>;\n}\n","import { Default, SettersBuilder, State, StoreApi } from '../types'\n\nexport function extendSetters<\n Builder extends SettersBuilder<T, Getters, Setters>,\n T extends State = Default,\n Getters = Default,\n Setters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n return {\n ...thisApi,\n set: {\n ...thisApi.set,\n ...builder(thisApi),\n },\n } as StoreApi<T, Getters, Setters & ReturnType<Builder>>\n}\n","import { Empty, GetRecord, SetRecord, State, StoreApi, StoreApiEncapsulated } from '../types';\n\nexport function restrictState<\n T extends State,\n Key extends keyof T,\n Getters extends GetRecord<any> = Empty,\n Setters extends SetRecord<any> = Empty,\n>(privateState: Key[], mergedState: T, thisApi: StoreApi<T, Getters, Setters>) {\n return {\n api: thisApi.api,\n set: thisApi.set,\n use: thisApi.use,\n get: Object.keys(thisApi.get).reduce(\n (acc, key) =>\n mergedState[key] && (privateState as string[]).includes(key)\n ? acc\n : {\n ...acc,\n [key]: thisApi.get[key],\n },\n {},\n ) as GetRecord<Omit<T, Key>> & Getters,\n } as StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>;\n}\n","import { StoreApiPlugin } from '../types';\n\ntype PluginResetSetters = {\n reset: () => void;\n};\n\nexport const reset: StoreApiPlugin<{}, {}, PluginResetSetters> = {\n extends: store => {\n return store.extendSetters(({ api }) => ({\n reset: () => {\n const initialState = api.getInitialState?.() ?? {};\n api.setState(() => initialState, true);\n },\n }));\n },\n};\n"],"mappings":"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","names":["index_exports","__export","createStore","reset","__toCommonJS","import_middleware","import_vanilla","logFunctionName","generateApi","api","hasDevtools","newState","replace","name","setState","generateGet","api","getters","initialState","key","symbol","generateSet","api","hasDevtools","setters","key","value","setState","state","import_shallow","import_traditional","generateUse","api","getters","key","equalityFn","state","import_shallow","import_traditional","extendGetters","builder","thisApi","use","get","key","args","extendSetters","builder","thisApi","restrictState","privateState","mergedState","thisApi","acc","key","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","storeApi","createVanillaStore","store","generateApi","generateGet","generateSet","generateUse","builder","extendGetters","extendSetters","publicState","restrictState","reset","store","api","initialState"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/createStore.ts","../src/lib/generateApi.ts","../src/lib/generateGet.ts","../src/lib/generateSet.ts","../src/lib/generateUse.ts","../src/lib/extendGetters.ts","../src/lib/extendSetters.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["export type { StoreApiPlugin } from './types'\nexport { createStore } from './lib/createStore';\nexport { reset } from './plugins/reset'\n","/**\n * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party\n * zustand-x repository: https://github.com/udecode/zustand-x.\n **/\nimport { DevtoolsOptions, PersistOptions, devtools, persist } from 'zustand/middleware'\nimport { createStore as createVanillaStore } from 'zustand/vanilla'\n\nimport {\n\tAugmentedApiData,\n\tAugmentedGetters,\n\tAugmentedSetters,\n\tGettersBuilder,\n\tSettersBuilder,\n\tState,\n\tStoreApi,\n\tStoreApiPluginList,\n} from '../types'\nimport { generateApi } from './generateApi'\nimport { generateGet } from './generateGet'\nimport { generateSet } from './generateSet'\nimport { generateUse } from './generateUse'\nimport { extendGetters } from './extendGetters'\nimport { extendSetters } from './extendSetters'\nimport { restrictState } from './restrictState'\n\nexport function createStore<T extends State, Plugins extends StoreApiPluginList = []>(\n\tinitialState: T,\n\toptions?: {\n\t\tname?: string\n\t\tplugins?: [...Plugins]\n\t\tmiddlewares?: { devtools?: true | DevtoolsOptions; persist?: true | PersistOptions<any> }\n\t}\n): Plugins extends []\n\t? StoreApi<T>\n\t: StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>> {\n\tconst { name = 'zustand-lite', plugins = [], middlewares = {} } = options ?? {}\n\n\t// Merge state from plugins to be available for future use.\n\tlet mergedState: any = initialState\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.creates) {\n\t\t\tmergedState = { ...mergedState, ...plugin.creates() }\n\t\t}\n\t})\n\n\t// Apply supported middlewares.\n\tlet initializer: any = () => mergedState\n\n\tif (middlewares.devtools) {\n\t\tinitializer = devtools(\n\t\t\tinitializer,\n\t\t\tmiddlewares.devtools === true\n\t\t\t\t? { name: 'zustand-lite', store: name }\n\t\t\t\t: middlewares.devtools\n\t\t)\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(\n\t\t\tinitializer,\n\t\t\tmiddlewares.persist === true ? { name } : middlewares.persist\n\t\t)\n\t}\n\n\t// Create a vanilla zustand store to wrap.\n\tconst storeApi: any = createVanillaStore(initializer)\n\n\t// Create zustand-lite wrapper.\n\tlet store: any = {\n\t\tapi: generateApi(storeApi, !!middlewares.devtools),\n\t\tget: generateGet(storeApi),\n\t\tset: generateSet(storeApi, !!middlewares.devtools),\n\t\tuse: generateUse(storeApi),\n\t\textendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendGetters(builder, this)\n\t\t},\n\t\textendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendSetters(builder, this)\n\t\t},\n\t\trestrictState<Key extends keyof T>(publicState: Key[] = []) {\n\t\t\treturn restrictState(\n\t\t\t\tpublicState,\n\t\t\t\tmergedState,\n\t\t\t\tthis as StoreApi<\n\t\t\t\t\tAugmentedApiData<T, Plugins>,\n\t\t\t\t\tAugmentedGetters<Plugins>,\n\t\t\t\t\tAugmentedSetters<Plugins>\n\t\t\t\t>\n\t\t\t)\n\t\t},\n\t}\n\n\t// Extend store getters and setters with plugins.\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.extends) {\n\t\t\tstore = plugin.extends(store)\n\t\t}\n\t})\n\n\treturn store\n}\n","import { StoreApi } from 'zustand/vanilla'\n\nimport { State } from '../types'\n\nfunction setterName() {\n\treturn new Error()?.stack?.split('\\n')[3].trim().split(' ')[1].split('.')[1] ?? 'setState'\n}\n\n/**\n * Required to wrap original Zustand setState function with default devtools action name.\n * @param api Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateApi<T extends State>(api: StoreApi<T>, hasDevtools: boolean) {\n\treturn {\n\t\t...api,\n\t\tsetState: (newState: T | ((state: T) => T), replace?: boolean, name?: string) => {\n\t\t\tapi.setState(\n\t\t\t\tnewState,\n\t\t\t\treplace,\n\t\t\t\t// @ts-ignore Additional parameter will have no effect even if devtools are disabled.\n\t\t\t\thasDevtools ? { type: name ?? setterName(), payload: newState } : undefined\n\t\t\t)\n\t\t},\n\t}\n}\n","import { StoreApi } from 'zustand/vanilla'\n\nimport { GetRecord, State } from '../types'\n\n/**\n * Generates automatic getters like store.get.foo()\n * @param api Zustand api interface\n */\nexport function generateGet<T extends State>(api: StoreApi<T>) {\n\tconst getters: GetRecord<T> = {} as GetRecord<T>\n\n\tconst initialState = api.getState()\n\n\tObject.keys(initialState).forEach((key) => {\n\t\tgetters[key as keyof T] = () => api.getState()[key as keyof T]\n\t})\n\n\tObject.getOwnPropertySymbols(initialState).forEach((symbol) => {\n\t\tgetters[symbol as keyof T] = () => api.getState()[symbol as keyof T]\n\t})\n\n\treturn getters\n}\n","import { NamedSet } from 'zustand/middleware/devtools'\nimport { StoreApi } from 'zustand/vanilla'\n\nimport { SetRecord, State } from '../types'\n\n/**\n * Generates automatic setters like store.set.foo(value)\n * @param api Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateSet<T extends State>(api: StoreApi<T>, hasDevtools: boolean): SetRecord<T> {\n\tconst setters: SetRecord<T> = {} as SetRecord<T>\n\n\tObject.keys(api.getState()).forEach((key) => {\n\t\tsetters[key as keyof T] = (value: any) => {\n\t\t\tif (api.getState()[key] === value) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tapi.setState(\n\t\t\t\t(state) => ({ ...state, [key]: value }),\n\t\t\t\tfalse,\n\t\t\t\t// @ts-ignore Additional parameter will have no effect even if devtools are disabled.\n\t\t\t\thasDevtools ? { type: key, payload: { [key]: value } } : undefined\n\t\t\t)\n\t\t}\n\t})\n\n\treturn setters\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { StoreApi } from 'zustand'\n\nimport { EqualityChecker, State, UseRecord } from '../types'\n\n/**\n * Generates automatic getters like store.use.foo()\n * @param api Zustand api interface\n */\nexport function generateUse<T extends State>(api: StoreApi<T>) {\n\tconst getters: UseRecord<T> = {} as UseRecord<T>\n\n\t// All of these wrappers are hooks and should obey the rule of hooks.\n\tObject.keys(api.getState()).forEach((key) => {\n\t\tgetters[key as keyof T] = (equalityFn: EqualityChecker<T[keyof T]> = shallow) => {\n\t\t\treturn useStoreWithEqualityFn(api, (state: T) => state[key as keyof T], equalityFn)\n\t\t}\n\t})\n\n\treturn getters\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { Default, GettersBuilder, State, StoreApi } from '../types'\n\nexport function extendGetters<\n\tBuilder extends GettersBuilder<T, Getters, Setters>,\n\tT extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n\tconst use = { ...thisApi.use }\n\tconst get = { ...thisApi.get }\n\n\tObject.keys(builder(thisApi)).forEach((key) => {\n\t\t// @ts-ignore\n\t\tuse[key] = (...args: any[]) =>\n\t\t\tuseStoreWithEqualityFn(\n\t\t\t\tthisApi.api,\n\t\t\t\t() => {\n\t\t\t\t\treturn builder(thisApi)[key](...args)\n\t\t\t\t},\n\t\t\t\tshallow\n\t\t\t)\n\n\t\t// @ts-ignore\n\t\tget[key] = (...args: any[]) => {\n\t\t\treturn builder(thisApi)[key](...args)\n\t\t}\n\t})\n\n\treturn { ...thisApi, get, use } as StoreApi<T, Getters & ReturnType<Builder>, Setters>\n}\n","import { Default, SettersBuilder, State, StoreApi } from '../types'\n\nexport function extendSetters<\n\tBuilder extends SettersBuilder<T, Getters, Setters>,\n\tT extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n\treturn { ...thisApi, set: { ...thisApi.set, ...builder(thisApi) } } as StoreApi<\n\t\tT,\n\t\tGetters,\n\t\tSetters & ReturnType<Builder>\n\t>\n}\n","import { Empty, GetRecord, SetRecord, State, StoreApi, StoreApiEncapsulated } from '../types'\n\nexport function restrictState<\n\tT extends State,\n\tKey extends keyof T,\n\tGetters extends GetRecord<any> = Empty,\n\tSetters extends SetRecord<any> = Empty,\n>(privateState: Key[], mergedState: T, thisApi: StoreApi<T, Getters, Setters>) {\n\treturn {\n\t\tapi: thisApi.api,\n\t\tset: thisApi.set,\n\t\tuse: thisApi.use,\n\t\tget: Object.keys(thisApi.get).reduce(\n\t\t\t(acc, key) =>\n\t\t\t\tmergedState[key] && (privateState as string[]).includes(key)\n\t\t\t\t\t? acc\n\t\t\t\t\t: { ...acc, [key]: thisApi.get[key] },\n\t\t\t{}\n\t\t) as GetRecord<Omit<T, Key>> & Getters,\n\t} as StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>\n}\n","import { StoreApiPlugin } from '../types'\n\ntype PluginResetSetters = { reset: () => void }\n\nexport const reset: StoreApiPlugin<{}, {}, PluginResetSetters> = {\n\textends: (store) => {\n\t\treturn store.extendSetters(({ api }) => ({\n\t\t\treset: () => {\n\t\t\t\tconst initialState = api.getInitialState?.() ?? {}\n\t\t\t\tapi.setState(() => initialState, true)\n\t\t\t},\n\t\t}))\n\t},\n}\n"],"mappings":"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","names":["index_exports","__export","createStore","reset","__toCommonJS","import_middleware","import_vanilla","setterName","generateApi","api","hasDevtools","newState","replace","name","generateGet","api","getters","initialState","key","symbol","generateSet","api","hasDevtools","setters","key","value","state","import_shallow","import_traditional","generateUse","api","getters","key","equalityFn","state","import_shallow","import_traditional","extendGetters","builder","thisApi","use","get","key","args","extendSetters","builder","thisApi","restrictState","privateState","mergedState","thisApi","acc","key","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","storeApi","createVanillaStore","store","generateApi","generateGet","generateSet","generateUse","builder","extendGetters","extendSetters","publicState","restrictState","reset","store","api","initialState"]}
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import{devtools as R,persist as B}from"zustand/middleware";import{createStore as P}from"zustand/vanilla";function T(){return new Error()?.stack?.split(`
2
- `)[3].trim().split(" ")[1].split(".")[1]??"setState"}function d(r,e){return{...r,setState:(o,s,t)=>{let n=r.setState;n(o,s,e?t??{type:T(),payload:o}:void 0)}}}function m(r){let e={},o=r.getState();return Object.keys(o).forEach(s=>{e[s]=()=>r.getState()[s]}),Object.getOwnPropertySymbols(o).forEach(s=>{e[s]=()=>r.getState()[s]}),e}function p(r,e){let o={};return Object.keys(r.getState()).forEach(s=>{o[s]=t=>{if(r.getState()[s]===t)return;let n=r.setState;n(a=>({...a,[s]:t}),!1,e?{type:s,payload:{[s]:t}}:void 0)}}),o}import{shallow as x}from"zustand/shallow";import{useStoreWithEqualityFn as y}from"zustand/traditional";function l(r){let e={};return Object.keys(r.getState()).forEach(o=>{e[o]=(s=x)=>y(r,t=>t[o],s)}),e}import{shallow as G}from"zustand/shallow";import{useStoreWithEqualityFn as A}from"zustand/traditional";function f(r,e){let o={...e.use},s={...e.get};return Object.keys(r(e)).forEach(t=>{o[t]=(...n)=>A(e.api,()=>r(e)[t](...n),G),s[t]=(...n)=>r(e)[t](...n)}),{...e,get:s,use:o}}function c(r,e){return{...e,set:{...e.set,...r(e)}}}function g(r,e,o){return{api:o.api,set:o.set,use:o.use,get:Object.keys(o.get).reduce((s,t)=>e[t]&&r.includes(t)?s:{...s,[t]:o.get[t]},{})}}function E(r,e){let{name:o="zustand-lite",plugins:s=[],middlewares:t={}}=e??{},n=r;s.forEach(i=>{i.creates&&(n={...n,...i.creates()})});let a=()=>n;t.devtools&&(a=R(a,t.devtools===!0?{name:"zustand-lite",store:o}:t.devtools)),t.persist&&(a=B(a,t.persist===!0?{name:o}:t.persist));let S=P(a),u={api:d(S,!!t.devtools),get:m(S),set:p(S,!!t.devtools),use:l(S),extendGetters(i){return f(i,this)},extendSetters(i){return c(i,this)},restrictState(i=[]){return g(i,n,this)}};return s.forEach(i=>{i.extends&&(u=i.extends(u))}),u}var D={extends:r=>r.extendSetters(({api:e})=>({reset:()=>{let o=e.getInitialState?.()??{};e.setState(()=>o,!0)}}))};export{E as createStore,D as reset};
1
+ import{devtools as P,persist as R}from"zustand/middleware";import{createStore as B}from"zustand/vanilla";function T(){return new Error()?.stack?.split(`
2
+ `)[3].trim().split(" ")[1].split(".")[1]??"setState"}function d(r,e){return{...r,setState:(o,s,t)=>{r.setState(o,s,e?{type:t??T(),payload:o}:void 0)}}}function p(r){let e={},o=r.getState();return Object.keys(o).forEach(s=>{e[s]=()=>r.getState()[s]}),Object.getOwnPropertySymbols(o).forEach(s=>{e[s]=()=>r.getState()[s]}),e}function m(r,e){let o={};return Object.keys(r.getState()).forEach(s=>{o[s]=t=>{r.getState()[s]!==t&&r.setState(i=>({...i,[s]:t}),!1,e?{type:s,payload:{[s]:t}}:void 0)}}),o}import{shallow as x}from"zustand/shallow";import{useStoreWithEqualityFn as y}from"zustand/traditional";function l(r){let e={};return Object.keys(r.getState()).forEach(o=>{e[o]=(s=x)=>y(r,t=>t[o],s)}),e}import{shallow as A}from"zustand/shallow";import{useStoreWithEqualityFn as G}from"zustand/traditional";function f(r,e){let o={...e.use},s={...e.get};return Object.keys(r(e)).forEach(t=>{o[t]=(...i)=>G(e.api,()=>r(e)[t](...i),A),s[t]=(...i)=>r(e)[t](...i)}),{...e,get:s,use:o}}function c(r,e){return{...e,set:{...e.set,...r(e)}}}function g(r,e,o){return{api:o.api,set:o.set,use:o.use,get:Object.keys(o.get).reduce((s,t)=>e[t]&&r.includes(t)?s:{...s,[t]:o.get[t]},{})}}function E(r,e){let{name:o="zustand-lite",plugins:s=[],middlewares:t={}}=e??{},i=r;s.forEach(n=>{n.creates&&(i={...i,...n.creates()})});let a=()=>i;t.devtools&&(a=P(a,t.devtools===!0?{name:"zustand-lite",store:o}:t.devtools)),t.persist&&(a=R(a,t.persist===!0?{name:o}:t.persist));let S=B(a),u={api:d(S,!!t.devtools),get:p(S),set:m(S,!!t.devtools),use:l(S),extendGetters(n){return f(n,this)},extendSetters(n){return c(n,this)},restrictState(n=[]){return g(n,i,this)}};return s.forEach(n=>{n.extends&&(u=n.extends(u))}),u}var D={extends:r=>r.extendSetters(({api:e})=>({reset:()=>{let o=e.getInitialState?.()??{};e.setState(()=>o,!0)}}))};export{E as createStore,D as reset};
3
3
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/createStore.ts","../src/lib/generateApi.ts","../src/lib/generateGet.ts","../src/lib/generateSet.ts","../src/lib/generateUse.ts","../src/lib/extendGetters.ts","../src/lib/extendSetters.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["/**\n * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party\n * zustand-x repository: https://github.com/udecode/zustand-x.\n **/\nimport { DevtoolsOptions, PersistOptions, devtools, persist } from 'zustand/middleware';\nimport { createStore as createVanillaStore } from 'zustand/vanilla';\n\nimport {\n AugmentedApiData,\n AugmentedGetters,\n AugmentedSetters,\n GettersBuilder,\n SettersBuilder,\n State,\n StoreApi,\n StoreApiPluginList,\n} from '../types';\nimport { generateApi } from \"./generateApi\";\nimport { generateGet } from './generateGet';\nimport { generateSet } from './generateSet';\nimport { generateUse } from './generateUse';\nimport { extendGetters } from './extendGetters';\nimport { extendSetters } from './extendSetters';\nimport { restrictState } from './restrictState';\n\nexport function createStore<T extends State, Plugins extends StoreApiPluginList = []>(\n initialState: T,\n options?: {\n name?: string;\n plugins?: [...Plugins];\n middlewares?: {\n devtools?: true | DevtoolsOptions;\n persist?: true | PersistOptions<any>;\n };\n },\n): StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>> {\n const { name = 'zustand-lite', plugins = [], middlewares = {} } = options ?? {};\n\n // Merge state from plugins to be available for future use.\n let mergedState: any = initialState;\n plugins.forEach(plugin => {\n if (plugin.creates) {\n mergedState = { ...mergedState, ...plugin.creates() };\n }\n });\n\n // Apply supported middlewares.\n let initializer: any = () => mergedState;\n\n if (middlewares.devtools) {\n initializer = devtools(\n initializer,\n middlewares.devtools === true ? { name: 'zustand-lite', store: name } : middlewares.devtools,\n );\n }\n\n if (middlewares.persist) {\n initializer = persist(\n initializer,\n middlewares.persist === true ? { name } : middlewares.persist,\n );\n }\n\n // Create a vanilla zustand store to wrap.\n const storeApi: any = createVanillaStore(initializer);\n\n // Create zustand-lite wrapper.\n let store: any = {\n api: generateApi(storeApi, !!middlewares.devtools),\n get: generateGet(storeApi),\n set: generateSet(storeApi, !!middlewares.devtools),\n use: generateUse(storeApi),\n extendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n return extendGetters(builder, this);\n },\n extendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n return extendSetters(builder, this);\n },\n restrictState<Key extends keyof T>(publicState: Key[] = []) {\n return restrictState(\n publicState,\n mergedState,\n this as StoreApi<\n AugmentedApiData<T, Plugins>,\n AugmentedGetters<Plugins>,\n AugmentedSetters<Plugins>\n >,\n );\n },\n };\n\n // Extend store getters and setters with plugins.\n plugins.forEach(plugin => {\n if (plugin.extends) {\n store = plugin.extends(store);\n }\n });\n\n return store;\n}\n","import { NamedSet } from 'zustand/middleware/devtools';\nimport { StoreApi } from 'zustand/vanilla';\n\nimport { State } from '../types';\n\nfunction logFunctionName() {\n return new Error()?.stack?.split('\\n')[3].trim().split(' ')[1].split('.')[1] ?? 'setState';\n}\n\nexport function generateApi<T extends State>(\n api: StoreApi<T>,\n hasDevtools: boolean,\n) {\n return {\n ...api,\n setState: (newState: T | ((state: T) => T), replace?: false, name?: string) => {\n const setState = api.setState as NamedSet<T>;\n setState(\n newState,\n replace,\n hasDevtools\n ? (name ?? { type: logFunctionName(), payload: newState })\n : undefined,\n );\n },\n };\n}\n","import { StoreApi } from 'zustand/vanilla';\n\nimport { GetRecord, State } from '../types';\n\nexport function generateGet<T extends State>(api: StoreApi<T>) {\n const getters: GetRecord<T> = {} as GetRecord<T>;\n\n const initialState = api.getState();\n\n Object.keys(initialState).forEach(key => {\n getters[key as keyof T] = () => api.getState()[key as keyof T];\n });\n\n Object.getOwnPropertySymbols(initialState).forEach(symbol => {\n getters[symbol as keyof T] = () => api.getState()[symbol as keyof T];\n });\n\n return getters;\n}\n","import { NamedSet } from 'zustand/middleware/devtools';\nimport { StoreApi } from 'zustand/vanilla';\n\nimport { SetRecord, State } from '../types';\n\nexport function generateSet<T extends State>(\n api: StoreApi<T>,\n hasDevtools: boolean,\n): SetRecord<T> {\n const setters: SetRecord<T> = {} as SetRecord<T>;\n\n Object.keys(api.getState()).forEach(key => {\n setters[key as keyof T] = (value: any) => {\n if (api.getState()[key] === value) {\n return;\n }\n\n const setState = api.setState as NamedSet<T>;\n setState(\n state => ({\n ...state,\n [key]: value,\n }),\n false,\n hasDevtools ? { type: key, payload: { [key]: value } } : undefined,\n );\n };\n });\n\n return setters;\n}\n","import { shallow } from 'zustand/shallow';\nimport { useStoreWithEqualityFn } from 'zustand/traditional';\n\nimport { StoreApi } from 'zustand';\n\nimport { EqualityChecker, GetRecord, State } from '../types';\n\nexport function generateUse<T extends State>(api: StoreApi<T>) {\n const getters: GetRecord<T> = {} as GetRecord<T>;\n\n Object.keys(api.getState()).forEach(key => {\n getters[key as keyof T] = (equalityFn: EqualityChecker<T[keyof T]> = shallow) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useStoreWithEqualityFn(api, (state: T) => state[key as keyof T], equalityFn);\n };\n });\n\n return getters;\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { Default, GettersBuilder, State, StoreApi } from '../types'\n\nexport function extendGetters<\n Builder extends GettersBuilder<T, Getters, Setters>,\n T extends State = Default,\n Getters = Default,\n Setters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n const use = { ...thisApi.use };\n const get = { ...thisApi.get };\n\n Object.keys(builder(thisApi)).forEach(key => {\n // @ts-ignore\n use[key] = (...args: any[]) =>\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useStoreWithEqualityFn(\n thisApi.api,\n () => {\n return builder(thisApi)[key](...args);\n },\n shallow,\n );\n\n // @ts-ignore\n get[key] = (...args: any[]) => {\n return builder(thisApi)[key](...args);\n };\n });\n\n return {\n ...thisApi,\n get,\n use,\n } as StoreApi<T, Getters & ReturnType<Builder>, Setters>;\n}\n","import { Default, SettersBuilder, State, StoreApi } from '../types'\n\nexport function extendSetters<\n Builder extends SettersBuilder<T, Getters, Setters>,\n T extends State = Default,\n Getters = Default,\n Setters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n return {\n ...thisApi,\n set: {\n ...thisApi.set,\n ...builder(thisApi),\n },\n } as StoreApi<T, Getters, Setters & ReturnType<Builder>>\n}\n","import { Empty, GetRecord, SetRecord, State, StoreApi, StoreApiEncapsulated } from '../types';\n\nexport function restrictState<\n T extends State,\n Key extends keyof T,\n Getters extends GetRecord<any> = Empty,\n Setters extends SetRecord<any> = Empty,\n>(privateState: Key[], mergedState: T, thisApi: StoreApi<T, Getters, Setters>) {\n return {\n api: thisApi.api,\n set: thisApi.set,\n use: thisApi.use,\n get: Object.keys(thisApi.get).reduce(\n (acc, key) =>\n mergedState[key] && (privateState as string[]).includes(key)\n ? acc\n : {\n ...acc,\n [key]: thisApi.get[key],\n },\n {},\n ) as GetRecord<Omit<T, Key>> & Getters,\n } as StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>;\n}\n","import { StoreApiPlugin } from '../types';\n\ntype PluginResetSetters = {\n reset: () => void;\n};\n\nexport const reset: StoreApiPlugin<{}, {}, PluginResetSetters> = {\n extends: store => {\n return store.extendSetters(({ api }) => ({\n reset: () => {\n const initialState = api.getInitialState?.() ?? {};\n api.setState(() => initialState, true);\n },\n }));\n },\n};\n"],"mappings":"AAKA,OAA0C,YAAAA,EAAU,WAAAC,MAAe,qBACnE,OAAS,eAAeC,MAA0B,kBCDlD,SAASC,GAAkB,CACzB,OAAO,IAAI,MAAM,GAAG,OAAO,MAAM;AAAA,CAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,GAAK,UAClF,CAEO,SAASC,EACdC,EACAC,EACA,CACA,MAAO,CACL,GAAGD,EACH,SAAU,CAACE,EAAiCC,EAAiBC,IAAkB,CAC7E,IAAMC,EAAWL,EAAI,SACrBK,EACEH,EACAC,EACAF,EACKG,GAAQ,CAAE,KAAMN,EAAgB,EAAG,QAASI,CAAS,EACtD,MACN,CACF,CACF,CACF,CCtBO,SAASI,EAA6BC,EAAkB,CAC7D,IAAMC,EAAwB,CAAC,EAEzBC,EAAeF,EAAI,SAAS,EAElC,cAAO,KAAKE,CAAY,EAAE,QAAQC,GAAO,CACvCF,EAAQE,CAAc,EAAI,IAAMH,EAAI,SAAS,EAAEG,CAAc,CAC/D,CAAC,EAED,OAAO,sBAAsBD,CAAY,EAAE,QAAQE,GAAU,CAC3DH,EAAQG,CAAiB,EAAI,IAAMJ,EAAI,SAAS,EAAEI,CAAiB,CACrE,CAAC,EAEMH,CACT,CCbO,SAASI,EACdC,EACAC,EACc,CACd,IAAMC,EAAwB,CAAC,EAE/B,cAAO,KAAKF,EAAI,SAAS,CAAC,EAAE,QAAQG,GAAO,CACzCD,EAAQC,CAAc,EAAKC,GAAe,CACxC,GAAIJ,EAAI,SAAS,EAAEG,CAAG,IAAMC,EAC1B,OAGF,IAAMC,EAAWL,EAAI,SACrBK,EACEC,IAAU,CACR,GAAGA,EACH,CAACH,CAAG,EAAGC,CACT,GACA,GACAH,EAAc,CAAE,KAAME,EAAK,QAAS,CAAE,CAACA,CAAG,EAAGC,CAAM,CAAE,EAAI,MAC3D,CACF,CACF,CAAC,EAEMF,CACT,CC9BA,OAAS,WAAAK,MAAe,kBACxB,OAAS,0BAAAC,MAA8B,sBAMhC,SAASC,EAA6BC,EAAkB,CAC7D,IAAMC,EAAwB,CAAC,EAE/B,cAAO,KAAKD,EAAI,SAAS,CAAC,EAAE,QAAQE,GAAO,CACzCD,EAAQC,CAAc,EAAI,CAACC,EAA0CN,IAE5DC,EAAuBE,EAAMI,GAAaA,EAAMF,CAAc,EAAGC,CAAU,CAEtF,CAAC,EAEMF,CACT,CClBA,OAAS,WAAAI,MAAe,kBACxB,OAAS,0BAAAC,MAA8B,sBAIhC,SAASC,EAKdC,EAAkBC,EAAwC,CAC1D,IAAMC,EAAM,CAAE,GAAGD,EAAQ,GAAI,EACvBE,EAAM,CAAE,GAAGF,EAAQ,GAAI,EAE7B,cAAO,KAAKD,EAAQC,CAAO,CAAC,EAAE,QAAQG,GAAO,CAE3CF,EAAIE,CAAG,EAAI,IAAIC,IAEbP,EACEG,EAAQ,IACR,IACSD,EAAQC,CAAO,EAAEG,CAAG,EAAE,GAAGC,CAAI,EAEtCR,CACF,EAGFM,EAAIC,CAAG,EAAI,IAAIC,IACNL,EAAQC,CAAO,EAAEG,CAAG,EAAE,GAAGC,CAAI,CAExC,CAAC,EAEM,CACL,GAAGJ,EACH,IAAAE,EACA,IAAAD,CACF,CACF,CCnCO,SAASI,EAKdC,EAAkBC,EAAwC,CAC1D,MAAO,CACL,GAAGA,EACH,IAAK,CACH,GAAGA,EAAQ,IACX,GAAGD,EAAQC,CAAO,CACpB,CACF,CACF,CCbO,SAASC,EAKdC,EAAqBC,EAAgBC,EAAwC,CAC7E,MAAO,CACL,IAAKA,EAAQ,IACb,IAAKA,EAAQ,IACb,IAAKA,EAAQ,IACb,IAAK,OAAO,KAAKA,EAAQ,GAAG,EAAE,OAC5B,CAACC,EAAKC,IACJH,EAAYG,CAAG,GAAMJ,EAA0B,SAASI,CAAG,EACvDD,EACA,CACE,GAAGA,EACH,CAACC,CAAG,EAAGF,EAAQ,IAAIE,CAAG,CACxB,EACN,CAAC,CACH,CACF,CACF,CPGO,SAASC,EACdC,EACAC,EAQ8F,CAC9F,GAAM,CAAE,KAAAC,EAAO,eAAgB,QAAAC,EAAU,CAAC,EAAG,YAAAC,EAAc,CAAC,CAAE,EAAIH,GAAW,CAAC,EAG1EI,EAAmBL,EACvBG,EAAQ,QAAQG,GAAU,CACpBA,EAAO,UACTD,EAAc,CAAE,GAAGA,EAAa,GAAGC,EAAO,QAAQ,CAAE,EAExD,CAAC,EAGD,IAAIC,EAAmB,IAAMF,EAEzBD,EAAY,WACdG,EAAcC,EACZD,EACAH,EAAY,WAAa,GAAO,CAAE,KAAM,eAAgB,MAAOF,CAAK,EAAIE,EAAY,QACtF,GAGEA,EAAY,UACdG,EAAcE,EACZF,EACAH,EAAY,UAAY,GAAO,CAAE,KAAAF,CAAK,EAAIE,EAAY,OACxD,GAIF,IAAMM,EAAgBC,EAAmBJ,CAAW,EAGhDK,EAAa,CACf,IAAKC,EAAYH,EAAU,CAAC,CAACN,EAAY,QAAQ,EACjD,IAAKU,EAAYJ,CAAQ,EACzB,IAAKK,EAAYL,EAAU,CAAC,CAACN,EAAY,QAAQ,EACjD,IAAKY,EAAYN,CAAQ,EACzB,cAAkEO,EAAkB,CAClF,OAAOC,EAAcD,EAAS,IAAI,CACpC,EACA,cAAkEA,EAAkB,CAClF,OAAOE,EAAcF,EAAS,IAAI,CACpC,EACA,cAAmCG,EAAqB,CAAC,EAAG,CAC1D,OAAOC,EACLD,EACAf,EACA,IAKF,CACF,CACF,EAGA,OAAAF,EAAQ,QAAQG,GAAU,CACpBA,EAAO,UACTM,EAAQN,EAAO,QAAQM,CAAK,EAEhC,CAAC,EAEMA,CACT,CQ9FO,IAAMU,EAAoD,CAC/D,QAASC,GACAA,EAAM,cAAc,CAAC,CAAE,IAAAC,CAAI,KAAO,CACvC,MAAO,IAAM,CACX,IAAMC,EAAeD,EAAI,kBAAkB,GAAK,CAAC,EACjDA,EAAI,SAAS,IAAMC,EAAc,EAAI,CACvC,CACF,EAAE,CAEN","names":["devtools","persist","createVanillaStore","logFunctionName","generateApi","api","hasDevtools","newState","replace","name","setState","generateGet","api","getters","initialState","key","symbol","generateSet","api","hasDevtools","setters","key","value","setState","state","shallow","useStoreWithEqualityFn","generateUse","api","getters","key","equalityFn","state","shallow","useStoreWithEqualityFn","extendGetters","builder","thisApi","use","get","key","args","extendSetters","builder","thisApi","restrictState","privateState","mergedState","thisApi","acc","key","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","devtools","persist","storeApi","createVanillaStore","store","generateApi","generateGet","generateSet","generateUse","builder","extendGetters","extendSetters","publicState","restrictState","reset","store","api","initialState"]}
1
+ {"version":3,"sources":["../src/lib/createStore.ts","../src/lib/generateApi.ts","../src/lib/generateGet.ts","../src/lib/generateSet.ts","../src/lib/generateUse.ts","../src/lib/extendGetters.ts","../src/lib/extendSetters.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["/**\n * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party\n * zustand-x repository: https://github.com/udecode/zustand-x.\n **/\nimport { DevtoolsOptions, PersistOptions, devtools, persist } from 'zustand/middleware'\nimport { createStore as createVanillaStore } from 'zustand/vanilla'\n\nimport {\n\tAugmentedApiData,\n\tAugmentedGetters,\n\tAugmentedSetters,\n\tGettersBuilder,\n\tSettersBuilder,\n\tState,\n\tStoreApi,\n\tStoreApiPluginList,\n} from '../types'\nimport { generateApi } from './generateApi'\nimport { generateGet } from './generateGet'\nimport { generateSet } from './generateSet'\nimport { generateUse } from './generateUse'\nimport { extendGetters } from './extendGetters'\nimport { extendSetters } from './extendSetters'\nimport { restrictState } from './restrictState'\n\nexport function createStore<T extends State, Plugins extends StoreApiPluginList = []>(\n\tinitialState: T,\n\toptions?: {\n\t\tname?: string\n\t\tplugins?: [...Plugins]\n\t\tmiddlewares?: { devtools?: true | DevtoolsOptions; persist?: true | PersistOptions<any> }\n\t}\n): Plugins extends []\n\t? StoreApi<T>\n\t: StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>> {\n\tconst { name = 'zustand-lite', plugins = [], middlewares = {} } = options ?? {}\n\n\t// Merge state from plugins to be available for future use.\n\tlet mergedState: any = initialState\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.creates) {\n\t\t\tmergedState = { ...mergedState, ...plugin.creates() }\n\t\t}\n\t})\n\n\t// Apply supported middlewares.\n\tlet initializer: any = () => mergedState\n\n\tif (middlewares.devtools) {\n\t\tinitializer = devtools(\n\t\t\tinitializer,\n\t\t\tmiddlewares.devtools === true\n\t\t\t\t? { name: 'zustand-lite', store: name }\n\t\t\t\t: middlewares.devtools\n\t\t)\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(\n\t\t\tinitializer,\n\t\t\tmiddlewares.persist === true ? { name } : middlewares.persist\n\t\t)\n\t}\n\n\t// Create a vanilla zustand store to wrap.\n\tconst storeApi: any = createVanillaStore(initializer)\n\n\t// Create zustand-lite wrapper.\n\tlet store: any = {\n\t\tapi: generateApi(storeApi, !!middlewares.devtools),\n\t\tget: generateGet(storeApi),\n\t\tset: generateSet(storeApi, !!middlewares.devtools),\n\t\tuse: generateUse(storeApi),\n\t\textendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendGetters(builder, this)\n\t\t},\n\t\textendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendSetters(builder, this)\n\t\t},\n\t\trestrictState<Key extends keyof T>(publicState: Key[] = []) {\n\t\t\treturn restrictState(\n\t\t\t\tpublicState,\n\t\t\t\tmergedState,\n\t\t\t\tthis as StoreApi<\n\t\t\t\t\tAugmentedApiData<T, Plugins>,\n\t\t\t\t\tAugmentedGetters<Plugins>,\n\t\t\t\t\tAugmentedSetters<Plugins>\n\t\t\t\t>\n\t\t\t)\n\t\t},\n\t}\n\n\t// Extend store getters and setters with plugins.\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.extends) {\n\t\t\tstore = plugin.extends(store)\n\t\t}\n\t})\n\n\treturn store\n}\n","import { StoreApi } from 'zustand/vanilla'\n\nimport { State } from '../types'\n\nfunction setterName() {\n\treturn new Error()?.stack?.split('\\n')[3].trim().split(' ')[1].split('.')[1] ?? 'setState'\n}\n\n/**\n * Required to wrap original Zustand setState function with default devtools action name.\n * @param api Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateApi<T extends State>(api: StoreApi<T>, hasDevtools: boolean) {\n\treturn {\n\t\t...api,\n\t\tsetState: (newState: T | ((state: T) => T), replace?: boolean, name?: string) => {\n\t\t\tapi.setState(\n\t\t\t\tnewState,\n\t\t\t\treplace,\n\t\t\t\t// @ts-ignore Additional parameter will have no effect even if devtools are disabled.\n\t\t\t\thasDevtools ? { type: name ?? setterName(), payload: newState } : undefined\n\t\t\t)\n\t\t},\n\t}\n}\n","import { StoreApi } from 'zustand/vanilla'\n\nimport { GetRecord, State } from '../types'\n\n/**\n * Generates automatic getters like store.get.foo()\n * @param api Zustand api interface\n */\nexport function generateGet<T extends State>(api: StoreApi<T>) {\n\tconst getters: GetRecord<T> = {} as GetRecord<T>\n\n\tconst initialState = api.getState()\n\n\tObject.keys(initialState).forEach((key) => {\n\t\tgetters[key as keyof T] = () => api.getState()[key as keyof T]\n\t})\n\n\tObject.getOwnPropertySymbols(initialState).forEach((symbol) => {\n\t\tgetters[symbol as keyof T] = () => api.getState()[symbol as keyof T]\n\t})\n\n\treturn getters\n}\n","import { NamedSet } from 'zustand/middleware/devtools'\nimport { StoreApi } from 'zustand/vanilla'\n\nimport { SetRecord, State } from '../types'\n\n/**\n * Generates automatic setters like store.set.foo(value)\n * @param api Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateSet<T extends State>(api: StoreApi<T>, hasDevtools: boolean): SetRecord<T> {\n\tconst setters: SetRecord<T> = {} as SetRecord<T>\n\n\tObject.keys(api.getState()).forEach((key) => {\n\t\tsetters[key as keyof T] = (value: any) => {\n\t\t\tif (api.getState()[key] === value) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tapi.setState(\n\t\t\t\t(state) => ({ ...state, [key]: value }),\n\t\t\t\tfalse,\n\t\t\t\t// @ts-ignore Additional parameter will have no effect even if devtools are disabled.\n\t\t\t\thasDevtools ? { type: key, payload: { [key]: value } } : undefined\n\t\t\t)\n\t\t}\n\t})\n\n\treturn setters\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { StoreApi } from 'zustand'\n\nimport { EqualityChecker, State, UseRecord } from '../types'\n\n/**\n * Generates automatic getters like store.use.foo()\n * @param api Zustand api interface\n */\nexport function generateUse<T extends State>(api: StoreApi<T>) {\n\tconst getters: UseRecord<T> = {} as UseRecord<T>\n\n\t// All of these wrappers are hooks and should obey the rule of hooks.\n\tObject.keys(api.getState()).forEach((key) => {\n\t\tgetters[key as keyof T] = (equalityFn: EqualityChecker<T[keyof T]> = shallow) => {\n\t\t\treturn useStoreWithEqualityFn(api, (state: T) => state[key as keyof T], equalityFn)\n\t\t}\n\t})\n\n\treturn getters\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { Default, GettersBuilder, State, StoreApi } from '../types'\n\nexport function extendGetters<\n\tBuilder extends GettersBuilder<T, Getters, Setters>,\n\tT extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n\tconst use = { ...thisApi.use }\n\tconst get = { ...thisApi.get }\n\n\tObject.keys(builder(thisApi)).forEach((key) => {\n\t\t// @ts-ignore\n\t\tuse[key] = (...args: any[]) =>\n\t\t\tuseStoreWithEqualityFn(\n\t\t\t\tthisApi.api,\n\t\t\t\t() => {\n\t\t\t\t\treturn builder(thisApi)[key](...args)\n\t\t\t\t},\n\t\t\t\tshallow\n\t\t\t)\n\n\t\t// @ts-ignore\n\t\tget[key] = (...args: any[]) => {\n\t\t\treturn builder(thisApi)[key](...args)\n\t\t}\n\t})\n\n\treturn { ...thisApi, get, use } as StoreApi<T, Getters & ReturnType<Builder>, Setters>\n}\n","import { Default, SettersBuilder, State, StoreApi } from '../types'\n\nexport function extendSetters<\n\tBuilder extends SettersBuilder<T, Getters, Setters>,\n\tT extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n\treturn { ...thisApi, set: { ...thisApi.set, ...builder(thisApi) } } as StoreApi<\n\t\tT,\n\t\tGetters,\n\t\tSetters & ReturnType<Builder>\n\t>\n}\n","import { Empty, GetRecord, SetRecord, State, StoreApi, StoreApiEncapsulated } from '../types'\n\nexport function restrictState<\n\tT extends State,\n\tKey extends keyof T,\n\tGetters extends GetRecord<any> = Empty,\n\tSetters extends SetRecord<any> = Empty,\n>(privateState: Key[], mergedState: T, thisApi: StoreApi<T, Getters, Setters>) {\n\treturn {\n\t\tapi: thisApi.api,\n\t\tset: thisApi.set,\n\t\tuse: thisApi.use,\n\t\tget: Object.keys(thisApi.get).reduce(\n\t\t\t(acc, key) =>\n\t\t\t\tmergedState[key] && (privateState as string[]).includes(key)\n\t\t\t\t\t? acc\n\t\t\t\t\t: { ...acc, [key]: thisApi.get[key] },\n\t\t\t{}\n\t\t) as GetRecord<Omit<T, Key>> & Getters,\n\t} as StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>\n}\n","import { StoreApiPlugin } from '../types'\n\ntype PluginResetSetters = { reset: () => void }\n\nexport const reset: StoreApiPlugin<{}, {}, PluginResetSetters> = {\n\textends: (store) => {\n\t\treturn store.extendSetters(({ api }) => ({\n\t\t\treset: () => {\n\t\t\t\tconst initialState = api.getInitialState?.() ?? {}\n\t\t\t\tapi.setState(() => initialState, true)\n\t\t\t},\n\t\t}))\n\t},\n}\n"],"mappings":"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","names":["devtools","persist","createVanillaStore","setterName","generateApi","api","hasDevtools","newState","replace","name","generateGet","api","getters","initialState","key","symbol","generateSet","api","hasDevtools","setters","key","value","state","shallow","useStoreWithEqualityFn","generateUse","api","getters","key","equalityFn","state","shallow","useStoreWithEqualityFn","extendGetters","builder","thisApi","use","get","key","args","extendSetters","builder","thisApi","restrictState","privateState","mergedState","thisApi","acc","key","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","devtools","persist","storeApi","createVanillaStore","store","generateApi","generateGet","generateSet","generateUse","builder","extendGetters","extendSetters","publicState","restrictState","reset","store","api","initialState"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zustand-lite",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "description": "Zustand Lite builds upon zustand, by auto-generating selectors and simplifying API even more.",
5
5
  "author": "Piotr Siatkowski <p.siatkowski@gmail.com>",
6
6
  "license": "MIT",
@@ -43,6 +43,7 @@
43
43
  "zustand": "5.0.5"
44
44
  },
45
45
  "devDependencies": {
46
+ "prettier": "^3.5.3",
46
47
  "typescript": "5.8.3",
47
48
  "tsup": "^8.5.0"
48
49
  },