zustand-lite 0.6.1 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -315,27 +315,25 @@ test('Testing Component', () => ({
315
315
 
316
316
  ### `createStore(initialState, options)`
317
317
 
318
- Creates a typed store with optional plugins and middleware.
318
+ Creates a typed store with your state and optional middleware.
319
319
 
320
320
  **Options:**
321
321
 
322
322
  | Key | Type | Description |
323
323
  | ------------- | -------------------------------------------------------------------------- | ------------------------------------ |
324
324
  | `name` | `string` | Name shown in Redux DevTools |
325
- | `plugins` | `StoreApiPlugin[]` | Array of plugins to extend the store |
326
325
  | `middlewares` | `{ devtools?: true or DevtoolsOptions, persist?: true or PersistOptions }` | Middleware configuration |
327
326
 
328
327
  ### Chainable Methods
329
328
 
330
329
  - **`.extendByState(fn | object)`**
331
330
  Add additional state that can be reused later.
332
- -
333
331
  - **`.extendGetters(fn)`**
334
332
  Add additional derived getters based on current state.
335
-
336
333
  - **`.extendSetters(fn)`**
337
334
  Add additional typed setters.
338
-
335
+ - **`.composePlugin(plugin)`**
336
+ Composes functionality of existing plugin ito your own store.
339
337
  - **`.restrictState(keys?: string[])`**
340
338
  Hide selected fields from the public API, returning a minimal store (removes config methods as well).
341
339
 
@@ -359,29 +357,32 @@ After creation, your store includes:
359
357
  You can define plugins that inject additional state or behavior:
360
358
 
361
359
  ```ts
362
- import { StoreApiPlugin } from 'zustand-lite'
363
-
364
- type Setters = { reset: () => void }
365
-
366
- export const reset: StoreApiPlugin<{}, {}, Setters> = {
367
- extends: (store) => {
368
- // If plugin defines data, that and only that data is available inside
369
- // setters and getters.
370
- return store.extendSetters(({ api, set }) => ({
371
- // Every piece od data, getter or setter will be available in the custom
372
- // extendGetter and extendSetter, allowing for even more interacctions.
373
- reset: () => {
374
- set(api.getInitialState?.() ?? {}, true)
375
- },
376
- }))
377
- },
378
- }
360
+ import { definePlugin } from 'zustand-lite'
361
+
362
+ export const withMyPlugin = definePlugin((store) =>
363
+ // If plugin defines data, that and only that data is available inside
364
+ // setters and getters.
365
+ store
366
+ .extendByState({ side: 1 })
367
+ .extendGetters(({ get }) => ({
368
+ // Every piece od data, getter or setter will be available in the custom
369
+ // extendGetter and extendSetter, allowing for even more interactions.
370
+ area() {
371
+ return get().side * get().side
372
+ },
373
+ }))
374
+ .extendSetters(({ set }) => ({
375
+ area(area: number) {
376
+ return set.side(Math.sqrt(area))
377
+ },
378
+ }))
379
+ )
379
380
  ```
380
381
 
381
382
  Apply newly created plugin like this:
382
383
 
383
384
  ```ts
384
- const store = createStore({}, { plugins: [reset] })
385
+ const store = createStore({}).composePlugin(withMyPlugin)
385
386
  ```
386
387
 
387
388
  **Any plugin state, getters and setters will be available for usage inside your own store.**
@@ -410,8 +411,6 @@ You can enable the most useful middlewares:
410
411
  structured data is important. For deeper properties it might be more convenient to auto
411
412
  generate getters and setters for deeply nested properties as well. **(partially done with hooks, entire
412
413
  state is selected for get from version 3.0.0, setters still generated for level one only)**
413
- - createPlugin function that will automatically infer types from the usage without the need of
414
- specifying types yourself, avoiding repetitiveness.
415
414
  - Ability to specify equality function for extended getters. It's possible now, but requires to
416
415
  import hook from 'zustand' package, which is suboptimal **(available from version 3.0.0 with
417
416
  use() function or deep auto-generated selectors. Still no possible for custom getters)**.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var J=Object.create;var g=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,T=Object.prototype.hasOwnProperty;var X=(e,t)=>{for(var r in t)g(e,r,{get:t[r],enumerable:!0})},h=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of H(t))!T.call(e,o)&&o!==r&&g(e,o,{get:()=>t[o],enumerable:!(n=V(t,o))||n.enumerable});return e};var Y=(e,t,r)=>(r=e!=null?J(Q(e)):{},h(t||!e||!e.__esModule?g(r,"default",{value:e,enumerable:!0}):r,e)),Z=e=>h(g({},"__esModule",{value:!0}),e);var te={};X(te,{createStore:()=>$,reset:()=>v,setGlobalConfig:()=>K});module.exports=Z(te);var G=require("zustand/middleware"),q=require("zustand/vanilla");var F=require("zustand/shallow"),O=require("zustand/traditional");function l(e){return()=>e.getState()}var j=require("zustand/shallow"),D=require("zustand/traditional");var B=e=>e,c=(e,t)=>t.reduce((r,n)=>(n in e&&(r[n]=e[n]),r),{});function f(e){return(t=B,r=j.shallow)=>(0,D.useStoreWithEqualityFn)(e,Array.isArray(t)?n=>c(n,t):t??B,r)}function E(e,t,r){let n=e({get:t.get}),o={};return Object.keys(n).forEach(s=>{o[s]=(...i)=>(0,O.useStoreWithEqualityFn)(r,()=>n[s](...i),F.shallow)}),t.use=Object.assign(f(r),t.use,o),t.get=Object.assign(l(r),t.get,n),t}var U=require("zustand/shallow");var R=Y(require("error-stack-parser"),1);function x(){let e=R.default.parse(new Error),t=e.findIndex(r=>r.functionName?.includes("_zustandLiteInferName_"));return t-1>=0?e[t-1].functionName:null}function y(e,t){return(r,n,o)=>{let s=e.getState(),i=typeof r=="function"?r(s):r;(0,U.shallow)(s,i)||e.setState(i,n,t?{type:x()??o??"setState",payload:i}:void 0)}}function w(e,t,r,n){let o=y(r,n),s=Object.entries(e(t)).reduce((i,[u,m])=>(i[u]=function(...d){return m(...d)},i),{});return t.set=Object.assign(o,t.set,s),t}var N=require("zustand/shallow"),W=require("zustand/traditional");function L(e,t,r,n){typeof e=="object"&&e!==null&&Object.keys(e).forEach(o=>{let s=[...r,o];Object.defineProperty(t,o,{value:(i=N.shallow)=>(0,W.useStoreWithEqualityFn)(n,u=>k(u,s),i),writable:!0,configurable:!0,enumerable:!0}),L(e[o],t[o],s,n)})}function k(e,t){let r=e;for(let n of t)if(r=r[n],!r)return r;return r}function b(e,t){let r=f(e);return L(c(e.getState(),t),r,[],e),r}var I=require("zustand/shallow");function A(e,t,r){let n=y(e,r);return t.forEach(o=>{n[o]=s=>{(0,I.shallow)(e.getState()[o],s)||e.setState(i=>({...i,[o]:s}),!1,r?{type:x()??o,payload:{[o]:s}}:void 0)}}),n}function C(e,t,r,n){let o=typeof e=="function"?e(t):e;return t.set(o),t.use={...t.use,...b(r,Object.keys(o))},t.set={...t.set,...A(r,Object.keys(o),n)},t}function M(e,t){return{getInitialState:e.getInitialState,getState:e.getState,persist:ee(e,t),setState:e.setState,subscribe:e.subscribe}}function ee(e,t){if("persist"in e){let r=e.persist;return r.read=()=>{try{return JSON.parse(localStorage?.getItem(t)??"")?.state}catch{return}},r}}function z(e){return l(e)}function _(e,t,r,n){return{api:r.api,set:r.set,use:e?(()=>{let o=Object.keys(r.use).reduce((s,i)=>t[i]&&e.includes(i)?s:{...s,[i]:r.use[i]},{});return Object.assign(f(n),o)})():r.use,get:e?Object.assign(()=>Object.entries(r.get()).reduce((s,[i,u])=>t[i]&&e.includes(i)?s:{...s,[i]:u},{}),r.get):r.get}}var p={appName:"zustand-lite",logging:!1};function K(e){p={...p,...e}}function $(e,t){let{name:r="zustand-lite",plugins:n=[],middlewares:o={}}=t??{},s=e;n.forEach(a=>{a.creates&&(s={...s,...a.creates()})});let i=()=>s,u=`${p.appName.replace(/\s/,"-")}.${r}}`,m=p.logging||!!o.devtools;m&&(i=(0,G.devtools)(i,{name:p.appName,store:r,...typeof o.devtools=="object"?o.devtools:{}})),o.persist&&(i=(0,G.persist)(i,{name:u,...typeof o.persist=="object"?o.persist:{}}));let S=(0,q.createStore)(i),d={api:M(S,u),get:z(S),use:b(S,Object.keys(s)),set:A(S,Object.keys(s),m),extendGetters(a){return E(a,this,S)},extendSetters(a){return w(a,this,S,m)},extendByState(a){return C(a,this,S,m)},restrictState(a=[]){return _(a,s,this,S)}},P=d;return n.forEach(a=>{a.extends&&(P=a.extends(d))}),P}var v={extends:e=>e.extendSetters(({api:t,set:r})=>({reset:()=>{r(t.getInitialState?.()??{},!0)}}))};0&&(module.exports={createStore,reset,setGlobalConfig});
1
+ "use strict";var $=Object.create;var p=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var T=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var v=(e,t)=>{for(var r in t)p(e,r,{get:t[r],enumerable:!0})},A=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of J(t))!V.call(e,o)&&o!==r&&p(e,o,{get:()=>t[o],enumerable:!(n=k(t,o))||n.enumerable});return e};var H=(e,t,r)=>(r=e!=null?$(T(e)):{},A(t||!e||!e.__esModule?p(r,"default",{value:e,enumerable:!0}):r,e)),Q=e=>A(p({},"__esModule",{value:!0}),e);var Z={};v(Z,{createStore:()=>_,definePlugin:()=>F,setGlobalConfig:()=>z,withReset:()=>q});module.exports=Q(Z);function F(e){return e}var y=require("zustand/middleware"),C=require("zustand/vanilla");var h=require("zustand/shallow");var L=require("zustand/shallow");var B=H(require("error-stack-parser"),1);function u(){let e=B.default.parse(new Error),t=e.findIndex(r=>r.functionName?.includes("_zustandLiteInferName_"));return t-1>=0?e[t-1].functionName:null}function d(e,t){return(r,n,o)=>{let i=e.getState(),s=typeof r=="function"?r(i):r;(0,L.shallow)(i,s)||e.setState(s,n,t?{type:u()??o??"setState",payload:s}:void 0)}}function c(e,t,r){let n=d(e,r);return t.forEach(o=>{n[o]=i=>{(0,h.shallow)(e.getState()[o],i)||e.setState(s=>({...s,[o]:i}),!1,r?{type:u()??o,payload:{[o]:i}}:void 0)}}),n}var b=e=>e,g=(e,t)=>t.reduce((r,n)=>(n in e&&(r[n]=e[n]),r),{});var O=require("zustand/shallow"),w=require("zustand/traditional");function G(e,t,r,n){typeof e=="object"&&e!==null&&Object.keys(e).forEach(o=>{let i=[...r,o];Object.defineProperty(t,o,{value:(s=O.shallow)=>(0,w.useStoreWithEqualityFn)(n,a=>X(a,i),s),writable:!0,configurable:!0,enumerable:!0}),G(e[o],t[o],i,n)})}function X(e,t){let r=e;for(let n of t)if(r=r[n],!r)return r;return r}var R=require("zustand/shallow"),j=require("zustand/traditional");function m(e){return(t=b,r=R.shallow)=>(0,j.useStoreWithEqualityFn)(e,Array.isArray(t)?n=>g(n,t):t??b,r)}function l(e,t){let r=m(e);return G(g(e.getState(),t),r,[],e),r}function N(e,t,r,n){let o=typeof e=="function"?e(t):e;return r.setState(o),t.use={...t.use,...l(r,Object.keys(o))},t.set={...t.set,...c(r,Object.keys(o),n)},t}var E=require("zustand/shallow"),P=require("zustand/traditional");function x(e){return()=>e.getState()}function U(e,t,r){let n=e({get:t.get}),o={};return Object.keys(n).forEach(i=>{o[i]=(...s)=>(0,P.useStoreWithEqualityFn)(r,()=>n[i](...s),E.shallow)}),t.use=Object.assign(m(r),t.use,o),t.get=Object.assign(x(r),t.get,n),t}function W(e,t,r,n){let o=d(r,n),i=Object.entries(e(t)).reduce((s,[a,S])=>(s[a]=function(...K){return S(...K)},s),{});return t.set=Object.assign(o,t.set,i),t}function D(e,t){return{getInitialState:e.getInitialState,getState:e.getState,persist:Y(e,t),setState:e.setState,subscribe:e.subscribe}}function Y(e,t){if("persist"in e){let r=e.persist;return r.read=()=>{try{return JSON.parse(localStorage?.getItem(t)??"")?.state}catch{return}},r}}function I(e){return x(e)}function M(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(m(n),o)})():r.use,get:e?Object.assign(()=>Object.entries(r.get()).reduce((i,[s,a])=>t[s]&&e.includes(s)?i:{...i,[s]:a},{}),r.get):r.get}}var f={appName:"zustand-lite",logging:!1};function z(e){f={...f,...e}}function _(e,t){let{name:r="zustand-lite",middlewares:n={}}=t??{},o=()=>e,i=`${f.appName.replace(/\s/,"-")}.${r}}`,s=f.logging||!!n.devtools;s&&(o=(0,y.devtools)(o,{name:f.appName,store:r,...typeof n.devtools=="object"?n.devtools:{}})),n.persist&&(o=(0,y.persist)(o,{name:i,...typeof n.persist=="object"?n.persist:{}}));let a=(0,C.createStore)(o);return{api:D(a,i),get:I(a),use:l(a,Object.keys(e)),set:c(a,Object.keys(e),s),composePlugin(S){return S(this)},extendGetters(S){return U(S,this,a)},extendSetters(S){return W(S,this,a,s)},extendByState(S){return N(S,this,a,s)},restrictState(S=[]){return M(S,e,this,a)}}}var q=e=>e.extendSetters(({api:t,set:r})=>({reset:()=>{r(t.getInitialState?.()??{},!0)}}));0&&(module.exports={createStore,definePlugin,setGlobalConfig,withReset});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/createStore.ts","../src/lib/extendGetters.ts","../src/lib/generateGetFn.ts","../src/lib/generateUseFn.ts","../src/utils/utils.ts","../src/lib/generateSetFn.ts","../src/lib/generateSetterName.ts","../src/lib/extendSetters.ts","../src/lib/generateUseStep.ts","../src/lib/generateUse.ts","../src/lib/generateSet.ts","../src/lib/extendByState.ts","../src/lib/generateApi.ts","../src/lib/generateGet.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["export type { StoreApiPlugin } from './types'\nexport { createStore, setGlobalConfig } from './lib/createStore'\nexport { reset } from './plugins/reset'\n","/**\n * Entire no-boilerplate functionality inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors.\n * It has few utilities described here: https://www.npmjs.com/package/zustand-lite\n * for:\n * 1) Generating getters for flat state (1-level deep selectors).\n * 2) Generating setters for flat state (1-level deep setters).\n * 3) Automatic devtools messaging.\n * 4) Annotating functions with proper TS types to avoid some bloating and TS frenzy.\n * 5) Extending getters and setters\n * 6) Extending state and restricting state\n * 7) Reuse plugins\n *\n * Idea is to support small store without complicated data reducing (it can be done as well,\n * but may indicate something is not right with the use case itself).\n **/\nimport { devtools, persist } from 'zustand/middleware'\nimport { createStore as createVanillaStore } from 'zustand/vanilla'\n\nimport {\n\tAugmentedApiData,\n\tAugmentedGetters,\n\tAugmentedSetters,\n\tByStateBuilder,\n\tDefault,\n\tGettersBuilder,\n\tGlobalConfig,\n\tMWConfiguration,\n\tSettersBuilder,\n\tState,\n\tStoreApi,\n\tStoreApiPluginList,\n\tStorePersist,\n} from '../types'\n\nimport { extendGetters } from './extendGetters'\nimport { extendSetters } from './extendSetters'\nimport { extendByState } from './extendByState'\nimport { generateApi } from './generateApi'\nimport { generateGet } from './generateGet'\nimport { generateSet } from './generateSet'\nimport { generateUse } from './generateUse'\nimport { restrictState } from './restrictState'\n\nlet config: GlobalConfig = { appName: 'zustand-lite', logging: false }\n\nexport function setGlobalConfig(newConfig: Partial<GlobalConfig>) {\n\tconfig = { ...config, ...newConfig }\n}\n\nexport function createStore<\n\tS extends State,\n\tPlugins extends StoreApiPluginList = [],\n\tExtraMW extends MWConfiguration = {},\n>(\n\tinitialState: S,\n\toptions?: { name?: string; plugins?: [...Plugins]; middlewares?: ExtraMW }\n): StoreApi<\n\tPlugins extends [] ? S : AugmentedApiData<S, Plugins>,\n\tPlugins extends [] ? Default : AugmentedGetters<Plugins>,\n\tPlugins extends [] ? Default : AugmentedSetters<Plugins>,\n\tExtraMW extends { persist: any } ? StorePersist<S> : {}\n> {\n\tconst { name = 'zustand-lite', plugins = [], middlewares = {} as ExtraMW } = 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\tconst persistId = `${config.appName.replace(/\\s/, '-')}.${name}}`\n\tconst shouldLog = config.logging || !!middlewares.devtools\n\n\tif (shouldLog) {\n\t\tinitializer = devtools(initializer, {\n\t\t\tname: config.appName,\n\t\t\tstore: name,\n\t\t\t...(typeof middlewares.devtools === 'object' ? middlewares.devtools : {}),\n\t\t})\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(initializer, {\n\t\t\tname: persistId,\n\t\t\t...(typeof middlewares.persist === 'object' ? 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, persistId),\n\t\tget: generateGet(storeLib),\n\t\tuse: generateUse(storeLib, Object.keys(mergedState)),\n\t\tset: generateSet(storeLib, Object.keys(mergedState), shouldLog),\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, shouldLog)\n\t\t},\n\t\textendByState<Builder extends ByStateBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendByState(builder, this, storeLib, shouldLog)\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 { 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>,\n\tS extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, api: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\tconst methods: any = builder({ get: api.get })\n\tconst getters: any = {}\n\n\tObject.keys(methods).forEach((key) => {\n\t\tgetters[key] = (...args: any[]) =>\n\t\t\tuseStoreWithEqualityFn(lib, () => methods[key](...args), shallow)\n\t})\n\n\tapi.use = Object.assign(generateUseFn(lib), api.use, getters)\n\tapi.get = Object.assign(generateGetFn(lib), api.get, methods)\n\treturn api\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\n\n/**\n * Generates getState function for store.get()\n * @param lib Zustand api interface\n */\nexport function generateGetFn<S extends State>(lib: StoreLib<S>) {\n\treturn () => lib.getState()\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { StoreApi as StoreLib } from 'zustand'\n\nimport { State } from '../types'\nimport { identity, pick } from '../utils/utils'\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 = identity, equality = shallow) => {\n\t\treturn useStoreWithEqualityFn(\n\t\t\tlib,\n\t\t\tArray.isArray(selector) ? (s) => pick(s, selector) : (selector ?? identity),\n\t\t\tequality\n\t\t)\n\t}\n}\n","export const identity = (arg: any) => arg\nexport const pick = (obj: Record<string, any>, keys: string[]) =>\n\tkeys.reduce<Record<string, any>>((acc, k) => (k in obj ? ((acc[k] = obj[k]), acc) : acc), {})\n","import { shallow } from 'zustand/shallow'\nimport { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\nimport { generateSetterName } from './generateSetterName'\n\n/**\n * Generates automatic setState function for store like store.set({ value })\n * @param lib Zustand api interface\n * @param log If devtools were activated for this store\n */\nexport function generateSetFn<S extends State>(lib: StoreLib<S>, log: boolean) {\n\treturn (updater: S | ((state: S) => S), replace?: boolean, name?: string) => {\n\t\tconst current = lib.getState()\n\t\tconst payload = typeof updater === 'function' ? updater(current) : updater\n\n\t\tif (shallow(current, payload)) {\n\t\t\treturn\n\t\t}\n\n\t\tlib.setState(\n\t\t\tpayload,\n\t\t\treplace,\n\t\t\t// @ts-ignore Additional parameter will have no effect even if logging is disabled.\n\t\t\tlog ? { type: generateSetterName() ?? name ?? 'setState', payload } : undefined\n\t\t)\n\t}\n}\n","import ErrorStackParser from 'error-stack-parser'\n\n/**\n * Hacky, but working (and possibly only one there is) method of fetching proper caller\n * name of the extended function.\n */\nexport function generateSetterName() {\n\t// Proper setter name should hide at 2nd position in the normalized stack.\n\tconst stack = ErrorStackParser.parse(new Error())\n\tconst index = stack.findIndex((entry) => entry.functionName?.includes('_zustandLiteInferName_'))\n\treturn index - 1 >= 0 ? stack[index - 1].functionName : null\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, api: StoreApi<S, Getters, Setters>, lib: StoreLib<S>, log: boolean) {\n\tconst setters = generateSetFn(lib, log)\n\tconst baseSet = Object.entries(builder(api)).reduce(\n\t\t(acc, [name, func]) => {\n\t\t\tacc[name] = function _zustandLiteInferName_(...args: any[]) {\n\t\t\t\treturn func(...args)\n\t\t\t}\n\n\t\t\treturn acc\n\t\t},\n\t\t{} as Record<string, any>\n\t)\n\n\tapi.set = Object.assign(setters, api.set, baseSet)\n\treturn api\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\n/**\n * Generates automatic getters like store.use.foo() (recursive steps for each level).\n * Getters are created as side effects.\n * @param state State at nth level\n * @param getters Getters at nth level\n * @param path Property access path at nth level like ['foo', 'bar']\n * @param lib Zustand api interface\n */\nexport function generateUseStep(state: any, getters: any, path: string[], lib: any) {\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 { StoreApi as StoreLib } from 'zustand'\n\nimport { State } from '../types'\nimport { generateUseStep } from './generateUseStep'\nimport { generateUseFn } from './generateUseFn'\nimport { pick } from '../utils/utils'\n\n/**\n * Generates automatic store hook subscribe function store.use()\n * @param lib Zustand api interface\n * @param key State keys to use\n */\nexport function generateUse<S extends State>(lib: StoreLib<S>, key: string[]) {\n\tconst getters = generateUseFn(lib)\n\tgenerateUseStep(pick(lib.getState(), key), getters, [], lib)\n\treturn getters\n}\n","import { shallow } from 'zustand/shallow'\nimport { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { SetRecord, State } from '../types'\nimport { generateSetFn } from './generateSetFn'\nimport { generateSetterName } from './generateSetterName'\n\n/**\n * Generates automatic setters like store.set.foo(value)\n * @param lib Zustand api interface\n * @param key Keys to generate setters for\n * @param log If devtools were activated for this store\n */\nexport function generateSet<S extends State>(lib: StoreLib<S>, key: string[], log: boolean) {\n\tconst setters: any = generateSetFn(lib, log)\n\n\tkey.forEach((key) => {\n\t\tsetters[key] = (value: any) => {\n\t\t\tif (shallow(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 logging is disabled.\n\t\t\t\tlog ? { type: generateSetterName() ?? key, payload: { [key]: value } } : undefined\n\t\t\t)\n\t\t}\n\t})\n\n\treturn setters as SetRecord<S>\n}\n","import { ByStateBuilder, Default, State, StoreApi } from '../types'\nimport { generateUse } from './generateUse'\nimport { generateSet } from './generateSet'\nimport { StoreApi as StoreLib } from 'zustand/vanilla'\n\nexport function extendByState<\n\tBuilder extends ByStateBuilder<S, Getters, Setters>,\n\tS extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(\n\tbuilder: Builder | Partial<S>,\n\tapi: StoreApi<S, Getters, Setters>,\n\tlib: StoreLib<S>,\n\tlog: boolean\n) {\n\tconst newState: Partial<S> = typeof builder === 'function' ? builder(api) : builder\n\n\t// Merge the new keys into the zustand state.\n\tapi.set(newState)\n\n\t// @ts-ignore\n\tapi.use = { ...api.use, ...generateUse(lib, Object.keys(newState)) }\n\tapi.set = { ...api.set, ...generateSet(lib, Object.keys(newState), log) }\n\n\t// Return the same object, but with widened state type (handled by overloads).\n\treturn api\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 (we should allow only one way of doing certain things).\n * @param lib Zustand api interface\n * @param key Zustand persist local storage key\n */\nexport function generateApi<S extends State>(lib: StoreLib<S>, key: string) {\n\treturn {\n\t\tgetInitialState: lib.getInitialState,\n\t\tgetState: lib.getState,\n\t\tpersist: augmentPersist(lib, key),\n\t\tsetState: lib.setState,\n\t\tsubscribe: lib.subscribe,\n\t}\n}\n\nfunction augmentPersist<S extends State>(lib: StoreLib<S>, key: string) {\n\tif ('persist' in lib) {\n\t\tconst augmented: any = lib.persist\n\t\taugmented.read = () => {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(localStorage?.getItem(key) ?? '')?.state\n\t\t\t} catch {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t}\n\n\t\treturn augmented\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\nimport { generateGetFn } from './generateGetFn'\n\n/**\n * Generates getters for store.get. In the past getters were generated as functions, but I\n * came to the conclusion that it's better and simpler to return the whole state.\n * @param lib Zustand api interface\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 { GetRecord, SetRecord, State, StoreApi, UseRecord } from '../types'\nimport { generateUseFn } from './generateUseFn'\n\n/**\n * Function that restrict access to the store and store api.\n * @param privateState Property names to be made private like ['foo', 'bar']\n * @param mergedState Final state of the store\n * @param api Returned store API\n * @param lib Zustand api interface\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, api: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\treturn {\n\t\tapi: api.api,\n\t\tset: api.set,\n\t\tuse: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getters = Object.keys(api.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]: (api.use as UseRecord<any>)[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: api.use,\n\t\tget: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getFn = () =>\n\t\t\t\t\t\tObject.entries(api.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, api.get)\n\t\t\t\t})()\n\t\t\t: api.get,\n\t}\n}\n","import { StoreApiPlugin } from '../types'\n\ntype PluginResetSetters = { reset: () => void }\n\n/**\n * Basic plugin example, that extends store with custom setter.\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","setGlobalConfig","__toCommonJS","import_middleware","import_vanilla","import_shallow","import_traditional","generateGetFn","lib","import_shallow","import_traditional","identity","arg","pick","obj","keys","acc","k","generateUseFn","lib","selector","identity","equality","s","pick","extendGetters","builder","api","lib","methods","getters","key","args","generateUseFn","generateGetFn","import_shallow","import_error_stack_parser","generateSetterName","stack","ErrorStackParser","index","entry","generateSetFn","lib","log","updater","replace","name","current","payload","generateSetterName","extendSetters","builder","api","lib","log","setters","generateSetFn","baseSet","acc","name","func","args","import_shallow","import_traditional","generateUseStep","state","getters","path","lib","key","newPath","equalityFn","getFromPath","data","generateUse","lib","key","getters","generateUseFn","generateUseStep","pick","import_shallow","generateSet","lib","key","log","setters","generateSetFn","value","state","generateSetterName","extendByState","builder","api","lib","log","newState","generateUse","generateSet","generateApi","lib","key","augmentPersist","augmented","generateGet","lib","generateGetFn","restrictState","privateState","mergedState","api","lib","getters","acc","key","generateUseFn","val","config","setGlobalConfig","newConfig","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","persistId","shouldLog","storeLib","createVanillaStore","storeApi","generateApi","generateGet","generateUse","generateSet","builder","extendGetters","extendSetters","extendByState","publicState","restrictState","result","reset","store","api","set"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/definePlugin.ts","../src/lib/createStore.ts","../src/lib/generateSetFn.ts","../src/lib/generateSetFnBase.ts","../src/lib/generateSetterName.ts","../src/utils/utils.ts","../src/lib/generateUseFnStep.ts","../src/lib/generateUseFnBase.ts","../src/lib/generateUseFn.ts","../src/lib/extendByState.ts","../src/lib/extendGetters.ts","../src/lib/generateGetFnBase.ts","../src/lib/extendSetters.ts","../src/lib/generateApiFn.ts","../src/lib/generateGetFn.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["export { definePlugin } from './lib/definePlugin'\nexport { createStore, setGlobalConfig } from './lib/createStore'\nexport { withReset } from './plugins/reset'\n","import { State, StoreApi } from '../types'\n\n/**\n * Identity helper that provides a typed `store` param and preserves the plugin's return type.\n */\nexport function definePlugin<F extends (store: StoreApi) => StoreApi>(fn: F) {\n\treturn fn as unknown as <S extends State, G, A, MW>(\n\t\tstore: StoreApi<S, G, A, MW>\n\t) => ReturnType<F>\n}\n","/**\n * Entire no-boilerplate functionality inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors.\n * It has few utilities described here: https://www.npmjs.com/package/zustand-lite\n * for:\n * 1) Generating getters for flat state (1-level deep selectors).\n * 2) Generating setters for flat state (1-level deep setters).\n * 3) Automatic devtools messaging.\n * 4) Annotating functions with proper TS types to avoid some bloating and TS frenzy.\n * 5) Extending getters and setters\n * 6) Extending state and restricting state\n * 7) Reuse plugins\n *\n * Idea is to support small store without complicated data reducing (it can be done as well,\n * but may indicate something is not right with the use case itself).\n **/\nimport { devtools, persist } from 'zustand/middleware'\nimport { createStore as createVanillaStore } from 'zustand/vanilla'\n\nimport {\n\tGetRecord,\n\tGlobalConfig,\n\tMWConfiguration,\n\tSetRecord,\n\tState,\n\tStoreApi,\n\tStorePersist,\n} from '../types'\n\nimport { extendByState } from './extendByState'\nimport { extendGetters } from './extendGetters'\nimport { extendSetters } from './extendSetters'\nimport { generateApiFn } from './generateApiFn'\nimport { generateGetFn } from './generateGetFn'\nimport { generateSetFn } from './generateSetFn'\nimport { generateUseFn } from './generateUseFn'\nimport { restrictState } from './restrictState'\n\nlet config: GlobalConfig = { appName: 'zustand-lite', logging: false }\n\nexport function setGlobalConfig(newConfig: Partial<GlobalConfig>) {\n\tconfig = { ...config, ...newConfig }\n}\n\nexport function createStore<S extends State, ExtraMW extends MWConfiguration = {}>(\n\tinitialState: S,\n\toptions?: { name?: string; middlewares?: ExtraMW }\n): StoreApi<\n\tS,\n\tGetRecord<S>,\n\tSetRecord<S>,\n\tExtraMW extends { persist: any } ? StorePersist<S> : {}\n> {\n\tconst { name = 'zustand-lite', middlewares = {} as ExtraMW } = options ?? {}\n\n\t// Apply supported middlewares.\n\tlet initializer: any = () => initialState\n\n\tconst persistId = `${config.appName.replace(/\\s/, '-')}.${name}}`\n\tconst shouldLog = config.logging || !!middlewares.devtools\n\n\tif (shouldLog) {\n\t\tinitializer = devtools(initializer, {\n\t\t\tname: config.appName,\n\t\t\tstore: name,\n\t\t\t...(typeof middlewares.devtools === 'object' ? middlewares.devtools : {}),\n\t\t})\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(initializer, {\n\t\t\tname: persistId,\n\t\t\t...(typeof middlewares.persist === 'object' ? 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\treturn {\n\t\tapi: generateApiFn(storeLib, persistId),\n\t\tget: generateGetFn(storeLib),\n\t\tuse: generateUseFn(storeLib, Object.keys(initialState)),\n\t\tset: generateSetFn(storeLib, Object.keys(initialState), shouldLog),\n\t\tcomposePlugin(plugin) {\n\t\t\treturn plugin(this)\n\t\t},\n\t\textendGetters(builder) {\n\t\t\treturn extendGetters(builder, this, storeLib)\n\t\t},\n\t\textendSetters(builder) {\n\t\t\treturn extendSetters(builder, this, storeLib, shouldLog)\n\t\t},\n\t\textendByState(builder) {\n\t\t\treturn extendByState(builder, this, storeLib, shouldLog)\n\t\t},\n\t\trestrictState(publicState = []) {\n\t\t\treturn restrictState(publicState, initialState, this, storeLib)\n\t\t},\n\t} as any\n}\n","import { shallow } from 'zustand/shallow'\nimport { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { SetRecord, State } from '../types'\nimport { generateSetFnBase } from './generateSetFnBase'\nimport { generateSetterName } from './generateSetterName'\n\n/**\n * Generates automatic setters like store.set.foo(value)\n *\n * @param lib Zustand api interface\n * @param key Keys to generate setters for\n * @param log If devtools were activated for this store\n */\nexport function generateSetFn<S extends State>(lib: StoreLib<S>, key: string[], log: boolean) {\n\tconst setters: any = generateSetFnBase(lib, log)\n\n\tkey.forEach((key) => {\n\t\tsetters[key] = (value: any) => {\n\t\t\tif (shallow(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 logging is disabled.\n\t\t\t\tlog ? { type: generateSetterName() ?? 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 { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\nimport { generateSetterName } from './generateSetterName'\n\n/**\n * Generates automatic setState function for store like store.set({ value })\n *\n * @param lib Zustand api interface\n * @param log If devtools were activated for this store\n */\nexport function generateSetFnBase<S extends State>(lib: StoreLib<S>, log: boolean) {\n\treturn (updater: S | ((state: S) => S), replace?: boolean, name?: string) => {\n\t\tconst current = lib.getState()\n\t\tconst payload = typeof updater === 'function' ? updater(current) : updater\n\n\t\tif (shallow(current, payload)) {\n\t\t\treturn\n\t\t}\n\n\t\tlib.setState(\n\t\t\tpayload,\n\t\t\treplace,\n\t\t\t// @ts-ignore Additional parameter will have no effect even if logging is disabled.\n\t\t\tlog ? { type: generateSetterName() ?? name ?? 'setState', payload } : undefined\n\t\t)\n\t}\n}\n","import ErrorStackParser from 'error-stack-parser'\n\n/**\n * Hacky, but working (and possibly only one there is) method of fetching proper caller\n * name of the extended function.\n */\nexport function generateSetterName() {\n\t// Proper setter name should hide at 2nd position in the normalized stack.\n\tconst stack = ErrorStackParser.parse(new Error())\n\tconst index = stack.findIndex((entry) => entry.functionName?.includes('_zustandLiteInferName_'))\n\treturn index - 1 >= 0 ? stack[index - 1].functionName : null\n}\n","export const identity = (arg: any) => arg\nexport const pick = (obj: Record<string, any>, keys: string[]) =>\n\tkeys.reduce<Record<string, any>>((acc, k) => (k in obj ? ((acc[k] = obj[k]), acc) : acc), {})\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\n/**\n * Generates automatic getters like store.use.foo() (recursive steps for each level).\n * Getters are created as side effects.\n *\n * @param state State at nth level\n * @param getters Getters at nth level\n * @param path Property access path at nth level like ['foo', 'bar']\n * @param lib Zustand api interface\n */\nexport function generateUseFnStep(state: any, getters: any, path: string[], lib: any) {\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\tgenerateUseFnStep(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 } from '../types'\nimport { identity, pick } from '../utils/utils'\n\n/**\n * Generates automatic getters like store.use.foo()\n *\n * @param lib Zustand api interface\n */\nexport function generateUseFnBase<S extends State, U>(lib: StoreLib<S>) {\n\treturn (selector = identity, equality = shallow) => {\n\t\treturn useStoreWithEqualityFn(\n\t\t\tlib,\n\t\t\tArray.isArray(selector) ? (s) => pick(s, selector) : (selector ?? identity),\n\t\t\tequality\n\t\t)\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand'\n\nimport { State } from '../types'\nimport { pick } from '../utils/utils'\nimport { generateUseFnStep } from './generateUseFnStep'\nimport { generateUseFnBase } from './generateUseFnBase'\n\n/**\n * Generates automatic store hook subscribe function store.use()\n *\n * @param lib Zustand api interface\n * @param key State keys to use\n */\nexport function generateUseFn<S extends State>(lib: StoreLib<S>, key: string[]) {\n\tconst getters = generateUseFnBase(lib)\n\tgenerateUseFnStep(pick(lib.getState(), key), getters, [], lib)\n\treturn getters\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\nimport { ByStateBuilder, State, StoreApi } from '../types'\nimport { generateSetFn } from './generateSetFn'\nimport { generateUseFn } from './generateUseFn'\n\n/**\n * Extends the store by adding new state fields, either by:\n * - passing an object patch: `{ b: 'x' }`\n * - or using a builder: `({ get }) => ({ c: get().b + 'y' })`\n *\n * @param builder Object patch or function producing new state fields.\n * @param api The extended store API before widening.\n * @param lib The underlying Zustand vanilla store.\n * @param log Enables logging for generated setters.\n *\n * @returns The same API instance, but with widened state (via overloads).\n */\nexport function extendByState<\n\tNewData extends State,\n\tOldData extends State,\n\tGetters,\n\tSetters,\n\tBuilder extends ByStateBuilder<NewData, OldData, Getters>,\n>(\n\tbuilder: Builder | NewData,\n\tapi: StoreApi<OldData, Getters, Setters>,\n\tlib: StoreLib<OldData>,\n\tlog: boolean\n) {\n\t// Calculate new state to be added to the store.\n\tconst newState: NewData = typeof builder === 'function' ? builder(api) : builder\n\n\t// Merge the new keys into the zustand state.\n\tlib.setState(newState as unknown as OldData)\n\n\t// Generate basic getters and setters from the newly added record.\n\tapi.use = { ...api.use, ...generateUseFn(lib, Object.keys(newState)) }\n\tapi.set = { ...api.set, ...generateSetFn(lib, Object.keys(newState), log) }\n\n\t// Return the same object, but with widened state type (handled by overloads).\n\treturn api\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\nimport { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { GettersBuilder, State, StoreApi } from '../types'\nimport { generateGetFnBase } from './generateGetFnBase'\nimport { generateUseFnBase } from './generateUseFnBase'\n\n/**\n * Adds derived getters to the store.\n *\n * @param builder Function returning new getter methods.\n * @param api Current store API to extend.\n * @param lib Underlying Zustand store.\n */\nexport function extendGetters<\n\tBuilder extends GettersBuilder<S, Getters>,\n\tS extends State,\n\tGetters,\n\tSetters,\n>(builder: Builder, api: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\tconst methods: any = builder({ get: api.get })\n\tconst getters: any = {}\n\n\tObject.keys(methods).forEach((key) => {\n\t\tgetters[key] = (...args: any[]) =>\n\t\t\tuseStoreWithEqualityFn(lib, () => methods[key](...args), shallow)\n\t})\n\n\tapi.use = Object.assign(generateUseFnBase(lib), api.use, getters)\n\tapi.get = Object.assign(generateGetFnBase(lib), api.get, methods)\n\treturn api\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\n\n/**\n * Generates getState function for store.get()\n *\n * @param lib Zustand api interface\n */\nexport function generateGetFnBase<S extends State>(lib: StoreLib<S>) {\n\treturn () => lib.getState()\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\nimport { SettersBuilder, State, StoreApi } from '../types'\nimport { generateSetFnBase } from './generateSetFnBase'\n\n/**\n * Adds custom setter methods to the store.\n *\n * @param builder Function returning new setter methods.\n * @param api Store API to extend.\n * @param lib Underlying Zustand store.\n * @param log Enables optional debug logging.\n */\nexport function extendSetters<\n\tBuilder extends SettersBuilder<S, Getters, Setters>,\n\tS extends State,\n\tGetters,\n\tSetters,\n>(builder: Builder, api: StoreApi<S, Getters, Setters>, lib: StoreLib<S>, log: boolean) {\n\tconst setters = generateSetFnBase(lib, log)\n\tconst baseSet = Object.entries(builder(api)).reduce(\n\t\t(acc, [name, func]) => {\n\t\t\tacc[name] = function _zustandLiteInferName_(...args: any[]) {\n\t\t\t\treturn func(...args)\n\t\t\t}\n\n\t\t\treturn acc\n\t\t},\n\t\t{} as Record<string, any>\n\t)\n\n\tapi.set = Object.assign(setters, api.set, baseSet)\n\treturn api\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 (we should allow only one way of doing certain things).\n *\n * @param lib Zustand api interface\n * @param key Zustand persist local storage key\n */\nexport function generateApiFn<S extends State>(lib: StoreLib<S>, key: string) {\n\treturn {\n\t\tgetInitialState: lib.getInitialState,\n\t\tgetState: lib.getState,\n\t\tpersist: augmentPersist(lib, key),\n\t\tsetState: lib.setState,\n\t\tsubscribe: lib.subscribe,\n\t}\n}\n\nfunction augmentPersist<S extends State>(lib: StoreLib<S>, key: string) {\n\tif ('persist' in lib) {\n\t\tconst augmented: any = lib.persist\n\t\taugmented.read = () => {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(localStorage?.getItem(key) ?? '')?.state\n\t\t\t} catch {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t}\n\n\t\treturn augmented\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\nimport { generateGetFnBase } from './generateGetFnBase'\n\n/**\n * Generates getters for store.get. In the past getters were generated as functions, but I\n * came to the conclusion that it's better and simpler to return the whole state.\n *\n * @param lib Zustand api interface\n */\nexport function generateGetFn<S extends State>(lib: StoreLib<S>) {\n\treturn generateGetFnBase(lib)\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { GetRecord, SetRecord, State, StoreApi, UseRecord } from '../types'\nimport { generateUseFnBase } from './generateUseFnBase'\n\n/**\n * Function that restrict access to the store and store api.\n *\n * @param privateState Property names to be made private like ['foo', 'bar']\n * @param mergedState Final state of the store\n * @param api Returned store API\n * @param lib Zustand api interface\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, api: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\treturn {\n\t\tapi: api.api,\n\t\tset: api.set,\n\t\tuse: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getters = Object.keys(api.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]: (api.use as UseRecord<any>)[key] },\n\t\t\t\t\t\t{}\n\t\t\t\t\t)\n\n\t\t\t\t\treturn Object.assign(generateUseFnBase(lib), getters)\n\t\t\t\t})()\n\t\t\t: api.use,\n\t\tget: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getFn = () =>\n\t\t\t\t\t\tObject.entries(api.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, api.get)\n\t\t\t\t})()\n\t\t\t: api.get,\n\t}\n}\n","import { definePlugin } from '../lib/definePlugin'\n\n/**\n * Basic plugin example, that extends store with custom setter.\n */\nexport const withReset = definePlugin((store) =>\n\tstore.extendSetters(({ api, set }) => ({\n\t\treset: () => {\n\t\t\tset(api.getInitialState?.() ?? {}, true)\n\t\t},\n\t}))\n)\n"],"mappings":"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","names":["index_exports","__export","createStore","definePlugin","setGlobalConfig","withReset","__toCommonJS","definePlugin","fn","import_middleware","import_vanilla","import_shallow","import_shallow","import_error_stack_parser","generateSetterName","stack","ErrorStackParser","index","entry","generateSetFnBase","lib","log","updater","replace","name","current","payload","generateSetterName","generateSetFn","lib","key","log","setters","generateSetFnBase","value","state","generateSetterName","identity","arg","pick","obj","keys","acc","k","import_shallow","import_traditional","generateUseFnStep","state","getters","path","lib","key","newPath","equalityFn","getFromPath","data","import_shallow","import_traditional","generateUseFnBase","lib","selector","identity","equality","s","pick","generateUseFn","lib","key","getters","generateUseFnBase","generateUseFnStep","pick","extendByState","builder","api","lib","log","newState","generateUseFn","generateSetFn","import_shallow","import_traditional","generateGetFnBase","lib","extendGetters","builder","api","lib","methods","getters","key","args","generateUseFnBase","generateGetFnBase","extendSetters","builder","api","lib","log","setters","generateSetFnBase","baseSet","acc","name","func","args","generateApiFn","lib","key","augmentPersist","augmented","generateGetFn","lib","generateGetFnBase","restrictState","privateState","mergedState","api","lib","getters","acc","key","generateUseFnBase","val","config","setGlobalConfig","newConfig","createStore","initialState","options","name","middlewares","initializer","persistId","shouldLog","storeLib","createVanillaStore","generateApiFn","generateGetFn","generateUseFn","generateSetFn","plugin","builder","extendGetters","extendSetters","extendByState","publicState","restrictState","withReset","store","api","set"]}
package/dist/index.d.cts CHANGED
@@ -1,77 +1,68 @@
1
1
  import { StoreApi as StoreApi$1 } from 'zustand';
