zustand-lite 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,50 +8,47 @@
8
8
 
9
9
  Zustand Lite is a **zero-boilerplate** state management built specifically for frontend
10
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
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
13
  plugins, devtools, and state encapsulation, managing state becomes a breeze, not a chore.
14
14
 
15
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.
17
- com/udecode/zustand-x) and getters/setters auto-generation patterns._
16
+ ergonomics, plugins, and dynamic extension — inspired by [zustand-x](https://github.com/udecode/zustand-x) and getters/setters auto-generation patterns._
18
17
 
19
18
  ## 🛠️ Why **zustand‑lite**?
20
19
 
21
- ### ✅ TL;DR
20
+ ### ✅ In short
22
21
 
23
22
  _**Zustand Lite** delivers a **simple**, **performant**, and **predictable** way to manage UI
24
23
  state, letting your code stay focused on business logic, not infrastructure. Try it today and
25
24
  see how effortless frontend state can be!_
26
25
 
27
- While tools like React‑Query handle server state, UI state often gets bogged down by excessive
26
+ _While tools like React‑Query handle server state, UI state often gets bogged down by excessive
28
27
  boilerplate, tangled data flows, and hard‑to‑control side effects. **Zustand Lite** cuts through
29
- the noise:
28
+ the noise._
30
29
 
31
- ## 🚀 Features
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
32
41
 
33
42
  - ⚛️ **Minimal & Typed**: Built on top of lightweight Zustand core, fully typed with TypeScript.
34
43
  - 🔄 **Clean Separation**: State and operations are well separated to minimize confusion.
35
44
  - 🚀 **Blazing Performance**: Selective updates and lean subscriptions keep things snappy.
36
- - 🪄 **Zero Boilerplate**: No mock setups, no dependency arrays, just importing and using.
37
- - 🧪 **TestFriendly Design**: Easily tested, no context or mock hacks required.
38
- - 🌱 **Composable & Extensible**: Opinionated defaults that adapt as your application grows.
39
- - 🔌 **Shareable plugin system**: Plug custom logic directly into your store for extended capabilities.
40
- - 🧩 **Optional middleware integration**: Seamlessly add devtools and persist, middlewares that matter.
41
- - 🛠 **Chainable API**: `extendGetters()`, `extendSetters()`, `restrictState()`- create store in composable steps.
42
- - 👁 **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.
43
51
  - 🧼 **No dependencies, only Zustand**: Keeps bundle size small and performance high.
44
- - 😊 **Write only code you need**: Focus on business logic, not boilerplate.
45
-
46
- ## ✨ Why it matters
47
-
48
- Boilerplate is the killer of productivity and obscures your real goal: **business logic**, which is usually far simpler than it appears.
49
- Thanks to **zustand‑lite**, you can move faster without sacrificing clarity or flexibility:
50
-
51
- 1. **No Context Providers** or React-specific setup
52
- 2. **No Mocking** during tests
53
- 3. **No bloated dependency arrays**
54
- 4. **Type-safe, simple API** - designed for everyday use
55
52
 
56
53
  ---
57
54
 
@@ -62,170 +59,197 @@ Thanks to **zustand‑lite**, you can move faster without sacrificing clarity or
62
59
  ```ts
63
60
  import { createStore } from 'zustand-lite'
64
61
 
65
- const initialState: { foo: string } = { foo: '' }
66
-
67
- export const store = createStore(initialState)
62
+ export const store = createStore({ foo: '' })
68
63
 
69
64
  // Subscribe for your data changes.
70
65
  function Component() {
71
- const foo = store.use.foo()
66
+ const foo = store.use.foo()
72
67
  }
73
68
 
74
- // Synchronous accessor, when you need it.
69
+ // Synchronous state accessor.
75
70
  function onClick() {
76
- console.log(store.get().foo)
71
+ console.log(store.get().foo)
77
72
  }
78
73
 
79
- // Setting value with one line as it should be.
74
+ // Setting value with auto-generated setter.
80
75
  function onClick() {
81
- store.set.foo('new-value')
76
+ store.set.foo('new-value')
82
77
  }
83
78
  ```
84
79
 
85
80
  ### Custom Setters
86
81
 
82
+ ```ts
87
83
  const store = createStore({ count: 0 })
88
- .extendSetters(({ get, set }) => ({
89
- increment: () => set.count(get().count + 1)
90
- }))
84
+ .extendSetters(({ get, set }) => ({
85
+ increment: () => set.count(get().count + 1)
86
+ }))
91
87
 
92
88
  function Counter() {
93
- const count = store.use.count()
94
- return (
95
- <button onClick={store.set.increment}>
96
- Count: {count}
97
- </button>
98
- )
89
+ const count = store.use.count()
90
+ return (
91
+ <button onClick={store.set.increment}>
92
+ Count: {count}
93
+ </button>
94
+ )
99
95
  }
96
+ ```
100
97
 
101
98
  ### Advanced store
102
99
 
103
100
  ```ts
104
- const initialState: { foo: string; bar: { x: number; y: number } } = {
105
- point: { x: 0, y: 0 },
106
- rectangle: { a: 20, b: 10 },
101
+ const initialState: {
102
+ point: { x: number; y: number }
103
+ rectangle: { a: number; b: number }
104
+ } = {
105
+ point: { x: 0, y: 0 },
106
+ rectangle: { a: 20, b: 10 }
107
107
  }
108
108
 
109
109
  export const store = createStore(initialState)
110
- .extendGetters(({ get }) => ({
111
- area: () => get().bar.x * get().bar.y
112
- }))
113
- .extendSetters(({ get, set }) => ({
114
- translateX: (dx: number) => set.bar({ x: get().point.x + dx, y: get().point.y }),
115
- }))
116
- .restrictState(['rectangle'])
117
- // ^ Seal the store, so that certain fields are unavailable for the outside context.
118
-
119
- // Subscribe for computed data changes.
110
+ .extendGetters(({ get }) => ({
111
+ area: () => get().rectangle.x * get().rectangle.y,
112
+ }))
113
+ .extendSetters(({ get, set }) => ({
114
+ translateX: (dx: number) =>
115
+ set.bar({ x: get().point.x + dx, y: get().point.y }),
116
+ }))
117
+ .restrictState(['rectangle'])
118
+ // ^ Seal the store, so that certain fields are unavailable for
119
+ // the outside context, while still being available for getters and setters.
120
+
121
+ // Subscribe for computed data changes. This new selector is auto-generated.
120
122
  function Component() {
121
- const area = store.use.area()
123
+ const area = store.use.area()
122
124
  }
123
125
 
124
126
  // Make private value inaccessible.
125
127
  function onClick() {
126
- console.log(store.get().rectangle) <- TS error, no value
128
+ console.log(store.get().rectangle)
129
+ // ^ TS error, no value. It is not accessible
130
+ // anymore from outside the store.
127
131
  }
128
132
 
129
133
  // Call custom action.
130
134
  function onClick() {
131
- store.set.translateX(7)
135
+ store.set.translateX(7)
132
136
  }
133
137
 
134
- // Access native Zustand api (expect getState, setState, which are available thrugh store.get
135
- and store.set).
138
+ // Access native Zustand api (expect getState, setState,
139
+ // which are available thrugh store.get() and store.set()
140
+ // for simplicity and additional expresivness).
136
141
  function Component() {
137
- const state = store.api.getInitialState()
142
+ const state = store.api.getInitialState()
138
143
  }
139
144
  ```
140
145
 
141
- ### Deep selectors
146
+ ### Deep value getters
142
147
 
143
148
  ```ts
144
149
  const initialState: { my: { foo: { bar: string} } } = {
145
- my: { foo: { bar: 'value' } },
150
+ my: { foo: { bar: 'value' } },
146
151
  }
147
152
 
148
153
  export const store = createStore(initialState)
149
154
  .myFooBar(({ get }) => ({
150
- return get().my.foo.bar;
151
- }))
152
- .restrictState()
155
+ // Entire state is accessible with store.get()
156
+ return get().my.foo.bar;
157
+ }))
158
+ .restrictState()
153
159
 
154
160
  // Component will update only if deeply nested value will update.
155
161
  function Component() {
156
- const myFooBar = store.use.myFooBar()
162
+ const myFooBar = store.use.myFooBar()
157
163
  }
158
164
  ```
159
165
 
160
166
  ### Automatic deep selectors
161
167
 
162
168
  ```ts
163
- const initialState: { my: { foo: { bar: string } } } = { my: { foo: { bar: 'value' } } }
169
+ const initialState: { my: { foo: { bar: string } } } = {
170
+ my: { foo: { bar: 'value' } },
171
+ }
164
172
 
165
173
  export const store = createStore(initialState)
166
174
 
167
- // Component will update only if deeply nested value will update. Those selectors
168
- // will be generated for hooks only for required attributes.
175
+ // Component will update only if deeply nested value will update.
176
+ // Those selectors will be generated only for required attributes.
169
177
  function Component() {
170
- const myFooBar = store.use.my.foo.bar()
178
+ const myFooBar = store.use.my.foo.bar()
171
179
  }
172
180
  ```
173
181
 
174
182
  ### Ad-hoc selectors
175
183
 
176
184
  ```ts
177
- const initialState: { my: { foo: { bar: string } } } = { my: { foo: { bar: 'value' } } }
185
+ const initialState: { my: { foo: { bar: string } } } = {
186
+ my: { foo: { bar: 'value' } },
187
+ }
178
188
 
179
189
  export const store = createStore(initialState)
180
190
 
181
- // If no auto-generated selector is available, custom one may still be used.
191
+ // If no auto-generated selector is available,
192
+ // custom one may still be used.
182
193
  function Component() {
183
- const myFooBar = store.use((state) => state.my.foo, customEquality)
194
+ const myFooBar = store.use((state) => state.my.foo, customEquality)
184
195
  }
185
196
  ```
186
197
 
187
198
  ### Setting whole state
188
199
 
189
200
  ```ts
190
- const initialState: { my: { foo: { bar: string } } } = { my: { foo: { bar: 'value' } } }
201
+ const initialState: { my: { foo: { bar: string } } } = {
202
+ my: { foo: { bar: 'value' } },
203
+ }
191
204
 
192
205
  export const store = createStore(initialState)
193
206
 
194
- // State can be set with first level auto-generated setters or with store.set
207
+ // State can be set with first level auto-generated
208
+ // setters or with store.set
195
209
  store.set((state) => ({ ...state, newField: 'newField' }))
210
+ // By default state is shallowly merged.
211
+ store.set({ newField: 'newField' })
212
+ // Emptying the state with replace: true flag.
213
+ store.set({}, true)
196
214
  ```
197
215
 
198
216
  ### Overriding getters and setters
199
217
 
200
218
  ```ts
201
- const initialState: { point: { x: number; y: number }; rectangle: { a: number; b: number } } = {
202
- point: { x: 0, y: 0 },
203
- rectangle: { a: 20, b: 10 },
219
+ const initialState: {
220
+ point: { x: number; y: number }
221
+ rectangle: { a: number; b: number }
222
+ } = {
223
+ point: { x: 0, y: 0 },
224
+ rectangle: { a: 20, b: 10 }
204
225
  }
205
226
 
206
227
  export const store = createStore(initialState)
207
- .extendGetters(({ get }) => ({
208
- // get().point refers to the store value
209
- myPoint: () => transformToDifferentCoordinates(get().point),
210
- }))
211
- .extendGetters(({ get }) => ({
212
- // get.myPoint() will reference to the already transformed point from the previous getter
213
- // definition. It will override the previous one, but can use it inside.
214
- myPoint: () => soSomethingWithTransformedPoint(get.myPoint()),
215
- }))
216
- .restrictState()
228
+ .extendGetters(({ get }) => ({
229
+ // get().point refers to the store value
230
+ myPoint: () => transformToDifferentCoordinates(get().point),
231
+ }))
232
+ .extendGetters(({ get }) => ({
233
+ // get.myPoint() will refer to the already transformed point
234
+ // from the previous getter. It will override the previous
235
+ // one, but can still accesess anything defined before.
236
+ myPoint: () => soSomethingWithTransformedPoint(get.myPoint()),
237
+ }))
238
+ .restrictState()
217
239
  ```
218
240
 
219
241
  ### Custom equality
220
242
 
221
243
  ```ts
222
- const initialState: { rectangle: { a: number; b: number } } = { rectangle: { a: 20, b: 10 } }
244
+ const initialState: { rectangle: { a: number; b: number } } = {
245
+ rectangle: { a: 20, b: 10 },
246
+ }
223
247
 
224
- export const store = createStore(initialState).restrictState()
248
+ export const store = createStore(initialState)
225
249
 
226
250
  // By default shallow equality is being used.
227
251
  function Component() {
228
- const rectangle = store.use.rectangle(customEqualityFunction)
252
+ const rectangle = store.use.rectangle(customEqualityFn)
229
253
  }
230
254
  ```
231
255
 
@@ -233,14 +257,16 @@ function Component() {
233
257
 
234
258
  ```ts
235
259
  function Component() {
236
- const dependencyA = store.use.dependencyA()
260
+ const dependencyA = store.use.dependencyA()
237
261
  }
238
262
 
239
- // No need to mock the store or add additional providers, just interact with it in the test.
263
+ // No need to mock the store or add additional providers, just
264
+ // interact with it in the usual way. Wrapping setter with act
265
+ // might be needed to sync react updates.
240
266
  test('Testing Component', () => ({
241
- render(<Component />)
242
- act(() => store.set.dependencyA(someValue))
243
- expect(somethingStoreDependant).toBe(someValue)
267
+ render(<Component />)
268
+ act(() => store.set.dependencyA(someValue))
269
+ expect(storeDependantText).toBe(someValue)
244
270
  })
245
271
  ```
246
272
 
@@ -296,42 +322,43 @@ import { StoreApiPlugin } from 'zustand-lite'
296
322
  type Setters = { reset: () => void }
297
323
 
298
324
  export const reset: StoreApiPlugin<{}, {}, Setters> = {
299
- extends: (store) => {
300
- // If plugin defines data, that and only that data is available inside
301
- // setters and getters.
302
- return store.extendSetters(({ api, set }) => ({
303
- reset: () => {
304
- const initialState = api.getInitialState?.() ?? {}
305
- set(() => initialState, true)
306
- },
307
- }))
308
- },
325
+ extends: (store) => {
326
+ // If plugin defines data, that and only that data is available inside
327
+ // setters and getters.
328
+ return store.extendSetters(({ api, set }) => ({
329
+ // Every piece od data, getter or setter will be available in the custom
330
+ // extendGetter and extendSetter, allowing for even more interacctions.
331
+ reset: () => {
332
+ set(api.getInitialState?.() ?? {}, true)
333
+ },
334
+ }))
335
+ },
309
336
  }
310
337
  ```
311
338
 
312
- Apply it like this:
339
+ Apply newly created plugin like this:
313
340
 
314
341
  ```ts
315
342
  const store = createStore({}, { plugins: [reset] })
316
343
  ```
317
344
 
318
- **Any plugin state, getters, setters will be available for usage inside your own store.**
345
+ **Any plugin state, getters and setters will be available for usage inside your own store.**
319
346
 
320
347
  ---
321
348
 
322
349
  ## 🧪 Middlewares Integration
323
350
 
324
- You can add the most useful middlewares:
351
+ You can enable the most useful middlewares:
325
352
 
326
353
  ```ts
327
354
  {
328
- name: 'MyApp/CounterStore',
329
- middlewares: {
330
- devtools: true,
331
- persist: {
332
- ...options,
333
- },
334
- }
355
+ name: 'MyApp/CounterStore',
356
+ middlewares: {
357
+ devtools: true,
358
+ persist: {
359
+ ...options,
360
+ },
361
+ }
335
362
  }
336
363
  ```
337
364
 
@@ -341,13 +368,12 @@ You can add the most useful middlewares:
341
368
 
342
369
  - Configurable level of auto-generation. While I advise to keep store as flat as possible, good
343
370
  structured data is important. For deeper properties it might be more convenient to auto
344
- generate getters and setters for deeply nested properties as well. (done with hooks, entire
345
- state is selected for get)
371
+ generate getters and setters for deeply nested properties as well. **(partially done with hooks, entire
372
+ state is selected for get from version 3.0.0, setters still generated for level one only)**
346
373
  - createPlugin function that will automatically infer types from the usage without the need of
347
374
  specifying types yourself, avoiding repetitiveness.
348
375
  - Ability to specify equality function for extended getters. It's possible now, but requires to
349
- import hook from 'zustand' package, which is suboptimal (now available with custom selector
350
- notation or deep auto-generated selectors).
376
+ 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)**.
351
377
 
352
378
  ---
353
379
 
package/dist/index.cjs CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var l=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var w=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 w(t))!U.call(e,r)&&r!==o&&l(e,r,{get:()=>t[r],enumerable:!(s=j(t,r))||s.enumerable});return e};var v=e=>q(l({},"__esModule",{value:!0}),e);var z={};L(z,{createStore:()=>O,reset:()=>R});module.exports=v(z);var a=require("zustand/middleware"),E=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=>K(u,n),S),writable:!0,configurable:!0,enumerable:!0}),m(e[r],t[r],n,s)})}function K(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 P=require("zustand/shallow"),B=require("zustand/traditional");function b(e,t,o){return Object.keys(e(t)).forEach(s=>{t.use[s]=(...r)=>(0,B.useStoreWithEqualityFn)(o,()=>e(t)[s](...r),P.shallow),t.get[s]=(...r)=>e(t)[s](...r)}),t}function h(e,t){return{...t,set:{...t.set,...e(t)}}}function D(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 O(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,E.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 h(i,this)},restrictState(i=[]){return D(i,n,this)}};return s.forEach(i=>{i.extends&&(d=i.extends(d))}),d}var R={extends:e=>e.extendSetters(({api:t,set:o})=>({reset:()=>{o(t.getInitialState?.()??{},!0)}}))};0&&(module.exports={createStore,reset});
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
3
  //# sourceMappingURL=index.cjs.map
@@ -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/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<Key extends keyof S>(publicState: Key[] = []) {\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\tObject.keys(builder(api)).forEach((key) => {\n\t\t// @ts-ignore\n\t\tapi.use[key] = (...args: any[]) =>\n\t\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\t\tuseStoreWithEqualityFn(\n\t\t\t\tlib,\n\t\t\t\t() => {\n\t\t\t\t\treturn builder(api)[key](...args)\n\t\t\t\t},\n\t\t\t\tshallow\n\t\t\t)\n\n\t\t// @ts-ignore\n\t\tapi.get[key] = (...args: any[]) => {\n\t\t\treturn builder(api)[key](...args)\n\t\t}\n\t})\n\n\treturn api as StoreApi<S, Getters & ReturnType<Builder>, Setters>\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\treturn { ...api, set: { ...api.set, ...builder(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","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"]}
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.js CHANGED
@@ -1,3 +1,3 @@
1
- import{devtools as E,persist as O}from"zustand/middleware";import{createStore as R}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,o){let s=(r,t,n)=>{e.setState(r,t,o?{type:n??A(),payload:r}:void 0)};return Object.keys(e.getState()).forEach(r=>{s[r]=t=>{e.getState()[r]!==t&&e.setState(n=>({...n,[r]:t}),!1,o?{type:r,payload:{[r]:t}}:void 0)}}),s}import{shallow as B}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,o,s,r){typeof e=="object"&&e!==null&&Object.keys(e).forEach(t=>{let n=[...s,t];Object.defineProperty(o,t,{value:(S=y)=>G(r,u=>P(u,n),S),writable:!0,configurable:!0,enumerable:!0}),d(e[t],o[t],n,r)})}function P(e,o){let s=e;for(let r of o)if(s=s[r],!s)return s;return s}function f(e){let o=(s,r=B)=>b(e,s,r);return d(e.getState(),o,[],e),o}import{shallow as h}from"zustand/shallow";import{useStoreWithEqualityFn as D}from"zustand/traditional";function c(e,o,s){return Object.keys(e(o)).forEach(r=>{o.use[r]=(...t)=>D(s,()=>e(o)[r](...t),h),o.get[r]=(...t)=>e(o)[r](...t)}),o}function g(e,o){return{...o,set:{...o.set,...e(o)}}}function x(e,o,s){return{api:s.api,set:s.set,use:e?Object.keys(s.use).reduce((r,t)=>o[t]&&e.includes(t)?r:{...r,[t]:s.use[t]},{}):s.use,get:e?()=>Object.entries(s.get()).reduce((r,[t,n])=>o[t]&&e.includes(t)?r:{...r,[t]:n},{}):s.get}}function j(e,o){let{name:s="zustand-lite",plugins:r=[],middlewares:t={}}=o??{},n=e;r.forEach(i=>{i.creates&&(n={...n,...i.creates()})});let S=()=>n;t.devtools&&(S=E(S,t.devtools===!0?{name:"zustand-lite",store:s}:t.devtools)),t.persist&&(S=O(S,t.persist===!0?{name:s}:t.persist));let u=R(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 r.forEach(i=>{i.extends&&(a=i.extends(a))}),a}var w={extends:e=>e.extendSetters(({api:o,set:s})=>({reset:()=>{s(o.getInitialState?.()??{},!0)}}))};export{j as createStore,w as reset};
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/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<Key extends keyof S>(publicState: Key[] = []) {\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\tObject.keys(builder(api)).forEach((key) => {\n\t\t// @ts-ignore\n\t\tapi.use[key] = (...args: any[]) =>\n\t\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\t\tuseStoreWithEqualityFn(\n\t\t\t\tlib,\n\t\t\t\t() => {\n\t\t\t\t\treturn builder(api)[key](...args)\n\t\t\t\t},\n\t\t\t\tshallow\n\t\t\t)\n\n\t\t// @ts-ignore\n\t\tapi.get[key] = (...args: any[]) => {\n\t\t\treturn builder(api)[key](...args)\n\t\t}\n\t})\n\n\treturn api as StoreApi<S, Getters & ReturnType<Builder>, Setters>\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\treturn { ...api, set: { ...api.set, ...builder(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":"AAKA,OAA0C,YAAAA,EAAU,WAAAC,MAAe,qBACnE,OAAS,eAAeC,MAA0B,kBCG3C,SAASC,EAA6BC,EAAkB,CAC9D,MAAO,CAAE,gBAAiBA,EAAI,gBAAiB,UAAWA,EAAI,SAAU,CACzE,CCPO,SAASC,EAA6BC,EAAkB,CAC9D,MAAO,IAAMA,EAAI,SAAS,CAC3B,CCFA,SAASC,GAAa,CACrB,OAAO,IAAI,MAAM,GAAG,OAAO,MAAM;AAAA,CAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,SAAS,EAAE,CAAC,GAAK,UACvF,CAOO,SAASC,EAA6BC,EAAkBC,EAAoC,CAClG,IAAMC,EAAU,CAACC,EAAgCC,EAAmBC,IAAkB,CACrFL,EAAI,SACHG,EACAC,EAEAH,EAAc,CAAE,KAAMI,GAAQP,EAAW,EAAG,QAASK,CAAQ,EAAI,MAClE,CACD,EAEA,cAAO,KAAKH,EAAI,SAAS,CAAC,EAAE,QAASM,GAAQ,CAE5CJ,EAAQI,CAAG,EAAKC,GAAe,CAC1BP,EAAI,SAAS,EAAEM,CAAG,IAAMC,GAI5BP,EAAI,SACFQ,IAAW,CAAE,GAAGA,EAAO,CAACF,CAAG,EAAGC,CAAM,GACrC,GAEAN,EAAc,CAAE,KAAMK,EAAK,QAAS,CAAE,CAACA,CAAG,EAAGC,CAAM,CAAE,EAAI,MAC1D,CACD,CACD,CAAC,EAEML,CACR,CCxCA,OAAS,WAAAO,MAAe,kBACxB,OAAS,0BAAAC,MAA8B,sBCDvC,OAAS,WAAAC,MAAe,kBACxB,OAAS,0BAAAC,MAA8B,sBAEhC,SAASC,EACfC,EACAC,EACAC,EACAC,EACC,CACG,OAAOH,GAAU,UAAYA,IAAU,MAC1C,OAAO,KAAKA,CAAK,EAAE,QAASI,GAAQ,CACnC,IAAMC,EAAU,CAAC,GAAGH,EAAME,CAAG,EAC7B,OAAO,eAAeH,EAASG,EAAK,CACnC,MAAO,CAACE,EAAaT,IACbC,EACNK,EACCH,GAAUO,EAAYP,EAAOK,CAAO,EACrCC,CACD,EAED,SAAU,GACV,aAAc,GACd,WAAY,EACb,CAAC,EAEDP,EAAgBC,EAAMI,CAAG,EAAGH,EAAQG,CAAG,EAAGC,EAASF,CAAG,CACvD,CAAC,CAEH,CAEA,SAASI,EAAYP,EAAYE,EAAgB,CAChD,IAAIM,EAAOR,EAEX,QAASI,KAAOF,EAEf,GADAM,EAAOA,EAAKJ,CAAG,EACX,CAACI,EACJ,OAAOA,EAIT,OAAOA,CACR,CD7BO,SAASC,EAAgCC,EAAkB,CACjE,IAAMC,EAAU,CAACC,EAA2BC,EAA+BC,IACnEC,EAAuBL,EAAKE,EAAUC,CAAQ,EAGtD,OAAAG,EAAgBN,EAAI,SAAS,EAAGC,EAAS,CAAC,EAAGD,CAAG,EACzCC,CACR,CEnBA,OAAS,WAAAM,MAAe,kBACxB,OAAS,0BAAAC,MAA8B,sBAKhC,SAASC,EAKdC,EAAkBC,EAAoCC,EAAkB,CACzE,cAAO,KAAKF,EAAQC,CAAG,CAAC,EAAE,QAASE,GAAQ,CAE1CF,EAAI,IAAIE,CAAG,EAAI,IAAIC,IAElBN,EACCI,EACA,IACQF,EAAQC,CAAG,EAAEE,CAAG,EAAE,GAAGC,CAAI,EAEjCP,CACD,EAGDI,EAAI,IAAIE,CAAG,EAAI,IAAIC,IACXJ,EAAQC,CAAG,EAAEE,CAAG,EAAE,GAAGC,CAAI,CAElC,CAAC,EAEMH,CACR,CC7BO,SAASI,EAKdC,EAAkBC,EAAoC,CACvD,MAAO,CAAE,GAAGA,EAAK,IAAK,CAAE,GAAGA,EAAI,IAAK,GAAGD,EAAQC,CAAG,CAAE,CAAE,CACvD,CCPO,SAASC,EAKdC,EAAqBC,EAAgBC,EAAwC,CAC9E,MAAO,CACN,IAAKA,EAAQ,IACb,IAAKA,EAAQ,IACb,IAAKF,EACF,OAAO,KAAKE,EAAQ,GAAG,EAAE,OACzB,CAACC,EAAKC,IACLH,EAAYG,CAAG,GAAMJ,EAA0B,SAASI,CAAG,EACxDD,EACA,CAAE,GAAGA,EAAK,CAACC,CAAG,EAAGF,EAAQ,IAAIE,CAAG,CAAE,EACtC,CAAC,CACF,EACCF,EAAQ,IACX,IAAKF,EACF,IACA,OAAO,QAAQE,EAAQ,IAAI,CAAC,EAAE,OAC7B,CAACC,EAAK,CAACC,EAAKC,CAAG,IACdJ,EAAYG,CAAG,GAAMJ,EAA0B,SAASI,CAAG,EACxDD,EACA,CAAE,GAAGA,EAAK,CAACC,CAAG,EAAGC,CAAI,EACzB,CAAC,CACF,EACAH,EAAQ,GACZ,CACD,CRLO,SAASI,EACfC,EACAC,EAO+F,CAC/F,GAAM,CAAE,KAAAC,EAAO,eAAgB,QAAAC,EAAU,CAAC,EAAG,YAAAC,EAAc,CAAC,CAAE,EAAIH,GAAW,CAAC,EAG1EI,EAAmBL,EACvBG,EAAQ,QAASG,GAAW,CACvBA,EAAO,UACVD,EAAc,CAAE,GAAGA,EAAa,GAAGC,EAAO,QAAQ,CAAE,EAEtD,CAAC,EAGD,IAAIC,EAAmB,IAAMF,EAEzBD,EAAY,WACfG,EAAcC,EACbD,EACAH,EAAY,WAAa,GACtB,CAAE,KAAM,eAAgB,MAAOF,CAAK,EACpCE,EAAY,QAChB,GAGGA,EAAY,UACfG,EAAcE,EACbF,EACAH,EAAY,UAAY,GAAO,CAAE,KAAAF,CAAK,EAAIE,EAAY,OACvD,GAID,IAAMM,EAAgBC,EAAmBJ,CAAW,EAGhDK,EAAa,CAChB,IAAKC,EAAYH,CAAQ,EACzB,IAAKI,EAAYJ,CAAQ,EACzB,IAAKK,EAAYL,EAAU,CAAC,CAACN,EAAY,QAAQ,EACjD,IAAKY,EAAYN,CAAQ,EACzB,cAAkEO,EAAkB,CACnF,OAAOC,EAAcD,EAAS,KAAMP,CAAQ,CAC7C,EACA,cAAkEO,EAAkB,CACnF,OAAOE,EAAcF,EAAS,IAAI,CACnC,EACA,cAAmCG,EAAqB,CAAC,EAAG,CAC3D,OAAOC,EAAcD,EAAaf,EAAa,IAAI,CACpD,CACD,EAGA,OAAAF,EAAQ,QAASG,GAAW,CACvBA,EAAO,UACVM,EAAQN,EAAO,QAAQM,CAAK,EAE9B,CAAC,EAEMA,CACR,CSzFO,IAAMU,EAAoD,CAChE,QAAUC,GACFA,EAAM,cAAc,CAAC,CAAE,IAAAC,EAAK,IAAAC,CAAI,KAAO,CAC7C,MAAO,IAAM,CACZA,EAAID,EAAI,kBAAkB,GAAK,CAAC,EAAG,EAAI,CACxC,CACD,EAAE,CAEJ","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","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"]}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "zustand-lite",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
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",