zustand-lite 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,283 +1,2 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/index.ts
31
- var index_exports = {};
32
- __export(index_exports, {
33
- createStore: () => createStore,
34
- reset: () => reset,
35
- setGlobalConfig: () => setGlobalConfig
36
- });
37
- module.exports = __toCommonJS(index_exports);
38
-
39
- // src/lib/createStore.ts
40
- var import_middleware = require("zustand/middleware");
41
- var import_vanilla = require("zustand/vanilla");
42
-
43
- // src/lib/extendGetters.ts
44
- var import_shallow2 = require("zustand/shallow");
45
- var import_traditional2 = require("zustand/traditional");
46
-
47
- // src/lib/generateGetFn.ts
48
- function generateGetFn(lib) {
49
- return () => lib.getState();
50
- }
51
-
52
- // src/lib/generateUseFn.ts
53
- var import_shallow = require("zustand/shallow");
54
- var import_traditional = require("zustand/traditional");
55
- function generateUseFn(lib) {
56
- return (selector, equality = import_shallow.shallow) => {
57
- return (0, import_traditional.useStoreWithEqualityFn)(lib, selector, equality);
58
- };
59
- }
60
-
61
- // src/lib/extendGetters.ts
62
- function extendGetters(builder, store, lib) {
63
- const methods = builder({ get: store.get });
64
- const getters = {};
65
- Object.keys(methods).forEach((key) => {
66
- getters[key] = (...args) => (0, import_traditional2.useStoreWithEqualityFn)(lib, () => methods[key](...args), import_shallow2.shallow);
67
- });
68
- store.use = Object.assign(generateUseFn(lib), store.use, getters);
69
- store.get = Object.assign(generateGetFn(lib), store.get, methods);
70
- return store;
71
- }
72
-
73
- // src/lib/generateSetFn.ts
74
- function generateSetFn(lib, hasDevtools) {
75
- return (updater, replace, name) => {
76
- lib.setState(
77
- updater,
78
- replace,
79
- // @ts-ignore Additional parameter will have no effect even if devtools are disabled.
80
- hasDevtools ? { type: name ?? "setState", payload: updater } : void 0
81
- );
82
- };
83
- }
84
-
85
- // src/lib/extendSetters.ts
86
- function extendSetters(builder, store, lib, hasDevtools) {
87
- const setters = generateSetFn(lib, hasDevtools);
88
- const baseSet = Object.entries(builder(store)).reduce(
89
- (acc, [name, func]) => {
90
- acc[name] = function _zustandLiteInferName_(...args) {
91
- return func(...args);
92
- };
93
- return acc;
94
- },
95
- {}
96
- );
97
- store.set = Object.assign(setters, store.set, baseSet);
98
- return store;
99
- }
100
-
101
- // src/lib/generateApi.ts
102
- function generateApi(lib) {
103
- return {
104
- getInitialState: lib.getInitialState,
105
- getState: lib.getState,
106
- persist: augmentPersist(lib),
107
- setState: lib.setState,
108
- subscribe: lib.subscribe
109
- };
110
- }
111
- function augmentPersist(lib) {
112
- if ("persist" in lib) {
113
- const augmented = lib.persist;
114
- augmented.read = () => {
115
- try {
116
- return JSON.parse(localStorage?.getItem(augmented.name) ?? "")?.state;
117
- } catch {
118
- return void 0;
119
- }
120
- };
121
- return augmented;
122
- }
123
- }
124
-
125
- // src/lib/generateGet.ts
126
- function generateGet(lib) {
127
- return generateGetFn(lib);
128
- }
129
-
130
- // src/lib/generateSet.ts
131
- var import_error_stack_parser = __toESM(require("error-stack-parser"), 1);
132
- function getSetterName() {
133
- const stack = import_error_stack_parser.default.parse(new Error());
134
- return stack[3].functionName?.includes("_zustandLiteInferName_") ? stack[2].functionName : null;
135
- }
136
- function generateSet(lib, hasDevtools) {
137
- const setters = generateSetFn(lib, hasDevtools);
138
- Object.keys(lib.getState()).forEach((key) => {
139
- setters[key] = (value) => {
140
- if (lib.getState()[key] === value) {
141
- return;
142
- }
143
- lib.setState(
144
- (state) => ({ ...state, [key]: value }),
145
- false,
146
- // @ts-ignore Additional parameter will have no effect even if devtools are disabled.
147
- hasDevtools ? { type: getSetterName() ?? key, payload: { [key]: value } } : void 0
148
- );
149
- };
150
- });
151
- return setters;
152
- }
153
-
154
- // src/lib/generateUseStep.ts
155
- var import_shallow3 = require("zustand/shallow");
156
- var import_traditional3 = require("zustand/traditional");
157
- function generateUseStep(state, getters, path, lib) {
158
- if (typeof state === "object" && state !== null) {
159
- Object.keys(state).forEach((key) => {
160
- const newPath = [...path, key];
161
- Object.defineProperty(getters, key, {
162
- value: (equalityFn = import_shallow3.shallow) => {
163
- return (0, import_traditional3.useStoreWithEqualityFn)(
164
- lib,
165
- (state2) => getFromPath(state2, newPath),
166
- equalityFn
167
- );
168
- },
169
- writable: true,
170
- configurable: true,
171
- enumerable: true
172
- });
173
- generateUseStep(state[key], getters[key], newPath, lib);
174
- });
175
- }
176
- }
177
- function getFromPath(state, path) {
178
- let data = state;
179
- for (const key of path) {
180
- data = data[key];
181
- if (!data) {
182
- return data;
183
- }
184
- }
185
- return data;
186
- }
187
-
188
- // src/lib/generateUse.ts
189
- function generateUse(lib) {
190
- const getters = generateUseFn(lib);
191
- generateUseStep(lib.getState(), getters, [], lib);
192
- return getters;
193
- }
194
-
195
- // src/lib/restrictState.ts
196
- function restrictState(privateState, mergedState, store, lib) {
197
- return {
198
- api: store.api,
199
- set: store.set,
200
- use: privateState ? (() => {
201
- const getters = Object.keys(store.use).reduce(
202
- (acc, key) => mergedState[key] && privateState.includes(key) ? acc : { ...acc, [key]: store.use[key] },
203
- {}
204
- );
205
- return Object.assign(generateUseFn(lib), getters);
206
- })() : store.use,
207
- get: privateState ? (() => {
208
- const getFn = () => Object.entries(store.get()).reduce(
209
- (acc, [key, val]) => mergedState[key] && privateState.includes(key) ? acc : { ...acc, [key]: val },
210
- {}
211
- );
212
- return Object.assign(getFn, store.get);
213
- })() : store.get
214
- };
215
- }
216
-
217
- // src/lib/createStore.ts
218
- var config = { appName: "zustand-lite", devtools: false };
219
- function setGlobalConfig(newConfig) {
220
- config = { ...config, ...newConfig };
221
- }
222
- function createStore(initialState, options) {
223
- const { name = "zustand-lite", plugins = [], middlewares = {} } = options ?? {};
224
- let mergedState = initialState;
225
- plugins.forEach((plugin) => {
226
- if (plugin.creates) {
227
- mergedState = { ...mergedState, ...plugin.creates() };
228
- }
229
- });
230
- let initializer = () => mergedState;
231
- if (middlewares.devtools || config.devtools) {
232
- initializer = (0, import_middleware.devtools)(
233
- initializer,
234
- middlewares.devtools === true || config.devtools && !middlewares.devtools ? { name: config.appName, store: name } : { name: config.appName, store: name, ...middlewares.devtools }
235
- );
236
- }
237
- if (middlewares.persist) {
238
- initializer = (0, import_middleware.persist)(
239
- initializer,
240
- middlewares.persist === true ? { name: `${config.appName.replace(/\s/, "-")}.${name}` } : { name: `${config.appName.replace(/\s/, "-")}.${name}`, ...middlewares.persist }
241
- );
242
- }
243
- const storeLib = (0, import_vanilla.createStore)(initializer);
244
- const storeApi = {
245
- api: generateApi(storeLib),
246
- get: generateGet(storeLib),
247
- use: generateUse(storeLib),
248
- set: generateSet(storeLib, !!middlewares.devtools),
249
- extendGetters(builder) {
250
- return extendGetters(builder, this, storeLib);
251
- },
252
- extendSetters(builder) {
253
- return extendSetters(builder, this, storeLib, !!middlewares.devtools);
254
- },
255
- restrictState(publicState = []) {
256
- return restrictState(publicState, mergedState, this, storeLib);
257
- }
258
- };
259
- let result = storeApi;
260
- plugins.forEach((plugin) => {
261
- if (plugin.extends) {
262
- result = plugin.extends(storeApi);
263
- }
264
- });
265
- return result;
266
- }
267
-
268
- // src/plugins/reset.ts
269
- var reset = {
270
- extends: (store) => {
271
- return store.extendSetters(({ api, set }) => ({
272
- reset: () => {
273
- set(api.getInitialState?.() ?? {}, true);
274
- }
275
- }));
276
- }
277
- };
278
- // Annotate the CommonJS export names for ESM import in node:
279
- 0 && (module.exports = {
280
- createStore,
281
- reset,
282
- setGlobalConfig
283
- });
1
+ "use strict";var v=Object.create;var f=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var _=(e,t)=>{for(var r in t)f(e,r,{get:t[r],enumerable:!0})},b=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of M(t))!z.call(e,o)&&o!==r&&f(e,o,{get:()=>t[o],enumerable:!(n=I(t,o))||n.enumerable});return e};var $=(e,t,r)=>(r=e!=null?v(q(e)):{},b(t||!e||!e.__esModule?f(r,"default",{value:e,enumerable:!0}):r,e)),K=e=>b(f({},"__esModule",{value:!0}),e);var Q={};_(Q,{createStore:()=>W,reset:()=>w,setGlobalConfig:()=>C});module.exports=K(Q);var g=require("zustand/middleware"),R=require("zustand/vanilla");var G=require("zustand/shallow"),L=require("zustand/traditional");function d(e){return()=>e.getState()}var A=require("zustand/shallow"),y=require("zustand/traditional");function m(e){return(t,r=A.shallow)=>(0,y.useStoreWithEqualityFn)(e,t,r)}function P(e,t,r){let n=e({get:t.get}),o={};return Object.keys(n).forEach(i=>{o[i]=(...s)=>(0,L.useStoreWithEqualityFn)(r,()=>n[i](...s),G.shallow)}),t.use=Object.assign(m(r),t.use,o),t.get=Object.assign(d(r),t.get,n),t}function l(e,t){return(r,n,o)=>{e.setState(r,n,t?{type:o??"setState",payload:r}:void 0)}}function h(e,t,r,n){let o=l(r,n),i=Object.entries(e(t)).reduce((s,[a,p])=>(s[a]=function(...S){return p(...S)},s),{});return t.set=Object.assign(o,t.set,i),t}function E(e){return{getInitialState:e.getInitialState,getState:e.getState,persist:J(e),setState:e.setState,subscribe:e.subscribe}}function J(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 B(e){return d(e)}var F=$(require("error-stack-parser"),1);function V(){let e=F.default.parse(new Error);return e[3].functionName?.includes("_zustandLiteInferName_")?e[2].functionName:null}function j(e,t){let r=l(e,t);return Object.keys(e.getState()).forEach(n=>{r[n]=o=>{e.getState()[n]!==o&&e.setState(i=>({...i,[n]:o}),!1,t?{type:V()??n,payload:{[n]:o}}:void 0)}}),r}var O=require("zustand/shallow"),U=require("zustand/traditional");function x(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,U.useStoreWithEqualityFn)(n,a=>H(a,i),s),writable:!0,configurable:!0,enumerable:!0}),x(e[o],t[o],i,n)})}function H(e,t){let r=e;for(let n of t)if(r=r[n],!r)return r;return r}function D(e){let t=m(e);return x(e.getState(),t,[],e),t}function N(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 u={appName:"zustand-lite",devtools:!1};function C(e){u={...u,...e}}function W(e,t){let{name:r="zustand-lite",plugins:n=[],middlewares:o={}}=t??{},i=e;n.forEach(S=>{S.creates&&(i={...i,...S.creates()})});let s=()=>i;(o.devtools||u.devtools)&&(s=(0,g.devtools)(s,o.devtools===!0||u.devtools&&!o.devtools?{name:u.appName,store:r}:{name:u.appName,store:r,...o.devtools})),o.persist&&(s=(0,g.persist)(s,o.persist===!0?{name:`${u.appName.replace(/\s/,"-")}.${r}`}:{name:`${u.appName.replace(/\s/,"-")}.${r}`,...o.persist}));let a=(0,R.createStore)(s),p={api:E(a),get:B(a),use:D(a),set:j(a,!!o.devtools),extendGetters(S){return P(S,this,a)},extendSetters(S){return h(S,this,a,!!o.devtools)},restrictState(S=[]){return N(S,i,this,a)}},c=p;return n.forEach(S=>{S.extends&&(c=S.extends(p))}),c}var w={extends:e=>e.extendSetters(({api:t,set:r})=>({reset:()=>{r(t.getInitialState?.()??{},!0)}}))};0&&(module.exports={createStore,reset,setGlobalConfig});
2
+ //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/createStore.ts","../src/lib/generateApi.ts","../src/lib/generateGetFn.ts","../src/lib/generateGet.ts","../src/lib/generateSetFn.ts","../src/lib/generateSet.ts","../src/lib/generateUseStep.ts","../src/lib/generateUseFn.ts","../src/lib/generateUse.ts","../src/lib/extendGetters.ts","../src/lib/extendSetters.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["export type { StoreApiPlugin } from './types'\nexport { createStore } from './lib/createStore'\nexport { reset } from './plugins/reset'\n","/**\n * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party\n * zustand-x repository: https://github.com/udecode/zustand-x.\n **/\nimport { DevtoolsOptions, PersistOptions, devtools, persist } from 'zustand/middleware'\nimport { createStore as createVanillaStore } from 'zustand/vanilla'\n\nimport {\n\tAugmentedApiData,\n\tAugmentedGetters,\n\tAugmentedSetters,\n\tGettersBuilder,\n\tSettersBuilder,\n\tState,\n\tStoreApi,\n\tStoreApiPluginList,\n} from '../types'\nimport { generateApi } from './generateApi'\nimport { generateGet } from './generateGet'\nimport { generateSet } from './generateSet'\nimport { generateUse } from './generateUse'\nimport { extendGetters } from './extendGetters'\nimport { extendSetters } from './extendSetters'\nimport { restrictState } from './restrictState'\n\nexport function createStore<S extends State, Plugins extends StoreApiPluginList = []>(\n\tinitialState: S,\n\toptions?: {\n\t\tname?: string\n\t\tplugins?: [...Plugins]\n\t\tmiddlewares?: { devtools?: true | DevtoolsOptions; persist?: true | PersistOptions<any> }\n\t}\n): Plugins extends []\n\t? StoreApi<S>\n\t: StoreApi<AugmentedApiData<S, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>> {\n\tconst { name = 'zustand-lite', plugins = [], middlewares = {} } = options ?? {}\n\n\t// Merge state from plugins to be available for future use.\n\tlet mergedState: any = initialState\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.creates) {\n\t\t\tmergedState = { ...mergedState, ...plugin.creates() }\n\t\t}\n\t})\n\n\t// Apply supported middlewares.\n\tlet initializer: any = () => mergedState\n\n\tif (middlewares.devtools) {\n\t\tinitializer = devtools(\n\t\t\tinitializer,\n\t\t\tmiddlewares.devtools === true\n\t\t\t\t? { name: 'zustand-lite', store: name }\n\t\t\t\t: middlewares.devtools\n\t\t)\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(\n\t\t\tinitializer,\n\t\t\tmiddlewares.persist === true ? { name } : middlewares.persist\n\t\t)\n\t}\n\n\t// Create a vanilla zustand store to wrap.\n\tconst storeLib: any = createVanillaStore(initializer)\n\n\t// Create zustand-lite wrapper.\n\tconst storeApi: any = {\n\t\tapi: generateApi(storeLib),\n\t\tget: generateGet(storeLib),\n\t\tuse: generateUse(storeLib),\n\t\tset: generateSet(storeLib, !!middlewares.devtools),\n\t\textendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendGetters(builder, this, storeLib)\n\t\t},\n\t\textendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendSetters(builder, this, storeLib, !!middlewares.devtools)\n\t\t},\n\t\trestrictState(publicState = []) {\n\t\t\treturn restrictState(publicState, mergedState, this, storeLib)\n\t\t},\n\t}\n\n\t// Extend store getters and setters with plugins.\n\tlet result = storeApi\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.extends) {\n\t\t\tresult = plugin.extends(storeApi)\n\t\t}\n\t})\n\n\treturn result\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\n\n/**\n * Required to wrap original Zustand interface without getState and setState, which are handled\n * by get and set (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 { getInitialState: lib.getInitialState, subscribe: lib.subscribe }\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 { 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 { State } from '../types'\n\n// Properly generate action names for chromium-based browsers and firefox.\nfunction getFunctionNamesFromStack(stack?: string): string[] {\n\tif (!stack) return []\n\n\treturn stack\n\t\t.split('\\n')\n\t\t.map((line) => {\n\t\t\t// Chrome / Edge format: \" at functionName (file.js:10:15)\"\n\t\t\tconst chromeMatch = line.match(/at (\\S+)/)\n\t\t\tif (chromeMatch) {\n\t\t\t\treturn chromeMatch[1]\n\t\t\t}\n\n\t\t\t// Firefox format: \"functionName@file.js:10:15\"\n\t\t\tconst firefoxMatch = line.match(/^(\\S+)@/)\n\t\t\tif (firefoxMatch) {\n\t\t\t\treturn firefoxMatch[1]\n\t\t\t}\n\n\t\t\treturn null\n\t\t})\n\t\t.filter((name): name is string => !!name)\n\t\t.map((name) => {\n\t\t\tconst split = name.split('.')\n\t\t\treturn split?.[1] ?? split?.[0]\n\t\t})\n}\n\n/**\n * Hacky, but working (and possibly only one there is) method of fetching proper caller\n * name. Used to generate devtools action name from the function name.\n */\nfunction getSetterName() {\n\t// Proper setter name should hide at 2nd position in the normalized stack.\n\treturn getFunctionNamesFromStack(new Error().stack)?.[2] ?? 'setState'\n}\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 ?? getSetterName(), payload: updater } : undefined\n\t\t)\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { SetRecord, State } from '../types'\nimport { generateSetFn } from './generateSetFn'\n\n/**\n * Generates automatic setters like store.set.foo(value)\n * @param lib Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateSet<S extends State>(lib: StoreLib<S>, hasDevtools: boolean) {\n\tconst setters: 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 ? { type: key, payload: { [key]: value } } : undefined\n\t\t\t)\n\t\t}\n\t})\n\n\treturn setters as SetRecord<S>\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\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 { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { StoreApi as StoreLib } from 'zustand'\n\nimport { State, EqualityChecker } from '../types'\n\n/**\n * Generates automatic getters like store.use.foo()\n * @param lib Zustand api interface\n */\nexport function generateUseFn<S extends State, U>(lib: StoreLib<S>) {\n\treturn (selector: (state: S) => U, equality: EqualityChecker<U> = shallow) => {\n\t\treturn useStoreWithEqualityFn(lib, selector, equality)\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand'\n\nimport { State } from '../types'\nimport { generateUseStep } from './generateUseStep'\nimport { generateUseFn } from './generateUseFn'\n\n/**\n * Generates automatic 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 { 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'\nimport { Default, SettersBuilder, State, StoreApi } from '../types'\nimport { generateSetFn } from './generateSetFn'\n\nexport function extendSetters<\n\tBuilder extends SettersBuilder<S, Getters, Setters>,\n\tS extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, store: StoreApi<S, Getters, Setters>, lib: StoreLib<S>, hasDevtools: boolean) {\n\tconst setters = generateSetFn(lib, hasDevtools)\n\tstore.set = Object.assign(setters, store.set, builder(store))\n\treturn store\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { GetRecord, SetRecord, State, StoreApi } from '../types'\nimport { generateUseFn } from './generateUseFn'\n\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[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","__toCommonJS","import_middleware","import_vanilla","generateApi","lib","generateGetFn","lib","generateGet","lib","generateGetFn","getFunctionNamesFromStack","stack","line","chromeMatch","firefoxMatch","name","split","getSetterName","generateSetFn","lib","hasDevtools","updater","replace","generateSet","lib","hasDevtools","setters","generateSetFn","key","value","state","import_shallow","import_traditional","generateUseStep","state","getters","path","lib","key","newPath","equalityFn","getFromPath","data","import_shallow","import_traditional","generateUseFn","lib","selector","equality","generateUse","lib","getters","generateUseFn","generateUseStep","import_shallow","import_traditional","extendGetters","builder","store","lib","methods","getters","key","args","generateUseFn","generateGetFn","extendSetters","builder","store","lib","hasDevtools","setters","generateSetFn","restrictState","privateState","mergedState","store","lib","getters","acc","key","generateUseFn","val","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","storeLib","createVanillaStore","storeApi","generateApi","generateGet","generateUse","generateSet","builder","extendGetters","extendSetters","publicState","restrictState","result","reset","store","api","set"]}
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"]}
package/dist/index.js CHANGED
@@ -1,244 +1,2 @@
1
- // src/lib/createStore.ts
2
- import { devtools, persist } from "zustand/middleware";
3
- import { createStore as createVanillaStore } from "zustand/vanilla";
4
-
5
- // src/lib/extendGetters.ts
6
- import { shallow as shallow2 } from "zustand/shallow";
7
- import { useStoreWithEqualityFn as useStoreWithEqualityFn2 } from "zustand/traditional";
8
-
9
- // src/lib/generateGetFn.ts
10
- function generateGetFn(lib) {
11
- return () => lib.getState();
12
- }
13
-
14
- // src/lib/generateUseFn.ts
15
- import { shallow } from "zustand/shallow";
16
- import { useStoreWithEqualityFn } from "zustand/traditional";
17
- function generateUseFn(lib) {
18
- return (selector, equality = shallow) => {
19
- return useStoreWithEqualityFn(lib, selector, equality);
20
- };
21
- }
22
-
23
- // src/lib/extendGetters.ts
24
- function extendGetters(builder, store, lib) {
25
- const methods = builder({ get: store.get });
26
- const getters = {};
27
- Object.keys(methods).forEach((key) => {
28
- getters[key] = (...args) => useStoreWithEqualityFn2(lib, () => methods[key](...args), shallow2);
29
- });
30
- store.use = Object.assign(generateUseFn(lib), store.use, getters);
31
- store.get = Object.assign(generateGetFn(lib), store.get, methods);
32
- return store;
33
- }
34
-
35
- // src/lib/generateSetFn.ts
36
- function generateSetFn(lib, hasDevtools) {
37
- return (updater, replace, name) => {
38
- lib.setState(
39
- updater,
40
- replace,
41
- // @ts-ignore Additional parameter will have no effect even if devtools are disabled.
42
- hasDevtools ? { type: name ?? "setState", payload: updater } : void 0
43
- );
44
- };
45
- }
46
-
47
- // src/lib/extendSetters.ts
48
- function extendSetters(builder, store, lib, hasDevtools) {
49
- const setters = generateSetFn(lib, hasDevtools);
50
- const baseSet = Object.entries(builder(store)).reduce(
51
- (acc, [name, func]) => {
52
- acc[name] = function _zustandLiteInferName_(...args) {
53
- return func(...args);
54
- };
55
- return acc;
56
- },
57
- {}
58
- );
59
- store.set = Object.assign(setters, store.set, baseSet);
60
- return store;
61
- }
62
-
63
- // src/lib/generateApi.ts
64
- function generateApi(lib) {
65
- return {
66
- getInitialState: lib.getInitialState,
67
- getState: lib.getState,
68
- persist: augmentPersist(lib),
69
- setState: lib.setState,
70
- subscribe: lib.subscribe
71
- };
72
- }
73
- function augmentPersist(lib) {
74
- if ("persist" in lib) {
75
- const augmented = lib.persist;
76
- augmented.read = () => {
77
- try {
78
- return JSON.parse(localStorage?.getItem(augmented.name) ?? "")?.state;
79
- } catch {
80
- return void 0;
81
- }
82
- };
83
- return augmented;
84
- }
85
- }
86
-
87
- // src/lib/generateGet.ts
88
- function generateGet(lib) {
89
- return generateGetFn(lib);
90
- }
91
-
92
- // src/lib/generateSet.ts
93
- import ErrorStackParser from "error-stack-parser";
94
- function getSetterName() {
95
- const stack = ErrorStackParser.parse(new Error());
96
- return stack[3].functionName?.includes("_zustandLiteInferName_") ? stack[2].functionName : null;
97
- }
98
- function generateSet(lib, hasDevtools) {
99
- const setters = generateSetFn(lib, hasDevtools);
100
- Object.keys(lib.getState()).forEach((key) => {
101
- setters[key] = (value) => {
102
- if (lib.getState()[key] === value) {
103
- return;
104
- }
105
- lib.setState(
106
- (state) => ({ ...state, [key]: value }),
107
- false,
108
- // @ts-ignore Additional parameter will have no effect even if devtools are disabled.
109
- hasDevtools ? { type: getSetterName() ?? key, payload: { [key]: value } } : void 0
110
- );
111
- };
112
- });
113
- return setters;
114
- }
115
-
116
- // src/lib/generateUseStep.ts
117
- import { shallow as shallow3 } from "zustand/shallow";
118
- import { useStoreWithEqualityFn as useStoreWithEqualityFn3 } from "zustand/traditional";
119
- function generateUseStep(state, getters, path, lib) {
120
- if (typeof state === "object" && state !== null) {
121
- Object.keys(state).forEach((key) => {
122
- const newPath = [...path, key];
123
- Object.defineProperty(getters, key, {
124
- value: (equalityFn = shallow3) => {
125
- return useStoreWithEqualityFn3(
126
- lib,
127
- (state2) => getFromPath(state2, newPath),
128
- equalityFn
129
- );
130
- },
131
- writable: true,
132
- configurable: true,
133
- enumerable: true
134
- });
135
- generateUseStep(state[key], getters[key], newPath, lib);
136
- });
137
- }
138
- }
139
- function getFromPath(state, path) {
140
- let data = state;
141
- for (const key of path) {
142
- data = data[key];
143
- if (!data) {
144
- return data;
145
- }
146
- }
147
- return data;
148
- }
149
-
150
- // src/lib/generateUse.ts
151
- function generateUse(lib) {
152
- const getters = generateUseFn(lib);
153
- generateUseStep(lib.getState(), getters, [], lib);
154
- return getters;
155
- }
156
-
157
- // src/lib/restrictState.ts
158
- function restrictState(privateState, mergedState, store, lib) {
159
- return {
160
- api: store.api,
161
- set: store.set,
162
- use: privateState ? (() => {
163
- const getters = Object.keys(store.use).reduce(
164
- (acc, key) => mergedState[key] && privateState.includes(key) ? acc : { ...acc, [key]: store.use[key] },
165
- {}
166
- );
167
- return Object.assign(generateUseFn(lib), getters);
168
- })() : store.use,
169
- get: privateState ? (() => {
170
- const getFn = () => Object.entries(store.get()).reduce(
171
- (acc, [key, val]) => mergedState[key] && privateState.includes(key) ? acc : { ...acc, [key]: val },
172
- {}
173
- );
174
- return Object.assign(getFn, store.get);
175
- })() : store.get
176
- };
177
- }
178
-
179
- // src/lib/createStore.ts
180
- var config = { appName: "zustand-lite", devtools: false };
181
- function setGlobalConfig(newConfig) {
182
- config = { ...config, ...newConfig };
183
- }
184
- function createStore(initialState, options) {
185
- const { name = "zustand-lite", plugins = [], middlewares = {} } = options ?? {};
186
- let mergedState = initialState;
187
- plugins.forEach((plugin) => {
188
- if (plugin.creates) {
189
- mergedState = { ...mergedState, ...plugin.creates() };
190
- }
191
- });
192
- let initializer = () => mergedState;
193
- if (middlewares.devtools || config.devtools) {
194
- initializer = devtools(
195
- initializer,
196
- middlewares.devtools === true || config.devtools && !middlewares.devtools ? { name: config.appName, store: name } : { name: config.appName, store: name, ...middlewares.devtools }
197
- );
198
- }
199
- if (middlewares.persist) {
200
- initializer = persist(
201
- initializer,
202
- middlewares.persist === true ? { name: `${config.appName.replace(/\s/, "-")}.${name}` } : { name: `${config.appName.replace(/\s/, "-")}.${name}`, ...middlewares.persist }
203
- );
204
- }
205
- const storeLib = createVanillaStore(initializer);
206
- const storeApi = {
207
- api: generateApi(storeLib),
208
- get: generateGet(storeLib),
209
- use: generateUse(storeLib),
210
- set: generateSet(storeLib, !!middlewares.devtools),
211
- extendGetters(builder) {
212
- return extendGetters(builder, this, storeLib);
213
- },
214
- extendSetters(builder) {
215
- return extendSetters(builder, this, storeLib, !!middlewares.devtools);
216
- },
217
- restrictState(publicState = []) {
218
- return restrictState(publicState, mergedState, this, storeLib);
219
- }
220
- };
221
- let result = storeApi;
222
- plugins.forEach((plugin) => {
223
- if (plugin.extends) {
224
- result = plugin.extends(storeApi);
225
- }
226
- });
227
- return result;
228
- }
229
-
230
- // src/plugins/reset.ts
231
- var reset = {
232
- extends: (store) => {
233
- return store.extendSetters(({ api, set }) => ({
234
- reset: () => {
235
- set(api.getInitialState?.() ?? {}, true);
236
- }
237
- }));
238
- }
239
- };
240
- export {
241
- createStore,
242
- reset,
243
- setGlobalConfig
244
- };
1
+ import{devtools as R,persist as C}from"zustand/middleware";import{createStore as W}from"zustand/vanilla";import{shallow as E}from"zustand/shallow";import{useStoreWithEqualityFn as B}from"zustand/traditional";function f(e){return()=>e.getState()}import{shallow as P}from"zustand/shallow";import{useStoreWithEqualityFn as h}from"zustand/traditional";function m(e){return(t,r=P)=>h(e,t,r)}function c(e,t,r){let n=e({get:t.get}),o={};return Object.keys(n).forEach(i=>{o[i]=(...s)=>B(r,()=>n[i](...s),E)}),t.use=Object.assign(m(r),t.use,o),t.get=Object.assign(f(r),t.get,n),t}function d(e,t){return(r,n,o)=>{e.setState(r,n,t?{type:o??"setState",payload:r}:void 0)}}function x(e,t,r,n){let o=d(r,n),i=Object.entries(e(t)).reduce((s,[a,p])=>(s[a]=function(...S){return p(...S)},s),{});return t.set=Object.assign(o,t.set,i),t}function b(e){return{getInitialState:e.getInitialState,getState:e.getState,persist:F(e),setState:e.setState,subscribe:e.subscribe}}function F(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 A(e){return f(e)}import j from"error-stack-parser";function O(){let e=j.parse(new Error);return e[3].functionName?.includes("_zustandLiteInferName_")?e[2].functionName:null}function y(e,t){let r=d(e,t);return Object.keys(e.getState()).forEach(n=>{r[n]=o=>{e.getState()[n]!==o&&e.setState(i=>({...i,[n]:o}),!1,t?{type:O()??n,payload:{[n]:o}}:void 0)}}),r}import{shallow as U}from"zustand/shallow";import{useStoreWithEqualityFn as D}from"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=U)=>D(n,a=>N(a,i),s),writable:!0,configurable:!0,enumerable:!0}),g(e[o],t[o],i,n)})}function N(e,t){let r=e;for(let n of t)if(r=r[n],!r)return r;return r}function G(e){let t=m(e);return g(e.getState(),t,[],e),t}function L(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 u={appName:"zustand-lite",devtools:!1};function w(e){u={...u,...e}}function v(e,t){let{name:r="zustand-lite",plugins:n=[],middlewares:o={}}=t??{},i=e;n.forEach(S=>{S.creates&&(i={...i,...S.creates()})});let s=()=>i;(o.devtools||u.devtools)&&(s=R(s,o.devtools===!0||u.devtools&&!o.devtools?{name:u.appName,store:r}:{name:u.appName,store:r,...o.devtools})),o.persist&&(s=C(s,o.persist===!0?{name:`${u.appName.replace(/\s/,"-")}.${r}`}:{name:`${u.appName.replace(/\s/,"-")}.${r}`,...o.persist}));let a=W(s),p={api:b(a),get:A(a),use:G(a),set:y(a,!!o.devtools),extendGetters(S){return c(S,this,a)},extendSetters(S){return x(S,this,a,!!o.devtools)},restrictState(S=[]){return L(S,i,this,a)}},l=p;return n.forEach(S=>{S.extends&&(l=S.extends(p))}),l}var I={extends:e=>e.extendSetters(({api:t,set:r})=>({reset:()=>{r(t.getInitialState?.()??{},!0)}}))};export{v as createStore,I as reset,w as setGlobalConfig};
2
+ //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/createStore.ts","../src/lib/generateApi.ts","../src/lib/generateGetFn.ts","../src/lib/generateGet.ts","../src/lib/generateSetFn.ts","../src/lib/generateSet.ts","../src/lib/generateUseStep.ts","../src/lib/generateUseFn.ts","../src/lib/generateUse.ts","../src/lib/extendGetters.ts","../src/lib/extendSetters.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["/**\n * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party\n * zustand-x repository: https://github.com/udecode/zustand-x.\n **/\nimport { DevtoolsOptions, PersistOptions, devtools, persist } from 'zustand/middleware'\nimport { createStore as createVanillaStore } from 'zustand/vanilla'\n\nimport {\n\tAugmentedApiData,\n\tAugmentedGetters,\n\tAugmentedSetters,\n\tGettersBuilder,\n\tSettersBuilder,\n\tState,\n\tStoreApi,\n\tStoreApiPluginList,\n} from '../types'\nimport { generateApi } from './generateApi'\nimport { generateGet } from './generateGet'\nimport { generateSet } from './generateSet'\nimport { generateUse } from './generateUse'\nimport { extendGetters } from './extendGetters'\nimport { extendSetters } from './extendSetters'\nimport { restrictState } from './restrictState'\n\nexport function createStore<S extends State, Plugins extends StoreApiPluginList = []>(\n\tinitialState: S,\n\toptions?: {\n\t\tname?: string\n\t\tplugins?: [...Plugins]\n\t\tmiddlewares?: { devtools?: true | DevtoolsOptions; persist?: true | PersistOptions<any> }\n\t}\n): Plugins extends []\n\t? StoreApi<S>\n\t: StoreApi<AugmentedApiData<S, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>> {\n\tconst { name = 'zustand-lite', plugins = [], middlewares = {} } = options ?? {}\n\n\t// Merge state from plugins to be available for future use.\n\tlet mergedState: any = initialState\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.creates) {\n\t\t\tmergedState = { ...mergedState, ...plugin.creates() }\n\t\t}\n\t})\n\n\t// Apply supported middlewares.\n\tlet initializer: any = () => mergedState\n\n\tif (middlewares.devtools) {\n\t\tinitializer = devtools(\n\t\t\tinitializer,\n\t\t\tmiddlewares.devtools === true\n\t\t\t\t? { name: 'zustand-lite', store: name }\n\t\t\t\t: middlewares.devtools\n\t\t)\n\t}\n\n\tif (middlewares.persist) {\n\t\tinitializer = persist(\n\t\t\tinitializer,\n\t\t\tmiddlewares.persist === true ? { name } : middlewares.persist\n\t\t)\n\t}\n\n\t// Create a vanilla zustand store to wrap.\n\tconst storeLib: any = createVanillaStore(initializer)\n\n\t// Create zustand-lite wrapper.\n\tconst storeApi: any = {\n\t\tapi: generateApi(storeLib),\n\t\tget: generateGet(storeLib),\n\t\tuse: generateUse(storeLib),\n\t\tset: generateSet(storeLib, !!middlewares.devtools),\n\t\textendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendGetters(builder, this, storeLib)\n\t\t},\n\t\textendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n\t\t\treturn extendSetters(builder, this, storeLib, !!middlewares.devtools)\n\t\t},\n\t\trestrictState(publicState = []) {\n\t\t\treturn restrictState(publicState, mergedState, this, storeLib)\n\t\t},\n\t}\n\n\t// Extend store getters and setters with plugins.\n\tlet result = storeApi\n\tplugins.forEach((plugin) => {\n\t\tif (plugin.extends) {\n\t\t\tresult = plugin.extends(storeApi)\n\t\t}\n\t})\n\n\treturn result\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { State } from '../types'\n\n/**\n * Required to wrap original Zustand interface without getState and setState, which are handled\n * by get and set (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 { getInitialState: lib.getInitialState, subscribe: lib.subscribe }\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 { 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 { State } from '../types'\n\n// Properly generate action names for chromium-based browsers and firefox.\nfunction getFunctionNamesFromStack(stack?: string): string[] {\n\tif (!stack) return []\n\n\treturn stack\n\t\t.split('\\n')\n\t\t.map((line) => {\n\t\t\t// Chrome / Edge format: \" at functionName (file.js:10:15)\"\n\t\t\tconst chromeMatch = line.match(/at (\\S+)/)\n\t\t\tif (chromeMatch) {\n\t\t\t\treturn chromeMatch[1]\n\t\t\t}\n\n\t\t\t// Firefox format: \"functionName@file.js:10:15\"\n\t\t\tconst firefoxMatch = line.match(/^(\\S+)@/)\n\t\t\tif (firefoxMatch) {\n\t\t\t\treturn firefoxMatch[1]\n\t\t\t}\n\n\t\t\treturn null\n\t\t})\n\t\t.filter((name): name is string => !!name)\n\t\t.map((name) => {\n\t\t\tconst split = name.split('.')\n\t\t\treturn split?.[1] ?? split?.[0]\n\t\t})\n}\n\n/**\n * Hacky, but working (and possibly only one there is) method of fetching proper caller\n * name. Used to generate devtools action name from the function name.\n */\nfunction getSetterName() {\n\t// Proper setter name should hide at 2nd position in the normalized stack.\n\treturn getFunctionNamesFromStack(new Error().stack)?.[2] ?? 'setState'\n}\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 ?? getSetterName(), payload: updater } : undefined\n\t\t)\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { SetRecord, State } from '../types'\nimport { generateSetFn } from './generateSetFn'\n\n/**\n * Generates automatic setters like store.set.foo(value)\n * @param lib Zustand api interface\n * @param hasDevtools If devtools were activated for this store\n */\nexport function generateSet<S extends State>(lib: StoreLib<S>, hasDevtools: boolean) {\n\tconst setters: 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 ? { type: key, payload: { [key]: value } } : undefined\n\t\t\t)\n\t\t}\n\t})\n\n\treturn setters as SetRecord<S>\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\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 { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { StoreApi as StoreLib } from 'zustand'\n\nimport { State, EqualityChecker } from '../types'\n\n/**\n * Generates automatic getters like store.use.foo()\n * @param lib Zustand api interface\n */\nexport function generateUseFn<S extends State, U>(lib: StoreLib<S>) {\n\treturn (selector: (state: S) => U, equality: EqualityChecker<U> = shallow) => {\n\t\treturn useStoreWithEqualityFn(lib, selector, equality)\n\t}\n}\n","import { StoreApi as StoreLib } from 'zustand'\n\nimport { State } from '../types'\nimport { generateUseStep } from './generateUseStep'\nimport { generateUseFn } from './generateUseFn'\n\n/**\n * Generates automatic 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 { 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'\nimport { Default, SettersBuilder, State, StoreApi } from '../types'\nimport { generateSetFn } from './generateSetFn'\n\nexport function extendSetters<\n\tBuilder extends SettersBuilder<S, Getters, Setters>,\n\tS extends State = Default,\n\tGetters = Default,\n\tSetters = Default,\n>(builder: Builder, store: StoreApi<S, Getters, Setters>, lib: StoreLib<S>, hasDevtools: boolean) {\n\tconst setters = generateSetFn(lib, hasDevtools)\n\tstore.set = Object.assign(setters, store.set, builder(store))\n\treturn store\n}\n","import { StoreApi as StoreLib } from 'zustand/vanilla'\n\nimport { GetRecord, SetRecord, State, StoreApi } from '../types'\nimport { generateUseFn } from './generateUseFn'\n\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[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","generateApi","lib","generateGetFn","lib","generateGet","lib","generateGetFn","getFunctionNamesFromStack","stack","line","chromeMatch","firefoxMatch","name","split","getSetterName","generateSetFn","lib","hasDevtools","updater","replace","generateSet","lib","hasDevtools","setters","generateSetFn","key","value","state","shallow","useStoreWithEqualityFn","generateUseStep","state","getters","path","lib","key","newPath","equalityFn","getFromPath","data","shallow","useStoreWithEqualityFn","generateUseFn","lib","selector","equality","generateUse","lib","getters","generateUseFn","generateUseStep","shallow","useStoreWithEqualityFn","extendGetters","builder","store","lib","methods","getters","key","args","useStoreWithEqualityFn","shallow","generateUseFn","generateGetFn","extendSetters","builder","store","lib","hasDevtools","setters","generateSetFn","restrictState","privateState","mergedState","store","lib","getters","acc","key","generateUseFn","val","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","devtools","persist","storeLib","createVanillaStore","storeApi","generateApi","generateGet","generateUse","generateSet","builder","extendGetters","extendSetters","publicState","restrictState","result","reset","store","api","set"]}
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zustand-lite",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "description": "Zustand Lite builds upon zustand, by auto-generating selectors and simplifying API even more.",
5
5
  "author": "Piotr Siatkowski <p.siatkowski@gmail.com>",
6
6
  "license": "MIT",
@@ -23,18 +23,15 @@
23
23
  },
24
24
  "sideEffects": false,
25
25
  "type": "module",
26
- "main": "dist/index.js",
27
- "module": "dist/index.mjs",
28
- "types": "dist/index.d.ts",
29
26
  "files": [
30
27
  "dist/**/*"
31
28
  ],
32
29
  "exports": {
33
30
  ".": {
34
31
  "types": "./dist/index.d.ts",
35
- "import": "./dist/index.mjs",
36
- "module": "./dist/index.mjs",
37
- "require": "./dist/index.js"
32
+ "import": "./dist/index.js",
33
+ "require": "./dist/index.cjs",
34
+ "default": "./dist/index.js"
38
35
  }
39
36
  },
40
37
  "scripts": {