zustand-lite 0.3.1 → 0.3.3

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
@@ -63,17 +63,17 @@ export const store = createStore({ foo: '' })
63
63
 
64
64
  // Subscribe for your data changes.
65
65
  function Component() {
66
- const foo = store.use.foo()
66
+ const foo = store.use.foo()
67
67
  }
68
68
 
69
69
  // Synchronous state accessor.
70
70
  function onClick() {
71
- console.log(store.get().foo)
71
+ console.log(store.get().foo)
72
72
  }
73
73
 
74
74
  // Setting value with auto-generated setter.
75
75
  function onClick() {
76
- store.set.foo('new-value')
76
+ store.set.foo('new-value')
77
77
  }
78
78
  ```
79
79
 
@@ -81,57 +81,65 @@ function onClick() {
81
81
 
82
82
  ```ts
83
83
  const store = createStore({ count: 0 })
84
- .extendSetters(({ get, set }) => ({
85
- increment: () => set.count(get().count + 1)
86
- }))
84
+ .extendSetters(({ get, set }) => ({
85
+ increment: () => set.count(get().count + 1)
86
+ }))
87
87
 
88
88
  function Counter() {
89
- const count = store.use.count()
90
- return (
91
- <button onClick={store.set.increment}>
92
- Count: {count}
93
- </button>
94
- )
89
+ const count = store.use.count()
90
+ return (
91
+ <button onClick={store.set.increment}>
92
+ Count: {count}
93
+ </button>
94
+ )
95
95
  }
96
96
  ```
97
97
 
98
98
  ### Advanced store
99
99
 
100
100
  ```ts
101
- const initialState: { point: { x: number; y: number }; rectangle: { a: number; b: number } } = {
102
- point: { x: 0, y: 0 },
103
- rectangle: { a: 20, b: 10 },
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 }
104
107
  }
105
108
 
106
109
  export const store = createStore(initialState)
107
- .extendGetters(({ get }) => ({ area: () => get().rectangle.x * get().rectangle.y }))
108
- .extendSetters(({ get, set }) => ({
109
- translateX: (dx: number) => set.bar({ x: get().point.x + dx, y: get().point.y }),
110
- }))
111
- .restrictState(['rectangle'])
112
- // ^ Seal the store, so that certain fields are unavailable for the outside context,
113
- // while still being available for getters and setters.
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.
114
120
 
115
121
  // Subscribe for computed data changes. This new selector is auto-generated.
116
122
  function Component() {
117
- const area = store.use.area()
123
+ const area = store.use.area()
118
124
  }
119
125
 
120
126
  // Make private value inaccessible.
121
127
  function onClick() {
122
- console.log(store.get().rectangle)
123
- // ^ TS error, no value. It is not accessible anymore from outside the store.
128
+ console.log(store.get().rectangle)
129
+ // ^ TS error, no value. It is not accessible
130
+ // anymore from outside the store.
124
131
  }
125
132
 
126
133
  // Call custom action.
127
134
  function onClick() {
128
- store.set.translateX(7)
135
+ store.set.translateX(7)
129
136
  }
130
137
 
131
- // Access native Zustand api (expect getState, setState, which are
132
- // available thrugh store.get() and store.set() for simplicity and expresivness).
138
+ // Access native Zustand api (expect getState, setState,
139
+ // which are available thrugh store.get() and store.set()
140
+ // for simplicity and additional expresivness).
133
141
  function Component() {
134
- const state = store.api.getInitialState()
142
+ const state = store.api.getInitialState()
135
143
  }
136
144
  ```
137
145
 
@@ -139,93 +147,109 @@ function Component() {
139
147
 
140
148
  ```ts
141
149
  const initialState: { my: { foo: { bar: string} } } = {
142
- my: { foo: { bar: 'value' } },
150
+ my: { foo: { bar: 'value' } },
143
151
  }
144
152
 
145
153
  export const store = createStore(initialState)
146
- .myFooBar(({ get }) => ({
147
- // Entire state is accessible with store.get()
148
- return get().my.foo.bar;
149
- }))
150
- .restrictState()
154
+ .myFooBar(({ get }) => ({
155
+ // Entire state is accessible with store.get()
156
+ return get().my.foo.bar;
157
+ }))
158
+ .restrictState()
151
159
 
