zustand-lite 0.2.2 โ 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 +335 -191
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,191 +1,335 @@
|
|
|
1
|
-
# ๐ง Zustand Lite
|
|
2
|
-
|
|
3
|
-
[](https://www.npmjs.com/package/zustand-lite)
|
|
4
|
-
[](https://bundlephobia.com/package/zustand-lite)
|
|
5
|
-
[](./LICENSE)
|
|
6
|
-
[](https://www.typescriptlang.org/)
|
|
7
|
-
[](https://github.com/PiotrSiatkowski/zustand-lite)
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
store.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const store = createStore(
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
1
|
+
# ๐ง Zustand Lite
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/zustand-lite)
|
|
4
|
+
[](https://bundlephobia.com/package/zustand-lite)
|
|
5
|
+
[](./LICENSE)
|
|
6
|
+
[](https://www.typescriptlang.org/)
|
|
7
|
+
[](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
|
@@ -22,7 +22,7 @@ type StoreApi<T extends State = Empty, Getters = Default, Setters = Default> = {
|
|
|
22
22
|
extendGetters<Builder extends GettersBuilder<T, Getters, Setters>>(builder: Builder): StoreApi<T, Getters & ReturnType<Builder>, Setters>;
|
|
23
23
|
extendSetters<Builder extends SettersBuilder<T, Getters, Setters>>(builder: Builder): StoreApi<T, Getters, Setters & ReturnType<Builder>>;
|
|
24
24
|
restrictState(): StoreApiEncapsulated<T, Getters, Setters>;
|
|
25
|
-
restrictState<Key extends keyof T>(publicState: Key[]): StoreApiEncapsulated<
|
|
25
|
+
restrictState<Key extends keyof T>(publicState: Key[]): StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>;
|
|
26
26
|
};
|
|
27
27
|
type GettersBuilder<T extends State, Getters = Default, Setters = Default> = (args: {
|
|
28
28
|
api: StoreApi$1<T>;
|
|
@@ -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
|
@@ -22,7 +22,7 @@ type StoreApi<T extends State = Empty, Getters = Default, Setters = Default> = {
|
|
|
22
22
|
extendGetters<Builder extends GettersBuilder<T, Getters, Setters>>(builder: Builder): StoreApi<T, Getters & ReturnType<Builder>, Setters>;
|
|
23
23
|
extendSetters<Builder extends SettersBuilder<T, Getters, Setters>>(builder: Builder): StoreApi<T, Getters, Setters & ReturnType<Builder>>;
|
|
24
24
|
restrictState(): StoreApiEncapsulated<T, Getters, Setters>;
|
|
25
|
-
restrictState<Key extends keyof T>(publicState: Key[]): StoreApiEncapsulated<
|
|
25
|
+
restrictState<Key extends keyof T>(publicState: Key[]): StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>;
|
|
26
26
|
};
|
|
27
27
|
type GettersBuilder<T extends State, Getters = Default, Setters = Default> = (args: {
|
|
28
28
|
api: StoreApi$1<T>;
|
|
@@ -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
|
|
2
|
-
`)[3].trim().split(" ")[1].split(".")[1]??"setState"}function
|
|
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
|
|
2
|
-
`)[3].trim().split(" ")[1].split(".")[1]??"setState"}function d(r,e){return{...r,setState:(o,s,t)=>{
|
|
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
|
package/dist/index.mjs.map
CHANGED
|
@@ -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":"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","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
|
+
"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
|
},
|