zustand-lite 0.2.4 → 0.3.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/README.md +151 -107
- package/dist/index.cjs +3 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +79 -0
- package/dist/index.d.ts +34 -37
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +61 -49
- package/dist/index.d.mts +0 -82
- package/dist/index.mjs +0 -3
- package/dist/index.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -6,50 +6,49 @@
|
|
|
6
6
|
[](https://www.typescriptlang.org/)
|
|
7
7
|
[](https://github.com/PiotrSiatkowski/zustand-lite)
|
|
8
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
|
|
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
|
|
12
|
+
setters to middleware — while remaining lightweight and extensible. With seamless support for
|
|
13
|
+
plugins, devtools, and state encapsulation, managing state becomes a breeze, not a chore.
|
|
12
14
|
|
|
13
|
-
_A zero-boilerplate wrapper around [Zustand](https://github.com/pmndrs/zustand), focused on
|
|
14
|
-
ergonomics, plugins, and
|
|
15
|
-
com/udecode/zustand-x) and getters/setters auto-generation patterns._
|
|
15
|
+
_A zero-boilerplate wrapper around [Zustand](https://github.com/pmndrs/zustand), focused on
|
|
16
|
+
ergonomics, plugins, and dynamic extension — inspired by [zustand-x](https://github.com/udecode/zustand-x) and getters/setters auto-generation patterns._
|
|
16
17
|
|
|
17
18
|
## 🛠️ Why **zustand‑lite**?
|
|
18
19
|
|
|
19
|
-
### ✅
|
|
20
|
+
### ✅ In short
|
|
20
21
|
|
|
21
22
|
_**Zustand Lite** delivers a **simple**, **performant**, and **predictable** way to manage UI
|
|
22
23
|
state, letting your code stay focused on business logic, not infrastructure. Try it today and
|
|
23
24
|
see how effortless frontend state can be!_
|
|
24
25
|
|
|
25
|
-
|
|
26
|
-
boilerplate, tangled data flows, and hard‑to‑control side effects. **Zustand Lite** cuts through
|
|
27
|
-
the noise
|
|
26
|
+
_While tools like React‑Query handle server state, UI state often gets bogged down by excessive
|
|
27
|
+
boilerplate, tangled data flows, and hard‑to‑control side effects. **Zustand Lite** cuts through
|
|
28
|
+
the noise._
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
### ✨ Why it matters
|
|
31
|
+
|
|
32
|
+
Boilerplate is the killer of productivity and obscures your real goal: **business logic**, which is usually far simpler than it appears.
|
|
33
|
+
Thanks to **zustand‑lite**, you can move faster without sacrificing clarity or flexibility.
|
|
34
|
+
|
|
35
|
+
1. **No context providers** or React-specific setup.
|
|
36
|
+
2. **No mocking** during tests
|
|
37
|
+
3. **No bloated dependency arrays**
|
|
38
|
+
4. **Type-safe, simple API** - simple usage with IDE support
|
|
39
|
+
|
|
40
|
+
### 🚀 Features
|
|
30
41
|
|
|
31
42
|
- ⚛️ **Minimal & Typed**: Built on top of lightweight Zustand core, fully typed with TypeScript.
|
|
32
43
|
- 🔄 **Clean Separation**: State and operations are well separated to minimize confusion.
|
|
33
44
|
- 🚀 **Blazing Performance**: Selective updates and lean subscriptions keep things snappy.
|
|
34
|
-
- 🪄 **Zero Boilerplate**:
|
|
35
|
-
- 🧪 **Test
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
- 👁 **Redux devtools labeling**: Built in clear, traceable actions and labels for debugging.
|
|
45
|
+
- 🪄 **Zero Boilerplate**: Does not require writing any idle code.
|
|
46
|
+
- 🧪 **Test Friendly**: Easy to test, no additional hacks or mocks required.
|
|
47
|
+
- 🔌 **Shareable plugins**: Plug custom logic directly into your store for extended capabilities.
|
|
48
|
+
- 🧩 **Optional middlewares**: Seamlessly add devtools and persist middleware layers.
|
|
49
|
+
- 🌱 **Chainable API**: create the store in a few simple composable steps.
|
|
50
|
+
- 👁 **Redux devtools labeling**: Built-in clear, traceable action labeling useful for debugging.
|
|
41
51
|
- 🧼 **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
52
|
|
|
54
53
|
---
|
|
55
54
|
|
|
@@ -60,30 +59,30 @@ Thanks to **zustand‑lite**, you can move faster without sacrificing clarity or
|
|
|
60
59
|
```ts
|
|
61
60
|
import { createStore } from 'zustand-lite'
|
|
62
61
|
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
export const store = createStore(initialState)
|
|
62
|
+
export const store = createStore({ foo: '' })
|
|
66
63
|
|
|
67
64
|
// Subscribe for your data changes.
|
|
68
65
|
function Component() {
|
|
69
|
-
|
|
66
|
+
const foo = store.use.foo()
|
|
70
67
|
}
|
|
71
68
|
|
|
72
|
-
// Synchronous accessor
|
|
69
|
+
// Synchronous state accessor.
|
|
73
70
|
function onClick() {
|
|
74
|
-
|
|
71
|
+
console.log(store.get().foo)
|
|
75
72
|
}
|
|
76
73
|
|
|
77
|
-
// Setting value with
|
|
74
|
+
// Setting value with auto-generated setter.
|
|
78
75
|
function onClick() {
|
|
79
|
-
|
|
76
|
+
store.set.foo('new-value')
|
|
80
77
|
}
|
|
81
78
|
```
|
|
82
79
|
|
|
83
80
|
### Custom Setters
|
|
81
|
+
|
|
82
|
+
```ts
|
|
84
83
|
const store = createStore({ count: 0 })
|
|
85
84
|
.extendSetters(({ get, set }) => ({
|
|
86
|
-
increment: () => set.count(get.count
|
|
85
|
+
increment: () => set.count(get().count + 1)
|
|
87
86
|
}))
|
|
88
87
|
|
|
89
88
|
function Counter() {
|
|
@@ -94,58 +93,61 @@ function Counter() {
|
|
|
94
93
|
</button>
|
|
95
94
|
)
|
|
96
95
|
}
|
|
96
|
+
```
|
|
97
97
|
|
|
98
98
|
### Advanced store
|
|
99
99
|
|
|
100
100
|
```ts
|
|
101
|
-
const initialState: {
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
const initialState: { point: { x: number; y: number }; rectangle: { a: number; b: number } } = {
|
|
102
|
+
point: { x: 0, y: 0 },
|
|
103
|
+
rectangle: { a: 20, b: 10 },
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
export const store = createStore(initialState)
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
// ^ Seal the store, so that certain fields are unavailable for the outside.
|
|
107
|
+
.extendGetters(({ get }) => ({ area: () => get().rectangle.x * get().rectangle.y }))
|
|
108
|
+
.extendSetters(({ get, set }) => ({
|
|
109
|
+
translateX: (dx: number) => set.bar({ x: get().point.x + dx, y: get().point.y }),
|
|
110
|
+
}))
|
|
111
|
+
.restrictState(['rectangle'])
|
|
112
|
+
// ^ Seal the store, so that certain fields are unavailable for the outside context,
|
|
113
|
+
// while still being available for getters and setters.
|
|
115
114
|
|
|
116
|
-
// Subscribe for computed data changes.
|
|
115
|
+
// Subscribe for computed data changes. This new selector is auto-generated.
|
|
117
116
|
function Component() {
|
|
118
|
-
|
|
117
|
+
const area = store.use.area()
|
|
119
118
|
}
|
|
120
119
|
|
|
121
120
|
// Make private value inaccessible.
|
|
122
121
|
function onClick() {
|
|
123
|
-
|
|
122
|
+
console.log(store.get().rectangle)
|
|
123
|
+
// ^ TS error, no value. It is not accessible anymore from outside the store.
|
|
124
124
|
}
|
|
125
125
|
|
|
126
126
|
// Call custom action.
|
|
127
127
|
function onClick() {
|
|
128
|
-
|
|
128
|
+
store.set.translateX(7)
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
-
// Access native Zustand api
|
|
131
|
+
// Access native Zustand api (expect getState, setState, which are
|
|
132
|
+
// available thrugh store.get() and store.set() for simplicity and expresivness).
|
|
132
133
|
function Component() {
|
|
133
|
-
|
|
134
|
+
const state = store.api.getInitialState()
|
|
134
135
|
}
|
|
135
136
|
```
|
|
136
137
|
|
|
137
|
-
### Deep
|
|
138
|
+
### Deep value getters
|
|
138
139
|
|
|
139
140
|
```ts
|
|
140
141
|
const initialState: { my: { foo: { bar: string} } } = {
|
|
141
|
-
|
|
142
|
+
my: { foo: { bar: 'value' } },
|
|
142
143
|
}
|
|
143
144
|
|
|
144
145
|
export const store = createStore(initialState)
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
146
|
+
.myFooBar(({ get }) => ({
|
|
147
|
+
// Entire state is accessible with store.get()
|
|
148
|
+
return get().my.foo.bar;
|
|
149
|
+
}))
|
|
150
|
+
.restrictState()
|
|
149
151
|
|
|
150
152
|
// Component will update only if deeply nested value will update.
|
|
151
153
|
function Component() {
|
|
@@ -153,40 +155,77 @@ function Component() {
|
|
|
153
155
|
}
|
|
154
156
|
```
|
|
155
157
|
|
|
158
|
+
### Automatic deep selectors
|
|
159
|
+
|
|
160
|
+
```ts
|
|
161
|
+
const initialState: { my: { foo: { bar: string } } } = { my: { foo: { bar: 'value' } } }
|
|
162
|
+
|
|
163
|
+
export const store = createStore(initialState)
|
|
164
|
+
|
|
165
|
+
// Component will update only if deeply nested value will update. Those selectors
|
|
166
|
+
// will be generated only for required attributes.
|
|
167
|
+
function Component() {
|
|
168
|
+
const myFooBar = store.use.my.foo.bar()
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Ad-hoc selectors
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
const initialState: { my: { foo: { bar: string } } } = { my: { foo: { bar: 'value' } } }
|
|
176
|
+
|
|
177
|
+
export const store = createStore(initialState)
|
|
178
|
+
|
|
179
|
+
// If no auto-generated selector is available, custom one may still be used.
|
|
180
|
+
function Component() {
|
|
181
|
+
const myFooBar = store.use((state) => state.my.foo, customEquality)
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Setting whole state
|
|
186
|
+
|
|
187
|
+
```ts
|
|
188
|
+
const initialState: { my: { foo: { bar: string } } } = { my: { foo: { bar: 'value' } } }
|
|
189
|
+
|
|
190
|
+
export const store = createStore(initialState)
|
|
191
|
+
|
|
192
|
+
// State can be set with first level auto-generated setters or with store.set
|
|
193
|
+
store.set((state) => ({ ...state, newField: 'newField' }))
|
|
194
|
+
store.set({ newField: 'newField' }) // <- By default state is shallowly merged.
|
|
195
|
+
store.set({}, true) // <- Emptying the state with replace: true flag
|
|
196
|
+
```
|
|
197
|
+
|
|
156
198
|
### Overriding getters and setters
|
|
157
199
|
|
|
158
200
|
```ts
|
|
159
201
|
const initialState: { point: { x: number; y: number }; rectangle: { a: number; b: number } } = {
|
|
160
|
-
|
|
161
|
-
|
|
202
|
+
point: { x: 0, y: 0 },
|
|
203
|
+
rectangle: { a: 20, b: 10 },
|
|
162
204
|
}
|
|
163
205
|
|
|
164
206
|
export const store = createStore(initialState)
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
.restrictState()
|
|
207
|
+
.extendGetters(({ get }) => ({
|
|
208
|
+
// get().point refers to the store value
|
|
209
|
+
myPoint: () => transformToDifferentCoordinates(get().point),
|
|
210
|
+
}))
|
|
211
|
+
.extendGetters(({ get }) => ({
|
|
212
|
+
// get.myPoint() will refer to the already transformed point from the previous getter.
|
|
213
|
+
// It will override the previous one, but can still accesess anything defined before.
|
|
214
|
+
myPoint: () => soSomethingWithTransformedPoint(get.myPoint()),
|
|
215
|
+
}))
|
|
216
|
+
.restrictState()
|
|
176
217
|
```
|
|
177
218
|
|
|
178
219
|
### Custom equality
|
|
179
220
|
|
|
180
221
|
```ts
|
|
181
|
-
const initialState: { rectangle: { a: number; b: number } } = {
|
|
182
|
-
rectangle: { a: 20, b: 10 },
|
|
183
|
-
}
|
|
222
|
+
const initialState: { rectangle: { a: number; b: number } } = { rectangle: { a: 20, b: 10 } }
|
|
184
223
|
|
|
185
|
-
export const store = createStore(initialState)
|
|
224
|
+
export const store = createStore(initialState)
|
|
186
225
|
|
|
187
226
|
// By default shallow equality is being used.
|
|
188
227
|
function Component() {
|
|
189
|
-
|
|
228
|
+
const rectangle = store.use.rectangle(customEqualityFunction)
|
|
190
229
|
}
|
|
191
230
|
```
|
|
192
231
|
|
|
@@ -197,11 +236,12 @@ function Component() {
|
|
|
197
236
|
const dependencyA = store.use.dependencyA()
|
|
198
237
|
}
|
|
199
238
|
|
|
200
|
-
// No need to mock the store or add additional providers, just interact with it
|
|
239
|
+
// No need to mock the store or add additional providers, just interact with it
|
|
240
|
+
// in the usual way. Wrapping setter with act might be needed to sync react updates.
|
|
201
241
|
test('Testing Component', () => ({
|
|
202
|
-
store.set.dependencyA(someValue)
|
|
203
242
|
render(<Component />)
|
|
204
|
-
|
|
243
|
+
act(() => store.set.dependencyA(someValue))
|
|
244
|
+
expect(storeDependantText).toBe(someValue)
|
|
205
245
|
})
|
|
206
246
|
```
|
|
207
247
|
|
|
@@ -236,12 +276,14 @@ Creates a typed store with optional plugins and middleware.
|
|
|
236
276
|
|
|
237
277
|
After creation, your store includes:
|
|
238
278
|
|
|
239
|
-
| Property
|
|
240
|
-
|
|
|
241
|
-
| `store.use.foo()`
|
|
242
|
-
| `store.
|
|
243
|
-
| `store.
|
|
244
|
-
| `store.
|
|
279
|
+
| Property | Purpose |
|
|
280
|
+
| --------------------- | --------------------------------------------------------------- |
|
|
281
|
+
| `store.use.foo()` | React hook for subscribing to `foo` |
|
|
282
|
+
| `store.use(selector)` | React hook for subscribing to custom selector result |
|
|
283
|
+
| `store.get()` | Direct synchronous access to whole state |
|
|
284
|
+
| `store.set.foo(v)` | Set a new value for `foo` |
|
|
285
|
+
| `store.set(state)` | Set an entire new state |
|
|
286
|
+
| `store.api` | The native Zustand store API (getInitialState, subscribe, etc.) |
|
|
245
287
|
|
|
246
288
|
---
|
|
247
289
|
|
|
@@ -255,32 +297,33 @@ import { StoreApiPlugin } from 'zustand-lite'
|
|
|
255
297
|
type Setters = { reset: () => void }
|
|
256
298
|
|
|
257
299
|
export const reset: StoreApiPlugin<{}, {}, Setters> = {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
300
|
+
extends: (store) => {
|
|
301
|
+
// If plugin defines data, that and only that data is available inside
|
|
302
|
+
// setters and getters.
|
|
303
|
+
return store.extendSetters(({ api, set }) => ({
|
|
304
|
+
// Every piece od data, getter or setter will be available in the custom
|
|
305
|
+
// extendGetter and extendSetter, allowing for even more interacctions.
|
|
306
|
+
reset: () => {
|
|
307
|
+
set(api.getInitialState?.() ?? {}, true)
|
|
308
|
+
},
|
|
309
|
+
}))
|
|
310
|
+
},
|
|
268
311
|
}
|
|
269
312
|
```
|
|
270
313
|
|
|
271
|
-
Apply
|
|
314
|
+
Apply newlyreated plugin like this:
|
|
272
315
|
|
|
273
316
|
```ts
|
|
274
317
|
const store = createStore({}, { plugins: [reset] })
|
|
275
318
|
```
|
|
276
319
|
|
|
277
|
-
**Any plugin state, getters
|
|
320
|
+
**Any plugin state, getters and setters will be available for usage inside your own store.**
|
|
278
321
|
|
|
279
322
|
---
|
|
280
323
|
|
|
281
324
|
## 🧪 Middlewares Integration
|
|
282
325
|
|
|
283
|
-
You can
|
|
326
|
+
You can enable the most useful middlewares:
|
|
284
327
|
|
|
285
328
|
```ts
|
|
286
329
|
{
|
|
@@ -298,13 +341,14 @@ You can add the most useful middlewares:
|
|
|
298
341
|
|
|
299
342
|
## 🛠 Planned improvements
|
|
300
343
|
|
|
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
|
-
|
|
344
|
+
- Configurable level of auto-generation. While I advise to keep store as flat as possible, good
|
|
345
|
+
structured data is important. For deeper properties it might be more convenient to auto
|
|
346
|
+
generate getters and setters for deeply nested properties as well. **(partially done with hooks, entire
|
|
347
|
+
state is selected for get from version 3.0.0, setters still generated for level one only)**
|
|
348
|
+
- createPlugin function that will automatically infer types from the usage without the need of
|
|
305
349
|
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.
|
|
350
|
+
- Ability to specify equality function for extended getters. It's possible now, but requires to
|
|
351
|
+
import hook from 'zustand' package, which is suboptimal **(available from version 3.0.0 with use() function or deep auto-generated selectors. Still no possible for cutom getters)**.
|
|
308
352
|
|
|
309
353
|
---
|
|
310
354
|
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";var l=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var L=(e,t)=>{for(var o in t)l(e,o,{get:t[o],enumerable:!0})},q=(e,t,o,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of R(t))!U.call(e,r)&&r!==o&&l(e,r,{get:()=>t[r],enumerable:!(s=w(t,r))||s.enumerable});return e};var v=e=>q(l({},"__esModule",{value:!0}),e);var I={};L(I,{createStore:()=>E,reset:()=>j});module.exports=v(I);var a=require("zustand/middleware"),D=require("zustand/vanilla");function p(e){return{getInitialState:e.getInitialState,subscribe:e.subscribe}}function f(e){return()=>e.getState()}function F(){return new Error()?.stack?.split(`
|
|
2
|
+
`)[3].trim().split(" ")[1].split("Object.")[1]??"setState"}function c(e,t){let o=(s,r,n)=>{e.setState(s,r,t?{type:n??F(),payload:s}:void 0)};return Object.keys(e.getState()).forEach(s=>{o[s]=r=>{e.getState()[s]!==r&&e.setState(n=>({...n,[s]:r}),!1,t?{type:s,payload:{[s]:r}}:void 0)}}),o}var A=require("zustand/shallow"),y=require("zustand/traditional");var g=require("zustand/shallow"),x=require("zustand/traditional");function m(e,t,o,s){typeof e=="object"&&e!==null&&Object.keys(e).forEach(r=>{let n=[...o,r];Object.defineProperty(t,r,{value:(S=g.shallow)=>(0,x.useStoreWithEqualityFn)(s,u=>z(u,n),S),writable:!0,configurable:!0,enumerable:!0}),m(e[r],t[r],n,s)})}function z(e,t){let o=e;for(let s of t)if(o=o[s],!o)return o;return o}function G(e){let t=(o,s=A.shallow)=>(0,y.useStoreWithEqualityFn)(e,o,s);return m(e.getState(),t,[],e),t}var b=require("zustand/shallow"),P=require("zustand/traditional");function B(e,t,o){let s=e(t);return Object.keys(s).forEach(r=>{t.use[r]=(...n)=>(0,P.useStoreWithEqualityFn)(o,()=>s[r](...n),b.shallow)}),t.get=Object.assign(t.get,s),t}function O(e,t){return t.set=Object.assign(t.set,e(t)),t}function h(e,t,o){return{api:o.api,set:o.set,use:e?Object.keys(o.use).reduce((s,r)=>t[r]&&e.includes(r)?s:{...s,[r]:o.use[r]},{}):o.use,get:e?()=>Object.entries(o.get()).reduce((s,[r,n])=>t[r]&&e.includes(r)?s:{...s,[r]:n},{}):o.get}}function E(e,t){let{name:o="zustand-lite",plugins:s=[],middlewares:r={}}=t??{},n=e;s.forEach(i=>{i.creates&&(n={...n,...i.creates()})});let S=()=>n;r.devtools&&(S=(0,a.devtools)(S,r.devtools===!0?{name:"zustand-lite",store:o}:r.devtools)),r.persist&&(S=(0,a.persist)(S,r.persist===!0?{name:o}:r.persist));let u=(0,D.createStore)(S),d={api:p(u),get:f(u),set:c(u,!!r.devtools),use:G(u),extendGetters(i){return B(i,this,u)},extendSetters(i){return O(i,this)},restrictState(i=[]){return h(i,n,this)}};return s.forEach(i=>{i.extends&&(d=i.extends(d))}),d}var j={extends:e=>e.extendSetters(({api:t,set:o})=>({reset:()=>{o(t.getInitialState?.()??{},!0)}}))};0&&(module.exports={createStore,reset});
|
|
3
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +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/generateUseStep.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<S extends State, Plugins extends StoreApiPluginList = []>(\n\tinitialState: S,\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<S>\n\t: StoreApi<AugmentedApiData<S, 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),\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, storeApi)\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(publicState = []) {\n\t\t\treturn restrictState(publicState, mergedState, this)\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\n/**\n * Required to wrap original Zustand interface without getState and setState, which are handled\n * by get and set.\n * @param api Zustand api interface\n */\nexport function generateApi<S extends State>(api: StoreApi<S>) {\n\treturn { getInitialState: api.getInitialState, subscribe: api.subscribe }\n}\n","import { StoreApi } from 'zustand/vanilla'\n\nimport { State } from '../types'\n\nexport function generateGet<S extends State>(api: StoreApi<S>) {\n\treturn () => api.getState()\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { SetRecord, State } from '../types'\n\nfunction setterName() {\n\treturn new Error()?.stack?.split('\\n')[3].trim().split(' ')[1].split('Object.')[1] ?? 'setState'\n}\n\n/**\n * Generates automatic setters like store.set.foo(value)\n * @param lib Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateSet<S extends State>(lib: StoreLib<S>, hasDevtools: boolean): SetRecord<S> {\n\tconst setters = (updater: S | ((state: S) => S), replace?: boolean, name?: string) => {\n\t\tlib.setState(\n\t\t\tupdater,\n\t\t\treplace,\n\t\t\t// @ts-ignore Additional parameter will have no effect even if devtools are disabled.\n\t\t\thasDevtools ? { type: name ?? setterName(), payload: updater } : undefined\n\t\t)\n\t}\n\n\tObject.keys(lib.getState()).forEach((key) => {\n\t\t// @ts-ignore\n\t\tsetters[key] = (value: any) => {\n\t\t\tif (lib.getState()[key] === value) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlib.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 as SetRecord<S>\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { StoreApi } from 'zustand'\n\nimport { State, EqualityChecker } from '../types'\nimport { generateUseStep } from './generateUseStep'\n\n/**\n * Generates automatic getters like store.use.foo()\n * @param api Zustand api interface\n */\nexport function generateUse<S extends State, U>(api: StoreApi<S>) {\n\tconst getters = (selector: (state: S) => U, equality: EqualityChecker<U> = shallow) => {\n\t\treturn useStoreWithEqualityFn(api, selector, equality)\n\t}\n\n\tgenerateUseStep(api.getState(), getters, [], api)\n\treturn getters\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nexport function generateUseStep(\n\tstate: any,\n\tgetters: any,\n\tpath: string[],\n\tapi: any,\n) {\n\tif (typeof state === 'object' && state !== null) {\n\t\tObject.keys(state).forEach((key) => {\n\t\t\tconst newPath = [...path, key]\n\t\t\tObject.defineProperty(getters, key, {\n\t\t\t\tvalue: (equalityFn = shallow) => {\n\t\t\t\t\treturn useStoreWithEqualityFn(\n\t\t\t\t\t\tapi,\n\t\t\t\t\t\t(state) => getFromPath(state, newPath),\n\t\t\t\t\t\tequalityFn\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\twritable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t})\n\n\t\t\tgenerateUseStep(state[key], getters[key], newPath, api)\n\t\t})\n\t}\n}\n\nfunction getFromPath(state: any, path: string[]) {\n\tlet data = state\n\n\tfor (let key of path) {\n\t\tdata = data[key]\n\t\tif (!data) {\n\t\t\treturn data\n\t\t}\n\t}\n\n\treturn data\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\nimport { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { Default, GettersBuilder, State, StoreApi } from '../types'\n\nexport function extendGetters<\n\tBuilder extends GettersBuilder<S, Getters, Setters>,\n\tS extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, api: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\tconst newGetters = builder(api)\n\n\tObject.keys(newGetters).forEach((key) => {\n\t\t// @ts-ignore\n\t\tapi.use[key] = (...args: any[]) =>\n\t\t\tuseStoreWithEqualityFn(\n\t\t\t\tlib,\n\t\t\t\t() => {\n\t\t\t\t\treturn newGetters[key](...args)\n\t\t\t\t},\n\t\t\t\tshallow\n\t\t\t)\n\t})\n\n\tapi.get = Object.assign(api.get, newGetters)\n\treturn api\n}\n","import { Default, SettersBuilder, State, StoreApi } from '../types'\n\nexport function extendSetters<\n\tBuilder extends SettersBuilder<S, Getters, Setters>,\n\tS extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, api: StoreApi<S, Getters, Setters>) {\n\tapi.set = Object.assign(api.set, builder(api))\n\treturn api\n}\n","import { GetRecord, SetRecord, State, StoreApi } from '../types'\n\nexport function restrictState<\n\tS extends State,\n\tKey extends keyof S,\n\tGetters extends GetRecord<any>,\n\tSetters extends SetRecord<any>,\n>(privateState: Key[], mergedState: S, thisApi: StoreApi<S, Getters, Setters>) {\n\treturn {\n\t\tapi: thisApi.api,\n\t\tset: thisApi.set,\n\t\tuse: privateState\n\t\t\t? Object.keys(thisApi.use).reduce(\n\t\t\t\t\t(acc, key) =>\n\t\t\t\t\t\tmergedState[key] && (privateState as string[]).includes(key)\n\t\t\t\t\t\t\t? acc\n\t\t\t\t\t\t\t: { ...acc, [key]: thisApi.use[key] },\n\t\t\t\t\t{}\n\t\t\t\t)\n\t\t\t: thisApi.use,\n\t\tget: privateState\n\t\t\t? () =>\n\t\t\t\t\tObject.entries(thisApi.get()).reduce(\n\t\t\t\t\t\t(acc, [key, val]) =>\n\t\t\t\t\t\t\tmergedState[key] && (privateState as string[]).includes(key)\n\t\t\t\t\t\t\t\t? acc\n\t\t\t\t\t\t\t\t: { ...acc, [key]: val },\n\t\t\t\t\t\t{}\n\t\t\t\t\t)\n\t\t\t: thisApi.get,\n\t}\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, set }) => ({\n\t\t\treset: () => {\n\t\t\t\tset(api.getInitialState?.() ?? {}, 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","generateApi","api","generateGet","api","setterName","generateSet","lib","hasDevtools","setters","updater","replace","name","key","value","state","import_shallow","import_traditional","import_shallow","import_traditional","generateUseStep","state","getters","path","api","key","newPath","equalityFn","getFromPath","data","generateUse","api","getters","selector","equality","generateUseStep","import_shallow","import_traditional","extendGetters","builder","api","lib","newGetters","key","args","extendSetters","builder","api","restrictState","privateState","mergedState","thisApi","acc","key","val","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","storeApi","createVanillaStore","store","generateApi","generateGet","generateSet","generateUse","builder","extendGetters","extendSetters","publicState","restrictState","reset","store","api","set"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { StoreApi as StoreApi$1 } from 'zustand';
|
|
2
|
+
import { DevtoolsOptions, PersistOptions } from 'zustand/middleware';
|
|
3
|
+
|
|
4
|
+
type State = Record<string | symbol, unknown>;
|
|
5
|
+
type Empty = Record<string, never>;
|
|
6
|
+
type Default = Record<string | symbol, any>;
|
|
7
|
+
type EqualityChecker<S> = (state: S, newState: S) => boolean;
|
|
8
|
+
type StoreApiEncapsulated<S extends State = Empty, Getters = Default, Setters = Default> = {
|
|
9
|
+
api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
|
|
10
|
+
get: GetRecord<S> & Getters;
|
|
11
|
+
set: SetRecord<S> & Setters;
|
|
12
|
+
use: UseRecord<S> & Getters;
|
|
13
|
+
};
|
|
14
|
+
type StoreApi<S extends State = Empty, Getters = Default, Setters = Default> = {
|
|
15
|
+
api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
|
|
16
|
+
get: GetRecord<S> & Getters;
|
|
17
|
+
set: SetRecord<S> & Setters;
|
|
18
|
+
use: UseRecord<S> & Getters;
|
|
19
|
+
extendGetters<Builder extends GettersBuilder<S, Getters, Setters>>(builder: Builder): StoreApi<S, Getters & ReturnType<Builder>, Setters>;
|
|
20
|
+
extendSetters<Builder extends SettersBuilder<S, Getters, Setters>>(builder: Builder): StoreApi<S, Getters, Setters & ReturnType<Builder>>;
|
|
21
|
+
restrictState(): StoreApiEncapsulated<S, Getters, Setters>;
|
|
22
|
+
restrictState<Key extends keyof S>(publicState: Key[]): StoreApiEncapsulated<Omit<S, Key>, Getters, Setters>;
|
|
23
|
+
};
|
|
24
|
+
type GettersBuilder<S extends State, Getters = Default, Setters = Default> = (args: {
|
|
25
|
+
api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
|
|
26
|
+
get: GetRecord<S> & Getters;
|
|
27
|
+
set: SetRecord<S> & Setters;
|
|
28
|
+
}) => Record<string, (...args: any[]) => any>;
|
|
29
|
+
type SettersBuilder<S extends State, Getters = Default, Setters = Default> = (args: {
|
|
30
|
+
api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
|
|
31
|
+
get: GetRecord<S> & Getters;
|
|
32
|
+
set: SetRecord<S> & Setters;
|
|
33
|
+
}) => Record<string, (...args: any[]) => void>;
|
|
34
|
+
type GetRecord<S extends Record<string, any>> = () => S;
|
|
35
|
+
type SetRecord<S extends Record<string, any>> = StoreApi$1<S>['setState'] & {
|
|
36
|
+
[K in keyof S]-?: (value: S[K]) => void;
|
|
37
|
+
};
|
|
38
|
+
type UseRecord<S, R = any> = UseRecordDeep<S> & ((selector: (state: S) => R, equality?: EqualityChecker<S>) => R);
|
|
39
|
+
type UseRecordDeep<S> = {
|
|
40
|
+
[K in keyof S]-?: S[K] extends Record<string, any> ? IsOptional<S, K> extends false ? ((equalityFn?: EqualityChecker<S[K]>) => S[K]) & UseRecordDeep<S[K]> : never : (equalityFn?: EqualityChecker<S[K]>) => S[K];
|
|
41
|
+
};
|
|
42
|
+
type IsOptional<S, K extends keyof S> = undefined extends S[K] ? {} extends Pick<S, K> ? true : false : false;
|
|
43
|
+
type StoreApiPlugin<NewApiData extends State, NewGetters, NewSetters> = {
|
|
44
|
+
creates?: () => NewApiData;
|
|
45
|
+
extends?: (store: StoreApi<NewApiData, NewGetters, NewSetters>) => StoreApi<NewApiData, NewGetters, NewSetters>;
|
|
46
|
+
};
|
|
47
|
+
type StoreApiPluginList = StoreApiPlugin<any, any, any>[];
|
|
48
|
+
type AugmentedApiData<S, Plugins extends StoreApiPluginList> = S & UnionToIntersection<ExtractPluginTypes<Plugins, 'create'>[number]>;
|
|
49
|
+
type AugmentedGetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['getters']>;
|
|
50
|
+
type AugmentedSetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['setters']>;
|
|
51
|
+
type ExtractPluginTypes<Plugins extends StoreApiPluginList, Key extends 'create' | 'extend'> = {
|
|
52
|
+
[K in keyof Plugins]: Plugins[K] extends StoreApiPlugin<infer S, infer G, infer A> ? Key extends 'create' ? S : Key extends 'extend' ? {
|
|
53
|
+
getters: G;
|
|
54
|
+
setters: A;
|
|
55
|
+
} : never : never;
|
|
56
|
+
};
|
|
57
|
+
type UnionToIntersection<S> = (S extends any ? (k: S) => void : never) extends (k: infer I) => void ? I : never;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Entire zustand-lite no-boilerplate functionality is inspired by this recipe:
|
|
61
|
+
* https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party
|
|
62
|
+
* zustand-x repository: https://github.com/udecode/zustand-x.
|
|
63
|
+
**/
|
|
64
|
+
|
|
65
|
+
declare function createStore<S extends State, Plugins extends StoreApiPluginList = []>(initialState: S, options?: {
|
|
66
|
+
name?: string;
|
|
67
|
+
plugins?: [...Plugins];
|
|
68
|
+
middlewares?: {
|
|
69
|
+
devtools?: true | DevtoolsOptions;
|
|
70
|
+
persist?: true | PersistOptions<any>;
|
|
71
|
+
};
|
|
72
|
+
}): Plugins extends [] ? StoreApi<S> : StoreApi<AugmentedApiData<S, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>>;
|
|
73
|
+
|
|
74
|
+
type PluginResetSetters = {
|
|
75
|
+
reset: () => void;
|
|
76
|
+
};
|
|
77
|
+
declare const reset: StoreApiPlugin<{}, {}, PluginResetSetters>;
|
|
78
|
+
|
|
79
|
+
export { type StoreApiPlugin, createStore, reset };
|
package/dist/index.d.ts
CHANGED
|
@@ -4,51 +4,48 @@ import { DevtoolsOptions, PersistOptions } from 'zustand/middleware';
|
|
|
4
4
|
type State = Record<string | symbol, unknown>;
|
|
5
5
|
type Empty = Record<string, never>;
|
|
6
6
|
type Default = Record<string | symbol, any>;
|
|
7
|
-
type EqualityChecker<
|
|
8
|
-
type
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
get: StoreApiGet<T, Getters>;
|
|
14
|
-
set: StoreApiSet<T, Setters>;
|
|
15
|
-
use: StoreApiUse<T, Getters>;
|
|
7
|
+
type EqualityChecker<S> = (state: S, newState: S) => boolean;
|
|
8
|
+
type StoreApiEncapsulated<S extends State = Empty, Getters = Default, Setters = Default> = {
|
|
9
|
+
api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
|
|
10
|
+
get: GetRecord<S> & Getters;
|
|
11
|
+
set: SetRecord<S> & Setters;
|
|
12
|
+
use: UseRecord<S> & Getters;
|
|
16
13
|
};
|
|
17
|
-
type StoreApi<
|
|
18
|
-
api: StoreApi$1<
|
|
19
|
-
get:
|
|
20
|
-
set:
|
|
21
|
-
use:
|
|
22
|
-
extendGetters<Builder extends GettersBuilder<
|
|
23
|
-
extendSetters<Builder extends SettersBuilder<
|
|
24
|
-
restrictState(): StoreApiEncapsulated<
|
|
25
|
-
restrictState<Key extends keyof
|
|
14
|
+
type StoreApi<S extends State = Empty, Getters = Default, Setters = Default> = {
|
|
15
|
+
api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
|
|
16
|
+
get: GetRecord<S> & Getters;
|
|
17
|
+
set: SetRecord<S> & Setters;
|
|
18
|
+
use: UseRecord<S> & Getters;
|
|
19
|
+
extendGetters<Builder extends GettersBuilder<S, Getters, Setters>>(builder: Builder): StoreApi<S, Getters & ReturnType<Builder>, Setters>;
|
|
20
|
+
extendSetters<Builder extends SettersBuilder<S, Getters, Setters>>(builder: Builder): StoreApi<S, Getters, Setters & ReturnType<Builder>>;
|
|
21
|
+
restrictState(): StoreApiEncapsulated<S, Getters, Setters>;
|
|
22
|
+
restrictState<Key extends keyof S>(publicState: Key[]): StoreApiEncapsulated<Omit<S, Key>, Getters, Setters>;
|
|
26
23
|
};
|
|
27
|
-
type GettersBuilder<
|
|
28
|
-
api: StoreApi$1<
|
|
29
|
-
get:
|
|
30
|
-
set:
|
|
24
|
+
type GettersBuilder<S extends State, Getters = Default, Setters = Default> = (args: {
|
|
25
|
+
api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
|
|
26
|
+
get: GetRecord<S> & Getters;
|
|
27
|
+
set: SetRecord<S> & Setters;
|
|
31
28
|
}) => Record<string, (...args: any[]) => any>;
|
|
32
|
-
type SettersBuilder<
|
|
33
|
-
api: StoreApi$1<
|
|
34
|
-
get:
|
|
35
|
-
set:
|
|
29
|
+
type SettersBuilder<S extends State, Getters = Default, Setters = Default> = (args: {
|
|
30
|
+
api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
|
|
31
|
+
get: GetRecord<S> & Getters;
|
|
32
|
+
set: SetRecord<S> & Setters;
|
|
36
33
|
}) => Record<string, (...args: any[]) => void>;
|
|
37
|
-
type GetRecord<
|
|
38
|
-
|
|
34
|
+
type GetRecord<S extends Record<string, any>> = () => S;
|
|
35
|
+
type SetRecord<S extends Record<string, any>> = StoreApi$1<S>['setState'] & {
|
|
36
|
+
[K in keyof S]-?: (value: S[K]) => void;
|
|
39
37
|
};
|
|
40
|
-
type UseRecord<
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
type SetRecord<O extends Record<string, any>> = {
|
|
44
|
-
[K in keyof O]: (value: O[K]) => void;
|
|
38
|
+
type UseRecord<S, R = any> = UseRecordDeep<S> & ((selector: (state: S) => R, equality?: EqualityChecker<S>) => R);
|
|
39
|
+
type UseRecordDeep<S> = {
|
|
40
|
+
[K in keyof S]-?: S[K] extends Record<string, any> ? IsOptional<S, K> extends false ? ((equalityFn?: EqualityChecker<S[K]>) => S[K]) & UseRecordDeep<S[K]> : never : (equalityFn?: EqualityChecker<S[K]>) => S[K];
|
|
45
41
|
};
|
|
42
|
+
type IsOptional<S, K extends keyof S> = undefined extends S[K] ? {} extends Pick<S, K> ? true : false : false;
|
|
46
43
|
type StoreApiPlugin<NewApiData extends State, NewGetters, NewSetters> = {
|
|
47
44
|
creates?: () => NewApiData;
|
|
48
45
|
extends?: (store: StoreApi<NewApiData, NewGetters, NewSetters>) => StoreApi<NewApiData, NewGetters, NewSetters>;
|
|
49
46
|
};
|
|
50
47
|
type StoreApiPluginList = StoreApiPlugin<any, any, any>[];
|
|
51
|
-
type AugmentedApiData<
|
|
48
|
+
type AugmentedApiData<S, Plugins extends StoreApiPluginList> = S & UnionToIntersection<ExtractPluginTypes<Plugins, 'create'>[number]>;
|
|
52
49
|
type AugmentedGetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['getters']>;
|
|
53
50
|
type AugmentedSetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['setters']>;
|
|
54
51
|
type ExtractPluginTypes<Plugins extends StoreApiPluginList, Key extends 'create' | 'extend'> = {
|
|
@@ -57,7 +54,7 @@ type ExtractPluginTypes<Plugins extends StoreApiPluginList, Key extends 'create'
|
|
|
57
54
|
setters: A;
|
|
58
55
|
} : never : never;
|
|
59
56
|
};
|
|
60
|
-
type UnionToIntersection<
|
|
57
|
+
type UnionToIntersection<S> = (S extends any ? (k: S) => void : never) extends (k: infer I) => void ? I : never;
|
|
61
58
|
|
|
62
59
|
/**
|
|
63
60
|
* Entire zustand-lite no-boilerplate functionality is inspired by this recipe:
|
|
@@ -65,14 +62,14 @@ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
|
|
|
65
62
|
* zustand-x repository: https://github.com/udecode/zustand-x.
|
|
66
63
|
**/
|
|
67
64
|
|
|
68
|
-
declare function createStore<
|
|
65
|
+
declare function createStore<S extends State, Plugins extends StoreApiPluginList = []>(initialState: S, options?: {
|
|
69
66
|
name?: string;
|
|
70
67
|
plugins?: [...Plugins];
|
|
71
68
|
middlewares?: {
|
|
72
69
|
devtools?: true | DevtoolsOptions;
|
|
73
70
|
persist?: true | PersistOptions<any>;
|
|
74
71
|
};
|
|
75
|
-
}): Plugins extends [] ? StoreApi<
|
|
72
|
+
}): Plugins extends [] ? StoreApi<S> : StoreApi<AugmentedApiData<S, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>>;
|
|
76
73
|
|
|
77
74
|
type PluginResetSetters = {
|
|
78
75
|
reset: () => void;
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
`)[3].trim().split(" ")[1].split(".")[1]??"setState"}function
|
|
1
|
+
import{devtools as D,persist as E}from"zustand/middleware";import{createStore as j}from"zustand/vanilla";function l(e){return{getInitialState:e.getInitialState,subscribe:e.subscribe}}function m(e){return()=>e.getState()}function A(){return new Error()?.stack?.split(`
|
|
2
|
+
`)[3].trim().split(" ")[1].split("Object.")[1]??"setState"}function p(e,r){let s=(o,t,n)=>{e.setState(o,t,r?{type:n??A(),payload:o}:void 0)};return Object.keys(e.getState()).forEach(o=>{s[o]=t=>{e.getState()[o]!==t&&e.setState(n=>({...n,[o]:t}),!1,r?{type:o,payload:{[o]:t}}:void 0)}}),s}import{shallow as P}from"zustand/shallow";import{useStoreWithEqualityFn as B}from"zustand/traditional";import{shallow as y}from"zustand/shallow";import{useStoreWithEqualityFn as G}from"zustand/traditional";function d(e,r,s,o){typeof e=="object"&&e!==null&&Object.keys(e).forEach(t=>{let n=[...s,t];Object.defineProperty(r,t,{value:(S=y)=>G(o,u=>b(u,n),S),writable:!0,configurable:!0,enumerable:!0}),d(e[t],r[t],n,o)})}function b(e,r){let s=e;for(let o of r)if(s=s[o],!s)return s;return s}function f(e){let r=(s,o=P)=>B(e,s,o);return d(e.getState(),r,[],e),r}import{shallow as O}from"zustand/shallow";import{useStoreWithEqualityFn as h}from"zustand/traditional";function c(e,r,s){let o=e(r);return Object.keys(o).forEach(t=>{r.use[t]=(...n)=>h(s,()=>o[t](...n),O)}),r.get=Object.assign(r.get,o),r}function g(e,r){return r.set=Object.assign(r.set,e(r)),r}function x(e,r,s){return{api:s.api,set:s.set,use:e?Object.keys(s.use).reduce((o,t)=>r[t]&&e.includes(t)?o:{...o,[t]:s.use[t]},{}):s.use,get:e?()=>Object.entries(s.get()).reduce((o,[t,n])=>r[t]&&e.includes(t)?o:{...o,[t]:n},{}):s.get}}function w(e,r){let{name:s="zustand-lite",plugins:o=[],middlewares:t={}}=r??{},n=e;o.forEach(i=>{i.creates&&(n={...n,...i.creates()})});let S=()=>n;t.devtools&&(S=D(S,t.devtools===!0?{name:"zustand-lite",store:s}:t.devtools)),t.persist&&(S=E(S,t.persist===!0?{name:s}:t.persist));let u=j(S),a={api:l(u),get:m(u),set:p(u,!!t.devtools),use:f(u),extendGetters(i){return c(i,this,u)},extendSetters(i){return g(i,this)},restrictState(i=[]){return x(i,n,this)}};return o.forEach(i=>{i.extends&&(a=i.extends(a))}),a}var R={extends:e=>e.extendSetters(({api:r,set:s})=>({reset:()=>{s(r.getInitialState?.()??{},!0)}}))};export{w as createStore,R as 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\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"]}
|
|
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/generateUseStep.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<S extends State, Plugins extends StoreApiPluginList = []>(\n\tinitialState: S,\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<S>\n\t: StoreApi<AugmentedApiData<S, 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),\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, storeApi)\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(publicState = []) {\n\t\t\treturn restrictState(publicState, mergedState, this)\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\n/**\n * Required to wrap original Zustand interface without getState and setState, which are handled\n * by get and set.\n * @param api Zustand api interface\n */\nexport function generateApi<S extends State>(api: StoreApi<S>) {\n\treturn { getInitialState: api.getInitialState, subscribe: api.subscribe }\n}\n","import { StoreApi } from 'zustand/vanilla'\n\nimport { State } from '../types'\n\nexport function generateGet<S extends State>(api: StoreApi<S>) {\n\treturn () => api.getState()\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { SetRecord, State } from '../types'\n\nfunction setterName() {\n\treturn new Error()?.stack?.split('\\n')[3].trim().split(' ')[1].split('Object.')[1] ?? 'setState'\n}\n\n/**\n * Generates automatic setters like store.set.foo(value)\n * @param lib Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateSet<S extends State>(lib: StoreLib<S>, hasDevtools: boolean): SetRecord<S> {\n\tconst setters = (updater: S | ((state: S) => S), replace?: boolean, name?: string) => {\n\t\tlib.setState(\n\t\t\tupdater,\n\t\t\treplace,\n\t\t\t// @ts-ignore Additional parameter will have no effect even if devtools are disabled.\n\t\t\thasDevtools ? { type: name ?? setterName(), payload: updater } : undefined\n\t\t)\n\t}\n\n\tObject.keys(lib.getState()).forEach((key) => {\n\t\t// @ts-ignore\n\t\tsetters[key] = (value: any) => {\n\t\t\tif (lib.getState()[key] === value) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlib.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 as SetRecord<S>\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { StoreApi } from 'zustand'\n\nimport { State, EqualityChecker } from '../types'\nimport { generateUseStep } from './generateUseStep'\n\n/**\n * Generates automatic getters like store.use.foo()\n * @param api Zustand api interface\n */\nexport function generateUse<S extends State, U>(api: StoreApi<S>) {\n\tconst getters = (selector: (state: S) => U, equality: EqualityChecker<U> = shallow) => {\n\t\treturn useStoreWithEqualityFn(api, selector, equality)\n\t}\n\n\tgenerateUseStep(api.getState(), getters, [], api)\n\treturn getters\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nexport function generateUseStep(\n\tstate: any,\n\tgetters: any,\n\tpath: string[],\n\tapi: any,\n) {\n\tif (typeof state === 'object' && state !== null) {\n\t\tObject.keys(state).forEach((key) => {\n\t\t\tconst newPath = [...path, key]\n\t\t\tObject.defineProperty(getters, key, {\n\t\t\t\tvalue: (equalityFn = shallow) => {\n\t\t\t\t\treturn useStoreWithEqualityFn(\n\t\t\t\t\t\tapi,\n\t\t\t\t\t\t(state) => getFromPath(state, newPath),\n\t\t\t\t\t\tequalityFn\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\twritable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t})\n\n\t\t\tgenerateUseStep(state[key], getters[key], newPath, api)\n\t\t})\n\t}\n}\n\nfunction getFromPath(state: any, path: string[]) {\n\tlet data = state\n\n\tfor (let key of path) {\n\t\tdata = data[key]\n\t\tif (!data) {\n\t\t\treturn data\n\t\t}\n\t}\n\n\treturn data\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\nimport { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { Default, GettersBuilder, State, StoreApi } from '../types'\n\nexport function extendGetters<\n\tBuilder extends GettersBuilder<S, Getters, Setters>,\n\tS extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, api: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\tconst newGetters = builder(api)\n\n\tObject.keys(newGetters).forEach((key) => {\n\t\t// @ts-ignore\n\t\tapi.use[key] = (...args: any[]) =>\n\t\t\tuseStoreWithEqualityFn(\n\t\t\t\tlib,\n\t\t\t\t() => {\n\t\t\t\t\treturn newGetters[key](...args)\n\t\t\t\t},\n\t\t\t\tshallow\n\t\t\t)\n\t})\n\n\tapi.get = Object.assign(api.get, newGetters)\n\treturn api\n}\n","import { Default, SettersBuilder, State, StoreApi } from '../types'\n\nexport function extendSetters<\n\tBuilder extends SettersBuilder<S, Getters, Setters>,\n\tS extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, api: StoreApi<S, Getters, Setters>) {\n\tapi.set = Object.assign(api.set, builder(api))\n\treturn api\n}\n","import { GetRecord, SetRecord, State, StoreApi } from '../types'\n\nexport function restrictState<\n\tS extends State,\n\tKey extends keyof S,\n\tGetters extends GetRecord<any>,\n\tSetters extends SetRecord<any>,\n>(privateState: Key[], mergedState: S, thisApi: StoreApi<S, Getters, Setters>) {\n\treturn {\n\t\tapi: thisApi.api,\n\t\tset: thisApi.set,\n\t\tuse: privateState\n\t\t\t? Object.keys(thisApi.use).reduce(\n\t\t\t\t\t(acc, key) =>\n\t\t\t\t\t\tmergedState[key] && (privateState as string[]).includes(key)\n\t\t\t\t\t\t\t? acc\n\t\t\t\t\t\t\t: { ...acc, [key]: thisApi.use[key] },\n\t\t\t\t\t{}\n\t\t\t\t)\n\t\t\t: thisApi.use,\n\t\tget: privateState\n\t\t\t? () =>\n\t\t\t\t\tObject.entries(thisApi.get()).reduce(\n\t\t\t\t\t\t(acc, [key, val]) =>\n\t\t\t\t\t\t\tmergedState[key] && (privateState as string[]).includes(key)\n\t\t\t\t\t\t\t\t? acc\n\t\t\t\t\t\t\t\t: { ...acc, [key]: val },\n\t\t\t\t\t\t{}\n\t\t\t\t\t)\n\t\t\t: thisApi.get,\n\t}\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, set }) => ({\n\t\t\treset: () => {\n\t\t\t\tset(api.getInitialState?.() ?? {}, true)\n\t\t\t},\n\t\t}))\n\t},\n}\n"],"mappings":"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","names":["devtools","persist","createVanillaStore","generateApi","api","generateGet","api","setterName","generateSet","lib","hasDevtools","setters","updater","replace","name","key","value","state","shallow","useStoreWithEqualityFn","shallow","useStoreWithEqualityFn","generateUseStep","state","getters","path","api","key","newPath","equalityFn","getFromPath","data","generateUse","api","getters","selector","equality","shallow","useStoreWithEqualityFn","generateUseStep","shallow","useStoreWithEqualityFn","extendGetters","builder","api","lib","newGetters","key","args","extendSetters","builder","api","restrictState","privateState","mergedState","thisApi","acc","key","val","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","set"]}
|
package/package.json
CHANGED
|
@@ -1,51 +1,63 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
2
|
+
"name": "zustand-lite",
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "Zustand Lite builds upon zustand, by auto-generating selectors and simplifying API even more.",
|
|
5
|
+
"author": "Piotr Siatkowski <p.siatkowski@gmail.com>",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"zustand",
|
|
9
|
+
"state-management",
|
|
10
|
+
"react",
|
|
11
|
+
"store",
|
|
12
|
+
"plugin",
|
|
13
|
+
"typescript",
|
|
14
|
+
"no-boilerplate"
|
|
15
|
+
],
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git://github.com/PiotrSiatkowski/zustand-lite.git",
|
|
19
|
+
"web": "https://github.com/PiotrSiatkowski/zustand-lite"
|
|
20
|
+
},
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/PiotrSiatkowski/zustand-lite/issues"
|
|
23
|
+
},
|
|
24
|
+
"sideEffects": false,
|
|
25
|
+
"type": "module",
|
|
26
|
+
"main": "dist/index.js",
|
|
27
|
+
"module": "dist/index.mjs",
|
|
28
|
+
"types": "dist/index.d.ts",
|
|
29
|
+
"files": [
|
|
30
|
+
"dist/**/*"
|
|
31
|
+
],
|
|
32
|
+
"exports": {
|
|
33
|
+
".": {
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
35
|
+
"import": "./dist/index.mjs",
|
|
36
|
+
"module": "./dist/index.mjs",
|
|
37
|
+
"require": "./dist/index.js"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "jest && tsup src/index.ts --format cjs,esm --dts --clean --sourcemap --minify",
|
|
42
|
+
"test": "jest"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"zustand": "5.0.5"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@testing-library/jest-dom": "^6.6.3",
|
|
49
|
+
"@testing-library/react": "^16.3.0",
|
|
50
|
+
"@types/jest": "^30.0.0",
|
|
51
|
+
"@types/react": "^19.1.8",
|
|
52
|
+
"jest": "^30.0.2",
|
|
53
|
+
"jest-environment-jsdom": "^30.0.2",
|
|
54
|
+
"prettier": "^3.5.3",
|
|
55
|
+
"react": "^19.0.0",
|
|
56
|
+
"react-dom": "^19.0.0",
|
|
57
|
+
"ts-jest": "^29.4.0",
|
|
58
|
+
"tsup": "^8.5.0",
|
|
59
|
+
"typescript": "5.8.3",
|
|
60
|
+
"use-sync-external-store": "^1.5.0"
|
|
61
|
+
},
|
|
62
|
+
"private": false
|
|
51
63
|
}
|
package/dist/index.d.mts
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { StoreApi as StoreApi$1 } from 'zustand';
|
|
2
|
-
import { DevtoolsOptions, PersistOptions } from 'zustand/middleware';
|
|
3
|
-
|
|
4
|
-
type State = Record<string | symbol, unknown>;
|
|
5
|
-
type Empty = Record<string, never>;
|
|
6
|
-
type Default = Record<string | symbol, any>;
|
|
7
|
-
type EqualityChecker<T> = (state: T, newState: T) => boolean;
|
|
8
|
-
type StoreApiGet<T extends State, Getters> = Required<GetRecord<T>> & Getters;
|
|
9
|
-
type StoreApiUse<T extends State, Getters> = Required<UseRecord<T>> & Getters;
|
|
10
|
-
type StoreApiSet<T extends State, Setters> = Required<SetRecord<T>> & Setters;
|
|
11
|
-
type StoreApiEncapsulated<T extends State = Empty, Getters = Default, Setters = Default> = {
|
|
12
|
-
api: StoreApi$1<T>;
|
|
13
|
-
get: StoreApiGet<T, Getters>;
|
|
14
|
-
set: StoreApiSet<T, Setters>;
|
|
15
|
-
use: StoreApiUse<T, Getters>;
|
|
16
|
-
};
|
|
17
|
-
type StoreApi<T extends State = Empty, Getters = Default, Setters = Default> = {
|
|
18
|
-
api: StoreApi$1<T>;
|
|
19
|
-
get: StoreApiGet<T, Getters>;
|
|
20
|
-
set: StoreApiSet<T, Setters>;
|
|
21
|
-
use: StoreApiUse<T, Getters>;
|
|
22
|
-
extendGetters<Builder extends GettersBuilder<T, Getters, Setters>>(builder: Builder): StoreApi<T, Getters & ReturnType<Builder>, Setters>;
|
|
23
|
-
extendSetters<Builder extends SettersBuilder<T, Getters, Setters>>(builder: Builder): StoreApi<T, Getters, Setters & ReturnType<Builder>>;
|
|
24
|
-
restrictState(): StoreApiEncapsulated<T, Getters, Setters>;
|
|
25
|
-
restrictState<Key extends keyof T>(publicState: Key[]): StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>;
|
|
26
|
-
};
|
|
27
|
-
type GettersBuilder<T extends State, Getters = Default, Setters = Default> = (args: {
|
|
28
|
-
api: StoreApi$1<T>;
|
|
29
|
-
get: StoreApiGet<T, Getters>;
|
|
30
|
-
set: StoreApiSet<T, Setters>;
|
|
31
|
-
}) => Record<string, (...args: any[]) => any>;
|
|
32
|
-
type SettersBuilder<T extends State, Getters = Default, Setters = Default> = (args: {
|
|
33
|
-
api: StoreApi$1<T>;
|
|
34
|
-
get: StoreApiGet<T, Getters>;
|
|
35
|
-
set: StoreApiSet<T, Setters>;
|
|
36
|
-
}) => Record<string, (...args: any[]) => void>;
|
|
37
|
-
type GetRecord<O extends Record<string, any>> = {
|
|
38
|
-
[K in keyof O]: () => O[K];
|
|
39
|
-
};
|
|
40
|
-
type UseRecord<O extends Record<string, any>> = {
|
|
41
|
-
[K in keyof O]: (equalityFn?: EqualityChecker<O[K]>) => O[K];
|
|
42
|
-
};
|
|
43
|
-
type SetRecord<O extends Record<string, any>> = {
|
|
44
|
-
[K in keyof O]: (value: O[K]) => void;
|
|
45
|
-
};
|
|
46
|
-
type StoreApiPlugin<NewApiData extends State, NewGetters, NewSetters> = {
|
|
47
|
-
creates?: () => NewApiData;
|
|
48
|
-
extends?: (store: StoreApi<NewApiData, NewGetters, NewSetters>) => StoreApi<NewApiData, NewGetters, NewSetters>;
|
|
49
|
-
};
|
|
50
|
-
type StoreApiPluginList = StoreApiPlugin<any, any, any>[];
|
|
51
|
-
type AugmentedApiData<T, Plugins extends StoreApiPluginList> = T & UnionToIntersection<ExtractPluginTypes<Plugins, 'create'>[number]>;
|
|
52
|
-
type AugmentedGetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['getters']>;
|
|
53
|
-
type AugmentedSetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['setters']>;
|
|
54
|
-
type ExtractPluginTypes<Plugins extends StoreApiPluginList, Key extends 'create' | 'extend'> = {
|
|
55
|
-
[K in keyof Plugins]: Plugins[K] extends StoreApiPlugin<infer S, infer G, infer A> ? Key extends 'create' ? S : Key extends 'extend' ? {
|
|
56
|
-
getters: G;
|
|
57
|
-
setters: A;
|
|
58
|
-
} : never : never;
|
|
59
|
-
};
|
|
60
|
-
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Entire zustand-lite no-boilerplate functionality is inspired by this recipe:
|
|
64
|
-
* https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party
|
|
65
|
-
* zustand-x repository: https://github.com/udecode/zustand-x.
|
|
66
|
-
**/
|
|
67
|
-
|
|
68
|
-
declare function createStore<T extends State, Plugins extends StoreApiPluginList = []>(initialState: T, options?: {
|
|
69
|
-
name?: string;
|
|
70
|
-
plugins?: [...Plugins];
|
|
71
|
-
middlewares?: {
|
|
72
|
-
devtools?: true | DevtoolsOptions;
|
|
73
|
-
persist?: true | PersistOptions<any>;
|
|
74
|
-
};
|
|
75
|
-
}): Plugins extends [] ? StoreApi<T> : StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>>;
|
|
76
|
-
|
|
77
|
-
type PluginResetSetters = {
|
|
78
|
-
reset: () => void;
|
|
79
|
-
};
|
|
80
|
-
declare const reset: StoreApiPlugin<{}, {}, PluginResetSetters>;
|
|
81
|
-
|
|
82
|
-
export { type StoreApiPlugin, createStore, reset };
|
package/dist/index.mjs
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
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
|
-
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"]}
|