152
160
  // Component will update only if deeply nested value will update.
153
161
  function Component() {
154
- const myFooBar = store.use.myFooBar()
162
+ const myFooBar = store.use.myFooBar()
155
163
  }
156
164
  ```
157
165
 
158
166
  ### Automatic deep selectors
159
167
 
160
168
  ```ts
161
- const initialState: { my: { foo: { bar: string } } } = { my: { foo: { bar: 'value' } } }
169
+ const initialState: { my: { foo: { bar: string } } } = {
170
+ my: { foo: { bar: 'value' } },
171
+ }
162
172
 
163
173
  export const store = createStore(initialState)
164
174
 
165
- // Component will update only if deeply nested value will update. Those selectors
166
- // will be generated 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.
167
177
  function Component() {
168
- const myFooBar = store.use.my.foo.bar()
178
+ const myFooBar = store.use.my.foo.bar()
169
179
  }
170
180
  ```
171
181
 
172
182
  ### Ad-hoc selectors
173
183
 
174
184
  ```ts
175
- const initialState: { my: { foo: { bar: string } } } = { my: { foo: { bar: 'value' } } }
185
+ const initialState: { my: { foo: { bar: string } } } = {
186
+ my: { foo: { bar: 'value' } },
187
+ }
176
188
 
177
189
  export const store = createStore(initialState)
178
190
 
179
- // 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.
180
193
  function Component() {
181
- const myFooBar = store.use((state) => state.my.foo, customEquality)
194
+ const myFooBar = store.use((state) => state.my.foo, customEquality)
182
195
  }
183
196
  ```
184
197
 
185
198
  ### Setting whole state
186
199
 
187
200
  ```ts
188
- const initialState: { my: { foo: { bar: string } } } = { my: { foo: { bar: 'value' } } }
201
+ const initialState: { my: { foo: { bar: string } } } = {
202
+ my: { foo: { bar: 'value' } },
203
+ }
189
204
 
190
205
  export const store = createStore(initialState)
191
206
 
192
- // 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
193
209
  store.set((state) => ({ ...state, newField: 'newField' }))
