zustand-lite 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -3
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -1
- package/dist/index.d.ts +13 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -268,6 +268,28 @@ function Component() {
|
|
|
268
268
|
}
|
|
269
269
|
```
|
|
270
270
|
|
|
271
|
+
### Extending state
|
|
272
|
+
|
|
273
|
+
```ts
|
|
274
|
+
const initialState: { rectangle: { a: number; b: number } } = {
|
|
275
|
+
rectangle: { a: 20, b: 10 },
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export const store = createStore(initialState)
|
|
279
|
+
.extendByState({ h: 30 })
|
|
280
|
+
.extendGetters(({ get }) => ({
|
|
281
|
+
volume() {
|
|
282
|
+
return get().rectangle.a * get().rectange.b * get().h
|
|
283
|
+
}
|
|
284
|
+
}))
|
|
285
|
+
|
|
286
|
+
// By default shallow equality is being used.
|
|
287
|
+
function Component() {
|
|
288
|
+
store.set.h(50)
|
|
289
|
+
const rectangle = store.use.volume()
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
271
293
|
### Testing features
|
|
272
294
|
|
|
273
295
|
```ts
|
|
@@ -303,6 +325,9 @@ Creates a typed store with optional plugins and middleware.
|
|
|
303
325
|
|
|
304
326
|
### Chainable Methods
|
|
305
327
|
|
|
328
|
+
- **`.extendByState(fn | object)`**
|
|
329
|
+
Add additional state that can be reused later.
|
|
330
|
+
-
|
|
306
331
|
- **`.extendGetters(fn)`**
|
|
307
332
|
Add additional derived getters based on current state.
|
|
308
333
|
|
|
@@ -388,9 +413,6 @@ You can enable the most useful middlewares:
|
|
|
388
413
|
- Ability to specify equality function for extended getters. It's possible now, but requires to
|
|
389
414
|
import hook from 'zustand' package, which is suboptimal **(available from version 3.0.0 with
|
|
390
415
|
use() function or deep auto-generated selectors. Still no possible for custom getters)**.
|
|
391
|
-
- Extend state option, to add additional state to the store than can be adjusted in setters and
|
|
392
|
-
getters.
|
|
393
|
-
- Higher order automatic devtools messages.
|
|
394
416
|
|
|
395
417
|
## 🧱 Built With
|
|
396
418
|
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var $=Object.create;var p=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var J=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var H=(e,t)=>{for(var r in t)p(e,r,{get:t[r],enumerable:!0})},P=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of K(t))!V.call(e,o)&&o!==r&&p(e,o,{get:()=>t[o],enumerable:!(n=q(t,o))||n.enumerable});return e};var Q=(e,t,r)=>(r=e!=null?$(J(e)):{},P(t||!e||!e.__esModule?p(r,"default",{value:e,enumerable:!0}):r,e)),T=e=>P(p({},"__esModule",{value:!0}),e);var Z={};H(Z,{createStore:()=>z,reset:()=>_,setGlobalConfig:()=>M});module.exports=T(Z);var A=require("zustand/middleware"),v=require("zustand/vanilla");var F=require("zustand/shallow"),O=require("zustand/traditional");function l(e){return()=>e.getState()}var h=require("zustand/shallow"),D=require("zustand/traditional");var B=e=>e,g=(e,t)=>t.reduce((r,n)=>(n in e&&(r[n]=e[n]),r),{});function m(e){return(t=B,r=h.shallow)=>(0,D.useStoreWithEqualityFn)(e,Array.isArray(t)?n=>g(n,t):t??B,r)}function j(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(m(r),t.use,o),t.get=Object.assign(l(r),t.get,n),t}var E=Q(require("error-stack-parser"),1);function c(){let e=E.default.parse(new Error),t=e.findIndex(r=>r.functionName?.includes("_zustandLiteInferName_"));return t-1>=0?e[t-1].functionName:null}function x(e,t){return(r,n,o)=>{e.setState(r,n,t?{type:c()??o??"setState",payload:r}:void 0)}}function N(e,t,r,n){let o=x(r,n),s=Object.entries(e(t)).reduce((i,[a,f])=>(i[a]=function(...d){return f(...d)},i),{});return t.set=Object.assign(o,t.set,s),t}var R=require("zustand/shallow"),U=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=R.shallow)=>(0,U.useStoreWithEqualityFn)(n,a=>X(a,s),i),writable:!0,configurable:!0,enumerable:!0}),L(e[o],t[o],s,n)})}function X(e,t){let r=e;for(let n of t)if(r=r[n],!r)return r;return r}function y(e,t){let r=m(e);return L(g(e.getState(),t),r,[],e),r}function b(e,t,r){let n=x(e,r);return t.forEach(o=>{n[o]=s=>{e.getState()[o]!==s&&e.setState(i=>({...i,[o]:s}),!1,r?{type:c()??o,payload:{[o]:s}}:void 0)}}),n}function w(e,t,r,n){let o=typeof e=="function"?e(t):e;return t.set(o),t.use={...t.use,...y(r,Object.keys(o))},t.set={...t.set,...b(r,Object.keys(o),n)},t}function W(e){return{getInitialState:e.getInitialState,getState:e.getState,persist:Y(e),setState:e.setState,subscribe:e.subscribe}}function Y(e){if("persist"in e){let t=e.persist;return t.read=()=>{try{return JSON.parse(localStorage?.getItem(t.name)??"")?.state}catch{return}},t}}function C(e){return l(e)}function I(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(m(n),o)})():r.use,get:e?Object.assign(()=>Object.entries(r.get()).reduce((s,[i,a])=>t[i]&&e.includes(i)?s:{...s,[i]:a},{}),r.get):r.get}}var u={appName:"zustand-lite",devtools:!1};function M(e){u={...u,...e}}function z(e,t){let{name:r="zustand-lite",plugins:n=[],middlewares:o={}}=t??{},s=e;n.forEach(S=>{S.creates&&(s={...s,...S.creates()})});let i=()=>s;(o.devtools||u.devtools)&&(i=(0,A.devtools)(i,o.devtools===!0||u.devtools&&!o.devtools?{name:u.appName,store:r}:{name:u.appName,store:r,...o.devtools})),o.persist&&(i=(0,A.persist)(i,o.persist===!0?{name:`${u.appName.replace(/\s/,"-")}.${r}`}:{name:`${u.appName.replace(/\s/,"-")}.${r}`,...o.persist}));let a=(0,v.createStore)(i),f=!!o.devtools,G={api:W(a),get:C(a),use:y(a,Object.keys(s)),set:b(a,Object.keys(s),f),extendGetters(S){return j(S,this,a)},extendSetters(S){return N(S,this,a,f)},extendByState(S){return w(S,this,a,f)},restrictState(S=[]){return I(S,s,this,a)}},d=G;return n.forEach(S=>{S.extends&&(d=S.extends(G))}),d}var _={extends:e=>e.extendSetters(({api:t,set:r})=>({reset:()=>{r(t.getInitialState?.()??{},!0)}}))};0&&(module.exports={createStore,reset,setGlobalConfig});
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -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/lib/generateSetFn.ts","../src/lib/extendSetters.ts","../src/lib/generateApi.ts","../src/lib/generateGet.ts","../src/lib/generateSet.ts","../src/lib/generateUseStep.ts","../src/lib/generateUse.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 *\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\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 { 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', devtools: 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\tif (middlewares.devtools || config.devtools) {\n\t\tinitializer = devtools(\n\t\t\tinitializer,\n\t\t\tmiddlewares.devtools === true || (config.devtools && !middlewares.devtools)\n\t\t\t\t? { name: config.appName, store: name }\n\t\t\t\t: { name: config.appName, store: name, ...middlewares.devtools }\n\t\t)\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(\n\t\t\tinitializer,\n\t\t\tmiddlewares.persist === true\n\t\t\t\t? { name: `${config.appName.replace(/\\s/, '-')}.${name}` }\n\t\t\t\t: { name: `${config.appName.replace(/\\s/, '-')}.${name}`, ...middlewares.persist }\n\t\t)\n\t}\n\n\t// Create a vanilla zustand store to wrap.\n\tconst storeLib: any = createVanillaStore(initializer)\n\n\t// Create zustand-lite wrapper.\n\tconst storeApi: any = {\n\t\tapi: generateApi(storeLib),\n\t\tget: generateGet(storeLib),\n\t\tuse: generateUse(storeLib),\n\t\tset: generateSet(storeLib, !!middlewares.devtools),\n\t\textendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendGetters(builder, this, storeLib)\n\t\t},\n\t\textendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendSetters(builder, this, storeLib, !!middlewares.devtools)\n\t\t},\n\t\trestrictState(publicState = []) {\n\t\t\treturn restrictState(publicState, mergedState, this, storeLib)\n\t\t},\n\t}\n\n\t// Extend store getters and setters with plugins.\n\tlet result = storeApi\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.extends) {\n\t\t\tresult = plugin.extends(storeApi)\n\t\t}\n\t})\n\n\treturn result\n}\n","import { 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, store: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\tconst methods: any = builder({ get: store.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\tstore.use = Object.assign(generateUseFn(lib), store.use, getters)\n\tstore.get = Object.assign(generateGetFn(lib), store.get, methods)\n\treturn store\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\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, EqualityChecker } from '../types'\n\n/**\n * Generates automatic getters like store.use.foo()\n * @param lib Zustand api interface\n */\nexport function generateUseFn<S extends State, U>(lib: StoreLib<S>) {\n\treturn (selector: (state: S) => U, equality: EqualityChecker<U> = shallow) => {\n\t\treturn useStoreWithEqualityFn(lib, selector, equality)\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\nimport ErrorStackParser from 'error-stack-parser'\n\n/**\n * Generates automatic setState function for store like store.set({ value })\n * @param lib Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateSetFn<S extends State>(lib: StoreLib<S>, hasDevtools: boolean) {\n\treturn (updater: S | ((state: S) => S), replace?: boolean, name?: string) => {\n\t\tlib.setState(\n\t\t\tupdater,\n\t\t\treplace,\n\t\t\t// @ts-ignore Additional parameter will have no effect even if devtools are disabled.\n\t\t\thasDevtools ? { type: name ?? 'setState', payload: updater } : undefined\n\t\t)\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\nimport { Default, SettersBuilder, State, StoreApi } from '../types'\nimport { generateSetFn } from './generateSetFn'\n\nexport function extendSetters<\n\tBuilder extends SettersBuilder<S, Getters, Setters>,\n\tS extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, store: StoreApi<S, Getters, Setters>, lib: StoreLib<S>, hasDevtools: boolean) {\n\tconst setters = generateSetFn(lib, hasDevtools)\n\tconst baseSet = Object.entries(builder(store)).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\tstore.set = Object.assign(setters, store.set, baseSet)\n\treturn store\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 */\nexport function generateApi<S extends State>(lib: StoreLib<S>) {\n\treturn {\n\t\tgetInitialState: lib.getInitialState,\n\t\tgetState: lib.getState,\n\t\tpersist: augmentPersist(lib),\n\t\tsetState: lib.setState,\n\t\tsubscribe: lib.subscribe,\n\t}\n}\n\nfunction augmentPersist<S extends State>(lib: StoreLib<S>) {\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(augmented.name) ?? '')?.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 { SetRecord, State } from '../types'\nimport { generateSetFn } from './generateSetFn'\nimport 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 */\nfunction getSetterName() {\n\t// Proper setter name should hide at 2nd position in the normalized stack.\n\tconst stack = ErrorStackParser.parse(new Error())\n\treturn stack[3].functionName?.includes('_zustandLiteInferName_') ? stack[2].functionName : null\n}\n\n/**\n * Generates automatic setters like store.set.foo(value)\n * @param lib Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateSet<S extends State>(lib: StoreLib<S>, hasDevtools: boolean) {\n\tconst setters: any = generateSetFn(lib, hasDevtools)\n\n\tObject.keys(lib.getState()).forEach((key) => {\n\t\tsetters[key] = (value: any) => {\n\t\t\tif (lib.getState()[key] === value) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlib.setState(\n\t\t\t\t(state) => ({ ...state, [key]: value }),\n\t\t\t\tfalse,\n\t\t\t\t// @ts-ignore Additional parameter will have no effect even if devtools are disabled.\n\t\t\t\thasDevtools\n\t\t\t\t\t? { type: getSetterName() ?? key, payload: { [key]: value } }\n\t\t\t\t\t: undefined\n\t\t\t)\n\t\t}\n\t})\n\n\treturn setters as SetRecord<S>\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\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'\n\n/**\n * Generates automatic store hook subscribe function store.use()\n * @param lib Zustand api interface\n */\nexport function generateUse<S extends State>(lib: StoreLib<S>) {\n\tconst getters = generateUseFn(lib)\n\tgenerateUseStep(lib.getState(), getters, [], lib)\n\treturn getters\n}\n","import { 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 store 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, store: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\treturn {\n\t\tapi: store.api,\n\t\tset: store.set,\n\t\tuse: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getters = Object.keys(store.use).reduce(\n\t\t\t\t\t\t(acc, key) =>\n\t\t\t\t\t\t\tmergedState[key] && (privateState as string[]).includes(key)\n\t\t\t\t\t\t\t\t? acc\n\t\t\t\t\t\t\t\t: { ...acc, [key]: (store.use 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: store.use,\n\t\tget: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getFn = () =>\n\t\t\t\t\t\tObject.entries(store.get()).reduce(\n\t\t\t\t\t\t\t(acc, [key, val]) =>\n\t\t\t\t\t\t\t\tmergedState[key] && (privateState as string[]).includes(key)\n\t\t\t\t\t\t\t\t\t? acc\n\t\t\t\t\t\t\t\t\t: { ...acc, [key]: val },\n\t\t\t\t\t\t\t{}\n\t\t\t\t\t\t)\n\n\t\t\t\t\treturn Object.assign(getFn, store.get)\n\t\t\t\t})()\n\t\t\t: store.get,\n\t}\n}\n","import { StoreApiPlugin } from '../types'\n\ntype PluginResetSetters = { reset: () => void }\n\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","generateUseFn","lib","selector","equality","extendGetters","builder","store","lib","methods","getters","key","args","generateUseFn","generateGetFn","generateSetFn","lib","hasDevtools","updater","replace","name","extendSetters","builder","store","lib","hasDevtools","setters","generateSetFn","baseSet","acc","name","func","args","generateApi","lib","augmentPersist","augmented","generateGet","lib","generateGetFn","import_error_stack_parser","getSetterName","stack","ErrorStackParser","generateSet","lib","hasDevtools","setters","generateSetFn","key","value","state","import_shallow","import_traditional","generateUseStep","state","getters","path","lib","key","newPath","equalityFn","getFromPath","data","generateUse","lib","getters","generateUseFn","generateUseStep","restrictState","privateState","mergedState","store","lib","getters","acc","key","generateUseFn","val","config","setGlobalConfig","newConfig","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","storeLib","createVanillaStore","storeApi","generateApi","generateGet","generateUse","generateSet","builder","extendGetters","extendSetters","publicState","restrictState","result","reset","store","api","set"]}
|
|
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/generateSetterName.ts","../src/lib/generateSetFn.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', devtools: 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\tif (middlewares.devtools || config.devtools) {\n\t\tinitializer = devtools(\n\t\t\tinitializer,\n\t\t\tmiddlewares.devtools === true || (config.devtools && !middlewares.devtools)\n\t\t\t\t? { name: config.appName, store: name }\n\t\t\t\t: { name: config.appName, store: name, ...middlewares.devtools }\n\t\t)\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(\n\t\t\tinitializer,\n\t\t\tmiddlewares.persist === true\n\t\t\t\t? { name: `${config.appName.replace(/\\s/, '-')}.${name}` }\n\t\t\t\t: { name: `${config.appName.replace(/\\s/, '-')}.${name}`, ...middlewares.persist }\n\t\t)\n\t}\n\n\t// Create a vanilla zustand store to wrap.\n\tconst storeLib: any = createVanillaStore(initializer)\n\tconst isLogger = !!middlewares.devtools\n\n\t// Create zustand-lite wrapper.\n\tconst storeApi: any = {\n\t\tapi: generateApi(storeLib),\n\t\tget: generateGet(storeLib),\n\t\tuse: generateUse(storeLib, Object.keys(mergedState)),\n\t\tset: generateSet(storeLib, Object.keys(mergedState), isLogger),\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, isLogger)\n\t\t},\n\t\textendByState<Builder extends ByStateBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendByState(builder, this, storeLib, isLogger)\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 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'\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\tlib.setState(\n\t\t\tupdater,\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: updater } : undefined\n\t\t)\n\t}\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 { 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 (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 */\nexport function generateApi<S extends State>(lib: StoreLib<S>) {\n\treturn {\n\t\tgetInitialState: lib.getInitialState,\n\t\tgetState: lib.getState,\n\t\tpersist: augmentPersist(lib),\n\t\tsetState: lib.setState,\n\t\tsubscribe: lib.subscribe,\n\t}\n}\n\nfunction augmentPersist<S extends State>(lib: StoreLib<S>) {\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(augmented.name) ?? '')?.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_error_stack_parser","generateSetterName","stack","ErrorStackParser","index","entry","generateSetFn","lib","log","updater","replace","name","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","generateSet","lib","key","log","setters","generateSetFn","value","state","generateSetterName","extendByState","builder","api","lib","log","newState","generateUse","generateSet","generateApi","lib","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","storeLib","createVanillaStore","isLogger","storeApi","generateApi","generateGet","generateUse","generateSet","builder","extendGetters","extendSetters","extendByState","publicState","restrictState","result","reset","store","api","set"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -22,6 +22,8 @@ type StoreApi<S extends State = Empty, Getters = Default, Setters = Default, Ext
|
|
|
22
22
|
use: OverrideUse<UseRecord<S>, Getters, S>;
|
|
23
23
|
extendGetters<Builder extends GettersBuilder<S, Getters>>(builder: Builder): StoreApi<S, OverrideGet<Getters, ReturnType<Builder>, S>, Setters, ExtraMW>;
|
|
24
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>;
|
|
25
27
|
restrictState(): StoreApiEncapsulated<S, Getters, Setters, ExtraMW>;
|
|
26
28
|
restrictState<Key extends keyof S>(publicState: Key[]): StoreApiEncapsulated<Omit<S, Key>, Getters, Setters, ExtraMW>;
|
|
27
29
|
};
|
|
@@ -33,13 +35,23 @@ type SettersBuilder<S extends State, Getters = Default, Setters = Default> = (ar
|
|
|
33
35
|
get: OverrideGet<GetRecord<S>, Getters, S>;
|
|
34
36
|
set: OverrideSet<SetRecord<S>, Setters, S>;
|
|
35
37
|
}) => Record<string, (...args: any[]) => void>;
|
|
38
|
+
type ByStateBuilder<S extends State, Getters = Default, Setters = Default> = (args: {
|
|
39
|
+
api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
|
|
40
|
+
get: OverrideGet<GetRecord<S>, Getters, S>;
|
|
41
|
+
set: OverrideSet<SetRecord<S>, Setters, S>;
|
|
42
|
+
use: OverrideUse<UseRecord<S>, Getters, S>;
|
|
43
|
+
}) => Partial<S>;
|
|
36
44
|
type GetRecordBase<S extends Record<string, any>> = () => S;
|
|
37
45
|
type GetRecord<S extends Record<string, any>> = GetRecordBase<S>;
|
|
38
46
|
type SetRecordBase<S extends Record<string, any>> = StoreApi$1<S>['setState'];
|
|
39
47
|
type SetRecord<S extends Record<string, any>> = SetRecordBase<S> & {
|
|
40
48
|
[K in keyof S]-?: (value: S[K]) => void;
|
|
41
49
|
};
|
|
42
|
-
type UseRecordBase<S> =
|
|
50
|
+
type UseRecordBase<S> = {
|
|
51
|
+
<K extends readonly (keyof S)[]>(selector: K, equality?: EqualityChecker<Pick<S, K[number]>>): Pick<S, K[number]>;
|
|
52
|
+
<R>(selector: (state: S) => R, equality?: EqualityChecker<R>): R;
|
|
53
|
+
(selector?: undefined, equality?: EqualityChecker<S>): S;
|
|
54
|
+
};
|
|
43
55
|
type UseRecord<S> = UseRecordDeep<S> & UseRecordBase<S>;
|
|
44
56
|
type UseRecordDeep<S> = {
|
|
45
57
|
[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];
|
package/dist/index.d.ts
CHANGED
|
@@ -22,6 +22,8 @@ type StoreApi<S extends State = Empty, Getters = Default, Setters = Default, Ext
|
|
|
22
22
|
use: OverrideUse<UseRecord<S>, Getters, S>;
|
|
23
23
|
extendGetters<Builder extends GettersBuilder<S, Getters>>(builder: Builder): StoreApi<S, OverrideGet<Getters, ReturnType<Builder>, S>, Setters, ExtraMW>;
|
|
24
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>;
|
|
25
27
|
restrictState(): StoreApiEncapsulated<S, Getters, Setters, ExtraMW>;
|
|
26
28
|
restrictState<Key extends keyof S>(publicState: Key[]): StoreApiEncapsulated<Omit<S, Key>, Getters, Setters, ExtraMW>;
|
|
27
29
|
};
|
|
@@ -33,13 +35,23 @@ type SettersBuilder<S extends State, Getters = Default, Setters = Default> = (ar
|
|
|
33
35
|
get: OverrideGet<GetRecord<S>, Getters, S>;
|
|
34
36
|
set: OverrideSet<SetRecord<S>, Setters, S>;
|
|
35
37
|
}) => Record<string, (...args: any[]) => void>;
|
|
38
|
+
type ByStateBuilder<S extends State, Getters = Default, Setters = Default> = (args: {
|
|
39
|
+
api: Omit<StoreApi$1<S>, 'setState' | 'getState'>;
|
|
40
|
+
get: OverrideGet<GetRecord<S>, Getters, S>;
|
|
41
|
+
set: OverrideSet<SetRecord<S>, Setters, S>;
|
|
42
|
+
use: OverrideUse<UseRecord<S>, Getters, S>;
|
|
43
|
+
}) => Partial<S>;
|
|
36
44
|
type GetRecordBase<S extends Record<string, any>> = () => S;
|
|
37
45
|
type GetRecord<S extends Record<string, any>> = GetRecordBase<S>;
|
|
38
46
|
type SetRecordBase<S extends Record<string, any>> = StoreApi$1<S>['setState'];
|
|
39
47
|
type SetRecord<S extends Record<string, any>> = SetRecordBase<S> & {
|
|
40
48
|
[K in keyof S]-?: (value: S[K]) => void;
|
|
41
49
|
};
|
|
42
|
-
type UseRecordBase<S> =
|
|
50
|
+
type UseRecordBase<S> = {
|
|
51
|
+
<K extends readonly (keyof S)[]>(selector: K, equality?: EqualityChecker<Pick<S, K[number]>>): Pick<S, K[number]>;
|
|
52
|
+
<R>(selector: (state: S) => R, equality?: EqualityChecker<R>): R;
|
|
53
|
+
(selector?: undefined, equality?: EqualityChecker<S>): S;
|
|
54
|
+
};
|
|
43
55
|
type UseRecord<S> = UseRecordDeep<S> & UseRecordBase<S>;
|
|
44
56
|
type UseRecordDeep<S> = {
|
|
45
57
|
[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];
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{devtools as
|
|
1
|
+
import{devtools as I,persist as v}from"zustand/middleware";import{createStore as M}from"zustand/vanilla";import{shallow as E}from"zustand/shallow";import{useStoreWithEqualityFn as N}from"zustand/traditional";function p(e){return()=>e.getState()}import{shallow as O}from"zustand/shallow";import{useStoreWithEqualityFn as j}from"zustand/traditional";var A=e=>e,l=(e,t)=>t.reduce((r,n)=>(n in e&&(r[n]=e[n]),r),{});function m(e){return(t=A,r=O)=>j(e,Array.isArray(t)?n=>l(n,t):t??A,r)}function B(e,t,r){let n=e({get:t.get}),o={};return Object.keys(n).forEach(s=>{o[s]=(...i)=>N(r,()=>n[s](...i),E)}),t.use=Object.assign(m(r),t.use,o),t.get=Object.assign(p(r),t.get,n),t}import R from"error-stack-parser";function g(){let e=R.parse(new Error),t=e.findIndex(r=>r.functionName?.includes("_zustandLiteInferName_"));return t-1>=0?e[t-1].functionName:null}function c(e,t){return(r,n,o)=>{e.setState(r,n,t?{type:g()??o??"setState",payload:r}:void 0)}}function L(e,t,r,n){let o=c(r,n),s=Object.entries(e(t)).reduce((i,[a,f])=>(i[a]=function(...d){return f(...d)},i),{});return t.set=Object.assign(o,t.set,s),t}import{shallow as U}from"zustand/shallow";import{useStoreWithEqualityFn as w}from"zustand/traditional";function G(e,t,r,n){typeof e=="object"&&e!==null&&Object.keys(e).forEach(o=>{let s=[...r,o];Object.defineProperty(t,o,{value:(i=U)=>w(n,a=>W(a,s),i),writable:!0,configurable:!0,enumerable:!0}),G(e[o],t[o],s,n)})}function W(e,t){let r=e;for(let n of t)if(r=r[n],!r)return r;return r}function x(e,t){let r=m(e);return G(l(e.getState(),t),r,[],e),r}function y(e,t,r){let n=c(e,r);return t.forEach(o=>{n[o]=s=>{e.getState()[o]!==s&&e.setState(i=>({...i,[o]:s}),!1,r?{type:g()??o,payload:{[o]:s}}:void 0)}}),n}function P(e,t,r,n){let o=typeof e=="function"?e(t):e;return t.set(o),t.use={...t.use,...x(r,Object.keys(o))},t.set={...t.set,...y(r,Object.keys(o),n)},t}function h(e){return{getInitialState:e.getInitialState,getState:e.getState,persist:C(e),setState:e.setState,subscribe:e.subscribe}}function C(e){if("persist"in e){let t=e.persist;return t.read=()=>{try{return JSON.parse(localStorage?.getItem(t.name)??"")?.state}catch{return}},t}}function D(e){return p(e)}function F(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(m(n),o)})():r.use,get:e?Object.assign(()=>Object.entries(r.get()).reduce((s,[i,a])=>t[i]&&e.includes(i)?s:{...s,[i]:a},{}),r.get):r.get}}var u={appName:"zustand-lite",devtools:!1};function z(e){u={...u,...e}}function _(e,t){let{name:r="zustand-lite",plugins:n=[],middlewares:o={}}=t??{},s=e;n.forEach(S=>{S.creates&&(s={...s,...S.creates()})});let i=()=>s;(o.devtools||u.devtools)&&(i=I(i,o.devtools===!0||u.devtools&&!o.devtools?{name:u.appName,store:r}:{name:u.appName,store:r,...o.devtools})),o.persist&&(i=v(i,o.persist===!0?{name:`${u.appName.replace(/\s/,"-")}.${r}`}:{name:`${u.appName.replace(/\s/,"-")}.${r}`,...o.persist}));let a=M(i),f=!!o.devtools,b={api:h(a),get:D(a),use:x(a,Object.keys(s)),set:y(a,Object.keys(s),f),extendGetters(S){return B(S,this,a)},extendSetters(S){return L(S,this,a,f)},extendByState(S){return P(S,this,a,f)},restrictState(S=[]){return F(S,s,this,a)}},d=b;return n.forEach(S=>{S.extends&&(d=S.extends(b))}),d}var $={extends:e=>e.extendSetters(({api:t,set:r})=>({reset:()=>{r(t.getInitialState?.()??{},!0)}}))};export{_ as createStore,$ as reset,z as setGlobalConfig};
|
|
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/lib/generateSetFn.ts","../src/lib/extendSetters.ts","../src/lib/generateApi.ts","../src/lib/generateGet.ts","../src/lib/generateSet.ts","../src/lib/generateUseStep.ts","../src/lib/generateUse.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 *\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\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 { 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', devtools: 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\tif (middlewares.devtools || config.devtools) {\n\t\tinitializer = devtools(\n\t\t\tinitializer,\n\t\t\tmiddlewares.devtools === true || (config.devtools && !middlewares.devtools)\n\t\t\t\t? { name: config.appName, store: name }\n\t\t\t\t: { name: config.appName, store: name, ...middlewares.devtools }\n\t\t)\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(\n\t\t\tinitializer,\n\t\t\tmiddlewares.persist === true\n\t\t\t\t? { name: `${config.appName.replace(/\\s/, '-')}.${name}` }\n\t\t\t\t: { name: `${config.appName.replace(/\\s/, '-')}.${name}`, ...middlewares.persist }\n\t\t)\n\t}\n\n\t// Create a vanilla zustand store to wrap.\n\tconst storeLib: any = createVanillaStore(initializer)\n\n\t// Create zustand-lite wrapper.\n\tconst storeApi: any = {\n\t\tapi: generateApi(storeLib),\n\t\tget: generateGet(storeLib),\n\t\tuse: generateUse(storeLib),\n\t\tset: generateSet(storeLib, !!middlewares.devtools),\n\t\textendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendGetters(builder, this, storeLib)\n\t\t},\n\t\textendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendSetters(builder, this, storeLib, !!middlewares.devtools)\n\t\t},\n\t\trestrictState(publicState = []) {\n\t\t\treturn restrictState(publicState, mergedState, this, storeLib)\n\t\t},\n\t}\n\n\t// Extend store getters and setters with plugins.\n\tlet result = storeApi\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.extends) {\n\t\t\tresult = plugin.extends(storeApi)\n\t\t}\n\t})\n\n\treturn result\n}\n","import { 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, store: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\tconst methods: any = builder({ get: store.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\tstore.use = Object.assign(generateUseFn(lib), store.use, getters)\n\tstore.get = Object.assign(generateGetFn(lib), store.get, methods)\n\treturn store\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\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, EqualityChecker } from '../types'\n\n/**\n * Generates automatic getters like store.use.foo()\n * @param lib Zustand api interface\n */\nexport function generateUseFn<S extends State, U>(lib: StoreLib<S>) {\n\treturn (selector: (state: S) => U, equality: EqualityChecker<U> = shallow) => {\n\t\treturn useStoreWithEqualityFn(lib, selector, equality)\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\nimport ErrorStackParser from 'error-stack-parser'\n\n/**\n * Generates automatic setState function for store like store.set({ value })\n * @param lib Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateSetFn<S extends State>(lib: StoreLib<S>, hasDevtools: boolean) {\n\treturn (updater: S | ((state: S) => S), replace?: boolean, name?: string) => {\n\t\tlib.setState(\n\t\t\tupdater,\n\t\t\treplace,\n\t\t\t// @ts-ignore Additional parameter will have no effect even if devtools are disabled.\n\t\t\thasDevtools ? { type: name ?? 'setState', payload: updater } : undefined\n\t\t)\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\nimport { Default, SettersBuilder, State, StoreApi } from '../types'\nimport { generateSetFn } from './generateSetFn'\n\nexport function extendSetters<\n\tBuilder extends SettersBuilder<S, Getters, Setters>,\n\tS extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, store: StoreApi<S, Getters, Setters>, lib: StoreLib<S>, hasDevtools: boolean) {\n\tconst setters = generateSetFn(lib, hasDevtools)\n\tconst baseSet = Object.entries(builder(store)).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\tstore.set = Object.assign(setters, store.set, baseSet)\n\treturn store\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 */\nexport function generateApi<S extends State>(lib: StoreLib<S>) {\n\treturn {\n\t\tgetInitialState: lib.getInitialState,\n\t\tgetState: lib.getState,\n\t\tpersist: augmentPersist(lib),\n\t\tsetState: lib.setState,\n\t\tsubscribe: lib.subscribe,\n\t}\n}\n\nfunction augmentPersist<S extends State>(lib: StoreLib<S>) {\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(augmented.name) ?? '')?.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 { SetRecord, State } from '../types'\nimport { generateSetFn } from './generateSetFn'\nimport 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 */\nfunction getSetterName() {\n\t// Proper setter name should hide at 2nd position in the normalized stack.\n\tconst stack = ErrorStackParser.parse(new Error())\n\treturn stack[3].functionName?.includes('_zustandLiteInferName_') ? stack[2].functionName : null\n}\n\n/**\n * Generates automatic setters like store.set.foo(value)\n * @param lib Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateSet<S extends State>(lib: StoreLib<S>, hasDevtools: boolean) {\n\tconst setters: any = generateSetFn(lib, hasDevtools)\n\n\tObject.keys(lib.getState()).forEach((key) => {\n\t\tsetters[key] = (value: any) => {\n\t\t\tif (lib.getState()[key] === value) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlib.setState(\n\t\t\t\t(state) => ({ ...state, [key]: value }),\n\t\t\t\tfalse,\n\t\t\t\t// @ts-ignore Additional parameter will have no effect even if devtools are disabled.\n\t\t\t\thasDevtools\n\t\t\t\t\t? { type: getSetterName() ?? key, payload: { [key]: value } }\n\t\t\t\t\t: undefined\n\t\t\t)\n\t\t}\n\t})\n\n\treturn setters as SetRecord<S>\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\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'\n\n/**\n * Generates automatic store hook subscribe function store.use()\n * @param lib Zustand api interface\n */\nexport function generateUse<S extends State>(lib: StoreLib<S>) {\n\tconst getters = generateUseFn(lib)\n\tgenerateUseStep(lib.getState(), getters, [], lib)\n\treturn getters\n}\n","import { 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 store 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, store: StoreApi<S, Getters, Setters>, lib: StoreLib<S>) {\n\treturn {\n\t\tapi: store.api,\n\t\tset: store.set,\n\t\tuse: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getters = Object.keys(store.use).reduce(\n\t\t\t\t\t\t(acc, key) =>\n\t\t\t\t\t\t\tmergedState[key] && (privateState as string[]).includes(key)\n\t\t\t\t\t\t\t\t? acc\n\t\t\t\t\t\t\t\t: { ...acc, [key]: (store.use 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: store.use,\n\t\tget: privateState\n\t\t\t? (() => {\n\t\t\t\t\tconst getFn = () =>\n\t\t\t\t\t\tObject.entries(store.get()).reduce(\n\t\t\t\t\t\t\t(acc, [key, val]) =>\n\t\t\t\t\t\t\t\tmergedState[key] && (privateState as string[]).includes(key)\n\t\t\t\t\t\t\t\t\t? acc\n\t\t\t\t\t\t\t\t\t: { ...acc, [key]: val },\n\t\t\t\t\t\t\t{}\n\t\t\t\t\t\t)\n\n\t\t\t\t\treturn Object.assign(getFn, store.get)\n\t\t\t\t})()\n\t\t\t: store.get,\n\t}\n}\n","import { StoreApiPlugin } from '../types'\n\ntype PluginResetSetters = { reset: () => void }\n\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","generateUseFn","lib","selector","equality","extendGetters","builder","store","lib","methods","getters","key","args","useStoreWithEqualityFn","shallow","generateUseFn","generateGetFn","generateSetFn","lib","hasDevtools","updater","replace","name","extendSetters","builder","store","lib","hasDevtools","setters","generateSetFn","baseSet","acc","name","func","args","generateApi","lib","augmentPersist","augmented","generateGet","lib","generateGetFn","ErrorStackParser","getSetterName","stack","generateSet","lib","hasDevtools","setters","generateSetFn","key","value","state","shallow","useStoreWithEqualityFn","generateUseStep","state","getters","path","lib","key","newPath","equalityFn","getFromPath","data","generateUse","lib","getters","generateUseFn","generateUseStep","restrictState","privateState","mergedState","store","lib","getters","acc","key","generateUseFn","val","config","setGlobalConfig","newConfig","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","devtools","persist","storeLib","createVanillaStore","storeApi","generateApi","generateGet","generateUse","generateSet","builder","extendGetters","extendSetters","publicState","restrictState","result","reset","store","api","set"]}
|
|
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/generateSetterName.ts","../src/lib/generateSetFn.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', devtools: 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\tif (middlewares.devtools || config.devtools) {\n\t\tinitializer = devtools(\n\t\t\tinitializer,\n\t\t\tmiddlewares.devtools === true || (config.devtools && !middlewares.devtools)\n\t\t\t\t? { name: config.appName, store: name }\n\t\t\t\t: { name: config.appName, store: name, ...middlewares.devtools }\n\t\t)\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(\n\t\t\tinitializer,\n\t\t\tmiddlewares.persist === true\n\t\t\t\t? { name: `${config.appName.replace(/\\s/, '-')}.${name}` }\n\t\t\t\t: { name: `${config.appName.replace(/\\s/, '-')}.${name}`, ...middlewares.persist }\n\t\t)\n\t}\n\n\t// Create a vanilla zustand store to wrap.\n\tconst storeLib: any = createVanillaStore(initializer)\n\tconst isLogger = !!middlewares.devtools\n\n\t// Create zustand-lite wrapper.\n\tconst storeApi: any = {\n\t\tapi: generateApi(storeLib),\n\t\tget: generateGet(storeLib),\n\t\tuse: generateUse(storeLib, Object.keys(mergedState)),\n\t\tset: generateSet(storeLib, Object.keys(mergedState), isLogger),\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, isLogger)\n\t\t},\n\t\textendByState<Builder extends ByStateBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendByState(builder, this, storeLib, isLogger)\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 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'\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\tlib.setState(\n\t\t\tupdater,\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: updater } : undefined\n\t\t)\n\t}\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 { 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 (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 */\nexport function generateApi<S extends State>(lib: StoreLib<S>) {\n\treturn {\n\t\tgetInitialState: lib.getInitialState,\n\t\tgetState: lib.getState,\n\t\tpersist: augmentPersist(lib),\n\t\tsetState: lib.setState,\n\t\tsubscribe: lib.subscribe,\n\t}\n}\n\nfunction augmentPersist<S extends State>(lib: StoreLib<S>) {\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(augmented.name) ?? '')?.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","ErrorStackParser","generateSetterName","stack","index","entry","generateSetFn","lib","log","updater","replace","name","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","generateSet","lib","key","log","setters","generateSetFn","value","state","generateSetterName","extendByState","builder","api","lib","log","newState","generateUse","generateSet","generateApi","lib","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","devtools","persist","storeLib","createVanillaStore","isLogger","storeApi","generateApi","generateGet","generateUse","generateSet","builder","extendGetters","extendSetters","extendByState","publicState","restrictState","result","reset","store","api","set"]}
|
package/package.json
CHANGED