2
2
  import { DevtoolsOptions, PersistOptions } from 'zustand/middleware';
3
3
 
4
- type State = Record<string | symbol, unknown>;
5
- type Empty = Record<string, never>;
6
- type Default = Record<string | symbol, any>;
4
+ type State = Record<PropertyKey, unknown>;
7
5
  type EqualityChecker<S> = (state: S, newState: S) => boolean;
8
- type Override<T, U> = Omit<T, keyof U> & U;
9
- type OverrideGet<T, U, S extends Record<string, any>> = Override<T, U> & GetRecordBase<S>;
10
- type OverrideSet<T, U, S extends Record<string, any>> = Override<T, U> & SetRecordBase<S>;
11
- type OverrideUse<T, U, S extends Record<string, any>> = Override<T, U> & UseRecordBase<S>;
12
- type StoreApiEncapsulated<S extends State = Empty, Getters = Default, Setters = Default, ExtraMW = {}> = {
6
+ type Prettify<T> = {
7
+ [K in keyof T]: T[K];
8
+ } & {};
9
+ type Override<T, U> = Prettify<Omit<T, keyof U> & U>;
10
+ type Augments<T, U, Base> = Base & Override<T, U>;
11
+ type StoreLib<S> = Omit<StoreApi$1<S>, 'setState' | 'getState'>;
12
+ type GetBase<S extends State> = () => Readonly<S>;
13
+ type SetBase<S extends State> = StoreApi$1<S>['setState'];
14
+ type UseBase<S extends State> = UseRecordBase<S>;
15
+ type OverrideGet<T, U, S extends State> = Augments<T, U, GetBase<S>>;
16
+ type OverrideSet<T, U, S extends State> = Augments<T, U, SetBase<S>>;
17
+ type OverrideUse<T, U, S extends State> = Augments<T, U, UseBase<S>>;
18
+ type GetRecord<S extends Record<string, unknown>> = GetBase<S>;
19
+ type SetRecord<S extends Record<string, unknown>> = SetBase<S> & {
20
+ [K in keyof S]-?: (value: S[K]) => void;
21
+ };
22
+ type StoreApiEncapsulated<S extends State = {}, Getters = {}, Setters = {}, ExtraMW = {}> = {
13
23
  api: StoreApi$1<S> & ExtraMW;
14
24
  get: OverrideGet<GetRecord<S>, Getters, S>;
15
25
  set: OverrideSet<SetRecord<S>, Setters, S>;
16
26
  use: OverrideUse<UseRecord<S>, Getters, S>;
17
27
  };
18
- type StoreApi<S extends State = Empty, Getters = Default, Setters = Default, ExtraMW = {}> = {
19
- api: Omit<StoreApi$1<S>, 'setState' | 'getState'> & ExtraMW;
28
+ type StoreApi<S extends State = {}, Getters = {}, Setters = {}, ExtraMW = {}> = {
29
+ api: StoreLib<S> & ExtraMW;
20
30
  get: OverrideGet<GetRecord<S>, Getters, S>;
21
31
  set: OverrideSet<SetRecord<S>, Setters, S>;
22
32
  use: OverrideUse<UseRecord<S>, Getters, S>;
23
- extendGetters<Builder extends GettersBuilder<S, Getters>>(builder: Builder): StoreApi<S, OverrideGet<Getters, ReturnType<Builder>, S>, Setters, ExtraMW>;
24
- extendSetters<Builder extends SettersBuilder<S, Getters, Setters>>(builder: Builder): StoreApi<S, Getters, OverrideSet<Setters, ReturnType<Builder>, S>, ExtraMW>;
25
- extendByState<NS extends State>(patch: NS): StoreApi<Override<S, NS>, Getters, Setters, ExtraMW>;
26
- extendByState<NS extends State, Builder extends ByStateBuilder<NS, Getters, Setters>>(builder: Builder): StoreApi<Override<S, ReturnType<Builder>>, Getters, Setters, ExtraMW>;
33
+ composePlugin<P extends (store: StoreApi<S, Getters, Setters, ExtraMW>) => StoreApi<any, any, any, ExtraMW>>(plugin: P): P extends (store: StoreApi<S, Getters, Setters, ExtraMW>) => StoreApi<infer S2, infer G2, infer A2, ExtraMW> ? StoreApi<Override<S, S2>, // merge state
34
+ Override<Getters, G2>, // merge getters (aware of new S)
35
+ Override<Setters, A2>, // merge setters (aware of new S)
36
+ ExtraMW> : never;
37
+ extendByState<NS extends State>(patch: NoOverlappingKeys<S, NS>): StoreApi<S & NS, Getters, Setters, ExtraMW>;
38
+ extendByState<NS extends State, Builder extends ByStateBuilder<NS, S, Getters>>(builder: ByStateBuilder<NS, S, Getters>): StoreApi<S & ReturnType<Builder>, Getters, Setters, ExtraMW>;
39
+ extendGetters<Builder extends GettersBuilder<S, Getters>>(builder: Builder): StoreApi<S, Override<Getters, ReturnType<Builder>>, Setters, ExtraMW>;
40
+ extendSetters<Builder extends SettersBuilder<S, Getters, Setters>>(builder: Builder): StoreApi<S, Getters, Override<Setters, ReturnType<Builder>>, ExtraMW>;
27
41
  restrictState(): StoreApiEncapsulated<S, Getters, Setters, ExtraMW>;
28
42
  restrictState<Key extends keyof S>(publicState: Key[]): StoreApiEncapsulated<Omit<S, Key>, Getters, Setters, ExtraMW>;
29
43
  };
30
- type GettersBuilder<S extends State, Getters = Default> = (args: {
44
+ type GettersBuilder<S extends State, Getters> = (args: {
31
45
  get: OverrideGet<GetRecord<S>, Getters, S>;
32
46
  }) => Record<string, (...args: any[]) => any>;
33
- type SettersBuilder<S extends State, Getters = Default, Setters = Default> = (args: {
34
- api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
47
+ type SettersBuilder<S extends State, Getters = {}, Setters = {}> = (args: {
48
+ api: StoreLib<S>;
35
49
  get: OverrideGet<GetRecord<S>, Getters, S>;
36
50
  set: OverrideSet<SetRecord<S>, Setters, S>;
37
51
  }) => Record<string, (...args: any[]) => void>;
38
- type ByStateBuilder<S extends State, Getters = Default, Setters = Default> = (args: {
39
- api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
52
+ type ByStateBuilder<NS extends State, S extends State, Getters = {}> = (args: {
40
53
  get: OverrideGet<GetRecord<S>, Getters, S>;
41
- set: OverrideSet<SetRecord<S>, Setters, S>;
42
- use: OverrideUse<UseRecord<S>, Getters, S>;
43
- }) => Partial<S>;
44
- type GetRecordBase<S extends Record<string, any>> = () => S;
45
- type GetRecord<S extends Record<string, any>> = GetRecordBase<S>;
46
- type SetRecordBase<S extends Record<string, any>> = StoreApi$1<S>['setState'];
47
- type SetRecord<S extends Record<string, any>> = SetRecordBase<S> & {
48
- [K in keyof S]-?: (value: S[K]) => void;
49
- };
54
+ }) => NoOverlappingKeys<S, NS>;
50
55
  type UseRecordBase<S> = {
51
- <K extends readonly (keyof S)[]>(selector: K, equality?: EqualityChecker<Pick<S, K[number]>>): Pick<S, K[number]>;
56
+ <K extends readonly (keyof S)[]>(selector: K, equality?: EqualityChecker<Pick<S, K[number]>>): Readonly<Pick<S, K[number]>>;
52
57
  <R>(selector: (state: S) => R, equality?: EqualityChecker<R>): R;
53
- (selector?: undefined, equality?: EqualityChecker<S>): S;
58
+ (selector?: undefined, equality?: EqualityChecker<Readonly<S>>): Readonly<S>;
54
59
  };
55
60
  type UseRecord<S> = UseRecordDeep<S> & UseRecordBase<S>;
56
61
  type UseRecordDeep<S> = {
57
62
  [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];
58
63
  };
59
64
  type IsOptional<S, K extends keyof S> = undefined extends S[K] ? {} extends Pick<S, K> ? true : false : false;
60
- type StoreApiPlugin<NewApiData extends State, NewGetters, NewSetters, NewExtraMW = Default> = {
61
- creates?: () => NewApiData;
62
- extends?: (store: StoreApi<NewApiData, NewGetters, NewSetters, NewExtraMW>) => StoreApi<NewApiData, NewGetters, NewSetters, NewExtraMW>;
63
- };
64
- type StoreApiPluginList = StoreApiPlugin<any, any, any, any>[];
65
- type AugmentedApiData<S, Plugins extends StoreApiPluginList> = S & UnionToIntersection<ExtractPluginTypes<Plugins, 'create'>[number]>;
66
- type AugmentedGetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['getters']>;
67
- type AugmentedSetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['setters']>;
68
- type UnionToIntersection<S> = (S extends any ? (k: S) => void : never) extends (k: infer I) => void ? I : never;
69
- type ExtractPluginTypes<Plugins extends StoreApiPluginList, Key extends 'create' | 'extend'> = {
70
- [K in keyof Plugins]: Plugins[K] extends StoreApiPlugin<infer S, infer G, infer A> ? Key extends 'create' ? S : Key extends 'extend' ? {
71
- getters: G;
72
- setters: A;
73
- } : never : never;
74
- };
65
+ type NoOverlappingKeys<Old, New> = keyof Old & keyof New extends never ? New : never;
75
66
  type MWConfiguration = {
76
67
  devtools?: true | Omit<DevtoolsOptions, 'store'>;
77
68
  persist?: true | Omit<PersistOptions<any>, 'name'>;
@@ -93,21 +84,24 @@ type GlobalConfig = {
93
84
  logging: boolean;
94
85
  };
95
86
 
87
+ /**
88
+ * Identity helper that provides a typed `store` param and preserves the plugin's return type.
89
+ */
90
+ declare function definePlugin<F extends (store: StoreApi) => StoreApi>(fn: F): <S extends State, G, A, MW>(store: StoreApi<S, G, A, MW>) => ReturnType<F>;
91
+
96
92
  declare function setGlobalConfig(newConfig: Partial<GlobalConfig>): void;
97
- declare function createStore<S extends State, Plugins extends StoreApiPluginList = [], ExtraMW extends MWConfiguration = {}>(initialState: S, options?: {
93
+ declare function createStore<S extends State, ExtraMW extends MWConfiguration = {}>(initialState: S, options?: {
98
94
  name?: string;
99
- plugins?: [...Plugins];
100
95
  middlewares?: ExtraMW;
101
- }): StoreApi<Plugins extends [] ? S : AugmentedApiData<S, Plugins>, Plugins extends [] ? Default : AugmentedGetters<Plugins>, Plugins extends [] ? Default : AugmentedSetters<Plugins>, ExtraMW extends {
96
+ }): StoreApi<S, GetRecord<S>, SetRecord<S>, ExtraMW extends {
102
97
  persist: any;
103
98
  } ? StorePersist<S> : {}>;
104
99
 
105
- type PluginResetSetters = {
106
- reset: () => void;
107
- };
108
100
  /**
109
101
  * Basic plugin example, that extends store with custom setter.
110
102
  */
111
- declare const reset: StoreApiPlugin<{}, {}, PluginResetSetters>;
103
+ declare const withReset: <S extends State, G, A, MW>(store: StoreApi<S, G, A, MW>) => StoreApi<{}, {}, {
104
+ reset: () => void;
105
+ }, {}>;
112
106
 
113
- export { type StoreApiPlugin, createStore, reset, setGlobalConfig };
107
+ export { createStore, definePlugin, setGlobalConfig, withReset };
package/dist/index.d.ts CHANGED
@@ -1,77 +1,68 @@
1
1
  import { StoreApi as StoreApi$1 } from 'zustand';
2
2
  import { DevtoolsOptions, PersistOptions } from 'zustand/middleware';
3
3
 
4
- type State = Record<string | symbol, unknown>;
5
- type Empty = Record<string, never>;
6
- type Default = Record<string | symbol, any>;
4
+ type State = Record<PropertyKey, unknown>;
7
5
  type EqualityChecker<S> = (state: S, newState: S) => boolean;
8
- type Override<T, U> = Omit<T, keyof U> & U;
9
- type OverrideGet<T, U, S extends Record<string, any>> = Override<T, U> & GetRecordBase<S>;
10
- type OverrideSet<T, U, S extends Record<string, any>> = Override<T, U> & SetRecordBase<S>;
11
- type OverrideUse<T, U, S extends Record<string, any>> = Override<T, U> & UseRecordBase<S>;
12
- type StoreApiEncapsulated<S extends State = Empty, Getters = Default, Setters = Default, ExtraMW = {}> = {
6
+ type Prettify<T> = {
7
+ [K in keyof T]: T[K];
8
+ } & {};
9
+ type Override<T, U> = Prettify<Omit<T, keyof U> & U>;
10
+ type Augments<T, U, Base> = Base & Override<T, U>;
11
+ type StoreLib<S> = Omit<StoreApi$1<S>, 'setState' | 'getState'>;
12
+ type GetBase<S extends State> = () => Readonly<S>;
13
+ type SetBase<S extends State> = StoreApi$1<S>['setState'];
14
+ type UseBase<S extends State> = UseRecordBase<S>;
15
+ type OverrideGet<T, U, S extends State> = Augments<T, U, GetBase<S>>;
16
+ type OverrideSet<T, U, S extends State> = Augments<T, U, SetBase<S>>;
17
+ type OverrideUse<T, U, S extends State> = Augments<T, U, UseBase<S>>;
18
+ type GetRecord<S extends Record<string, unknown>> = GetBase<S>;
19
+ type SetRecord<S extends Record<string, unknown>> = SetBase<S> & {
20
+ [K in keyof S]-?: (value: S[K]) => void;
21
+ };
22
+ type StoreApiEncapsulated<S extends State = {}, Getters = {}, Setters = {}, ExtraMW = {}> = {
13
23
  api: StoreApi$1<S> & ExtraMW;
14
24
  get: OverrideGet<GetRecord<S>, Getters, S>;
15
25
  set: OverrideSet<SetRecord<S>, Setters, S>;
16
26
  use: OverrideUse<UseRecord<S>, Getters, S>;
17
27
  };
18
- type StoreApi<S extends State = Empty, Getters = Default, Setters = Default, ExtraMW = {}> = {
19
- api: Omit<StoreApi$1<S>, 'setState' | 'getState'> & ExtraMW;
28
+ type StoreApi<S extends State = {}, Getters = {}, Setters = {}, ExtraMW = {}> = {
29
+ api: StoreLib<S> & ExtraMW;
20
30
  get: OverrideGet<GetRecord<S>, Getters, S>;
21
31
  set: OverrideSet<SetRecord<S>, Setters, S>;
22
32
  use: OverrideUse<UseRecord<S>, Getters, S>;
23
- extendGetters<Builder extends GettersBuilder<S, Getters>>(builder: Builder): StoreApi<S, OverrideGet<Getters, ReturnType<Builder>, S>, Setters, ExtraMW>;
24
- extendSetters<Builder extends SettersBuilder<S, Getters, Setters>>(builder: Builder): StoreApi<S, Getters, OverrideSet<Setters, ReturnType<Builder>, S>, ExtraMW>;
25
- extendByState<NS extends State>(patch: NS): StoreApi<Override<S, NS>, Getters, Setters, ExtraMW>;
26
- extendByState<NS extends State, Builder extends ByStateBuilder<NS, Getters, Setters>>(builder: Builder): StoreApi<Override<S, ReturnType<Builder>>, Getters, Setters, ExtraMW>;
33
+ composePlugin<P extends (store: StoreApi<S, Getters, Setters, ExtraMW>) => StoreApi<any, any, any, ExtraMW>>(plugin: P): P extends (store: StoreApi<S, Getters, Setters, ExtraMW>) => StoreApi<infer S2, infer G2, infer A2, ExtraMW> ? StoreApi<Override<S, S2>, // merge state
34
+ Override<Getters, G2>, // merge getters (aware of new S)
35
+ Override<Setters, A2>, // merge setters (aware of new S)
36
+ ExtraMW> : never;
37
+ extendByState<NS extends State>(patch: NoOverlappingKeys<S, NS>): StoreApi<S & NS, Getters, Setters, ExtraMW>;
38
+ extendByState<NS extends State, Builder extends ByStateBuilder<NS, S, Getters>>(builder: ByStateBuilder<NS, S, Getters>): StoreApi<S & ReturnType<Builder>, Getters, Setters, ExtraMW>;
39
+ extendGetters<Builder extends GettersBuilder<S, Getters>>(builder: Builder): StoreApi<S, Override<Getters, ReturnType<Builder>>, Setters, ExtraMW>;
40
+ extendSetters<Builder extends SettersBuilder<S, Getters, Setters>>(builder: Builder): StoreApi<S, Getters, Override<Setters, ReturnType<Builder>>, ExtraMW>;
27
41
  restrictState(): StoreApiEncapsulated<S, Getters, Setters, ExtraMW>;
28
42
  restrictState<Key extends keyof S>(publicState: Key[]): StoreApiEncapsulated<Omit<S, Key>, Getters, Setters, ExtraMW>;
29
43
  };
30
- type GettersBuilder<S extends State, Getters = Default> = (args: {
44
+ type GettersBuilder<S extends State, Getters> = (args: {
31
45
  get: OverrideGet<GetRecord<S>, Getters, S>;
32
46
  }) => Record<string, (...args: any[]) => any>;
33
- type SettersBuilder<S extends State, Getters = Default, Setters = Default> = (args: {
34
- api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
47
+ type SettersBuilder<S extends State, Getters = {}, Setters = {}> = (args: {
48
+ api: StoreLib<S>;
35
49
  get: OverrideGet<GetRecord<S>, Getters, S>;
36
50
  set: OverrideSet<SetRecord<S>, Setters, S>;
37
51
  }) => Record<string, (...args: any[]) => void>;
38
- type ByStateBuilder<S extends State, Getters = Default, Setters = Default> = (args: {
39
- api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
52
+ type ByStateBuilder<NS extends State, S extends State, Getters = {}> = (args: {
40
53
  get: OverrideGet<GetRecord<S>, Getters, S>;
41
- set: OverrideSet<SetRecord<S>, Setters, S>;
42
- use: OverrideUse<UseRecord<S>, Getters, S>;
43
- }) => Partial<S>;
44
- type GetRecordBase<S extends Record<string, any>> = () => S;
45
- type GetRecord<S extends Record<string, any>> = GetRecordBase<S>;
46
- type SetRecordBase<S extends Record<string, any>> = StoreApi$1<S>['setState'];
47
- type SetRecord<S extends Record<string, any>> = SetRecordBase<S> & {
48
- [K in keyof S]-?: (value: S[K]) => void;
49
- };
54
+ }) => NoOverlappingKeys<S, NS>;
50
55
  type UseRecordBase<S> = {
51
- <K extends readonly (keyof S)[]>(selector: K, equality?: EqualityChecker<Pick<S, K[number]>>): Pick<S, K[number]>;
56
+ <K extends readonly (keyof S)[]>(selector: K, equality?: EqualityChecker<Pick<S, K[number]>>): Readonly<Pick<S, K[number]>>;
52
57
  <R>(selector: (state: S) => R, equality?: EqualityChecker<R>): R;
53
- (selector?: undefined, equality?: EqualityChecker<S>): S;
58
+ (selector?: undefined, equality?: EqualityChecker<Readonly<S>>): Readonly<S>;
54
59
  };
55
60
  type UseRecord<S> = UseRecordDeep<S> & UseRecordBase<S>;
56
61
  type UseRecordDeep<S> = {
57
62
  [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];
58
63
  };
59
64
  type IsOptional<S, K extends keyof S> = undefined extends S[K] ? {} extends Pick<S, K> ? true : false : false;
60
- type StoreApiPlugin<NewApiData extends State, NewGetters, NewSetters, NewExtraMW = Default> = {
61
- creates?: () => NewApiData;
62
- extends?: (store: StoreApi<NewApiData, NewGetters, NewSetters, NewExtraMW>) => StoreApi<NewApiData, NewGetters, NewSetters, NewExtraMW>;
63
- };
64
- type StoreApiPluginList = StoreApiPlugin<any, any, any, any>[];
65
- type AugmentedApiData<S, Plugins extends StoreApiPluginList> = S & UnionToIntersection<ExtractPluginTypes<Plugins, 'create'>[number]>;
66
- type AugmentedGetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['getters']>;
67
- type AugmentedSetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['setters']>;
68
- type UnionToIntersection<S> = (S extends any ? (k: S) => void : never) extends (k: infer I) => void ? I : never;
69
- type ExtractPluginTypes<Plugins extends StoreApiPluginList, Key extends 'create' | 'extend'> = {
70
- [K in keyof Plugins]: Plugins[K] extends StoreApiPlugin<infer S, infer G, infer A> ? Key extends 'create' ? S : Key extends 'extend' ? {
71
- getters: G;
72
- setters: A;
73
- } : never : never;
74
- };
65
+ type NoOverlappingKeys<Old, New> = keyof Old & keyof New extends never ? New : never;
75
66
  type MWConfiguration = {
76
67
  devtools?: true | Omit<DevtoolsOptions, 'store'>;
77
68
  persist?: true | Omit<PersistOptions<any>, 'name'>;
@@ -93,21 +84,24 @@ type GlobalConfig = {
93
84
  logging: boolean;
94
85
  };
95
86
 
87
+ /**
88
+ * Identity helper that provides a typed `store` param and preserves the plugin's return type.
89
+ */
90
+ declare function definePlugin<F extends (store: StoreApi) => StoreApi>(fn: F): <S extends State, G, A, MW>(store: StoreApi<S, G, A, MW>) => ReturnType<F>;
91
+
96
92
  declare function setGlobalConfig(newConfig: Partial<GlobalConfig>): void;
97
- declare function createStore<S extends State, Plugins extends StoreApiPluginList = [], ExtraMW extends MWConfiguration = {}>(initialState: S, options?: {
93
+ declare function createStore<S extends State, ExtraMW extends MWConfiguration = {}>(initialState: S, options?: {
98
94
  name?: string;
99
- plugins?: [...Plugins];
100
95
  middlewares?: ExtraMW;
101
- }): StoreApi<Plugins extends [] ? S : AugmentedApiData<S, Plugins>, Plugins extends [] ? Default : AugmentedGetters<Plugins>, Plugins extends [] ? Default : AugmentedSetters<Plugins>, ExtraMW extends {
96
+ }): StoreApi<S, GetRecord<S>, SetRecord<S>, ExtraMW extends {
102
97
  persist: any;
103
98
  } ? StorePersist<S> : {}>;
104
99
 
105
- type PluginResetSetters = {
106
- reset: () => void;
107
- };
108
100
  /**
109
101
  * Basic plugin example, that extends store with custom setter.
110
102
  */
111
- declare const reset: StoreApiPlugin<{}, {}, PluginResetSetters>;
103
+ declare const withReset: <S extends State, G, A, MW>(store: StoreApi<S, G, A, MW>) => StoreApi<{}, {}, {
104
+ reset: () => void;
105
+ }, {}>;
112
106
 
113
- export { type StoreApiPlugin, createStore, reset, setGlobalConfig };
107
+ export { createStore, definePlugin, setGlobalConfig, withReset };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{devtools as _,persist as q}from"zustand/middleware";import{createStore as K}from"zustand/vanilla";import{shallow as R}from"zustand/shallow";import{useStoreWithEqualityFn as U}from"zustand/traditional";function g(e){return()=>e.getState()}import{shallow as O}from"zustand/shallow";import{useStoreWithEqualityFn as E}from"zustand/traditional";var A=e=>e,l=(e,r)=>r.reduce((t,n)=>(n in e&&(t[n]=e[n]),t),{});function f(e){return(r=A,t=O)=>E(e,Array.isArray(r)?n=>l(n,r):r??A,t)}function L(e,r,t){let n=e({get:r.get}),o={};return Object.keys(n).forEach(s=>{o[s]=(...i)=>U(t,()=>n[s](...i),R)}),r.use=Object.assign(f(t),r.use,o),r.get=Object.assign(g(t),r.get,n),r}import{shallow as N}from"zustand/shallow";import w from"error-stack-parser";function c(){let e=w.parse(new Error),r=e.findIndex(t=>t.functionName?.includes("_zustandLiteInferName_"));return r-1>=0?e[r-1].functionName:null}function x(e,r){return(t,n,o)=>{let s=e.getState(),i=typeof t=="function"?t(s):t;N(s,i)||e.setState(i,n,r?{type:c()??o??"setState",payload:i}:void 0)}}function P(e,r,t,n){let o=x(t,n),s=Object.entries(e(r)).reduce((i,[u,m])=>(i[u]=function(...d){return m(...d)},i),{});return r.set=Object.assign(o,r.set,s),r}import{shallow as W}from"zustand/shallow";import{useStoreWithEqualityFn as I}from"zustand/traditional";function G(e,r,t,n){typeof e=="object"&&e!==null&&Object.keys(e).forEach(o=>{let s=[...t,o];Object.defineProperty(r,o,{value:(i=W)=>I(n,u=>C(u,s),i),writable:!0,configurable:!0,enumerable:!0}),G(e[o],r[o],s,n)})}function C(e,r){let t=e;for(let n of r)if(t=t[n],!t)return t;return t}function y(e,r){let t=f(e);return G(l(e.getState(),r),t,[],e),t}import{shallow as M}from"zustand/shallow";function b(e,r,t){let n=x(e,t);return r.forEach(o=>{n[o]=s=>{M(e.getState()[o],s)||e.setState(i=>({...i,[o]:s}),!1,t?{type:c()??o,payload:{[o]:s}}:void 0)}}),n}function h(e,r,t,n){let o=typeof e=="function"?e(r):e;return r.set(o),r.use={...r.use,...y(t,Object.keys(o))},r.set={...r.set,...b(t,Object.keys(o),n)},r}function j(e,r){return{getInitialState:e.getInitialState,getState:e.getState,persist:z(e,r),setState:e.setState,subscribe:e.subscribe}}function z(e,r){if("persist"in e){let t=e.persist;return t.read=()=>{try{return JSON.parse(localStorage?.getItem(r)??"")?.state}catch{return}},t}}function D(e){return g(e)}function F(e,r,t,n){return{api:t.api,set:t.set,use:e?(()=>{let o=Object.keys(t.use).reduce((s,i)=>r[i]&&e.includes(i)?s:{...s,[i]:t.use[i]},{});return Object.assign(f(n),o)})():t.use,get:e?Object.assign(()=>Object.entries(t.get()).reduce((s,[i,u])=>r[i]&&e.includes(i)?s:{...s,[i]:u},{}),t.get):t.get}}var p={appName:"zustand-lite",logging:!1};function $(e){p={...p,...e}}function v(e,r){let{name:t="zustand-lite",plugins:n=[],middlewares:o={}}=r??{},s=e;n.forEach(a=>{a.creates&&(s={...s,...a.creates()})});let i=()=>s,u=`${p.appName.replace(/\s/,"-")}.${t}}`,m=p.logging||!!o.devtools;m&&(i=_(i,{name:p.appName,store:t,...typeof o.devtools=="object"?o.devtools:{}})),o.persist&&(i=q(i,{name:u,...typeof o.persist=="object"?o.persist:{}}));let S=K(i),d={api:j(S,u),get:D(S),use:y(S,Object.keys(s)),set:b(S,Object.keys(s),m),extendGetters(a){return L(a,this,S)},extendSetters(a){return P(a,this,S,m)},extendByState(a){return h(a,this,S,m)},restrictState(a=[]){return F(a,s,this,S)}},B=d;return n.forEach(a=>{a.extends&&(B=a.extends(d))}),B}var J={extends:e=>e.extendSetters(({api:r,set:t})=>({reset:()=>{t(r.getInitialState?.()??{},!0)}}))};export{v as createStore,J as reset,$ as setGlobalConfig};
1
+ function O(e){return e}import{devtools as C,persist as z}from"zustand/middleware";import{createStore as _}from"zustand/vanilla";import{shallow as j}from"zustand/shallow";import{shallow as R}from"zustand/shallow";import w from"error-stack-parser";function p(){let e=w.parse(new Error),r=e.findIndex(t=>t.functionName?.includes("_zustandLiteInferName_"));return r-1>=0?e[r-1].functionName:null}function u(e,r){return(t,o,n)=>{let i=e.getState(),s=typeof t=="function"?t(i):t;R(i,s)||e.setState(s,o,r?{type:p()??n??"setState",payload:s}:void 0)}}function d(e,r,t){let o=u(e,t);return r.forEach(n=>{o[n]=i=>{j(e.getState()[n],i)||e.setState(s=>({...s,[n]:i}),!1,t?{type:p()??n,payload:{[n]:i}}:void 0)}}),o}var x=e=>e,c=(e,r)=>r.reduce((t,o)=>(o in e&&(t[o]=e[o]),t),{});import{shallow as N}from"zustand/shallow";import{useStoreWithEqualityFn as E}from"zustand/traditional";function y(e,r,t,o){typeof e=="object"&&e!==null&&Object.keys(e).forEach(n=>{let i=[...t,n];Object.defineProperty(r,n,{value:(s=N)=>E(o,a=>P(a,i),s),writable:!0,configurable:!0,enumerable:!0}),y(e[n],r[n],i,o)})}function P(e,r){let t=e;for(let o of r)if(t=t[o],!t)return t;return t}import{shallow as U}from"zustand/shallow";import{useStoreWithEqualityFn as W}from"zustand/traditional";function m(e){return(r=x,t=U)=>W(e,Array.isArray(r)?o=>c(o,r):r??x,t)}function g(e,r){let t=m(e);return y(c(e.getState(),r),t,[],e),t}function b(e,r,t,o){let n=typeof e=="function"?e(r):e;return t.setState(n),r.use={...r.use,...g(t,Object.keys(n))},r.set={...r.set,...d(t,Object.keys(n),o)},r}import{shallow as D}from"zustand/shallow";import{useStoreWithEqualityFn as I}from"zustand/traditional";function l(e){return()=>e.getState()}function G(e,r,t){let o=e({get:r.get}),n={};return Object.keys(o).forEach(i=>{n[i]=(...s)=>I(t,()=>o[i](...s),D)}),r.use=Object.assign(m(t),r.use,n),r.get=Object.assign(l(t),r.get,o),r}function A(e,r,t,o){let n=u(t,o),i=Object.entries(e(r)).reduce((s,[a,S])=>(s[a]=function(...h){return S(...h)},s),{});return r.set=Object.assign(n,r.set,i),r}function F(e,r){return{getInitialState:e.getInitialState,getState:e.getState,persist:M(e,r),setState:e.setState,subscribe:e.subscribe}}function M(e,r){if("persist"in e){let t=e.persist;return t.read=()=>{try{return JSON.parse(localStorage?.getItem(r)??"")?.state}catch{return}},t}}function B(e){return l(e)}function L(e,r,t,o){return{api:t.api,set:t.set,use:e?(()=>{let n=Object.keys(t.use).reduce((i,s)=>r[s]&&e.includes(s)?i:{...i,[s]:t.use[s]},{});return Object.assign(m(o),n)})():t.use,get:e?Object.assign(()=>Object.entries(t.get()).reduce((i,[s,a])=>r[s]&&e.includes(s)?i:{...i,[s]:a},{}),t.get):t.get}}var f={appName:"zustand-lite",logging:!1};function q(e){f={...f,...e}}function K(e,r){let{name:t="zustand-lite",middlewares:o={}}=r??{},n=()=>e,i=`${f.appName.replace(/\s/,"-")}.${t}}`,s=f.logging||!!o.devtools;s&&(n=C(n,{name:f.appName,store:t,...typeof o.devtools=="object"?o.devtools:{}})),o.persist&&(n=z(n,{name:i,...typeof o.persist=="object"?o.persist:{}}));let a=_(n);return{api:F(a,i),get:B(a),use:g(a,Object.keys(e)),set:d(a,Object.keys(e),s),composePlugin(S){return S(this)},extendGetters(S){return G(S,this,a)},extendSetters(S){return A(S,this,a,s)},extendByState(S){return b(S,this,a,s)},restrictState(S=[]){return L(S,e,this,a)}}}var $=e=>e.extendSetters(({api:r,set:t})=>({reset:()=>{t(r.getInitialState?.()??{},!0)}}));export{K as createStore,O as definePlugin,q as setGlobalConfig,$ as withReset};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/createStore.ts","../src/lib/extendGetters.ts","../src/lib/generateGetFn.ts","../src/lib/generateUseFn.ts","../src/utils/utils.ts","../src/lib/generateSetFn.ts","../src/lib/generateSetterName.ts","../src/lib/extendSetters.ts","../src/lib/generateUseStep.ts","../src/lib/generateUse.ts","../src/lib/generateSet.ts","../src/lib/extendByState.ts","../src/lib/generateApi.ts","../src/lib/generateGet.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["/**\n * Entire no-boilerplate functionality inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors.\n * It has few utilities described here: https://www.npmjs.com/package/zustand-lite\n * for:\n * 1) Generating getters for flat state (1-level deep selectors).\n * 2) Generating setters for flat state (1-level deep setters).\n * 3) Automatic devtools messaging.\n * 4) Annotating functions with proper TS types to avoid some bloating and TS frenzy.\n * 5) Extending getters and setters\n * 6) Extending state and restricting state\n * 7) Reuse plugins\n *\n * Idea is to support small store without complicated data reducing (it can be done as well,\n * but may indicate something is not right with the use case itself).\n **/\nimport { devtools, persist } from 'zustand/middleware'\nimport { createStore as createVanillaStore } from 'zustand/vanilla'\n\nimport {\n\tAugmentedApiData,\n\tAugmentedGetters,\n\tAugmentedSetters,\n\tByStateBuilder,\n\tDefault,\n\tGettersBuilder,\n\tGlobalConfig,\n\tMWConfiguration,\n\tSettersBuilder,\n\tState,\n\tStoreApi,\n\tStoreApiPluginList,\n\tStorePersist,\n} from '../types'\n\nimport { extendGetters } from './extendGetters'\nimport { extendSetters } from './extendSetters'\nimport { extendByState } from './extendByState'\nimport { generateApi } from './generateApi'\nimport { generateGet } from './generateGet'\nimport { generateSet } from './generateSet'\nimport { generateUse } from './generateUse'\nimport { restrictState } from './restrictState'\n\nlet config: GlobalConfig = { appName: 'zustand-lite', logging: false }\n\nexport function setGlobalConfig(newConfig: Partial<GlobalConfig>) {\n\tconfig = { ...config, ...newConfig }\n}\n\nexport function createStore<\n\tS extends State,\n\tPlugins extends StoreApiPluginList = [],\n\tExtraMW extends MWConfiguration = {},\n>(\n\tinitialState: S,\n\toptions?: { name?: string; plugins?: [...Plugins]; middlewares?: ExtraMW }\n): StoreApi<\n\tPlugins extends [] ? S : AugmentedApiData<S, Plugins>,\n\tPlugins extends [] ? Default : AugmentedGetters<Plugins>,\n\tPlugins extends [] ? Default : AugmentedSetters<Plugins>,\n\tExtraMW extends { persist: any } ? StorePersist<S> : {}\n> {\n\tconst { name = 'zustand-lite', plugins = [], middlewares = {} as ExtraMW } = 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\tconst persistId = `${config.appName.replace(/\\s/, '-')}.${name}}`\n\tconst shouldLog = config.logging || !!middlewares.devtools\n\n\tif (shouldLog) {\n\t\tinitializer = devtools(initializer, {\n\t\t\tname: config.appName,\n\t\t\tstore: name,\n\t\t\t...(typeof middlewares.devtools === 'object' ? middlewares.devtools : {}),\n\t\t})\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(initializer, {\n\t\t\tname: persistId,\n\t\t\t...(typeof middlewares.persist === 'object' ? 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, persistId),\n\t\tget: generateGet(storeLib),\n\t\tuse: generateUse(storeLib, Object.keys(mergedState)),\n\t\tset: generateSet(storeLib, Object.keys(mergedState), shouldLog),\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, shouldLog)\n\t\t},\n\t\textendByState<Builder extends ByStateBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendByState(builder, this, storeLib, shouldLog)\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 { 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>,\n\tS extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, api: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\tconst methods: any = builder({ get: api.get })\n\tconst getters: any = {}\n\n\tObject.keys(methods).forEach((key) => {\n\t\tgetters[key] = (...args: any[]) =>\n\t\t\tuseStoreWithEqualityFn(lib, () => methods[key](...args), shallow)\n\t})\n\n\tapi.use = Object.assign(generateUseFn(lib), api.use, getters)\n\tapi.get = Object.assign(generateGetFn(lib), api.get, methods)\n\treturn api\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\n\n/**\n * Generates getState function for store.get()\n * @param lib Zustand api interface\n */\nexport function generateGetFn<S extends State>(lib: StoreLib<S>) {\n\treturn () => lib.getState()\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { StoreApi as StoreLib } from 'zustand'\n\nimport { State } from '../types'\nimport { identity, pick } from '../utils/utils'\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 = identity, equality = shallow) => {\n\t\treturn useStoreWithEqualityFn(\n\t\t\tlib,\n\t\t\tArray.isArray(selector) ? (s) => pick(s, selector) : (selector ?? identity),\n\t\t\tequality\n\t\t)\n\t}\n}\n","export const identity = (arg: any) => arg\nexport const pick = (obj: Record<string, any>, keys: string[]) =>\n\tkeys.reduce<Record<string, any>>((acc, k) => (k in obj ? ((acc[k] = obj[k]), acc) : acc), {})\n","import { shallow } from 'zustand/shallow'\nimport { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\nimport { generateSetterName } from './generateSetterName'\n\n/**\n * Generates automatic setState function for store like store.set({ value })\n * @param lib Zustand api interface\n * @param log If devtools were activated for this store\n */\nexport function generateSetFn<S extends State>(lib: StoreLib<S>, log: boolean) {\n\treturn (updater: S | ((state: S) => S), replace?: boolean, name?: string) => {\n\t\tconst current = lib.getState()\n\t\tconst payload = typeof updater === 'function' ? updater(current) : updater\n\n\t\tif (shallow(current, payload)) {\n\t\t\treturn\n\t\t}\n\n\t\tlib.setState(\n\t\t\tpayload,\n\t\t\treplace,\n\t\t\t// @ts-ignore Additional parameter will have no effect even if logging is disabled.\n\t\t\tlog ? { type: generateSetterName() ?? name ?? 'setState', payload } : undefined\n\t\t)\n\t}\n}\n","import ErrorStackParser from 'error-stack-parser'\n\n/**\n * Hacky, but working (and possibly only one there is) method of fetching proper caller\n * name of the extended function.\n */\nexport function generateSetterName() {\n\t// Proper setter name should hide at 2nd position in the normalized stack.\n\tconst stack = ErrorStackParser.parse(new Error())\n\tconst index = stack.findIndex((entry) => entry.functionName?.includes('_zustandLiteInferName_'))\n\treturn index - 1 >= 0 ? stack[index - 1].functionName : null\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, api: StoreApi<S, Getters, Setters>, lib: StoreLib<S>, log: boolean) {\n\tconst setters = generateSetFn(lib, log)\n\tconst baseSet = Object.entries(builder(api)).reduce(\n\t\t(acc, [name, func]) => {\n\t\t\tacc[name] = function _zustandLiteInferName_(...args: any[]) {\n\t\t\t\treturn func(...args)\n\t\t\t}\n\n\t\t\treturn acc\n\t\t},\n\t\t{} as Record<string, any>\n\t)\n\n\tapi.set = Object.assign(setters, api.set, baseSet)\n\treturn api\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\n/**\n * Generates automatic getters like store.use.foo() (recursive steps for each level).\n * Getters are created as side effects.\n * @param state State at nth level\n * @param getters Getters at nth level\n * @param path Property access path at nth level like ['foo', 'bar']\n * @param lib Zustand api interface\n */\nexport function generateUseStep(state: any, getters: any, path: string[], lib: any) {\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 { StoreApi as StoreLib } from 'zustand'\n\nimport { State } from '../types'\nimport { generateUseStep } from './generateUseStep'\nimport { generateUseFn } from './generateUseFn'\nimport { pick } from '../utils/utils'\n\n/**\n * Generates automatic store hook subscribe function store.use()\n * @param lib Zustand api interface\n * @param key State keys to use\n */\nexport function generateUse<S extends State>(lib: StoreLib<S>, key: string[]) {\n\tconst getters = generateUseFn(lib)\n\tgenerateUseStep(pick(lib.getState(), key), getters, [], lib)\n\treturn getters\n}\n","import { shallow } from 'zustand/shallow'\nimport { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { SetRecord, State } from '../types'\nimport { generateSetFn } from './generateSetFn'\nimport { generateSetterName } from './generateSetterName'\n\n/**\n * Generates automatic setters like store.set.foo(value)\n * @param lib Zustand api interface\n * @param key Keys to generate setters for\n * @param log If devtools were activated for this store\n */\nexport function generateSet<S extends State>(lib: StoreLib<S>, key: string[], log: boolean) {\n\tconst setters: any = generateSetFn(lib, log)\n\n\tkey.forEach((key) => {\n\t\tsetters[key] = (value: any) => {\n\t\t\tif (shallow(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 logging is disabled.\n\t\t\t\tlog ? { type: generateSetterName() ?? key, payload: { [key]: value } } : undefined\n\t\t\t)\n\t\t}\n\t})\n\n\treturn setters as SetRecord<S>\n}\n","import { ByStateBuilder, Default, State, StoreApi } from '../types'\nimport { generateUse } from './generateUse'\nimport { generateSet } from './generateSet'\nimport { StoreApi as StoreLib } from 'zustand/vanilla'\n\nexport function extendByState<\n\tBuilder extends ByStateBuilder<S, Getters, Setters>,\n\tS extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(\n\tbuilder: Builder | Partial<S>,\n\tapi: StoreApi<S, Getters, Setters>,\n\tlib: StoreLib<S>,\n\tlog: boolean\n) {\n\tconst newState: Partial<S> = typeof builder === 'function' ? builder(api) : builder\n\n\t// Merge the new keys into the zustand state.\n\tapi.set(newState)\n\n\t// @ts-ignore\n\tapi.use = { ...api.use, ...generateUse(lib, Object.keys(newState)) }\n\tapi.set = { ...api.set, ...generateSet(lib, Object.keys(newState), log) }\n\n\t// Return the same object, but with widened state type (handled by overloads).\n\treturn api\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 (we should allow only one way of doing certain things).\n * @param lib Zustand api interface\n * @param key Zustand persist local storage key\n */\nexport function generateApi<S extends State>(lib: StoreLib<S>, key: string) {\n\treturn {\n\t\tgetInitialState: lib.getInitialState,\n\t\tgetState: lib.getState,\n\t\tpersist: augmentPersist(lib, key),\n\t\tsetState: lib.setState,\n\t\tsubscribe: lib.subscribe,\n\t}\n}\n\nfunction augmentPersist<S extends State>(lib: StoreLib<S>, key: string) {\n\tif ('persist' in lib) {\n\t\tconst augmented: any = lib.persist\n\t\taugmented.read = () => {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(localStorage?.getItem(key) ?? '')?.state\n\t\t\t} catch {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t}\n\n\t\treturn augmented\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\nimport { generateGetFn } from './generateGetFn'\n\n/**\n * Generates getters for store.get. In the past getters were generated as functions, but I\n * came to the conclusion that it's better and simpler to return the whole state.\n * @param lib Zustand api interface\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 { GetRecord, SetRecord, State, StoreApi, UseRecord } from '../types'\nimport { generateUseFn } from './generateUseFn'\n\n/**\n * Function that restrict access to the store and store api.\n * @param privateState Property names to be made private like ['foo', 'bar']\n * @param mergedState Final state of the store\n * @param api Returned store API\n * @param lib Zustand api interface\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, api: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\treturn {\n\t\tapi: api.api,\n\t\tset: api.set,\n\t\tuse: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getters = Object.keys(api.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]: (api.use as UseRecord<any>)[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: api.use,\n\t\tget: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getFn = () =>\n\t\t\t\t\t\tObject.entries(api.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, api.get)\n\t\t\t\t})()\n\t\t\t: api.get,\n\t}\n}\n","import { StoreApiPlugin } from '../types'\n\ntype PluginResetSetters = { reset: () => void }\n\n/**\n * Basic plugin example, that extends store with custom setter.\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","shallow","useStoreWithEqualityFn","generateGetFn","lib","shallow","useStoreWithEqualityFn","identity","arg","pick","obj","keys","acc","k","generateUseFn","lib","selector","identity","equality","shallow","useStoreWithEqualityFn","s","pick","extendGetters","builder","api","lib","methods","getters","key","args","useStoreWithEqualityFn","shallow","generateUseFn","generateGetFn","shallow","ErrorStackParser","generateSetterName","stack","index","entry","generateSetFn","lib","log","updater","replace","name","current","payload","shallow","generateSetterName","extendSetters","builder","api","lib","log","setters","generateSetFn","baseSet","acc","name","func","args","shallow","useStoreWithEqualityFn","generateUseStep","state","getters","path","lib","key","newPath","equalityFn","getFromPath","data","generateUse","lib","key","getters","generateUseFn","generateUseStep","pick","shallow","generateSet","lib","key","log","setters","generateSetFn","value","shallow","state","generateSetterName","extendByState","builder","api","lib","log","newState","generateUse","generateSet","generateApi","lib","key","augmentPersist","augmented","generateGet","lib","generateGetFn","restrictState","privateState","mergedState","api","lib","getters","acc","key","generateUseFn","val","config","setGlobalConfig","newConfig","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","persistId","shouldLog","devtools","persist","storeLib","createVanillaStore","storeApi","generateApi","generateGet","generateUse","generateSet","builder","extendGetters","extendSetters","extendByState","publicState","restrictState","result","reset","store","api","set"]}
1
+ {"version":3,"sources":["../src/lib/definePlugin.ts","../src/lib/createStore.ts","../src/lib/generateSetFn.ts","../src/lib/generateSetFnBase.ts","../src/lib/generateSetterName.ts","../src/utils/utils.ts","../src/lib/generateUseFnStep.ts","../src/lib/generateUseFnBase.ts","../src/lib/generateUseFn.ts","../src/lib/extendByState.ts","../src/lib/extendGetters.ts","../src/lib/generateGetFnBase.ts","../src/lib/extendSetters.ts","../src/lib/generateApiFn.ts","../src/lib/generateGetFn.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["import { State, StoreApi } from '../types'\n\n/**\n * Identity helper that provides a typed `store` param and preserves the plugin's return type.\n */\nexport function definePlugin<F extends (store: StoreApi) => StoreApi>(fn: F) {\n\treturn fn as unknown as <S extends State, G, A, MW>(\n\t\tstore: StoreApi<S, G, A, MW>\n\t) => ReturnType<F>\n}\n","/**\n * Entire no-boilerplate functionality inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors.\n * It has few utilities described here: https://www.npmjs.com/package/zustand-lite\n * for:\n * 1) Generating getters for flat state (1-level deep selectors).\n * 2) Generating setters for flat state (1-level deep setters).\n * 3) Automatic devtools messaging.\n * 4) Annotating functions with proper TS types to avoid some bloating and TS frenzy.\n * 5) Extending getters and setters\n * 6) Extending state and restricting state\n * 7) Reuse plugins\n *\n * Idea is to support small store without complicated data reducing (it can be done as well,\n * but may indicate something is not right with the use case itself).\n **/\nimport { devtools, persist } from 'zustand/middleware'\nimport { createStore as createVanillaStore } from 'zustand/vanilla'\n\nimport {\n\tGetRecord,\n\tGlobalConfig,\n\tMWConfiguration,\n\tSetRecord,\n\tState,\n\tStoreApi,\n\tStorePersist,\n} from '../types'\n\nimport { extendByState } from './extendByState'\nimport { extendGetters } from './extendGetters'\nimport { extendSetters } from './extendSetters'\nimport { generateApiFn } from './generateApiFn'\nimport { generateGetFn } from './generateGetFn'\nimport { generateSetFn } from './generateSetFn'\nimport { generateUseFn } from './generateUseFn'\nimport { restrictState } from './restrictState'\n\nlet config: GlobalConfig = { appName: 'zustand-lite', logging: false }\n\nexport function setGlobalConfig(newConfig: Partial<GlobalConfig>) {\n\tconfig = { ...config, ...newConfig }\n}\n\nexport function createStore<S extends State, ExtraMW extends MWConfiguration = {}>(\n\tinitialState: S,\n\toptions?: { name?: string; middlewares?: ExtraMW }\n): StoreApi<\n\tS,\n\tGetRecord<S>,\n\tSetRecord<S>,\n\tExtraMW extends { persist: any } ? StorePersist<S> : {}\n> {\n\tconst { name = 'zustand-lite', middlewares = {} as ExtraMW } = options ?? {}\n\n\t// Apply supported middlewares.\n\tlet initializer: any = () => initialState\n\n\tconst persistId = `${config.appName.replace(/\\s/, '-')}.${name}}`\n\tconst shouldLog = config.logging || !!middlewares.devtools\n\n\tif (shouldLog) {\n\t\tinitializer = devtools(initializer, {\n\t\t\tname: config.appName,\n\t\t\tstore: name,\n\t\t\t...(typeof middlewares.devtools === 'object' ? middlewares.devtools : {}),\n\t\t})\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(initializer, {\n\t\t\tname: persistId,\n\t\t\t...(typeof middlewares.persist === 'object' ? 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\treturn {\n\t\tapi: generateApiFn(storeLib, persistId),\n\t\tget: generateGetFn(storeLib),\n\t\tuse: generateUseFn(storeLib, Object.keys(initialState)),\n\t\tset: generateSetFn(storeLib, Object.keys(initialState), shouldLog),\n\t\tcomposePlugin(plugin) {\n\t\t\treturn plugin(this)\n\t\t},\n\t\textendGetters(builder) {\n\t\t\treturn extendGetters(builder, this, storeLib)\n\t\t},\n\t\textendSetters(builder) {\n\t\t\treturn extendSetters(builder, this, storeLib, shouldLog)\n\t\t},\n\t\textendByState(builder) {\n\t\t\treturn extendByState(builder, this, storeLib, shouldLog)\n\t\t},\n\t\trestrictState(publicState = []) {\n\t\t\treturn restrictState(publicState, initialState, this, storeLib)\n\t\t},\n\t} as any\n}\n","import { shallow } from 'zustand/shallow'\nimport { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { SetRecord, State } from '../types'\nimport { generateSetFnBase } from './generateSetFnBase'\nimport { generateSetterName } from './generateSetterName'\n\n/**\n * Generates automatic setters like store.set.foo(value)\n *\n * @param lib Zustand api interface\n * @param key Keys to generate setters for\n * @param log If devtools were activated for this store\n */\nexport function generateSetFn<S extends State>(lib: StoreLib<S>, key: string[], log: boolean) {\n\tconst setters: any = generateSetFnBase(lib, log)\n\n\tkey.forEach((key) => {\n\t\tsetters[key] = (value: any) => {\n\t\t\tif (shallow(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 logging is disabled.\n\t\t\t\tlog ? { type: generateSetterName() ?? 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 { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\nimport { generateSetterName } from './generateSetterName'\n\n/**\n * Generates automatic setState function for store like store.set({ value })\n *\n * @param lib Zustand api interface\n * @param log If devtools were activated for this store\n */\nexport function generateSetFnBase<S extends State>(lib: StoreLib<S>, log: boolean) {\n\treturn (updater: S | ((state: S) => S), replace?: boolean, name?: string) => {\n\t\tconst current = lib.getState()\n\t\tconst payload = typeof updater === 'function' ? updater(current) : updater\n\n\t\tif (shallow(current, payload)) {\n\t\t\treturn\n\t\t}\n\n\t\tlib.setState(\n\t\t\tpayload,\n\t\t\treplace,\n\t\t\t// @ts-ignore Additional parameter will have no effect even if logging is disabled.\n\t\t\tlog ? { type: generateSetterName() ?? name ?? 'setState', payload } : undefined\n\t\t)\n\t}\n}\n","import ErrorStackParser from 'error-stack-parser'\n\n/**\n * Hacky, but working (and possibly only one there is) method of fetching proper caller\n * name of the extended function.\n */\nexport function generateSetterName() {\n\t// Proper setter name should hide at 2nd position in the normalized stack.\n\tconst stack = ErrorStackParser.parse(new Error())\n\tconst index = stack.findIndex((entry) => entry.functionName?.includes('_zustandLiteInferName_'))\n\treturn index - 1 >= 0 ? stack[index - 1].functionName : null\n}\n","export const identity = (arg: any) => arg\nexport const pick = (obj: Record<string, any>, keys: string[]) =>\n\tkeys.reduce<Record<string, any>>((acc, k) => (k in obj ? ((acc[k] = obj[k]), acc) : acc), {})\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\n/**\n * Generates automatic getters like store.use.foo() (recursive steps for each level).\n * Getters are created as side effects.\n *\n * @param state State at nth level\n * @param getters Getters at nth level\n * @param path Property access path at nth level like ['foo', 'bar']\n * @param lib Zustand api interface\n */\nexport function generateUseFnStep(state: any, getters: any, path: string[], lib: any) {\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\tgenerateUseFnStep(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 } from '../types'\nimport { identity, pick } from '../utils/utils'\n\n/**\n * Generates automatic getters like store.use.foo()\n *\n * @param lib Zustand api interface\n */\nexport function generateUseFnBase<S extends State, U>(lib: StoreLib<S>) {\n\treturn (selector = identity, equality = shallow) => {\n\t\treturn useStoreWithEqualityFn(\n\t\t\tlib,\n\t\t\tArray.isArray(selector) ? (s) => pick(s, selector) : (selector ?? identity),\n\t\t\tequality\n\t\t)\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand'\n\nimport { State } from '../types'\nimport { pick } from '../utils/utils'\nimport { generateUseFnStep } from './generateUseFnStep'\nimport { generateUseFnBase } from './generateUseFnBase'\n\n/**\n * Generates automatic store hook subscribe function store.use()\n *\n * @param lib Zustand api interface\n * @param key State keys to use\n */\nexport function generateUseFn<S extends State>(lib: StoreLib<S>, key: string[]) {\n\tconst getters = generateUseFnBase(lib)\n\tgenerateUseFnStep(pick(lib.getState(), key), getters, [], lib)\n\treturn getters\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\nimport { ByStateBuilder, State, StoreApi } from '../types'\nimport { generateSetFn } from './generateSetFn'\nimport { generateUseFn } from './generateUseFn'\n\n/**\n * Extends the store by adding new state fields, either by:\n * - passing an object patch: `{ b: 'x' }`\n * - or using a builder: `({ get }) => ({ c: get().b + 'y' })`\n *\n * @param builder Object patch or function producing new state fields.\n * @param api The extended store API before widening.\n * @param lib The underlying Zustand vanilla store.\n * @param log Enables logging for generated setters.\n *\n * @returns The same API instance, but with widened state (via overloads).\n */\nexport function extendByState<\n\tNewData extends State,\n\tOldData extends State,\n\tGetters,\n\tSetters,\n\tBuilder extends ByStateBuilder<NewData, OldData, Getters>,\n>(\n\tbuilder: Builder | NewData,\n\tapi: StoreApi<OldData, Getters, Setters>,\n\tlib: StoreLib<OldData>,\n\tlog: boolean\n) {\n\t// Calculate new state to be added to the store.\n\tconst newState: NewData = typeof builder === 'function' ? builder(api) : builder\n\n\t// Merge the new keys into the zustand state.\n\tlib.setState(newState as unknown as OldData)\n\n\t// Generate basic getters and setters from the newly added record.\n\tapi.use = { ...api.use, ...generateUseFn(lib, Object.keys(newState)) }\n\tapi.set = { ...api.set, ...generateSetFn(lib, Object.keys(newState), log) }\n\n\t// Return the same object, but with widened state type (handled by overloads).\n\treturn api\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\nimport { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { GettersBuilder, State, StoreApi } from '../types'\nimport { generateGetFnBase } from './generateGetFnBase'\nimport { generateUseFnBase } from './generateUseFnBase'\n\n/**\n * Adds derived getters to the store.\n *\n * @param builder Function returning new getter methods.\n * @param api Current store API to extend.\n * @param lib Underlying Zustand store.\n */\nexport function extendGetters<\n\tBuilder extends GettersBuilder<S, Getters>,\n\tS extends State,\n\tGetters,\n\tSetters,\n>(builder: Builder, api: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\tconst methods: any = builder({ get: api.get })\n\tconst getters: any = {}\n\n\tObject.keys(methods).forEach((key) => {\n\t\tgetters[key] = (...args: any[]) =>\n\t\t\tuseStoreWithEqualityFn(lib, () => methods[key](...args), shallow)\n\t})\n\n\tapi.use = Object.assign(generateUseFnBase(lib), api.use, getters)\n\tapi.get = Object.assign(generateGetFnBase(lib), api.get, methods)\n\treturn api\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\n\n/**\n * Generates getState function for store.get()\n *\n * @param lib Zustand api interface\n */\nexport function generateGetFnBase<S extends State>(lib: StoreLib<S>) {\n\treturn () => lib.getState()\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\nimport { SettersBuilder, State, StoreApi } from '../types'\nimport { generateSetFnBase } from './generateSetFnBase'\n\n/**\n * Adds custom setter methods to the store.\n *\n * @param builder Function returning new setter methods.\n * @param api Store API to extend.\n * @param lib Underlying Zustand store.\n * @param log Enables optional debug logging.\n */\nexport function extendSetters<\n\tBuilder extends SettersBuilder<S, Getters, Setters>,\n\tS extends State,\n\tGetters,\n\tSetters,\n>(builder: Builder, api: StoreApi<S, Getters, Setters>, lib: StoreLib<S>, log: boolean) {\n\tconst setters = generateSetFnBase(lib, log)\n\tconst baseSet = Object.entries(builder(api)).reduce(\n\t\t(acc, [name, func]) => {\n\t\t\tacc[name] = function _zustandLiteInferName_(...args: any[]) {\n\t\t\t\treturn func(...args)\n\t\t\t}\n\n\t\t\treturn acc\n\t\t},\n\t\t{} as Record<string, any>\n\t)\n\n\tapi.set = Object.assign(setters, api.set, baseSet)\n\treturn api\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 (we should allow only one way of doing certain things).\n *\n * @param lib Zustand api interface\n * @param key Zustand persist local storage key\n */\nexport function generateApiFn<S extends State>(lib: StoreLib<S>, key: string) {\n\treturn {\n\t\tgetInitialState: lib.getInitialState,\n\t\tgetState: lib.getState,\n\t\tpersist: augmentPersist(lib, key),\n\t\tsetState: lib.setState,\n\t\tsubscribe: lib.subscribe,\n\t}\n}\n\nfunction augmentPersist<S extends State>(lib: StoreLib<S>, key: string) {\n\tif ('persist' in lib) {\n\t\tconst augmented: any = lib.persist\n\t\taugmented.read = () => {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(localStorage?.getItem(key) ?? '')?.state\n\t\t\t} catch {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t}\n\n\t\treturn augmented\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\nimport { generateGetFnBase } from './generateGetFnBase'\n\n/**\n * Generates getters for store.get. In the past getters were generated as functions, but I\n * came to the conclusion that it's better and simpler to return the whole state.\n *\n * @param lib Zustand api interface\n */\nexport function generateGetFn<S extends State>(lib: StoreLib<S>) {\n\treturn generateGetFnBase(lib)\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { GetRecord, SetRecord, State, StoreApi, UseRecord } from '../types'\nimport { generateUseFnBase } from './generateUseFnBase'\n\n/**\n * Function that restrict access to the store and store api.\n *\n * @param privateState Property names to be made private like ['foo', 'bar']\n * @param mergedState Final state of the store\n * @param api Returned store API\n * @param lib Zustand api interface\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, api: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\treturn {\n\t\tapi: api.api,\n\t\tset: api.set,\n\t\tuse: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getters = Object.keys(api.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]: (api.use as UseRecord<any>)[key] },\n\t\t\t\t\t\t{}\n\t\t\t\t\t)\n\n\t\t\t\t\treturn Object.assign(generateUseFnBase(lib), getters)\n\t\t\t\t})()\n\t\t\t: api.use,\n\t\tget: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getFn = () =>\n\t\t\t\t\t\tObject.entries(api.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, api.get)\n\t\t\t\t})()\n\t\t\t: api.get,\n\t}\n}\n","import { definePlugin } from '../lib/definePlugin'\n\n/**\n * Basic plugin example, that extends store with custom setter.\n */\nexport const withReset = definePlugin((store) =>\n\tstore.extendSetters(({ api, set }) => ({\n\t\treset: () => {\n\t\t\tset(api.getInitialState?.() ?? {}, true)\n\t\t},\n\t}))\n)\n"],"mappings":"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","names":["definePlugin","fn","devtools","persist","createVanillaStore","shallow","shallow","ErrorStackParser","generateSetterName","stack","index","entry","generateSetFnBase","lib","log","updater","replace","name","current","payload","shallow","generateSetterName","generateSetFn","lib","key","log","setters","generateSetFnBase","value","shallow","state","generateSetterName","identity","arg","pick","obj","keys","acc","k","shallow","useStoreWithEqualityFn","generateUseFnStep","state","getters","path","lib","key","newPath","equalityFn","getFromPath","data","shallow","useStoreWithEqualityFn","generateUseFnBase","lib","selector","identity","equality","shallow","useStoreWithEqualityFn","s","pick","generateUseFn","lib","key","getters","generateUseFnBase","generateUseFnStep","pick","extendByState","builder","api","lib","log","newState","generateUseFn","generateSetFn","shallow","useStoreWithEqualityFn","generateGetFnBase","lib","extendGetters","builder","api","lib","methods","getters","key","args","useStoreWithEqualityFn","shallow","generateUseFnBase","generateGetFnBase","extendSetters","builder","api","lib","log","setters","generateSetFnBase","baseSet","acc","name","func","args","generateApiFn","lib","key","augmentPersist","augmented","generateGetFn","lib","generateGetFnBase","restrictState","privateState","mergedState","api","lib","getters","acc","key","generateUseFnBase","val","config","setGlobalConfig","newConfig","createStore","initialState","options","name","middlewares","initializer","persistId","shouldLog","devtools","persist","storeLib","createVanillaStore","generateApiFn","generateGetFn","generateUseFn","generateSetFn","plugin","builder","extendGetters","extendSetters","extendByState","publicState","restrictState","withReset","store","api","set"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zustand-lite",
3
- "version": "0.6.1",
3
+ "version": "0.7.1",
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",