zustand-lite 0.2.4 → 0.3.0

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
@@ -6,12 +6,14 @@
6
6
  [![Types](https://img.shields.io/badge/TypeScript-ready-blue?logo=typescript)](https://www.typescriptlang.org/)
7
7
  [![GitHub stars](https://img.shields.io/github/stars/PiotrSiatkowski/zustand-lite?style=social)](https://github.com/PiotrSiatkowski/zustand-lite)
8
8
 
9
- Zustand Lite is a **zero-boilerplate** state management built specifically for frontend
10
- developers who want **powerful and scalable** global state **without the usual complexity**.
11
- Designed for simplicity, it gives you everything you need out-of-the-box — from selectors to setters to middleware — while remaining lightweight and extensible. With seamless support for plugins, devtools, and state encapsulation, managing state becomes a breeze, not a chore.
12
-
13
- _A zero-boilerplate wrapper around [Zustand](https://github.com/pmndrs/zustand), focused on
14
- ergonomics, plugins, and powerful dynamic extension — inspired by [zustand-x](https://github.
9
+ Zustand Lite is a **zero-boilerplate** state management built specifically for frontend
10
+ developers who want **powerful and scalable** global state **without the usual complexity**.
11
+ Designed for simplicity, it gives you everything you need out-of-the-box — from selectors to
12
+ setters to middleware — while remaining lightweight and extensible. With seamless support for
13
+ plugins, devtools, and state encapsulation, managing state becomes a breeze, not a chore.
14
+
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.
15
17
  com/udecode/zustand-x) and getters/setters auto-generation patterns._
16
18
 
17
19
  ## 🛠️ Why **zustand‑lite**?
@@ -22,8 +24,8 @@ _**Zustand Lite** delivers a **simple**, **performant**, and **predictable** way
22
24
  state, letting your code stay focused on business logic, not infrastructure. Try it today and
23
25
  see how effortless frontend state can be!_
24
26
 
25
- While tools like React‑Query handle server state, UI state often gets bogged down by excessive
26
- boilerplate, tangled data flows, and hard‑to‑control side effects. **Zustand Lite** cuts through
27
+ While tools like React‑Query handle server state, UI state often gets bogged down by excessive
28
+ boilerplate, tangled data flows, and hard‑to‑control side effects. **Zustand Lite** cuts through
27
29
  the noise:
28
30
 
29
31
  ## 🚀 Features
@@ -32,12 +34,12 @@ the noise:
32
34
  - 🔄 **Clean Separation**: State and operations are well separated to minimize confusion.
33
35
  - 🚀 **Blazing Performance**: Selective updates and lean subscriptions keep things snappy.
34
36
  - 🪄 **Zero Boilerplate**: No mock setups, no dependency arrays, just importing and using.
35
- - 🧪 **Test‑Friendly Design**: Easily tested, no context or mocks hacks required.
37
+ - 🧪 **Test‑Friendly Design**: Easily tested, no context or mock hacks required.
36
38
  - 🌱 **Composable & Extensible**: Opinionated defaults that adapt as your application grows.
37
39
  - 🔌 **Shareable plugin system**: Plug custom logic directly into your store for extended capabilities.
38
40
  - 🧩 **Optional middleware integration**: Seamlessly add devtools and persist, middlewares that matter.
39
41
  - 🛠 **Chainable API**: `extendGetters()`, `extendSetters()`, `restrictState()`- create store in composable steps.
40
- - 👁 **Redux devtools labeling**: Built in clear, traceable actions and labels for debugging.
42
+ - 👁 **Redux devtools labeling**: Built-in clear, traceable actions and labels for debugging.
41
43
  - 🧼 **No dependencies, only Zustand**: Keeps bundle size small and performance high.
42
44
  - 😊 **Write only code you need**: Focus on business logic, not boilerplate.
43
45
 
@@ -66,24 +68,25 @@ export const store = createStore(initialState)
66
68
 
67
69
  // Subscribe for your data changes.
68
70
  function Component() {
69
- const foo = store.use.foo()
71
+ const foo = store.use.foo()
70
72
  }
71
73
 
72
74
  // Synchronous accessor, when you need it.
73
75
  function onClick() {
74
- console.log(store.get.foo())
76
+ console.log(store.get().foo)
75
77
  }
76
78
 
77
79
  // Setting value with one line as it should be.
78
80
  function onClick() {
79
- store.set.foo('new-value')
81
+ store.set.foo('new-value')
80
82
  }
81
83
  ```
82
84
 
83
85
  ### Custom Setters
86
+
84
87
  const store = createStore({ count: 0 })
85
88
  .extendSetters(({ get, set }) => ({
86
- increment: () => set.count(get.count() + 1)
89
+ increment: () => set.count(get().count + 1)
87
90
  }))
88
91
 
89
92
  function Counter() {
@@ -104,14 +107,14 @@ const initialState: { foo: string; bar: { x: number; y: number } } = {
104
107
  }
105
108
 
106
109
  export const store = createStore(initialState)
107
- .extendGetters(({ get }) => ({
108
- area: () => get.bar().x * get.bar().y
110
+ .extendGetters(({ get }) => ({
111
+ area: () => get().bar.x * get().bar.y
109
112
  }))
110
113
  .extendSetters(({ get, set }) => ({
111
- translateX: (dx: number) => set.bar({ x: get.point().x + dx, y: get.point().y }),
114
+ translateX: (dx: number) => set.bar({ x: get().point.x + dx, y: get().point.y }),
112
115
  }))
113
116
  .restrictState(['rectangle'])
114
- // ^ Seal the store, so that certain fields are unavailable for the outside.
117
+ // ^ Seal the store, so that certain fields are unavailable for the outside context.
115
118
 
116
119
  // Subscribe for computed data changes.
117
120
  function Component() {
@@ -120,7 +123,7 @@ function Component() {
120
123
 
121
124
  // Make private value inaccessible.
122
125
  function onClick() {
123
- console.log(store.get.rectangle()) <- TS error
126
+ console.log(store.get().rectangle) <- TS error, no value
124
127
  }
125
128
 
126
129
  // Call custom action.
@@ -128,9 +131,10 @@ function onClick() {
128
131
  store.set.translateX(7)
129
132
  }
130
133
 
131
- // Access native Zustand api.
134
+ // Access native Zustand api (expect getState, setState, which are available thrugh store.get
135
+ and store.set).
132
136
  function Component() {
133
- const state = store.api.getState()
137
+ const state = store.api.getInitialState()
134
138
  }
135
139
  ```
136
140
 
@@ -143,7 +147,7 @@ const initialState: { my: { foo: { bar: string} } } = {
143
147
 
144
148
  export const store = createStore(initialState)
145
149
  .myFooBar(({ get }) => ({
146
- return get.my().foo.bar;
150
+ return get().my.foo.bar;
147
151
  }))
148
152
  .restrictState()
149
153
 
@@ -153,40 +157,75 @@ function Component() {
153
157
  }
154
158
  ```
155
159
 
160
+ ### Automatic deep selectors
161
+
162
+ ```ts
163
+ const initialState: { my: { foo: { bar: string } } } = { my: { foo: { bar: 'value' } } }
164
+
165
+ export const store = createStore(initialState)
166
+
167
+ // Component will update only if deeply nested value will update. Those selectors
168
+ // will be generated for hooks only for required attributes.
169
+ function Component() {
170
+ const myFooBar = store.use.my.foo.bar()
171
+ }
172
+ ```
173
+
174
+ ### Ad-hoc selectors
175
+
176
+ ```ts
177
+ const initialState: { my: { foo: { bar: string } } } = { my: { foo: { bar: 'value' } } }
178
+
179
+ export const store = createStore(initialState)
180
+
181
+ // If no auto-generated selector is available, custom one may still be used.
182
+ function Component() {
183
+ const myFooBar = store.use((state) => state.my.foo, customEquality)
184
+ }
185
+ ```
186
+
187
+ ### Setting whole state
188
+
189
+ ```ts
190
+ const initialState: { my: { foo: { bar: string } } } = { my: { foo: { bar: 'value' } } }
191
+
192
+ export const store = createStore(initialState)
193
+
194
+ // State can be set with first level auto-generated setters or with store.set
195
+ store.set((state) => ({ ...state, newField: 'newField' }))
196
+ ```
197
+
156
198
  ### Overriding getters and setters
157
199
 
158
200
  ```ts
159
201
  const initialState: { point: { x: number; y: number }; rectangle: { a: number; b: number } } = {
160
- point: { x: 0, y: 0 },
161
- rectangle: { a: 20, b: 10 },
202
+ point: { x: 0, y: 0 },
203
+ rectangle: { a: 20, b: 10 },
162
204
  }
163
205
 
164
206
  export const store = createStore(initialState)
165
- .extendGetters(({ get }) => ({
166
- // get.point() references to latest defined getter, so new definition overrides the old one
167
- // still having access to the default one.
168
- point: () => transformToDifferentCoordinates(get.point())
169
- }))
170
- .extendGetters(({ get }) => ({
171
- // get.point() will reference to the already transformed point from the previous getter
172
- // definition.
173
- point: () => soSomethingWithTransformedPoint(get.point())
174
- }))
175
- .restrictState()
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()
176
217
  ```
177
218
 
178
219
  ### Custom equality
179
220
 
180
221
  ```ts
181
- const initialState: { rectangle: { a: number; b: number } } = {
182
- rectangle: { a: 20, b: 10 },
183
- }
222
+ const initialState: { rectangle: { a: number; b: number } } = { rectangle: { a: 20, b: 10 } }
184
223
 
185
224
  export const store = createStore(initialState).restrictState()
186
225
 
187
226
  // By default shallow equality is being used.
188
227
  function Component() {
189
- const rectangle = store.use.rectangle(customEqualityFunction)
228
+ const rectangle = store.use.rectangle(customEqualityFunction)
190
229
  }
191
230
  ```
192
231
 
@@ -199,8 +238,8 @@ function Component() {
199
238
 
200
239
  // No need to mock the store or add additional providers, just interact with it in the test.
201
240
  test('Testing Component', () => ({
202
- store.set.dependencyA(someValue)
203
241
  render(<Component />)
242
+ act(() => store.set.dependencyA(someValue))
204
243
  expect(somethingStoreDependant).toBe(someValue)
205
244
  })
206
245
  ```
@@ -236,12 +275,14 @@ Creates a typed store with optional plugins and middleware.
236
275
 
237
276
  After creation, your store includes:
238
277
 
239
- | Property | Purpose |
240
- | ------------------ | ------------------------------------------------------- |
241
- | `store.use.foo()` | React hook getter for subscribing to `foo` |
242
- | `store.get.foo()` | Direct synchronous access to `foo` |
243
- | `store.set.foo(v)` | Set a new value for `foo` |
244
- | `store.api` | The native Zustand store API (getState, setState, etc.) |
278
+ | Property | Purpose |
279
+ | --------------------- | --------------------------------------------------------------- |
280
+ | `store.use.foo()` | React hook for subscribing to `foo` |
281
+ | `store.use(selector)` | React hook for subscribing to custom selector result |
282
+ | `store.get()` | Direct synchronous access to whole state |
283
+ | `store.set.foo(v)` | Set a new value for `foo` |
284
+ | `store.set(state)` | Set an entire new state |
285
+ | `store.api` | The native Zustand store API (getInitialState, subscribe, etc.) |
245
286
 
246
287
  ---
247
288
 
@@ -255,16 +296,16 @@ import { StoreApiPlugin } from 'zustand-lite'
255
296
  type Setters = { reset: () => void }
256
297
 
257
298
  export const reset: StoreApiPlugin<{}, {}, Setters> = {
258
- extends: (store) => {
259
- // If plugin defines data, that and only that data is available inside
260
- // setters and getters.
261
- return store.extendSetters(({ api }) => ({
262
- reset: () => {
263
- const initialState = api.getInitialState?.() ?? {}
264
- api.setState(() => initialState, true)
265
- },
266
- }))
267
- },
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
+ },
268
309
  }
269
310
  ```
270
311
 
@@ -298,13 +339,15 @@ You can add the most useful middlewares:
298
339
 
299
340
  ## 🛠 Planned improvements
300
341
 
301
- - Configurable level of auto-generation. While I advise to keep store as flat as possible, good
302
- structured data is important. For deeper properties it might be more convenient to auto
303
- generate getters and setters for deeply nested properties as well.
304
- - createPlugin function that will automatically infer types from the usage without the need of
342
+ - Configurable level of auto-generation. While I advise to keep store as flat as possible, good
343
+ 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)
346
+ - createPlugin function that will automatically infer types from the usage without the need of
305
347
  specifying types yourself, avoiding repetitiveness.
306
- - Ability to specify equality function for extended getters. It's possible now, but requires to
307
- import hook from 'zustand' package, which is suboptimal.
348
+ - 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).
308
351
 
309
352
  ---
310
353
 
package/dist/index.cjs ADDED
@@ -0,0 +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});
3
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/createStore.ts","../src/lib/generateApi.ts","../src/lib/generateGet.ts","../src/lib/generateSet.ts","../src/lib/generateUse.ts","../src/lib/generateUseStep.ts","../src/lib/extendGetters.ts","../src/lib/extendSetters.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["export type { StoreApiPlugin } from './types'\nexport { createStore } from './lib/createStore';\nexport { reset } from './plugins/reset'\n","/**\n * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party\n * zustand-x repository: https://github.com/udecode/zustand-x.\n **/\nimport { DevtoolsOptions, PersistOptions, devtools, persist } from 'zustand/middleware'\nimport { createStore as createVanillaStore } from 'zustand/vanilla'\n\nimport {\n\tAugmentedApiData,\n\tAugmentedGetters,\n\tAugmentedSetters,\n\tGettersBuilder,\n\tSettersBuilder,\n\tState,\n\tStoreApi,\n\tStoreApiPluginList,\n} from '../types'\nimport { generateApi } from './generateApi'\nimport { generateGet } from './generateGet'\nimport { generateSet } from './generateSet'\nimport { generateUse } from './generateUse'\nimport { extendGetters } from './extendGetters'\nimport { extendSetters } from './extendSetters'\nimport { restrictState } from './restrictState'\n\nexport function createStore<S extends State, Plugins extends StoreApiPluginList = []>(\n\tinitialState: S,\n\toptions?: {\n\t\tname?: string\n\t\tplugins?: [...Plugins]\n\t\tmiddlewares?: { devtools?: true | DevtoolsOptions; persist?: true | PersistOptions<any> }\n\t}\n): Plugins extends []\n\t? StoreApi<S>\n\t: StoreApi<AugmentedApiData<S, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>> {\n\tconst { name = 'zustand-lite', plugins = [], middlewares = {} } = options ?? {}\n\n\t// Merge state from plugins to be available for future use.\n\tlet mergedState: any = initialState\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.creates) {\n\t\t\tmergedState = { ...mergedState, ...plugin.creates() }\n\t\t}\n\t})\n\n\t// Apply supported middlewares.\n\tlet initializer: any = () => mergedState\n\n\tif (middlewares.devtools) {\n\t\tinitializer = devtools(\n\t\t\tinitializer,\n\t\t\tmiddlewares.devtools === true\n\t\t\t\t? { name: 'zustand-lite', store: name }\n\t\t\t\t: middlewares.devtools\n\t\t)\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(\n\t\t\tinitializer,\n\t\t\tmiddlewares.persist === true ? { name } : middlewares.persist\n\t\t)\n\t}\n\n\t// Create a vanilla zustand store to wrap.\n\tconst storeApi: any = createVanillaStore(initializer)\n\n\t// Create zustand-lite wrapper.\n\tlet store: any = {\n\t\tapi: generateApi(storeApi),\n\t\tget: generateGet(storeApi),\n\t\tset: generateSet(storeApi, !!middlewares.devtools),\n\t\tuse: generateUse(storeApi),\n\t\textendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendGetters(builder, this, storeApi)\n\t\t},\n\t\textendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendSetters(builder, this)\n\t\t},\n\t\trestrictState<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"]}
@@ -0,0 +1,79 @@
1
+ import { StoreApi as StoreApi$1 } from 'zustand';
2
+ import { DevtoolsOptions, PersistOptions } from 'zustand/middleware';
3
+
4
+ type State = Record<string | symbol, unknown>;
5
+ type Empty = Record<string, never>;
6
+ type Default = Record<string | symbol, any>;
7
+ type EqualityChecker<S> = (state: S, newState: S) => boolean;
8
+ type StoreApiEncapsulated<S extends State = Empty, Getters = Default, Setters = Default> = {
9
+ api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
10
+ get: GetRecord<S> & Getters;
11
+ set: SetRecord<S> & Setters;
12
+ use: UseRecord<S> & Getters;
13
+ };
14
+ type StoreApi<S extends State = Empty, Getters = Default, Setters = Default> = {
15
+ api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
16
+ get: GetRecord<S> & Getters;
17
+ set: SetRecord<S> & Setters;
18
+ use: UseRecord<S> & Getters;
19
+ extendGetters<Builder extends GettersBuilder<S, Getters, Setters>>(builder: Builder): StoreApi<S, Getters & ReturnType<Builder>, Setters>;
20
+ extendSetters<Builder extends SettersBuilder<S, Getters, Setters>>(builder: Builder): StoreApi<S, Getters, Setters & ReturnType<Builder>>;
21
+ restrictState(): StoreApiEncapsulated<S, Getters, Setters>;
22
+ restrictState<Key extends keyof S>(publicState: Key[]): StoreApiEncapsulated<Omit<S, Key>, Getters, Setters>;
23
+ };
24
+ type GettersBuilder<S extends State, Getters = Default, Setters = Default> = (args: {
25
+ api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
26
+ get: GetRecord<S> & Getters;
27
+ set: SetRecord<S> & Setters;
28
+ }) => Record<string, (...args: any[]) => any>;
29
+ type SettersBuilder<S extends State, Getters = Default, Setters = Default> = (args: {
30
+ api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
31
+ get: GetRecord<S> & Getters;
32
+ set: SetRecord<S> & Setters;
33
+ }) => Record<string, (...args: any[]) => void>;
34
+ type GetRecord<S extends Record<string, any>> = () => S;
35
+ type SetRecord<S extends Record<string, any>> = StoreApi$1<S>['setState'] & {
36
+ [K in keyof S]-?: (value: S[K]) => void;
37
+ };
38
+ type UseRecord<S, R = any> = UseRecordDeep<S> & ((selector: (state: S) => R, equality?: EqualityChecker<S>) => R);
39
+ type UseRecordDeep<S> = {
40
+ [K in keyof S]-?: S[K] extends Record<string, any> ? IsOptional<S, K> extends false ? ((equalityFn?: EqualityChecker<S[K]>) => S[K]) & UseRecordDeep<S[K]> : never : (equalityFn?: EqualityChecker<S[K]>) => S[K];
41
+ };
42
+ type IsOptional<S, K extends keyof S> = undefined extends S[K] ? {} extends Pick<S, K> ? true : false : false;
43
+ type StoreApiPlugin<NewApiData extends State, NewGetters, NewSetters> = {
44
+ creates?: () => NewApiData;
45
+ extends?: (store: StoreApi<NewApiData, NewGetters, NewSetters>) => StoreApi<NewApiData, NewGetters, NewSetters>;
46
+ };
47
+ type StoreApiPluginList = StoreApiPlugin<any, any, any>[];
48
+ type AugmentedApiData<S, Plugins extends StoreApiPluginList> = S & UnionToIntersection<ExtractPluginTypes<Plugins, 'create'>[number]>;
49
+ type AugmentedGetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['getters']>;
50
+ type AugmentedSetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['setters']>;
51
+ type ExtractPluginTypes<Plugins extends StoreApiPluginList, Key extends 'create' | 'extend'> = {
52
+ [K in keyof Plugins]: Plugins[K] extends StoreApiPlugin<infer S, infer G, infer A> ? Key extends 'create' ? S : Key extends 'extend' ? {
53
+ getters: G;
54
+ setters: A;
55
+ } : never : never;
56
+ };
57
+ type UnionToIntersection<S> = (S extends any ? (k: S) => void : never) extends (k: infer I) => void ? I : never;
58
+
59
+ /**
60
+ * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:
61
+ * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party
62
+ * zustand-x repository: https://github.com/udecode/zustand-x.
63
+ **/
64
+
65
+ declare function createStore<S extends State, Plugins extends StoreApiPluginList = []>(initialState: S, options?: {
66
+ name?: string;
67
+ plugins?: [...Plugins];
68
+ middlewares?: {
69
+ devtools?: true | DevtoolsOptions;
70
+ persist?: true | PersistOptions<any>;
71
+ };
72
+ }): Plugins extends [] ? StoreApi<S> : StoreApi<AugmentedApiData<S, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>>;
73
+
74
+ type PluginResetSetters = {
75
+ reset: () => void;
76
+ };
77
+ declare const reset: StoreApiPlugin<{}, {}, PluginResetSetters>;
78
+
79
+ export { type StoreApiPlugin, createStore, reset };
package/dist/index.d.ts CHANGED
@@ -4,51 +4,48 @@ import { DevtoolsOptions, PersistOptions } from 'zustand/middleware';
4
4
  type State = Record<string | symbol, unknown>;
5
5
  type Empty = Record<string, never>;
6
6
  type Default = Record<string | symbol, any>;
7
- type EqualityChecker<T> = (state: T, newState: T) => boolean;
8
- type StoreApiGet<T extends State, Getters> = Required<GetRecord<T>> & Getters;
9
- type StoreApiUse<T extends State, Getters> = Required<UseRecord<T>> & Getters;
10
- type StoreApiSet<T extends State, Setters> = Required<SetRecord<T>> & Setters;
11
- type StoreApiEncapsulated<T extends State = Empty, Getters = Default, Setters = Default> = {
12
- api: StoreApi$1<T>;
13
- get: StoreApiGet<T, Getters>;
14
- set: StoreApiSet<T, Setters>;
15
- use: StoreApiUse<T, Getters>;
7
+ type EqualityChecker<S> = (state: S, newState: S) => boolean;
8
+ type StoreApiEncapsulated<S extends State = Empty, Getters = Default, Setters = Default> = {
9
+ api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
10
+ get: GetRecord<S> & Getters;
11
+ set: SetRecord<S> & Setters;
12
+ use: UseRecord<S> & Getters;
16
13
  };
17
- type StoreApi<T extends State = Empty, Getters = Default, Setters = Default> = {
18
- api: StoreApi$1<T>;
19
- get: StoreApiGet<T, Getters>;
20
- set: StoreApiSet<T, Setters>;
21
- use: StoreApiUse<T, Getters>;
22
- extendGetters<Builder extends GettersBuilder<T, Getters, Setters>>(builder: Builder): StoreApi<T, Getters & ReturnType<Builder>, Setters>;
23
- extendSetters<Builder extends SettersBuilder<T, Getters, Setters>>(builder: Builder): StoreApi<T, Getters, Setters & ReturnType<Builder>>;
24
- restrictState(): StoreApiEncapsulated<T, Getters, Setters>;
25
- restrictState<Key extends keyof T>(publicState: Key[]): StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>;
14
+ type StoreApi<S extends State = Empty, Getters = Default, Setters = Default> = {
15
+ api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
16
+ get: GetRecord<S> & Getters;
17
+ set: SetRecord<S> & Setters;
18
+ use: UseRecord<S> & Getters;
19
+ extendGetters<Builder extends GettersBuilder<S, Getters, Setters>>(builder: Builder): StoreApi<S, Getters & ReturnType<Builder>, Setters>;
20
+ extendSetters<Builder extends SettersBuilder<S, Getters, Setters>>(builder: Builder): StoreApi<S, Getters, Setters & ReturnType<Builder>>;
21
+ restrictState(): StoreApiEncapsulated<S, Getters, Setters>;
22
+ restrictState<Key extends keyof S>(publicState: Key[]): StoreApiEncapsulated<Omit<S, Key>, Getters, Setters>;
26
23
  };
27
- type GettersBuilder<T extends State, Getters = Default, Setters = Default> = (args: {
28
- api: StoreApi$1<T>;
29
- get: StoreApiGet<T, Getters>;
30
- set: StoreApiSet<T, Setters>;
24
+ type GettersBuilder<S extends State, Getters = Default, Setters = Default> = (args: {
25
+ api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
26
+ get: GetRecord<S> & Getters;
27
+ set: SetRecord<S> & Setters;
31
28
  }) => Record<string, (...args: any[]) => any>;
32
- type SettersBuilder<T extends State, Getters = Default, Setters = Default> = (args: {
33
- api: StoreApi$1<T>;
34
- get: StoreApiGet<T, Getters>;
35
- set: StoreApiSet<T, Setters>;
29
+ type SettersBuilder<S extends State, Getters = Default, Setters = Default> = (args: {
30
+ api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
31
+ get: GetRecord<S> & Getters;
32
+ set: SetRecord<S> & Setters;
36
33
  }) => Record<string, (...args: any[]) => void>;
37
- type GetRecord<O extends Record<string, any>> = {
38
- [K in keyof O]: () => O[K];
34
+ type GetRecord<S extends Record<string, any>> = () => S;
35
+ type SetRecord<S extends Record<string, any>> = StoreApi$1<S>['setState'] & {
36
+ [K in keyof S]-?: (value: S[K]) => void;
39
37
  };
40
- type UseRecord<O extends Record<string, any>> = {
41
- [K in keyof O]: (equalityFn?: EqualityChecker<O[K]>) => O[K];
42
- };
43
- type SetRecord<O extends Record<string, any>> = {
44
- [K in keyof O]: (value: O[K]) => void;
38
+ type UseRecord<S, R = any> = UseRecordDeep<S> & ((selector: (state: S) => R, equality?: EqualityChecker<S>) => R);
39
+ type UseRecordDeep<S> = {
40
+ [K in keyof S]-?: S[K] extends Record<string, any> ? IsOptional<S, K> extends false ? ((equalityFn?: EqualityChecker<S[K]>) => S[K]) & UseRecordDeep<S[K]> : never : (equalityFn?: EqualityChecker<S[K]>) => S[K];
45
41
  };
42
+ type IsOptional<S, K extends keyof S> = undefined extends S[K] ? {} extends Pick<S, K> ? true : false : false;
46
43
  type StoreApiPlugin<NewApiData extends State, NewGetters, NewSetters> = {
47
44
  creates?: () => NewApiData;
48
45
  extends?: (store: StoreApi<NewApiData, NewGetters, NewSetters>) => StoreApi<NewApiData, NewGetters, NewSetters>;
49
46
  };
50
47
  type StoreApiPluginList = StoreApiPlugin<any, any, any>[];
51
- type AugmentedApiData<T, Plugins extends StoreApiPluginList> = T & UnionToIntersection<ExtractPluginTypes<Plugins, 'create'>[number]>;
48
+ type AugmentedApiData<S, Plugins extends StoreApiPluginList> = S & UnionToIntersection<ExtractPluginTypes<Plugins, 'create'>[number]>;
52
49
  type AugmentedGetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['getters']>;
53
50
  type AugmentedSetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['setters']>;
54
51
  type ExtractPluginTypes<Plugins extends StoreApiPluginList, Key extends 'create' | 'extend'> = {
@@ -57,7 +54,7 @@ type ExtractPluginTypes<Plugins extends StoreApiPluginList, Key extends 'create'
57
54
  setters: A;
58
55
  } : never : never;
59
56
  };
60
- type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
57
+ type UnionToIntersection<S> = (S extends any ? (k: S) => void : never) extends (k: infer I) => void ? I : never;
61
58
 
62
59
  /**
63
60
  * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:
@@ -65,14 +62,14 @@ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
65
62
  * zustand-x repository: https://github.com/udecode/zustand-x.
66
63
  **/
67
64
 
68
- declare function createStore<T extends State, Plugins extends StoreApiPluginList = []>(initialState: T, options?: {
65
+ declare function createStore<S extends State, Plugins extends StoreApiPluginList = []>(initialState: S, options?: {
69
66
  name?: string;
70
67
  plugins?: [...Plugins];
71
68
  middlewares?: {
72
69
  devtools?: true | DevtoolsOptions;
73
70
  persist?: true | PersistOptions<any>;
74
71
  };
75
- }): Plugins extends [] ? StoreApi<T> : StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>>;
72
+ }): Plugins extends [] ? StoreApi<S> : StoreApi<AugmentedApiData<S, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>>;
76
73
 
77
74
  type PluginResetSetters = {
78
75
  reset: () => void;
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var p=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var b=(t,e)=>{for(var o in e)p(t,o,{get:e[o],enumerable:!0})},j=(t,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of O(e))!v.call(t,r)&&r!==o&&p(t,r,{get:()=>e[r],enumerable:!(s=D(e,r))||s.enumerable});return t};var k=t=>j(p({},"__esModule",{value:!0}),t);var w={};b(w,{createStore:()=>B,reset:()=>E});module.exports=k(w);var u=require("zustand/middleware"),R=require("zustand/vanilla");function K(){return new Error()?.stack?.split(`
2
- `)[3].trim().split(" ")[1].split(".")[1]??"setState"}function m(t,e){return{...t,setState:(o,s,r)=>{t.setState(o,s,e?{type:r??K(),payload:o}:void 0)}}}function l(t){let e={},o=t.getState();return Object.keys(o).forEach(s=>{e[s]=()=>t.getState()[s]}),Object.getOwnPropertySymbols(o).forEach(s=>{e[s]=()=>t.getState()[s]}),e}function f(t,e){let o={};return Object.keys(t.getState()).forEach(s=>{o[s]=r=>{t.getState()[s]!==r&&t.setState(i=>({...i,[s]:r}),!1,e?{type:s,payload:{[s]:r}}:void 0)}}),o}var c=require("zustand/shallow"),g=require("zustand/traditional");function T(t){let e={};return Object.keys(t.getState()).forEach(o=>{e[o]=(s=c.shallow)=>(0,g.useStoreWithEqualityFn)(t,r=>r[o],s)}),e}var x=require("zustand/shallow"),y=require("zustand/traditional");function A(t,e){let o={...e.use},s={...e.get};return Object.keys(t(e)).forEach(r=>{o[r]=(...i)=>(0,y.useStoreWithEqualityFn)(e.api,()=>t(e)[r](...i),x.shallow),s[r]=(...i)=>t(e)[r](...i)}),{...e,get:s,use:o}}function G(t,e){return{...e,set:{...e.set,...t(e)}}}function P(t,e,o){return{api:o.api,set:o.set,use:o.use,get:Object.keys(o.get).reduce((s,r)=>e[r]&&t.includes(r)?s:{...s,[r]:o.get[r]},{})}}function B(t,e){let{name:o="zustand-lite",plugins:s=[],middlewares:r={}}=e??{},i=t;s.forEach(n=>{n.creates&&(i={...i,...n.creates()})});let a=()=>i;r.devtools&&(a=(0,u.devtools)(a,r.devtools===!0?{name:"zustand-lite",store:o}:r.devtools)),r.persist&&(a=(0,u.persist)(a,r.persist===!0?{name:o}:r.persist));let S=(0,R.createStore)(a),d={api:m(S,!!r.devtools),get:l(S),set:f(S,!!r.devtools),use:T(S),extendGetters(n){return A(n,this)},extendSetters(n){return G(n,this)},restrictState(n=[]){return P(n,i,this)}};return s.forEach(n=>{n.extends&&(d=n.extends(d))}),d}var E={extends:t=>t.extendSetters(({api:e})=>({reset:()=>{let o=e.getInitialState?.()??{};e.setState(()=>o,!0)}}))};0&&(module.exports={createStore,reset});
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};
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/createStore.ts","../src/lib/generateApi.ts","../src/lib/generateGet.ts","../src/lib/generateSet.ts","../src/lib/generateUse.ts","../src/lib/extendGetters.ts","../src/lib/extendSetters.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["export type { StoreApiPlugin } from './types'\nexport { createStore } from './lib/createStore';\nexport { reset } from './plugins/reset'\n","/**\n * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party\n * zustand-x repository: https://github.com/udecode/zustand-x.\n **/\nimport { DevtoolsOptions, PersistOptions, devtools, persist } from 'zustand/middleware'\nimport { createStore as createVanillaStore } from 'zustand/vanilla'\n\nimport {\n\tAugmentedApiData,\n\tAugmentedGetters,\n\tAugmentedSetters,\n\tGettersBuilder,\n\tSettersBuilder,\n\tState,\n\tStoreApi,\n\tStoreApiPluginList,\n} from '../types'\nimport { generateApi } from './generateApi'\nimport { generateGet } from './generateGet'\nimport { generateSet } from './generateSet'\nimport { generateUse } from './generateUse'\nimport { extendGetters } from './extendGetters'\nimport { extendSetters } from './extendSetters'\nimport { restrictState } from './restrictState'\n\nexport function createStore<T extends State, Plugins extends StoreApiPluginList = []>(\n\tinitialState: T,\n\toptions?: {\n\t\tname?: string\n\t\tplugins?: [...Plugins]\n\t\tmiddlewares?: { devtools?: true | DevtoolsOptions; persist?: true | PersistOptions<any> }\n\t}\n): Plugins extends []\n\t? StoreApi<T>\n\t: StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>> {\n\tconst { name = 'zustand-lite', plugins = [], middlewares = {} } = options ?? {}\n\n\t// Merge state from plugins to be available for future use.\n\tlet mergedState: any = initialState\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.creates) {\n\t\t\tmergedState = { ...mergedState, ...plugin.creates() }\n\t\t}\n\t})\n\n\t// Apply supported middlewares.\n\tlet initializer: any = () => mergedState\n\n\tif (middlewares.devtools) {\n\t\tinitializer = devtools(\n\t\t\tinitializer,\n\t\t\tmiddlewares.devtools === true\n\t\t\t\t? { name: 'zustand-lite', store: name }\n\t\t\t\t: middlewares.devtools\n\t\t)\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(\n\t\t\tinitializer,\n\t\t\tmiddlewares.persist === true ? { name } : middlewares.persist\n\t\t)\n\t}\n\n\t// Create a vanilla zustand store to wrap.\n\tconst storeApi: any = createVanillaStore(initializer)\n\n\t// Create zustand-lite wrapper.\n\tlet store: any = {\n\t\tapi: generateApi(storeApi, !!middlewares.devtools),\n\t\tget: generateGet(storeApi),\n\t\tset: generateSet(storeApi, !!middlewares.devtools),\n\t\tuse: generateUse(storeApi),\n\t\textendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendGetters(builder, this)\n\t\t},\n\t\textendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendSetters(builder, this)\n\t\t},\n\t\trestrictState<Key extends keyof T>(publicState: Key[] = []) {\n\t\t\treturn restrictState(\n\t\t\t\tpublicState,\n\t\t\t\tmergedState,\n\t\t\t\tthis as StoreApi<\n\t\t\t\t\tAugmentedApiData<T, Plugins>,\n\t\t\t\t\tAugmentedGetters<Plugins>,\n\t\t\t\t\tAugmentedSetters<Plugins>\n\t\t\t\t>\n\t\t\t)\n\t\t},\n\t}\n\n\t// Extend store getters and setters with plugins.\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.extends) {\n\t\t\tstore = plugin.extends(store)\n\t\t}\n\t})\n\n\treturn store\n}\n","import { StoreApi } from 'zustand/vanilla'\n\nimport { State } from '../types'\n\nfunction setterName() {\n\treturn new Error()?.stack?.split('\\n')[3].trim().split(' ')[1].split('.')[1] ?? 'setState'\n}\n\n/**\n * Required to wrap original Zustand setState function with default devtools action name.\n * @param api Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateApi<T extends State>(api: StoreApi<T>, hasDevtools: boolean) {\n\treturn {\n\t\t...api,\n\t\tsetState: (newState: T | ((state: T) => T), replace?: boolean, name?: string) => {\n\t\t\tapi.setState(\n\t\t\t\tnewState,\n\t\t\t\treplace,\n\t\t\t\t// @ts-ignore Additional parameter will have no effect even if devtools are disabled.\n\t\t\t\thasDevtools ? { type: name ?? setterName(), payload: newState } : undefined\n\t\t\t)\n\t\t},\n\t}\n}\n","import { StoreApi } from 'zustand/vanilla'\n\nimport { GetRecord, State } from '../types'\n\n/**\n * Generates automatic getters like store.get.foo()\n * @param api Zustand api interface\n */\nexport function generateGet<T extends State>(api: StoreApi<T>) {\n\tconst getters: GetRecord<T> = {} as GetRecord<T>\n\n\tconst initialState = api.getState()\n\n\tObject.keys(initialState).forEach((key) => {\n\t\tgetters[key as keyof T] = () => api.getState()[key as keyof T]\n\t})\n\n\tObject.getOwnPropertySymbols(initialState).forEach((symbol) => {\n\t\tgetters[symbol as keyof T] = () => api.getState()[symbol as keyof T]\n\t})\n\n\treturn getters\n}\n","import { NamedSet } from 'zustand/middleware/devtools'\nimport { StoreApi } from 'zustand/vanilla'\n\nimport { SetRecord, State } from '../types'\n\n/**\n * Generates automatic setters like store.set.foo(value)\n * @param api Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateSet<T extends State>(api: StoreApi<T>, hasDevtools: boolean): SetRecord<T> {\n\tconst setters: SetRecord<T> = {} as SetRecord<T>\n\n\tObject.keys(api.getState()).forEach((key) => {\n\t\tsetters[key as keyof T] = (value: any) => {\n\t\t\tif (api.getState()[key] === value) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tapi.setState(\n\t\t\t\t(state) => ({ ...state, [key]: value }),\n\t\t\t\tfalse,\n\t\t\t\t// @ts-ignore Additional parameter will have no effect even if devtools are disabled.\n\t\t\t\thasDevtools ? { type: key, payload: { [key]: value } } : undefined\n\t\t\t)\n\t\t}\n\t})\n\n\treturn setters\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { StoreApi } from 'zustand'\n\nimport { EqualityChecker, State, UseRecord } from '../types'\n\n/**\n * Generates automatic getters like store.use.foo()\n * @param api Zustand api interface\n */\nexport function generateUse<T extends State>(api: StoreApi<T>) {\n\tconst getters: UseRecord<T> = {} as UseRecord<T>\n\n\t// All of these wrappers are hooks and should obey the rule of hooks.\n\tObject.keys(api.getState()).forEach((key) => {\n\t\tgetters[key as keyof T] = (equalityFn: EqualityChecker<T[keyof T]> = shallow) => {\n\t\t\treturn useStoreWithEqualityFn(api, (state: T) => state[key as keyof T], equalityFn)\n\t\t}\n\t})\n\n\treturn getters\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { Default, GettersBuilder, State, StoreApi } from '../types'\n\nexport function extendGetters<\n\tBuilder extends GettersBuilder<T, Getters, Setters>,\n\tT extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n\tconst use = { ...thisApi.use }\n\tconst get = { ...thisApi.get }\n\n\tObject.keys(builder(thisApi)).forEach((key) => {\n\t\t// @ts-ignore\n\t\tuse[key] = (...args: any[]) =>\n\t\t\tuseStoreWithEqualityFn(\n\t\t\t\tthisApi.api,\n\t\t\t\t() => {\n\t\t\t\t\treturn builder(thisApi)[key](...args)\n\t\t\t\t},\n\t\t\t\tshallow\n\t\t\t)\n\n\t\t// @ts-ignore\n\t\tget[key] = (...args: any[]) => {\n\t\t\treturn builder(thisApi)[key](...args)\n\t\t}\n\t})\n\n\treturn { ...thisApi, get, use } as StoreApi<T, Getters & ReturnType<Builder>, Setters>\n}\n","import { Default, SettersBuilder, State, StoreApi } from '../types'\n\nexport function extendSetters<\n\tBuilder extends SettersBuilder<T, Getters, Setters>,\n\tT extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n\treturn { ...thisApi, set: { ...thisApi.set, ...builder(thisApi) } } as StoreApi<\n\t\tT,\n\t\tGetters,\n\t\tSetters & ReturnType<Builder>\n\t>\n}\n","import { Empty, GetRecord, SetRecord, State, StoreApi, StoreApiEncapsulated } from '../types'\n\nexport function restrictState<\n\tT extends State,\n\tKey extends keyof T,\n\tGetters extends GetRecord<any> = Empty,\n\tSetters extends SetRecord<any> = Empty,\n>(privateState: Key[], mergedState: T, thisApi: StoreApi<T, Getters, Setters>) {\n\treturn {\n\t\tapi: thisApi.api,\n\t\tset: thisApi.set,\n\t\tuse: thisApi.use,\n\t\tget: Object.keys(thisApi.get).reduce(\n\t\t\t(acc, key) =>\n\t\t\t\tmergedState[key] && (privateState as string[]).includes(key)\n\t\t\t\t\t? acc\n\t\t\t\t\t: { ...acc, [key]: thisApi.get[key] },\n\t\t\t{}\n\t\t) as GetRecord<Omit<T, Key>> & Getters,\n\t} as StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>\n}\n","import { StoreApiPlugin } from '../types'\n\ntype PluginResetSetters = { reset: () => void }\n\nexport const reset: StoreApiPlugin<{}, {}, PluginResetSetters> = {\n\textends: (store) => {\n\t\treturn store.extendSetters(({ api }) => ({\n\t\t\treset: () => {\n\t\t\t\tconst initialState = api.getInitialState?.() ?? {}\n\t\t\t\tapi.setState(() => initialState, true)\n\t\t\t},\n\t\t}))\n\t},\n}\n"],"mappings":"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","names":["index_exports","__export","createStore","reset","__toCommonJS","import_middleware","import_vanilla","setterName","generateApi","api","hasDevtools","newState","replace","name","generateGet","api","getters","initialState","key","symbol","generateSet","api","hasDevtools","setters","key","value","state","import_shallow","import_traditional","generateUse","api","getters","key","equalityFn","state","import_shallow","import_traditional","extendGetters","builder","thisApi","use","get","key","args","extendSetters","builder","thisApi","restrictState","privateState","mergedState","thisApi","acc","key","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","storeApi","createVanillaStore","store","generateApi","generateGet","generateSet","generateUse","builder","extendGetters","extendSetters","publicState","restrictState","reset","store","api","initialState"]}
1
+ {"version":3,"sources":["../src/lib/createStore.ts","../src/lib/generateApi.ts","../src/lib/generateGet.ts","../src/lib/generateSet.ts","../src/lib/generateUse.ts","../src/lib/generateUseStep.ts","../src/lib/extendGetters.ts","../src/lib/extendSetters.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["/**\n * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party\n * zustand-x repository: https://github.com/udecode/zustand-x.\n **/\nimport { DevtoolsOptions, PersistOptions, devtools, persist } from 'zustand/middleware'\nimport { createStore as createVanillaStore } from 'zustand/vanilla'\n\nimport {\n\tAugmentedApiData,\n\tAugmentedGetters,\n\tAugmentedSetters,\n\tGettersBuilder,\n\tSettersBuilder,\n\tState,\n\tStoreApi,\n\tStoreApiPluginList,\n} from '../types'\nimport { generateApi } from './generateApi'\nimport { generateGet } from './generateGet'\nimport { generateSet } from './generateSet'\nimport { generateUse } from './generateUse'\nimport { extendGetters } from './extendGetters'\nimport { extendSetters } from './extendSetters'\nimport { restrictState } from './restrictState'\n\nexport function createStore<S extends State, Plugins extends StoreApiPluginList = []>(\n\tinitialState: S,\n\toptions?: {\n\t\tname?: string\n\t\tplugins?: [...Plugins]\n\t\tmiddlewares?: { devtools?: true | DevtoolsOptions; persist?: true | PersistOptions<any> }\n\t}\n): Plugins extends []\n\t? StoreApi<S>\n\t: StoreApi<AugmentedApiData<S, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>> {\n\tconst { name = 'zustand-lite', plugins = [], middlewares = {} } = options ?? {}\n\n\t// Merge state from plugins to be available for future use.\n\tlet mergedState: any = initialState\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.creates) {\n\t\t\tmergedState = { ...mergedState, ...plugin.creates() }\n\t\t}\n\t})\n\n\t// Apply supported middlewares.\n\tlet initializer: any = () => mergedState\n\n\tif (middlewares.devtools) {\n\t\tinitializer = devtools(\n\t\t\tinitializer,\n\t\t\tmiddlewares.devtools === true\n\t\t\t\t? { name: 'zustand-lite', store: name }\n\t\t\t\t: middlewares.devtools\n\t\t)\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(\n\t\t\tinitializer,\n\t\t\tmiddlewares.persist === true ? { name } : middlewares.persist\n\t\t)\n\t}\n\n\t// Create a vanilla zustand store to wrap.\n\tconst storeApi: any = createVanillaStore(initializer)\n\n\t// Create zustand-lite wrapper.\n\tlet store: any = {\n\t\tapi: generateApi(storeApi),\n\t\tget: generateGet(storeApi),\n\t\tset: generateSet(storeApi, !!middlewares.devtools),\n\t\tuse: generateUse(storeApi),\n\t\textendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendGetters(builder, this, storeApi)\n\t\t},\n\t\textendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendSetters(builder, this)\n\t\t},\n\t\trestrictState<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":["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"]}
package/package.json CHANGED
@@ -1,51 +1,63 @@
1
1
  {
2
- "name": "zustand-lite",
3
- "version": "0.2.4",
4
- "description": "Zustand Lite builds upon zustand, by auto-generating selectors and simplifying API even more.",
5
- "author": "Piotr Siatkowski <p.siatkowski@gmail.com>",
6
- "license": "MIT",
7
- "keywords": [
8
- "zustand",
9
- "state-management",
10
- "react",
11
- "store",
12
- "plugin",
13
- "typescript",
14
- "no-boilerplate"
15
- ],
16
- "repository": {
17
- "type": "git",
18
- "url": "git://github.com/PiotrSiatkowski/zustand-lite.git",
19
- "web": "https://github.com/PiotrSiatkowski/zustand-lite"
20
- },
21
- "bugs": {
22
- "url": "https://github.com/PiotrSiatkowski/zustand-lite/issues"
23
- },
24
- "sideEffects": false,
25
- "main": "dist/index.js",
26
- "module": "dist/index.mjs",
27
- "types": "dist/index.d.ts",
28
- "files": [
29
- "dist/**/*"
30
- ],
31
- "exports": {
32
- ".": {
33
- "types": "./dist/index.d.ts",
34
- "import": "./dist/index.mjs",
35
- "module": "./dist/index.mjs",
36
- "require": "./dist/index.js"
37
- }
38
- },
39
- "scripts": {
40
- "build": "tsup src/index.ts --format cjs,esm --dts --clean --sourcemap --minify"
41
- },
42
- "dependencies": {
43
- "zustand": "5.0.5"
44
- },
45
- "devDependencies": {
46
- "prettier": "^3.5.3",
47
- "typescript": "5.8.3",
48
- "tsup": "^8.5.0"
49
- },
50
- "private": false
2
+ "name": "zustand-lite",
3
+ "version": "0.3.0",
4
+ "description": "Zustand Lite builds upon zustand, by auto-generating selectors and simplifying API even more.",
5
+ "author": "Piotr Siatkowski <p.siatkowski@gmail.com>",
6
+ "license": "MIT",
7
+ "keywords": [
8
+ "zustand",
9
+ "state-management",
10
+ "react",
11
+ "store",
12
+ "plugin",
13
+ "typescript",
14
+ "no-boilerplate"
15
+ ],
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git://github.com/PiotrSiatkowski/zustand-lite.git",
19
+ "web": "https://github.com/PiotrSiatkowski/zustand-lite"
20
+ },
21
+ "bugs": {
22
+ "url": "https://github.com/PiotrSiatkowski/zustand-lite/issues"
23
+ },
24
+ "sideEffects": false,
25
+ "type": "module",
26
+ "main": "dist/index.js",
27
+ "module": "dist/index.mjs",
28
+ "types": "dist/index.d.ts",
29
+ "files": [
30
+ "dist/**/*"
31
+ ],
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist/index.d.ts",
35
+ "import": "./dist/index.mjs",
36
+ "module": "./dist/index.mjs",
37
+ "require": "./dist/index.js"
38
+ }
39
+ },
40
+ "scripts": {
41
+ "build": "jest && tsup src/index.ts --format cjs,esm --dts --clean --sourcemap --minify",
42
+ "test": "jest"
43
+ },
44
+ "dependencies": {
45
+ "zustand": "5.0.5"
46
+ },
47
+ "devDependencies": {
48
+ "@testing-library/jest-dom": "^6.6.3",
49
+ "@testing-library/react": "^16.3.0",
50
+ "@types/jest": "^30.0.0",
51
+ "@types/react": "^19.1.8",
52
+ "jest": "^30.0.2",
53
+ "jest-environment-jsdom": "^30.0.2",
54
+ "prettier": "^3.5.3",
55
+ "react": "^19.0.0",
56
+ "react-dom": "^19.0.0",
57
+ "ts-jest": "^29.4.0",
58
+ "tsup": "^8.5.0",
59
+ "typescript": "5.8.3",
60
+ "use-sync-external-store": "^1.5.0"
61
+ },
62
+ "private": false
51
63
  }
package/dist/index.d.mts DELETED
@@ -1,82 +0,0 @@
1
- import { StoreApi as StoreApi$1 } from 'zustand';
2
- import { DevtoolsOptions, PersistOptions } from 'zustand/middleware';
3
-
4
- type State = Record<string | symbol, unknown>;
5
- type Empty = Record<string, never>;
6
- type Default = Record<string | symbol, any>;
7
- type EqualityChecker<T> = (state: T, newState: T) => boolean;
8
- type StoreApiGet<T extends State, Getters> = Required<GetRecord<T>> & Getters;
9
- type StoreApiUse<T extends State, Getters> = Required<UseRecord<T>> & Getters;
10
- type StoreApiSet<T extends State, Setters> = Required<SetRecord<T>> & Setters;
11
- type StoreApiEncapsulated<T extends State = Empty, Getters = Default, Setters = Default> = {
12
- api: StoreApi$1<T>;
13
- get: StoreApiGet<T, Getters>;
14
- set: StoreApiSet<T, Setters>;
15
- use: StoreApiUse<T, Getters>;
16
- };
17
- type StoreApi<T extends State = Empty, Getters = Default, Setters = Default> = {
18
- api: StoreApi$1<T>;
19
- get: StoreApiGet<T, Getters>;
20
- set: StoreApiSet<T, Setters>;
21
- use: StoreApiUse<T, Getters>;
22
- extendGetters<Builder extends GettersBuilder<T, Getters, Setters>>(builder: Builder): StoreApi<T, Getters & ReturnType<Builder>, Setters>;
23
- extendSetters<Builder extends SettersBuilder<T, Getters, Setters>>(builder: Builder): StoreApi<T, Getters, Setters & ReturnType<Builder>>;
24
- restrictState(): StoreApiEncapsulated<T, Getters, Setters>;
25
- restrictState<Key extends keyof T>(publicState: Key[]): StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>;
26
- };
27
- type GettersBuilder<T extends State, Getters = Default, Setters = Default> = (args: {
28
- api: StoreApi$1<T>;
29
- get: StoreApiGet<T, Getters>;
30
- set: StoreApiSet<T, Setters>;
31
- }) => Record<string, (...args: any[]) => any>;
32
- type SettersBuilder<T extends State, Getters = Default, Setters = Default> = (args: {
33
- api: StoreApi$1<T>;
34
- get: StoreApiGet<T, Getters>;
35
- set: StoreApiSet<T, Setters>;
36
- }) => Record<string, (...args: any[]) => void>;
37
- type GetRecord<O extends Record<string, any>> = {
38
- [K in keyof O]: () => O[K];
39
- };
40
- type UseRecord<O extends Record<string, any>> = {
41
- [K in keyof O]: (equalityFn?: EqualityChecker<O[K]>) => O[K];
42
- };
43
- type SetRecord<O extends Record<string, any>> = {
44
- [K in keyof O]: (value: O[K]) => void;
45
- };
46
- type StoreApiPlugin<NewApiData extends State, NewGetters, NewSetters> = {
47
- creates?: () => NewApiData;
48
- extends?: (store: StoreApi<NewApiData, NewGetters, NewSetters>) => StoreApi<NewApiData, NewGetters, NewSetters>;
49
- };
50
- type StoreApiPluginList = StoreApiPlugin<any, any, any>[];
51
- type AugmentedApiData<T, Plugins extends StoreApiPluginList> = T & UnionToIntersection<ExtractPluginTypes<Plugins, 'create'>[number]>;
52
- type AugmentedGetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['getters']>;
53
- type AugmentedSetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['setters']>;
54
- type ExtractPluginTypes<Plugins extends StoreApiPluginList, Key extends 'create' | 'extend'> = {
55
- [K in keyof Plugins]: Plugins[K] extends StoreApiPlugin<infer S, infer G, infer A> ? Key extends 'create' ? S : Key extends 'extend' ? {
56
- getters: G;
57
- setters: A;
58
- } : never : never;
59
- };
60
- type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
61
-
62
- /**
63
- * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:
64
- * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party
65
- * zustand-x repository: https://github.com/udecode/zustand-x.
66
- **/
67
-
68
- declare function createStore<T extends State, Plugins extends StoreApiPluginList = []>(initialState: T, options?: {
69
- name?: string;
70
- plugins?: [...Plugins];
71
- middlewares?: {
72
- devtools?: true | DevtoolsOptions;
73
- persist?: true | PersistOptions<any>;
74
- };
75
- }): Plugins extends [] ? StoreApi<T> : StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>>;
76
-
77
- type PluginResetSetters = {
78
- reset: () => void;
79
- };
80
- declare const reset: StoreApiPlugin<{}, {}, PluginResetSetters>;
81
-
82
- export { type StoreApiPlugin, createStore, reset };
package/dist/index.mjs DELETED
@@ -1,3 +0,0 @@
1
- import{devtools as P,persist as R}from"zustand/middleware";import{createStore as B}from"zustand/vanilla";function T(){return new Error()?.stack?.split(`
2
- `)[3].trim().split(" ")[1].split(".")[1]??"setState"}function d(r,e){return{...r,setState:(o,s,t)=>{r.setState(o,s,e?{type:t??T(),payload:o}:void 0)}}}function p(r){let e={},o=r.getState();return Object.keys(o).forEach(s=>{e[s]=()=>r.getState()[s]}),Object.getOwnPropertySymbols(o).forEach(s=>{e[s]=()=>r.getState()[s]}),e}function m(r,e){let o={};return Object.keys(r.getState()).forEach(s=>{o[s]=t=>{r.getState()[s]!==t&&r.setState(i=>({...i,[s]:t}),!1,e?{type:s,payload:{[s]:t}}:void 0)}}),o}import{shallow as x}from"zustand/shallow";import{useStoreWithEqualityFn as y}from"zustand/traditional";function l(r){let e={};return Object.keys(r.getState()).forEach(o=>{e[o]=(s=x)=>y(r,t=>t[o],s)}),e}import{shallow as A}from"zustand/shallow";import{useStoreWithEqualityFn as G}from"zustand/traditional";function f(r,e){let o={...e.use},s={...e.get};return Object.keys(r(e)).forEach(t=>{o[t]=(...i)=>G(e.api,()=>r(e)[t](...i),A),s[t]=(...i)=>r(e)[t](...i)}),{...e,get:s,use:o}}function c(r,e){return{...e,set:{...e.set,...r(e)}}}function g(r,e,o){return{api:o.api,set:o.set,use:o.use,get:Object.keys(o.get).reduce((s,t)=>e[t]&&r.includes(t)?s:{...s,[t]:o.get[t]},{})}}function E(r,e){let{name:o="zustand-lite",plugins:s=[],middlewares:t={}}=e??{},i=r;s.forEach(n=>{n.creates&&(i={...i,...n.creates()})});let a=()=>i;t.devtools&&(a=P(a,t.devtools===!0?{name:"zustand-lite",store:o}:t.devtools)),t.persist&&(a=R(a,t.persist===!0?{name:o}:t.persist));let S=B(a),u={api:d(S,!!t.devtools),get:p(S),set:m(S,!!t.devtools),use:l(S),extendGetters(n){return f(n,this)},extendSetters(n){return c(n,this)},restrictState(n=[]){return g(n,i,this)}};return s.forEach(n=>{n.extends&&(u=n.extends(u))}),u}var D={extends:r=>r.extendSetters(({api:e})=>({reset:()=>{let o=e.getInitialState?.()??{};e.setState(()=>o,!0)}}))};export{E as createStore,D as reset};
3
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/createStore.ts","../src/lib/generateApi.ts","../src/lib/generateGet.ts","../src/lib/generateSet.ts","../src/lib/generateUse.ts","../src/lib/extendGetters.ts","../src/lib/extendSetters.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["/**\n * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party\n * zustand-x repository: https://github.com/udecode/zustand-x.\n **/\nimport { DevtoolsOptions, PersistOptions, devtools, persist } from 'zustand/middleware'\nimport { createStore as createVanillaStore } from 'zustand/vanilla'\n\nimport {\n\tAugmentedApiData,\n\tAugmentedGetters,\n\tAugmentedSetters,\n\tGettersBuilder,\n\tSettersBuilder,\n\tState,\n\tStoreApi,\n\tStoreApiPluginList,\n} from '../types'\nimport { generateApi } from './generateApi'\nimport { generateGet } from './generateGet'\nimport { generateSet } from './generateSet'\nimport { generateUse } from './generateUse'\nimport { extendGetters } from './extendGetters'\nimport { extendSetters } from './extendSetters'\nimport { restrictState } from './restrictState'\n\nexport function createStore<T extends State, Plugins extends StoreApiPluginList = []>(\n\tinitialState: T,\n\toptions?: {\n\t\tname?: string\n\t\tplugins?: [...Plugins]\n\t\tmiddlewares?: { devtools?: true | DevtoolsOptions; persist?: true | PersistOptions<any> }\n\t}\n): Plugins extends []\n\t? StoreApi<T>\n\t: StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>> {\n\tconst { name = 'zustand-lite', plugins = [], middlewares = {} } = options ?? {}\n\n\t// Merge state from plugins to be available for future use.\n\tlet mergedState: any = initialState\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.creates) {\n\t\t\tmergedState = { ...mergedState, ...plugin.creates() }\n\t\t}\n\t})\n\n\t// Apply supported middlewares.\n\tlet initializer: any = () => mergedState\n\n\tif (middlewares.devtools) {\n\t\tinitializer = devtools(\n\t\t\tinitializer,\n\t\t\tmiddlewares.devtools === true\n\t\t\t\t? { name: 'zustand-lite', store: name }\n\t\t\t\t: middlewares.devtools\n\t\t)\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(\n\t\t\tinitializer,\n\t\t\tmiddlewares.persist === true ? { name } : middlewares.persist\n\t\t)\n\t}\n\n\t// Create a vanilla zustand store to wrap.\n\tconst storeApi: any = createVanillaStore(initializer)\n\n\t// Create zustand-lite wrapper.\n\tlet store: any = {\n\t\tapi: generateApi(storeApi, !!middlewares.devtools),\n\t\tget: generateGet(storeApi),\n\t\tset: generateSet(storeApi, !!middlewares.devtools),\n\t\tuse: generateUse(storeApi),\n\t\textendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendGetters(builder, this)\n\t\t},\n\t\textendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendSetters(builder, this)\n\t\t},\n\t\trestrictState<Key extends keyof T>(publicState: Key[] = []) {\n\t\t\treturn restrictState(\n\t\t\t\tpublicState,\n\t\t\t\tmergedState,\n\t\t\t\tthis as StoreApi<\n\t\t\t\t\tAugmentedApiData<T, Plugins>,\n\t\t\t\t\tAugmentedGetters<Plugins>,\n\t\t\t\t\tAugmentedSetters<Plugins>\n\t\t\t\t>\n\t\t\t)\n\t\t},\n\t}\n\n\t// Extend store getters and setters with plugins.\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.extends) {\n\t\t\tstore = plugin.extends(store)\n\t\t}\n\t})\n\n\treturn store\n}\n","import { StoreApi } from 'zustand/vanilla'\n\nimport { State } from '../types'\n\nfunction setterName() {\n\treturn new Error()?.stack?.split('\\n')[3].trim().split(' ')[1].split('.')[1] ?? 'setState'\n}\n\n/**\n * Required to wrap original Zustand setState function with default devtools action name.\n * @param api Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateApi<T extends State>(api: StoreApi<T>, hasDevtools: boolean) {\n\treturn {\n\t\t...api,\n\t\tsetState: (newState: T | ((state: T) => T), replace?: boolean, name?: string) => {\n\t\t\tapi.setState(\n\t\t\t\tnewState,\n\t\t\t\treplace,\n\t\t\t\t// @ts-ignore Additional parameter will have no effect even if devtools are disabled.\n\t\t\t\thasDevtools ? { type: name ?? setterName(), payload: newState } : undefined\n\t\t\t)\n\t\t},\n\t}\n}\n","import { StoreApi } from 'zustand/vanilla'\n\nimport { GetRecord, State } from '../types'\n\n/**\n * Generates automatic getters like store.get.foo()\n * @param api Zustand api interface\n */\nexport function generateGet<T extends State>(api: StoreApi<T>) {\n\tconst getters: GetRecord<T> = {} as GetRecord<T>\n\n\tconst initialState = api.getState()\n\n\tObject.keys(initialState).forEach((key) => {\n\t\tgetters[key as keyof T] = () => api.getState()[key as keyof T]\n\t})\n\n\tObject.getOwnPropertySymbols(initialState).forEach((symbol) => {\n\t\tgetters[symbol as keyof T] = () => api.getState()[symbol as keyof T]\n\t})\n\n\treturn getters\n}\n","import { NamedSet } from 'zustand/middleware/devtools'\nimport { StoreApi } from 'zustand/vanilla'\n\nimport { SetRecord, State } from '../types'\n\n/**\n * Generates automatic setters like store.set.foo(value)\n * @param api Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateSet<T extends State>(api: StoreApi<T>, hasDevtools: boolean): SetRecord<T> {\n\tconst setters: SetRecord<T> = {} as SetRecord<T>\n\n\tObject.keys(api.getState()).forEach((key) => {\n\t\tsetters[key as keyof T] = (value: any) => {\n\t\t\tif (api.getState()[key] === value) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tapi.setState(\n\t\t\t\t(state) => ({ ...state, [key]: value }),\n\t\t\t\tfalse,\n\t\t\t\t// @ts-ignore Additional parameter will have no effect even if devtools are disabled.\n\t\t\t\thasDevtools ? { type: key, payload: { [key]: value } } : undefined\n\t\t\t)\n\t\t}\n\t})\n\n\treturn setters\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { StoreApi } from 'zustand'\n\nimport { EqualityChecker, State, UseRecord } from '../types'\n\n/**\n * Generates automatic getters like store.use.foo()\n * @param api Zustand api interface\n */\nexport function generateUse<T extends State>(api: StoreApi<T>) {\n\tconst getters: UseRecord<T> = {} as UseRecord<T>\n\n\t// All of these wrappers are hooks and should obey the rule of hooks.\n\tObject.keys(api.getState()).forEach((key) => {\n\t\tgetters[key as keyof T] = (equalityFn: EqualityChecker<T[keyof T]> = shallow) => {\n\t\t\treturn useStoreWithEqualityFn(api, (state: T) => state[key as keyof T], equalityFn)\n\t\t}\n\t})\n\n\treturn getters\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { Default, GettersBuilder, State, StoreApi } from '../types'\n\nexport function extendGetters<\n\tBuilder extends GettersBuilder<T, Getters, Setters>,\n\tT extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n\tconst use = { ...thisApi.use }\n\tconst get = { ...thisApi.get }\n\n\tObject.keys(builder(thisApi)).forEach((key) => {\n\t\t// @ts-ignore\n\t\tuse[key] = (...args: any[]) =>\n\t\t\tuseStoreWithEqualityFn(\n\t\t\t\tthisApi.api,\n\t\t\t\t() => {\n\t\t\t\t\treturn builder(thisApi)[key](...args)\n\t\t\t\t},\n\t\t\t\tshallow\n\t\t\t)\n\n\t\t// @ts-ignore\n\t\tget[key] = (...args: any[]) => {\n\t\t\treturn builder(thisApi)[key](...args)\n\t\t}\n\t})\n\n\treturn { ...thisApi, get, use } as StoreApi<T, Getters & ReturnType<Builder>, Setters>\n}\n","import { Default, SettersBuilder, State, StoreApi } from '../types'\n\nexport function extendSetters<\n\tBuilder extends SettersBuilder<T, Getters, Setters>,\n\tT extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n\treturn { ...thisApi, set: { ...thisApi.set, ...builder(thisApi) } } as StoreApi<\n\t\tT,\n\t\tGetters,\n\t\tSetters & ReturnType<Builder>\n\t>\n}\n","import { Empty, GetRecord, SetRecord, State, StoreApi, StoreApiEncapsulated } from '../types'\n\nexport function restrictState<\n\tT extends State,\n\tKey extends keyof T,\n\tGetters extends GetRecord<any> = Empty,\n\tSetters extends SetRecord<any> = Empty,\n>(privateState: Key[], mergedState: T, thisApi: StoreApi<T, Getters, Setters>) {\n\treturn {\n\t\tapi: thisApi.api,\n\t\tset: thisApi.set,\n\t\tuse: thisApi.use,\n\t\tget: Object.keys(thisApi.get).reduce(\n\t\t\t(acc, key) =>\n\t\t\t\tmergedState[key] && (privateState as string[]).includes(key)\n\t\t\t\t\t? acc\n\t\t\t\t\t: { ...acc, [key]: thisApi.get[key] },\n\t\t\t{}\n\t\t) as GetRecord<Omit<T, Key>> & Getters,\n\t} as StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>\n}\n","import { StoreApiPlugin } from '../types'\n\ntype PluginResetSetters = { reset: () => void }\n\nexport const reset: StoreApiPlugin<{}, {}, PluginResetSetters> = {\n\textends: (store) => {\n\t\treturn store.extendSetters(({ api }) => ({\n\t\t\treset: () => {\n\t\t\t\tconst initialState = api.getInitialState?.() ?? {}\n\t\t\t\tapi.setState(() => initialState, true)\n\t\t\t},\n\t\t}))\n\t},\n}\n"],"mappings":"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","names":["devtools","persist","createVanillaStore","setterName","generateApi","api","hasDevtools","newState","replace","name","generateGet","api","getters","initialState","key","symbol","generateSet","api","hasDevtools","setters","key","value","state","shallow","useStoreWithEqualityFn","generateUse","api","getters","key","equalityFn","state","shallow","useStoreWithEqualityFn","extendGetters","builder","thisApi","use","get","key","args","extendSetters","builder","thisApi","restrictState","privateState","mergedState","thisApi","acc","key","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","devtools","persist","storeApi","createVanillaStore","store","generateApi","generateGet","generateSet","generateUse","builder","extendGetters","extendSetters","publicState","restrictState","reset","store","api","initialState"]}