194
- store.set({ newField: 'newField' }) // <- By default state is shallowly merged.
195
- store.set({}, true) // <- Emptying the state with replace: true flag
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 refer to the already transformed point from the previous getter.
213
- // It will override the previous one, but can still accesess anything defined before.
214
- myPoint: () => soSomethingWithTransformedPoint(get.myPoint()),
215
- }))
216
- .restrictState()
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
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,15 +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
240
- // in the usual way. Wrapping setter with act might be needed to sync react updates.
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.
241
266
  test('Testing Component', () => ({
242
- render(<Component />)
243
- act(() => store.set.dependencyA(someValue))
244
- expect(storeDependantText).toBe(someValue)
267
+ render(<Component />)
268
+ act(() => store.set.dependencyA(someValue))
269
+ expect(storeDependantText).toBe(someValue)
245
270
  })
246
271
  ```
247
272
 
@@ -297,21 +322,21 @@ import { StoreApiPlugin } from 'zustand-lite'
297
322
  type Setters = { reset: () => void }
298
323
 
299
324
  export const reset: StoreApiPlugin<{}, {}, Setters> = {
300
- extends: (store) => {
301
- // If plugin defines data, that and only that data is available inside
302
- // setters and getters.
303
- return store.extendSetters(({ api, set }) => ({
304
- // Every piece od data, getter or setter will be available in the custom
305
- // extendGetter and extendSetter, allowing for even more interacctions.
306
- reset: () => {
307
- set(api.getInitialState?.() ?? {}, true)
308
- },
309
- }))
310
- },
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
+ },
311
336
  }
312
337
  ```
313
338
 
314
- Apply newlyreated plugin like this:
339
+ Apply newly created plugin like this:
315
340
 
316
341
  ```ts
317
342
  const store = createStore({}, { plugins: [reset] })
@@ -327,13 +352,13 @@ You can enable the most useful middlewares:
327
352
 
328
353
  ```ts
329
354
  {
330
- name: 'MyApp/CounterStore',
331
- middlewares: {
332
- devtools: true,
333
- persist: {
334
- ...options,
335
- },
336
- }
355
+ name: 'MyApp/CounterStore',
356
+ middlewares: {
357
+ devtools: true,
358
+ persist: {
359
+ ...options,
360
+ },
361
+ }
337
362
  }
338
363
  ```
339
364
 
package/dist/index.cjs CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var l=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var L=(e,t)=>{for(var o in t)l(e,o,{get:t[o],enumerable:!0})},q=(e,t,o,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of R(t))!U.call(e,r)&&r!==o&&l(e,r,{get:()=>t[r],enumerable:!(s=w(t,r))||s.enumerable});return e};var v=e=>q(l({},"__esModule",{value:!0}),e);var I={};L(I,{createStore:()=>E,reset:()=>j});module.exports=v(I);var a=require("zustand/middleware"),D=require("zustand/vanilla");function p(e){return{getInitialState:e.getInitialState,subscribe:e.subscribe}}function f(e){return()=>e.getState()}function F(){return new Error()?.stack?.split(`
2
- `)[3].trim().split(" ")[1].split("Object.")[1]??"setState"}function c(e,t){let o=(s,r,n)=>{e.setState(s,r,t?{type:n??F(),payload:s}:void 0)};return Object.keys(e.getState()).forEach(s=>{o[s]=r=>{e.getState()[s]!==r&&e.setState(n=>({...n,[s]:r}),!1,t?{type:s,payload:{[s]:r}}:void 0)}}),o}var A=require("zustand/shallow"),y=require("zustand/traditional");var g=require("zustand/shallow"),x=require("zustand/traditional");function m(e,t,o,s){typeof e=="object"&&e!==null&&Object.keys(e).forEach(r=>{let n=[...o,r];Object.defineProperty(t,r,{value:(S=g.shallow)=>(0,x.useStoreWithEqualityFn)(s,u=>z(u,n),S),writable:!0,configurable:!0,enumerable:!0}),m(e[r],t[r],n,s)})}function z(e,t){let o=e;for(let s of t)if(o=o[s],!o)return o;return o}function G(e){let t=(o,s=A.shallow)=>(0,y.useStoreWithEqualityFn)(e,o,s);return m(e.getState(),t,[],e),t}var b=require("zustand/shallow"),P=require("zustand/traditional");function B(e,t,o){let s=e(t);return Object.keys(s).forEach(r=>{t.use[r]=(...n)=>(0,P.useStoreWithEqualityFn)(o,()=>s[r](...n),b.shallow)}),t.get=Object.assign(t.get,s),t}function O(e,t){return t.set=Object.assign(t.set,e(t)),t}function h(e,t,o){return{api:o.api,set:o.set,use:e?Object.keys(o.use).reduce((s,r)=>t[r]&&e.includes(r)?s:{...s,[r]:o.use[r]},{}):o.use,get:e?()=>Object.entries(o.get()).reduce((s,[r,n])=>t[r]&&e.includes(r)?s:{...s,[r]:n},{}):o.get}}function E(e,t){let{name:o="zustand-lite",plugins:s=[],middlewares:r={}}=t??{},n=e;s.forEach(i=>{i.creates&&(n={...n,...i.creates()})});let S=()=>n;r.devtools&&(S=(0,a.devtools)(S,r.devtools===!0?{name:"zustand-lite",store:o}:r.devtools)),r.persist&&(S=(0,a.persist)(S,r.persist===!0?{name:o}:r.persist));let u=(0,D.createStore)(S),d={api:p(u),get:f(u),set:c(u,!!r.devtools),use:G(u),extendGetters(i){return B(i,this,u)},extendSetters(i){return O(i,this)},restrictState(i=[]){return h(i,n,this)}};return s.forEach(i=>{i.extends&&(d=i.extends(d))}),d}var j={extends:e=>e.extendSetters(({api:t,set:o})=>({reset:()=>{o(t.getInitialState?.()??{},!0)}}))};0&&(module.exports={createStore,reset});
1
+ "use strict";var d=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var z=(e,t)=>{for(var r in t)d(e,r,{get:t[r],enumerable:!0})},I=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of q(t))!v.call(e,o)&&o!==r&&d(e,o,{get:()=>t[o],enumerable:!(n=R(t,o))||n.enumerable});return e};var W=e=>I(d({},"__esModule",{value:!0}),e);var N={};z(N,{createStore:()=>U,reset:()=>w});module.exports=W(N);var f=require("zustand/middleware"),E=require("zustand/vanilla");function x(e){return{getInitialState:e.getInitialState,subscribe:e.subscribe}}function p(e){return()=>e.getState()}function b(e){return p(e)}function C(){return new Error()?.stack?.split(`
2
+ `)[3].trim().split(" ")[1].split("Object.")[1]??"setState"}function m(e,t){return(r,n,o)=>{e.setState(r,n,t?{type:o??C(),payload:r}:void 0)}}function A(e,t){let r=m(e,t);return Object.keys(e.getState()).forEach(n=>{r[n]=o=>{e.getState()[n]!==o&&e.setState(i=>({...i,[n]:o}),!1,t?{type:n,payload:{[n]:o}}:void 0)}}),r}var y=require("zustand/shallow"),G=require("zustand/traditional");function l(e,t,r,n){typeof e=="object"&&e!==null&&Object.keys(e).forEach(o=>{let i=[...r,o];Object.defineProperty(t,o,{value:(s=y.shallow)=>(0,G.useStoreWithEqualityFn)(n,S=>K(S,i),s),writable:!0,configurable:!0,enumerable:!0}),l(e[o],t[o],i,n)})}function K(e,t){let r=e;for(let n of t)if(r=r[n],!r)return r;return r}var L=require("zustand/shallow"),h=require("zustand/traditional");function u(e){return(t,r=L.shallow)=>(0,h.useStoreWithEqualityFn)(e,t,r)}function P(e){let t=u(e);return l(e.getState(),t,[],e),t}var B=require("zustand/shallow"),F=require("zustand/traditional");function O(e,t,r){let n=e(t),o={};return Object.keys(n).forEach(i=>{o[i]=(...s)=>(0,F.useStoreWithEqualityFn)(r,()=>n[i](...s),B.shallow)}),t.use=Object.assign(u(r),t.use,o),t.get=Object.assign(p(r),t.get,n),t}function j(e,t,r,n){let o=m(r,n);return t.set=Object.assign(o,t.set,e(t)),t}function D(e,t,r,n){return{api:r.api,set:r.set,use:e?(()=>{let o=Object.keys(r.use).reduce((i,s)=>t[s]&&e.includes(s)?i:{...i,[s]:r.use[s]},{});return Object.assign(u(n),o)})():r.use,get:e?Object.assign(()=>Object.entries(r.get()).reduce((i,[s,S])=>t[s]&&e.includes(s)?i:{...i,[s]:S},{}),r.get):r.get}}function U(e,t){let{name:r="zustand-lite",plugins:n=[],middlewares:o={}}=t??{},i=e;n.forEach(a=>{a.creates&&(i={...i,...a.creates()})});let s=()=>i;o.devtools&&(s=(0,f.devtools)(s,o.devtools===!0?{name:"zustand-lite",store:r}:o.devtools)),o.persist&&(s=(0,f.persist)(s,o.persist===!0?{name:r}:o.persist));let S=(0,E.createStore)(s),g={api:x(S),get:b(S),use:P(S),set:A(S,!!o.devtools),extendGetters(a){return O(a,this,S)},extendSetters(a){return j(a,this,S,!!o.devtools)},restrictState(a=[]){return D(a,i,this,S)}},c=g;return n.forEach(a=>{a.extends&&(c=a.extends(g))}),c}var w={extends:e=>e.extendSetters(({api:t,set:r})=>({reset:()=>{r(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(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"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/createStore.ts","../src/lib/generateApi.ts","../src/lib/generateGetFn.ts","../src/lib/generateGet.ts","../src/lib/generateSetFn.ts","../src/lib/generateSet.ts","../src/lib/generateUseStep.ts","../src/lib/generateUseFn.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<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 storeLib: any = createVanillaStore(initializer)\n\n\t// Create zustand-lite wrapper.\n\tconst storeApi: any = {\n\t\tapi: generateApi(storeLib),\n\t\tget: generateGet(storeLib),\n\t\tuse: generateUse(storeLib),\n\t\tset: generateSet(storeLib, !!middlewares.devtools),\n\t\textendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendGetters(builder, this, storeLib)\n\t\t},\n\t\textendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendSetters(builder, this, storeLib, !!middlewares.devtools)\n\t\t},\n\t\trestrictState(publicState = []) {\n\t\t\treturn restrictState(publicState, mergedState, this, storeLib)\n\t\t},\n\t}\n\n\t// Extend store getters and setters with plugins.\n\tlet result = storeApi\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.extends) {\n\t\t\tresult = plugin.extends(storeApi)\n\t\t}\n\t})\n\n\treturn result\n}\n","import { StoreApi as StoreLib } 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 lib Zustand api interface\n */\nexport function generateApi<S extends State>(lib: StoreLib<S>) {\n\treturn { getInitialState: lib.getInitialState, subscribe: lib.subscribe }\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\n\nexport function generateGetFn<S extends State>(lib: StoreLib<S>) {\n\treturn () => lib.getState()\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\nimport { generateGetFn } from './generateGetFn'\n\nexport function generateGet<S extends State>(lib: StoreLib<S>) {\n\treturn generateGetFn(lib)\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { 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 generateSetFn<S extends State>(lib: StoreLib<S>, hasDevtools: boolean) {\n\treturn (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","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { SetRecord, State } from '../types'\nimport { generateSetFn } from './generateSetFn'\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) {\n\tconst setters = generateSetFn(lib, hasDevtools)\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\nexport function generateUseStep(\n\tstate: any,\n\tgetters: any,\n\tpath: string[],\n\tlib: 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\tlib,\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, lib)\n\t\t})\n\t}\n}\n\nfunction getFromPath(state: any, path: string[]) {\n\tlet data = state\n\n\tfor (const 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'\n\nimport { StoreApi as StoreLib } from 'zustand'\n\nimport { State, EqualityChecker } from '../types'\n\n/**\n * Generates automatic getters like store.use.foo()\n * @param lib Zustand api interface\n */\nexport function generateUseFn<S extends State, U>(lib: StoreLib<S>) {\n\treturn (selector: (state: S) => U, equality: EqualityChecker<U> = shallow) => {\n\t\treturn useStoreWithEqualityFn(lib, selector, equality)\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand'\n\nimport { State } from '../types'\nimport { generateUseStep } from './generateUseStep'\nimport { generateUseFn } from './generateUseFn'\n\n/**\n * Generates automatic getters like store.use.foo()\n * @param lib Zustand api interface\n */\nexport function generateUse<S extends State>(lib: StoreLib<S>) {\n\tconst getters = generateUseFn(lib)\n\tgenerateUseStep(lib.getState(), getters, [], lib)\n\treturn getters\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'\nimport { generateGetFn } from './generateGetFn'\nimport { generateUseFn } from './generateUseFn'\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, store: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\tconst methods = builder(store)\n\tconst getters = {}\n\n\tObject.keys(methods).forEach((key) => {\n\t\t// @ts-ignore\n\t\tgetters[key] = (...args: any[]) =>\n\t\t\tuseStoreWithEqualityFn(\n\t\t\t\tlib,\n\t\t\t\t() => {\n\t\t\t\t\treturn methods[key](...args)\n\t\t\t\t},\n\t\t\t\tshallow\n\t\t\t)\n\t})\n\n\tstore.use = Object.assign(generateUseFn(lib), store.use, getters)\n\tstore.get = Object.assign(generateGetFn(lib), store.get, methods)\n\treturn store\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\nimport { Default, SettersBuilder, State, StoreApi } from '../types'\nimport { generateSetFn } from './generateSetFn'\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, store: StoreApi<S, Getters, Setters>, lib: StoreLib<S>, hasDevtools: boolean) {\n\tconst setters = generateSetFn(lib, hasDevtools)\n\tstore.set = Object.assign(setters, store.set, builder(store))\n\treturn store\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { GetRecord, SetRecord, State, StoreApi } from '../types'\nimport { generateUseFn } from './generateUseFn'\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, store: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\treturn {\n\t\tapi: store.api,\n\t\tset: store.set,\n\t\tuse: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getters = Object.keys(store.use).reduce(\n\t\t\t\t\t\t(acc, key) =>\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]: store.use[key] },\n\t\t\t\t\t\t{}\n\t\t\t\t\t)\n\n\t\t\t\t\treturn Object.assign(generateUseFn(lib), getters)\n\t\t\t\t})()\n\t\t\t: store.use,\n\t\tget: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getFn = () =>\n\t\t\t\t\t\tObject.entries(store.get()).reduce(\n\t\t\t\t\t\t\t(acc, [key, val]) =>\n\t\t\t\t\t\t\t\tmergedState[key] && (privateState as string[]).includes(key)\n\t\t\t\t\t\t\t\t\t? acc\n\t\t\t\t\t\t\t\t\t: { ...acc, [key]: val },\n\t\t\t\t\t\t\t{}\n\t\t\t\t\t\t)\n\n\t\t\t\t\treturn Object.assign(getFn, store.get)\n\t\t\t\t})()\n\t\t\t: store.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","lib","generateGetFn","lib","generateGet","lib","generateGetFn","setterName","generateSetFn","lib","hasDevtools","updater","replace","name","generateSet","lib","hasDevtools","setters","generateSetFn","key","value","state","import_shallow","import_traditional","generateUseStep","state","getters","path","lib","key","newPath","equalityFn","getFromPath","data","import_shallow","import_traditional","generateUseFn","lib","selector","equality","generateUse","lib","getters","generateUseFn","generateUseStep","import_shallow","import_traditional","extendGetters","builder","store","lib","methods","getters","key","args","generateUseFn","generateGetFn","extendSetters","builder","store","lib","hasDevtools","setters","generateSetFn","restrictState","privateState","mergedState","store","lib","getters","acc","key","generateUseFn","val","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","storeLib","createVanillaStore","storeApi","generateApi","generateGet","generateUse","generateSet","builder","extendGetters","extendSetters","publicState","restrictState","result","reset","store","api","set"]}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
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};
1
+ import{devtools as E,persist as U}from"zustand/middleware";import{createStore as w}from"zustand/vanilla";function g(e){return{getInitialState:e.getInitialState,subscribe:e.subscribe}}function p(e){return()=>e.getState()}function c(e){return p(e)}function L(){return new Error()?.stack?.split(`
2
+ `)[3].trim().split(" ")[1].split("Object.")[1]??"setState"}function m(e,r){return(t,n,o)=>{e.setState(t,n,r?{type:o??L(),payload:t}:void 0)}}function x(e,r){let t=m(e,r);return Object.keys(e.getState()).forEach(n=>{t[n]=o=>{e.getState()[n]!==o&&e.setState(i=>({...i,[n]:o}),!1,r?{type:n,payload:{[n]:o}}:void 0)}}),t}import{shallow as h}from"zustand/shallow";import{useStoreWithEqualityFn as P}from"zustand/traditional";function f(e,r,t,n){typeof e=="object"&&e!==null&&Object.keys(e).forEach(o=>{let i=[...t,o];Object.defineProperty(r,o,{value:(s=h)=>P(n,S=>B(S,i),s),writable:!0,configurable:!0,enumerable:!0}),f(e[o],r[o],i,n)})}function B(e,r){let t=e;for(let n of r)if(t=t[n],!t)return t;return t}import{shallow as F}from"zustand/shallow";import{useStoreWithEqualityFn as O}from"zustand/traditional";function u(e){return(r,t=F)=>O(e,r,t)}function b(e){let r=u(e);return f(e.getState(),r,[],e),r}import{shallow as j}from"zustand/shallow";import{useStoreWithEqualityFn as D}from"zustand/traditional";function A(e,r,t){let n=e(r),o={};return Object.keys(n).forEach(i=>{o[i]=(...s)=>D(t,()=>n[i](...s),j)}),r.use=Object.assign(u(t),r.use,o),r.get=Object.assign(p(t),r.get,n),r}function y(e,r,t,n){let o=m(t,n);return r.set=Object.assign(o,r.set,e(r)),r}function G(e,r,t,n){return{api:t.api,set:t.set,use:e?(()=>{let o=Object.keys(t.use).reduce((i,s)=>r[s]&&e.includes(s)?i:{...i,[s]:t.use[s]},{});return Object.assign(u(n),o)})():t.use,get:e?Object.assign(()=>Object.entries(t.get()).reduce((i,[s,S])=>r[s]&&e.includes(s)?i:{...i,[s]:S},{}),t.get):t.get}}function R(e,r){let{name:t="zustand-lite",plugins:n=[],middlewares:o={}}=r??{},i=e;n.forEach(a=>{a.creates&&(i={...i,...a.creates()})});let s=()=>i;o.devtools&&(s=E(s,o.devtools===!0?{name:"zustand-lite",store:t}:o.devtools)),o.persist&&(s=U(s,o.persist===!0?{name:t}:o.persist));let S=w(s),d={api:g(S),get:c(S),use:b(S),set:x(S,!!o.devtools),extendGetters(a){return A(a,this,S)},extendSetters(a){return y(a,this,S,!!o.devtools)},restrictState(a=[]){return G(a,i,this,S)}},l=d;return n.forEach(a=>{a.extends&&(l=a.extends(d))}),l}var q={extends:e=>e.extendSetters(({api:r,set:t})=>({reset:()=>{t(r.getInitialState?.()??{},!0)}}))};export{R as createStore,q 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(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"]}
1
+ {"version":3,"sources":["../src/lib/createStore.ts","../src/lib/generateApi.ts","../src/lib/generateGetFn.ts","../src/lib/generateGet.ts","../src/lib/generateSetFn.ts","../src/lib/generateSet.ts","../src/lib/generateUseStep.ts","../src/lib/generateUseFn.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<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 storeLib: any = createVanillaStore(initializer)\n\n\t// Create zustand-lite wrapper.\n\tconst storeApi: any = {\n\t\tapi: generateApi(storeLib),\n\t\tget: generateGet(storeLib),\n\t\tuse: generateUse(storeLib),\n\t\tset: generateSet(storeLib, !!middlewares.devtools),\n\t\textendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendGetters(builder, this, storeLib)\n\t\t},\n\t\textendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendSetters(builder, this, storeLib, !!middlewares.devtools)\n\t\t},\n\t\trestrictState(publicState = []) {\n\t\t\treturn restrictState(publicState, mergedState, this, storeLib)\n\t\t},\n\t}\n\n\t// Extend store getters and setters with plugins.\n\tlet result = storeApi\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.extends) {\n\t\t\tresult = plugin.extends(storeApi)\n\t\t}\n\t})\n\n\treturn result\n}\n","import { StoreApi as StoreLib } 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 lib Zustand api interface\n */\nexport function generateApi<S extends State>(lib: StoreLib<S>) {\n\treturn { getInitialState: lib.getInitialState, subscribe: lib.subscribe }\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\n\nexport function generateGetFn<S extends State>(lib: StoreLib<S>) {\n\treturn () => lib.getState()\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\nimport { generateGetFn } from './generateGetFn'\n\nexport function generateGet<S extends State>(lib: StoreLib<S>) {\n\treturn generateGetFn(lib)\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { 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 generateSetFn<S extends State>(lib: StoreLib<S>, hasDevtools: boolean) {\n\treturn (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","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { SetRecord, State } from '../types'\nimport { generateSetFn } from './generateSetFn'\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) {\n\tconst setters = generateSetFn(lib, hasDevtools)\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\nexport function generateUseStep(\n\tstate: any,\n\tgetters: any,\n\tpath: string[],\n\tlib: 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\tlib,\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, lib)\n\t\t})\n\t}\n}\n\nfunction getFromPath(state: any, path: string[]) {\n\tlet data = state\n\n\tfor (const 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'\n\nimport { StoreApi as StoreLib } from 'zustand'\n\nimport { State, EqualityChecker } from '../types'\n\n/**\n * Generates automatic getters like store.use.foo()\n * @param lib Zustand api interface\n */\nexport function generateUseFn<S extends State, U>(lib: StoreLib<S>) {\n\treturn (selector: (state: S) => U, equality: EqualityChecker<U> = shallow) => {\n\t\treturn useStoreWithEqualityFn(lib, selector, equality)\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand'\n\nimport { State } from '../types'\nimport { generateUseStep } from './generateUseStep'\nimport { generateUseFn } from './generateUseFn'\n\n/**\n * Generates automatic getters like store.use.foo()\n * @param lib Zustand api interface\n */\nexport function generateUse<S extends State>(lib: StoreLib<S>) {\n\tconst getters = generateUseFn(lib)\n\tgenerateUseStep(lib.getState(), getters, [], lib)\n\treturn getters\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'\nimport { generateGetFn } from './generateGetFn'\nimport { generateUseFn } from './generateUseFn'\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, store: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\tconst methods = builder(store)\n\tconst getters = {}\n\n\tObject.keys(methods).forEach((key) => {\n\t\t// @ts-ignore\n\t\tgetters[key] = (...args: any[]) =>\n\t\t\tuseStoreWithEqualityFn(\n\t\t\t\tlib,\n\t\t\t\t() => {\n\t\t\t\t\treturn methods[key](...args)\n\t\t\t\t},\n\t\t\t\tshallow\n\t\t\t)\n\t})\n\n\tstore.use = Object.assign(generateUseFn(lib), store.use, getters)\n\tstore.get = Object.assign(generateGetFn(lib), store.get, methods)\n\treturn store\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\nimport { Default, SettersBuilder, State, StoreApi } from '../types'\nimport { generateSetFn } from './generateSetFn'\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, store: StoreApi<S, Getters, Setters>, lib: StoreLib<S>, hasDevtools: boolean) {\n\tconst setters = generateSetFn(lib, hasDevtools)\n\tstore.set = Object.assign(setters, store.set, builder(store))\n\treturn store\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { GetRecord, SetRecord, State, StoreApi } from '../types'\nimport { generateUseFn } from './generateUseFn'\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, store: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\treturn {\n\t\tapi: store.api,\n\t\tset: store.set,\n\t\tuse: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getters = Object.keys(store.use).reduce(\n\t\t\t\t\t\t(acc, key) =>\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]: store.use[key] },\n\t\t\t\t\t\t{}\n\t\t\t\t\t)\n\n\t\t\t\t\treturn Object.assign(generateUseFn(lib), getters)\n\t\t\t\t})()\n\t\t\t: store.use,\n\t\tget: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getFn = () =>\n\t\t\t\t\t\tObject.entries(store.get()).reduce(\n\t\t\t\t\t\t\t(acc, [key, val]) =>\n\t\t\t\t\t\t\t\tmergedState[key] && (privateState as string[]).includes(key)\n\t\t\t\t\t\t\t\t\t? acc\n\t\t\t\t\t\t\t\t\t: { ...acc, [key]: val },\n\t\t\t\t\t\t\t{}\n\t\t\t\t\t\t)\n\n\t\t\t\t\treturn Object.assign(getFn, store.get)\n\t\t\t\t})()\n\t\t\t: store.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","lib","generateGetFn","lib","generateGet","lib","generateGetFn","setterName","generateSetFn","lib","hasDevtools","updater","replace","name","generateSet","lib","hasDevtools","setters","generateSetFn","key","value","state","shallow","useStoreWithEqualityFn","generateUseStep","state","getters","path","lib","key","newPath","equalityFn","getFromPath","data","shallow","useStoreWithEqualityFn","generateUseFn","lib","selector","equality","generateUse","lib","getters","generateUseFn","generateUseStep","shallow","useStoreWithEqualityFn","extendGetters","builder","store","lib","methods","getters","key","args","useStoreWithEqualityFn","shallow","generateUseFn","generateGetFn","extendSetters","builder","store","lib","hasDevtools","setters","generateSetFn","restrictState","privateState","mergedState","store","lib","getters","acc","key","generateUseFn","val","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","devtools","persist","storeLib","createVanillaStore","storeApi","generateApi","generateGet","generateUse","generateSet","builder","extendGetters","extendSetters","publicState","restrictState","result","reset","store","api","set"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zustand-lite",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
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",