zustand-lite 0.1.3 → 0.2.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.
@@ -0,0 +1,82 @@
1
+ import { StoreApi as StoreApi$1 } from 'zustand';
2
+ import { DevtoolsOptions, PersistOptions } from 'zustand/middleware';
3
+
4
+ type State = Record<string | symbol, unknown>;
5
+ type Empty = Record<string, never>;
6
+ type Default = Record<string | symbol, any>;
7
+ type EqualityChecker<T> = (state: T, newState: T) => boolean;
8
+ type StoreApiGet<T extends State, Getters> = Required<GetRecord<T>> & Getters;
9
+ type StoreApiUse<T extends State, Getters> = Required<UseRecord<T>> & Getters;
10
+ type StoreApiSet<T extends State, Setters> = Required<SetRecord<T>> & Setters;
11
+ type StoreApiEncapsulated<T extends State = Empty, Getters = Default, Setters = Default> = {
12
+ api: StoreApi$1<T>;
13
+ get: StoreApiGet<T, Getters>;
14
+ set: StoreApiSet<T, Setters>;
15
+ use: StoreApiUse<T, Getters>;
16
+ };
17
+ type StoreApi<T extends State = Empty, Getters = Default, Setters = Default> = {
18
+ api: StoreApi$1<T>;
19
+ get: StoreApiGet<T, Getters>;
20
+ set: StoreApiSet<T, Setters>;
21
+ use: StoreApiUse<T, Getters>;
22
+ extendGetters<Builder extends GettersBuilder<T, Getters, Setters>>(builder: Builder): StoreApi<T, Getters & ReturnType<Builder>, Setters>;
23
+ extendSetters<Builder extends SettersBuilder<T, Getters, Setters>>(builder: Builder): StoreApi<T, Getters, Setters & ReturnType<Builder>>;
24
+ restrictState(): StoreApiEncapsulated<T, Getters, Setters>;
25
+ restrictState<Key extends keyof T>(publicState: Key[]): StoreApiEncapsulated<Pick<T, Key>, Getters, Setters>;
26
+ };
27
+ type GettersBuilder<T extends State, Getters = Default, Setters = Default> = (args: {
28
+ api: StoreApi$1<T>;
29
+ get: StoreApiGet<T, Getters>;
30
+ set: StoreApiSet<T, Setters>;
31
+ }) => Record<string, (...args: any[]) => {}>;
32
+ type SettersBuilder<T extends State, Getters = Default, Setters = Default> = (args: {
33
+ api: StoreApi$1<T>;
34
+ get: StoreApiGet<T, Getters>;
35
+ set: StoreApiSet<T, Setters>;
36
+ }) => Record<string, (...args: any[]) => void>;
37
+ type GetRecord<O extends Record<string, any>> = {
38
+ [K in keyof O]: () => O[K];
39
+ };
40
+ type UseRecord<O extends Record<string, any>> = {
41
+ [K in keyof O]: (equalityFn?: EqualityChecker<O[K]>) => O[K];
42
+ };
43
+ type SetRecord<O extends Record<string, any>> = {
44
+ [K in keyof O]: (value: O[K]) => void;
45
+ };
46
+ type StoreApiPlugin<NewApiData extends State, NewGetters, NewSetters> = {
47
+ creates?: () => NewApiData;
48
+ extends?: (store: StoreApi<NewApiData, NewGetters, NewSetters>) => StoreApi<NewApiData, NewGetters, NewSetters>;
49
+ };
50
+ type StoreApiPluginList = StoreApiPlugin<any, any, any>[];
51
+ type AugmentedApiData<T, Plugins extends StoreApiPluginList> = T & UnionToIntersection<ExtractPluginTypes<Plugins, 'create'>[number]>;
52
+ type AugmentedGetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['getters']>;
53
+ type AugmentedSetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['setters']>;
54
+ type ExtractPluginTypes<Plugins extends StoreApiPluginList, Key extends 'create' | 'extend'> = {
55
+ [K in keyof Plugins]: Plugins[K] extends StoreApiPlugin<infer S, infer G, infer A> ? Key extends 'create' ? S : Key extends 'extend' ? {
56
+ getters: G;
57
+ setters: A;
58
+ } : never : never;
59
+ };
60
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
61
+
62
+ /**
63
+ * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:
64
+ * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party
65
+ * zustand-x repository: https://github.com/udecode/zustand-x.
66
+ **/
67
+
68
+ declare function createStore<T extends State, Plugins extends StoreApiPluginList = []>(initialState: T, options?: {
69
+ name?: string;
70
+ plugins?: [...Plugins];
71
+ middlewares?: {
72
+ devtools?: true | DevtoolsOptions;
73
+ persist?: true | PersistOptions<any>;
74
+ };
75
+ }): StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>>;
76
+
77
+ type PluginResetSetters = {
78
+ reset: () => void;
79
+ };
80
+ declare const reset: StoreApiPlugin<{}, {}, PluginResetSetters>;
81
+
82
+ export { type StoreApiPlugin, createStore, reset };
package/dist/index.d.ts CHANGED
@@ -28,7 +28,7 @@ type GettersBuilder<T extends State, Getters = Default, Setters = Default> = (ar
28
28
  api: StoreApi$1<T>;
29
29
  get: StoreApiGet<T, Getters>;
30
30
  set: StoreApiSet<T, Setters>;
31
- }) => Record<string, (...args: any[]) => {} | null>;
31
+ }) => Record<string, (...args: any[]) => {}>;
32
32
  type SettersBuilder<T extends State, Getters = Default, Setters = Default> = (args: {
33
33
  api: StoreApi$1<T>;
34
34
  get: StoreApiGet<T, Getters>;
package/dist/index.js CHANGED
@@ -1,201 +1,3 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
23
- createStore: () => createStore,
24
- reset: () => reset
25
- });
26
- module.exports = __toCommonJS(index_exports);
27
-
28
- // src/lib/createStore.ts
29
- var import_middleware = require("zustand/middleware");
30
- var import_vanilla = require("zustand/vanilla");
31
-
32
- // src/lib/extendGetters.ts
33
- var import_shallow = require("zustand/shallow");
34
- var import_traditional = require("zustand/traditional");
35
- function extendGetters(builder, thisApi) {
36
- const use = { ...thisApi.use };
37
- const get = { ...thisApi.get };
38
- Object.keys(builder(thisApi)).forEach((key) => {
39
- use[key] = (...args) => (
40
- // eslint-disable-next-line react-hooks/rules-of-hooks
41
- (0, import_traditional.useStoreWithEqualityFn)(
42
- thisApi.api,
43
- () => {
44
- return builder(thisApi)[key](...args);
45
- },
46
- import_shallow.shallow
47
- )
48
- );
49
- get[key] = (...args) => {
50
- return builder(thisApi)[key](...args);
51
- };
52
- });
53
- return {
54
- ...thisApi,
55
- get,
56
- use
57
- };
58
- }
59
-
60
- // src/lib/extendSetters.ts
61
- function extendSetters(builder, thisApi) {
62
- return {
63
- ...thisApi,
64
- set: {
65
- ...thisApi.set,
66
- ...builder(thisApi)
67
- }
68
- };
69
- }
70
-
71
- // src/lib/generateStateGet.ts
72
- function generateStateGet(api) {
73
- const getters = {};
74
- const initialState = api.getState();
75
- Object.keys(initialState).forEach((key) => {
76
- getters[key] = () => api.getState()[key];
77
- });
78
- Object.getOwnPropertySymbols(initialState).forEach((symbol) => {
79
- getters[symbol] = () => api.getState()[symbol];
80
- });
81
- return getters;
82
- }
83
-
84
- // src/lib/generateStateSet.ts
85
- function generateStateSet(api, hasDevtools, storeName) {
86
- const setters = {};
87
- Object.keys(api.getState()).forEach((key) => {
88
- setters[key] = (value) => {
89
- if (api.getState()[key] === value) {
90
- return;
91
- }
92
- const setState = api.setState;
93
- setState(
94
- (state) => ({
95
- ...state,
96
- [key]: value
97
- }),
98
- false,
99
- hasDevtools ? { type: `${storeName}/${key}`, payload: { [key]: value } } : void 0
100
- );
101
- };
102
- });
103
- return setters;
104
- }
105
-
106
- // src/lib/generateStateUse.ts
107
- var import_shallow2 = require("zustand/shallow");
108
- var import_traditional2 = require("zustand/traditional");
109
- function generateStateUse(api) {
110
- const getters = {};
111
- Object.keys(api.getState()).forEach((key) => {
112
- getters[key] = (equalityFn = import_shallow2.shallow) => {
113
- return (0, import_traditional2.useStoreWithEqualityFn)(api, (state) => state[key], equalityFn);
114
- };
115
- });
116
- return getters;
117
- }
118
-
119
- // src/lib/restrictState.ts
120
- function restrictState(privateState, mergedState, thisApi) {
121
- return {
122
- api: thisApi.api,
123
- set: thisApi.set,
124
- use: thisApi.use,
125
- get: Object.keys(thisApi.get).reduce(
126
- (acc, key) => mergedState[key] && privateState.includes(key) ? acc : {
127
- ...acc,
128
- [key]: thisApi.get[key]
129
- },
130
- {}
131
- )
132
- };
133
- }
134
-
135
- // src/lib/createStore.ts
136
- function createStore(initialState, options) {
137
- const { name = "zustand-lite", plugins = [], middlewares = {} } = options ?? {};
138
- let mergedState = initialState;
139
- plugins.forEach((plugin) => {
140
- if (plugin.creates) {
141
- mergedState = { ...mergedState, ...plugin.creates() };
142
- }
143
- });
144
- let initializer = () => mergedState;
145
- if (middlewares.devtools) {
146
- initializer = (0, import_middleware.devtools)(
147
- initializer,
148
- middlewares.devtools === true ? { name } : middlewares.devtools
149
- );
150
- }
151
- if (middlewares.persist) {
152
- initializer = (0, import_middleware.persist)(
153
- initializer,
154
- middlewares.persist === true ? { name } : middlewares.persist
155
- );
156
- }
157
- const storeApi = (0, import_vanilla.createStore)(initializer);
158
- let store = {
159
- api: storeApi,
160
- get: generateStateGet(storeApi),
161
- set: generateStateSet(storeApi, !!middlewares.devtools, name),
162
- use: generateStateUse(storeApi),
163
- extendGetters(builder) {
164
- return extendGetters(builder, this);
165
- },
166
- extendSetters(builder) {
167
- return extendSetters(builder, this);
168
- },
169
- restrictState(publicState = []) {
170
- return restrictState(
171
- publicState,
172
- mergedState,
173
- this
174
- );
175
- }
176
- };
177
- plugins.forEach((plugin) => {
178
- if (plugin.extends) {
179
- store = plugin.extends(store);
180
- }
181
- });
182
- return store;
183
- }
184
-
185
- // src/plugins/reset.ts
186
- var reset = {
187
- extends: (store) => {
188
- return store.extendSetters(({ api }) => ({
189
- reset: () => {
190
- const initialState = api.getInitialState?.() ?? {};
191
- api.setState(() => initialState, true);
192
- }
193
- }));
194
- }
195
- };
196
- // Annotate the CommonJS export names for ESM import in node:
197
- 0 && (module.exports = {
198
- createStore,
199
- reset
200
- });
1
+ "use strict";var m=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var b=(t,e)=>{for(var o in e)m(t,o,{get:e[o],enumerable:!0})},j=(t,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of O(e))!v.call(t,r)&&r!==o&&m(t,r,{get:()=>e[r],enumerable:!(s=D(e,r))||s.enumerable});return t};var k=t=>j(m({},"__esModule",{value:!0}),t);var w={};b(w,{createStore:()=>P,reset:()=>E});module.exports=k(w);var u=require("zustand/middleware"),B=require("zustand/vanilla");function K(){return new Error()?.stack?.split(`
2
+ `)[3].trim().split(" ")[1].split(".")[1]??"setState"}function p(t,e){return{...t,setState:(o,s,r)=>{let n=t.setState;n(o,s,e?r??{type:K(),payload:o}:void 0)}}}function l(t){let e={},o=t.getState();return Object.keys(o).forEach(s=>{e[s]=()=>t.getState()[s]}),Object.getOwnPropertySymbols(o).forEach(s=>{e[s]=()=>t.getState()[s]}),e}function f(t,e){let o={};return Object.keys(t.getState()).forEach(s=>{o[s]=r=>{if(t.getState()[s]===r)return;let n=t.setState;n(a=>({...a,[s]:r}),!1,e?{type:s,payload:{[s]:r}}:void 0)}}),o}var c=require("zustand/shallow"),g=require("zustand/traditional");function T(t){let e={};return Object.keys(t.getState()).forEach(o=>{e[o]=(s=c.shallow)=>(0,g.useStoreWithEqualityFn)(t,r=>r[o],s)}),e}var x=require("zustand/shallow"),y=require("zustand/traditional");function G(t,e){let o={...e.use},s={...e.get};return Object.keys(t(e)).forEach(r=>{o[r]=(...n)=>(0,y.useStoreWithEqualityFn)(e.api,()=>t(e)[r](...n),x.shallow),s[r]=(...n)=>t(e)[r](...n)}),{...e,get:s,use:o}}function A(t,e){return{...e,set:{...e.set,...t(e)}}}function R(t,e,o){return{api:o.api,set:o.set,use:o.use,get:Object.keys(o.get).reduce((s,r)=>e[r]&&t.includes(r)?s:{...s,[r]:o.get[r]},{})}}function P(t,e){let{name:o="zustand-lite",plugins:s=[],middlewares:r={}}=e??{},n=t;s.forEach(i=>{i.creates&&(n={...n,...i.creates()})});let a=()=>n;r.devtools&&(a=(0,u.devtools)(a,r.devtools===!0?{name:"zustand-lite",store:o}:r.devtools)),r.persist&&(a=(0,u.persist)(a,r.persist===!0?{name:o}:r.persist));let S=(0,B.createStore)(a),d={api:p(S,!!r.devtools),get:l(S),set:f(S,!!r.devtools),use:T(S),extendGetters(i){return G(i,this)},extendSetters(i){return A(i,this)},restrictState(i=[]){return R(i,n,this)}};return s.forEach(i=>{i.extends&&(d=i.extends(d))}),d}var E={extends:t=>t.extendSetters(({api:e})=>({reset:()=>{let o=e.getInitialState?.()??{};e.setState(()=>o,!0)}}))};0&&(module.exports={createStore,reset});
201
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/createStore.ts","../src/lib/extendGetters.ts","../src/lib/extendSetters.ts","../src/lib/generateStateGet.ts","../src/lib/generateStateSet.ts","../src/lib/generateStateUse.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 AugmentedApiData,\n AugmentedGetters,\n AugmentedSetters,\n GettersBuilder,\n SettersBuilder,\n State,\n StoreApi,\n StoreApiPluginList,\n} from '../types';\nimport { extendGetters } from './extendGetters';\nimport { extendSetters } from './extendSetters';\nimport { generateStateGet } from './generateStateGet';\nimport { generateStateSet } from './generateStateSet';\nimport { generateStateUse } from './generateStateUse';\nimport { restrictState } from './restrictState';\n\nexport function createStore<T extends State, Plugins extends StoreApiPluginList = []>(\n initialState: T,\n options?: {\n name?: string;\n plugins?: [...Plugins];\n middlewares?: {\n devtools?: true | DevtoolsOptions;\n persist?: true | PersistOptions<any>;\n };\n },\n): StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>> {\n const { name = 'zustand-lite', plugins = [], middlewares = {} } = options ?? {};\n\n // Merge state from plugins to be available for future use.\n let mergedState: any = initialState;\n plugins.forEach(plugin => {\n if (plugin.creates) {\n mergedState = { ...mergedState, ...plugin.creates() };\n }\n });\n\n // Apply supported middlewares.\n let initializer: any = () => mergedState;\n\n if (middlewares.devtools) {\n initializer = devtools(\n initializer,\n middlewares.devtools === true ? { name } : middlewares.devtools,\n );\n }\n\n if (middlewares.persist) {\n initializer = persist(\n initializer,\n middlewares.persist === true ? { name } : middlewares.persist,\n );\n }\n\n // Create a vanilla zustand store to wrap.\n const storeApi: any = createVanillaStore(initializer);\n\n // Create zustand-lite wrapper.\n let store: any = {\n api: storeApi,\n get: generateStateGet(storeApi),\n set: generateStateSet(storeApi, !!middlewares.devtools, name),\n use: generateStateUse(storeApi),\n extendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n return extendGetters(builder, this);\n },\n extendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n return extendSetters(builder, this);\n },\n restrictState<Key extends keyof T>(publicState: Key[] = []) {\n return restrictState(\n publicState,\n mergedState,\n this as StoreApi<\n AugmentedApiData<T, Plugins>,\n AugmentedGetters<Plugins>,\n AugmentedSetters<Plugins>\n >,\n );\n },\n };\n\n // Extend store getters and setters with plugins.\n plugins.forEach(plugin => {\n if (plugin.extends) {\n store = plugin.extends(store);\n }\n });\n\n return store;\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { Default, GettersBuilder, State, StoreApi } from '../types'\n\nexport function extendGetters<\n Builder extends GettersBuilder<T, Getters, Setters>,\n T extends State = Default,\n Getters = Default,\n Setters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n const use = { ...thisApi.use };\n const get = { ...thisApi.get };\n\n Object.keys(builder(thisApi)).forEach(key => {\n // @ts-ignore\n use[key] = (...args: any[]) =>\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useStoreWithEqualityFn(\n thisApi.api,\n () => {\n return builder(thisApi)[key](...args);\n },\n shallow,\n );\n\n // @ts-ignore\n get[key] = (...args: any[]) => {\n return builder(thisApi)[key](...args);\n };\n });\n\n return {\n ...thisApi,\n get,\n use,\n } as StoreApi<T, Getters & ReturnType<Builder>, Setters>;\n}\n","import { Default, SettersBuilder, State, StoreApi } from '../types'\n\nexport function extendSetters<\n Builder extends SettersBuilder<T, Getters, Setters>,\n T extends State = Default,\n Getters = Default,\n Setters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n return {\n ...thisApi,\n set: {\n ...thisApi.set,\n ...builder(thisApi),\n },\n } as StoreApi<T, Getters, Setters & ReturnType<Builder>>\n}\n","import { StoreApi } from 'zustand/vanilla';\n\nimport { GetRecord, State } from '../types';\n\nexport function generateStateGet<T extends State>(api: StoreApi<T>) {\n const getters: GetRecord<T> = {} as GetRecord<T>;\n\n const initialState = api.getState();\n\n Object.keys(initialState).forEach(key => {\n getters[key as keyof T] = () => api.getState()[key as keyof T];\n });\n\n Object.getOwnPropertySymbols(initialState).forEach(symbol => {\n getters[symbol as keyof T] = () => api.getState()[symbol as keyof T];\n });\n\n return getters;\n}\n","import { NamedSet } from 'zustand/middleware/devtools';\nimport { StoreApi } from 'zustand/vanilla';\n\nimport { SetRecord, State } from '../types';\n\nexport function generateStateSet<T extends State>(\n api: StoreApi<T>,\n hasDevtools: boolean,\n storeName: string\n): SetRecord<T> {\n const setters: SetRecord<T> = {} as SetRecord<T>;\n\n Object.keys(api.getState()).forEach(key => {\n setters[key as keyof T] = (value: any) => {\n if (api.getState()[key] === value) {\n return;\n }\n\n const setState = api.setState as NamedSet<T>;\n setState(\n state => ({\n ...state,\n [key]: value,\n }),\n false,\n hasDevtools ? { type: `${storeName}/${key}`, payload: { [key]: value } } : undefined,\n );\n };\n });\n\n return setters;\n}\n","import { shallow } from 'zustand/shallow';\nimport { useStoreWithEqualityFn } from 'zustand/traditional';\n\nimport { StoreApi } from 'zustand';\n\nimport { EqualityChecker, GetRecord, State } from '../types';\n\nexport function generateStateUse<T extends State>(api: StoreApi<T>) {\n const getters: GetRecord<T> = {} as GetRecord<T>;\n\n Object.keys(api.getState()).forEach(key => {\n getters[key as keyof T] = (equalityFn: EqualityChecker<T[keyof T]> = shallow) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useStoreWithEqualityFn(api, (state: T) => state[key as keyof T], equalityFn);\n };\n });\n\n return getters;\n}\n","import { Empty, GetRecord, SetRecord, State, StoreApi, StoreApiEncapsulated } from '../types';\n\nexport function restrictState<\n T extends State,\n Key extends keyof T,\n Getters extends GetRecord<any> = Empty,\n Setters extends SetRecord<any> = Empty,\n>(privateState: Key[], mergedState: T, thisApi: StoreApi<T, Getters, Setters>) {\n return {\n api: thisApi.api,\n set: thisApi.set,\n use: thisApi.use,\n get: Object.keys(thisApi.get).reduce(\n (acc, key) =>\n mergedState[key] && (privateState as string[]).includes(key)\n ? acc\n : {\n ...acc,\n [key]: thisApi.get[key],\n },\n {},\n ) as GetRecord<Omit<T, Key>> & Getters,\n } as StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>;\n}\n","import { StoreApiPlugin } from '../types';\n\ntype PluginResetSetters = {\n reset: () => void;\n};\n\nexport const reset: StoreApiPlugin<{}, {}, PluginResetSetters> = {\n extends: store => {\n return store.extendSetters(({ api }) => ({\n reset: () => {\n const initialState = api.getInitialState?.() ?? {};\n api.setState(() => initialState, true);\n },\n }));\n },\n};\n"],"mappings":"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","names":["import_shallow","import_traditional","createVanillaStore"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/createStore.ts","../src/lib/generateApi.ts","../src/lib/generateGet.ts","../src/lib/generateSet.ts","../src/lib/generateUse.ts","../src/lib/extendGetters.ts","../src/lib/extendSetters.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["export type { StoreApiPlugin } from './types'\nexport { createStore } from './lib/createStore';\nexport { reset } from './plugins/reset'\n","/**\n * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party\n * zustand-x repository: https://github.com/udecode/zustand-x.\n **/\nimport { DevtoolsOptions, PersistOptions, devtools, persist } from 'zustand/middleware';\nimport { createStore as createVanillaStore } from 'zustand/vanilla';\n\nimport {\n AugmentedApiData,\n AugmentedGetters,\n AugmentedSetters,\n GettersBuilder,\n SettersBuilder,\n State,\n StoreApi,\n StoreApiPluginList,\n} from '../types';\nimport { generateApi } from \"./generateApi\";\nimport { generateGet } from './generateGet';\nimport { generateSet } from './generateSet';\nimport { generateUse } from './generateUse';\nimport { extendGetters } from './extendGetters';\nimport { extendSetters } from './extendSetters';\nimport { restrictState } from './restrictState';\n\nexport function createStore<T extends State, Plugins extends StoreApiPluginList = []>(\n initialState: T,\n options?: {\n name?: string;\n plugins?: [...Plugins];\n middlewares?: {\n devtools?: true | DevtoolsOptions;\n persist?: true | PersistOptions<any>;\n };\n },\n): StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>> {\n const { name = 'zustand-lite', plugins = [], middlewares = {} } = options ?? {};\n\n // Merge state from plugins to be available for future use.\n let mergedState: any = initialState;\n plugins.forEach(plugin => {\n if (plugin.creates) {\n mergedState = { ...mergedState, ...plugin.creates() };\n }\n });\n\n // Apply supported middlewares.\n let initializer: any = () => mergedState;\n\n if (middlewares.devtools) {\n initializer = devtools(\n initializer,\n middlewares.devtools === true ? { name: 'zustand-lite', store: name } : middlewares.devtools,\n );\n }\n\n if (middlewares.persist) {\n initializer = persist(\n initializer,\n middlewares.persist === true ? { name } : middlewares.persist,\n );\n }\n\n // Create a vanilla zustand store to wrap.\n const storeApi: any = createVanillaStore(initializer);\n\n // Create zustand-lite wrapper.\n let store: any = {\n api: generateApi(storeApi, !!middlewares.devtools),\n get: generateGet(storeApi),\n set: generateSet(storeApi, !!middlewares.devtools),\n use: generateUse(storeApi),\n extendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n return extendGetters(builder, this);\n },\n extendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n return extendSetters(builder, this);\n },\n restrictState<Key extends keyof T>(publicState: Key[] = []) {\n return restrictState(\n publicState,\n mergedState,\n this as StoreApi<\n AugmentedApiData<T, Plugins>,\n AugmentedGetters<Plugins>,\n AugmentedSetters<Plugins>\n >,\n );\n },\n };\n\n // Extend store getters and setters with plugins.\n plugins.forEach(plugin => {\n if (plugin.extends) {\n store = plugin.extends(store);\n }\n });\n\n return store;\n}\n","import { NamedSet } from 'zustand/middleware/devtools';\nimport { StoreApi } from 'zustand/vanilla';\n\nimport { State } from '../types';\n\nfunction logFunctionName() {\n return new Error()?.stack?.split('\\n')[3].trim().split(' ')[1].split('.')[1] ?? 'setState';\n}\n\nexport function generateApi<T extends State>(\n api: StoreApi<T>,\n hasDevtools: boolean,\n) {\n return {\n ...api,\n setState: (newState: T | ((state: T) => T), replace?: false, name?: string) => {\n const setState = api.setState as NamedSet<T>;\n setState(\n newState,\n replace,\n hasDevtools\n ? (name ?? { type: logFunctionName(), payload: newState })\n : undefined,\n );\n },\n };\n}\n","import { StoreApi } from 'zustand/vanilla';\n\nimport { GetRecord, State } from '../types';\n\nexport function generateGet<T extends State>(api: StoreApi<T>) {\n const getters: GetRecord<T> = {} as GetRecord<T>;\n\n const initialState = api.getState();\n\n Object.keys(initialState).forEach(key => {\n getters[key as keyof T] = () => api.getState()[key as keyof T];\n });\n\n Object.getOwnPropertySymbols(initialState).forEach(symbol => {\n getters[symbol as keyof T] = () => api.getState()[symbol as keyof T];\n });\n\n return getters;\n}\n","import { NamedSet } from 'zustand/middleware/devtools';\nimport { StoreApi } from 'zustand/vanilla';\n\nimport { SetRecord, State } from '../types';\n\nexport function generateSet<T extends State>(\n api: StoreApi<T>,\n hasDevtools: boolean,\n): SetRecord<T> {\n const setters: SetRecord<T> = {} as SetRecord<T>;\n\n Object.keys(api.getState()).forEach(key => {\n setters[key as keyof T] = (value: any) => {\n if (api.getState()[key] === value) {\n return;\n }\n\n const setState = api.setState as NamedSet<T>;\n setState(\n state => ({\n ...state,\n [key]: value,\n }),\n false,\n hasDevtools ? { type: key, payload: { [key]: value } } : undefined,\n );\n };\n });\n\n return setters;\n}\n","import { shallow } from 'zustand/shallow';\nimport { useStoreWithEqualityFn } from 'zustand/traditional';\n\nimport { StoreApi } from 'zustand';\n\nimport { EqualityChecker, GetRecord, State } from '../types';\n\nexport function generateUse<T extends State>(api: StoreApi<T>) {\n const getters: GetRecord<T> = {} as GetRecord<T>;\n\n Object.keys(api.getState()).forEach(key => {\n getters[key as keyof T] = (equalityFn: EqualityChecker<T[keyof T]> = shallow) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useStoreWithEqualityFn(api, (state: T) => state[key as keyof T], equalityFn);\n };\n });\n\n return getters;\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { Default, GettersBuilder, State, StoreApi } from '../types'\n\nexport function extendGetters<\n Builder extends GettersBuilder<T, Getters, Setters>,\n T extends State = Default,\n Getters = Default,\n Setters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n const use = { ...thisApi.use };\n const get = { ...thisApi.get };\n\n Object.keys(builder(thisApi)).forEach(key => {\n // @ts-ignore\n use[key] = (...args: any[]) =>\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useStoreWithEqualityFn(\n thisApi.api,\n () => {\n return builder(thisApi)[key](...args);\n },\n shallow,\n );\n\n // @ts-ignore\n get[key] = (...args: any[]) => {\n return builder(thisApi)[key](...args);\n };\n });\n\n return {\n ...thisApi,\n get,\n use,\n } as StoreApi<T, Getters & ReturnType<Builder>, Setters>;\n}\n","import { Default, SettersBuilder, State, StoreApi } from '../types'\n\nexport function extendSetters<\n Builder extends SettersBuilder<T, Getters, Setters>,\n T extends State = Default,\n Getters = Default,\n Setters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n return {\n ...thisApi,\n set: {\n ...thisApi.set,\n ...builder(thisApi),\n },\n } as StoreApi<T, Getters, Setters & ReturnType<Builder>>\n}\n","import { Empty, GetRecord, SetRecord, State, StoreApi, StoreApiEncapsulated } from '../types';\n\nexport function restrictState<\n T extends State,\n Key extends keyof T,\n Getters extends GetRecord<any> = Empty,\n Setters extends SetRecord<any> = Empty,\n>(privateState: Key[], mergedState: T, thisApi: StoreApi<T, Getters, Setters>) {\n return {\n api: thisApi.api,\n set: thisApi.set,\n use: thisApi.use,\n get: Object.keys(thisApi.get).reduce(\n (acc, key) =>\n mergedState[key] && (privateState as string[]).includes(key)\n ? acc\n : {\n ...acc,\n [key]: thisApi.get[key],\n },\n {},\n ) as GetRecord<Omit<T, Key>> & Getters,\n } as StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>;\n}\n","import { StoreApiPlugin } from '../types';\n\ntype PluginResetSetters = {\n reset: () => void;\n};\n\nexport const reset: StoreApiPlugin<{}, {}, PluginResetSetters> = {\n extends: store => {\n return store.extendSetters(({ api }) => ({\n reset: () => {\n const initialState = api.getInitialState?.() ?? {};\n api.setState(() => initialState, true);\n },\n }));\n },\n};\n"],"mappings":"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","names":["index_exports","__export","createStore","reset","__toCommonJS","import_middleware","import_vanilla","logFunctionName","generateApi","api","hasDevtools","newState","replace","name","setState","generateGet","api","getters","initialState","key","symbol","generateSet","api","hasDevtools","setters","key","value","setState","state","import_shallow","import_traditional","generateUse","api","getters","key","equalityFn","state","import_shallow","import_traditional","extendGetters","builder","thisApi","use","get","key","args","extendSetters","builder","thisApi","restrictState","privateState","mergedState","thisApi","acc","key","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","storeApi","createVanillaStore","store","generateApi","generateGet","generateSet","generateUse","builder","extendGetters","extendSetters","publicState","restrictState","reset","store","api","initialState"]}
package/dist/index.mjs CHANGED
@@ -1,173 +1,3 @@
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 } from "zustand/shallow";
7
- import { useStoreWithEqualityFn } from "zustand/traditional";
8
- function extendGetters(builder, thisApi) {
9
- const use = { ...thisApi.use };
10
- const get = { ...thisApi.get };
11
- Object.keys(builder(thisApi)).forEach((key) => {
12
- use[key] = (...args) => (
13
- // eslint-disable-next-line react-hooks/rules-of-hooks
14
- useStoreWithEqualityFn(
15
- thisApi.api,
16
- () => {
17
- return builder(thisApi)[key](...args);
18
- },
19
- shallow
20
- )
21
- );
22
- get[key] = (...args) => {
23
- return builder(thisApi)[key](...args);
24
- };
25
- });
26
- return {
27
- ...thisApi,
28
- get,
29
- use
30
- };
31
- }
32
-
33
- // src/lib/extendSetters.ts
34
- function extendSetters(builder, thisApi) {
35
- return {
36
- ...thisApi,
37
- set: {
38
- ...thisApi.set,
39
- ...builder(thisApi)
40
- }
41
- };
42
- }
43
-
44
- // src/lib/generateStateGet.ts
45
- function generateStateGet(api) {
46
- const getters = {};
47
- const initialState = api.getState();
48
- Object.keys(initialState).forEach((key) => {
49
- getters[key] = () => api.getState()[key];
50
- });
51
- Object.getOwnPropertySymbols(initialState).forEach((symbol) => {
52
- getters[symbol] = () => api.getState()[symbol];
53
- });
54
- return getters;
55
- }
56
-
57
- // src/lib/generateStateSet.ts
58
- function generateStateSet(api, hasDevtools, storeName) {
59
- const setters = {};
60
- Object.keys(api.getState()).forEach((key) => {
61
- setters[key] = (value) => {
62
- if (api.getState()[key] === value) {
63
- return;
64
- }
65
- const setState = api.setState;
66
- setState(
67
- (state) => ({
68
- ...state,
69
- [key]: value
70
- }),
71
- false,
72
- hasDevtools ? { type: `${storeName}/${key}`, payload: { [key]: value } } : void 0
73
- );
74
- };
75
- });
76
- return setters;
77
- }
78
-
79
- // src/lib/generateStateUse.ts
80
- import { shallow as shallow2 } from "zustand/shallow";
81
- import { useStoreWithEqualityFn as useStoreWithEqualityFn2 } from "zustand/traditional";
82
- function generateStateUse(api) {
83
- const getters = {};
84
- Object.keys(api.getState()).forEach((key) => {
85
- getters[key] = (equalityFn = shallow2) => {
86
- return useStoreWithEqualityFn2(api, (state) => state[key], equalityFn);
87
- };
88
- });
89
- return getters;
90
- }
91
-
92
- // src/lib/restrictState.ts
93
- function restrictState(privateState, mergedState, thisApi) {
94
- return {
95
- api: thisApi.api,
96
- set: thisApi.set,
97
- use: thisApi.use,
98
- get: Object.keys(thisApi.get).reduce(
99
- (acc, key) => mergedState[key] && privateState.includes(key) ? acc : {
100
- ...acc,
101
- [key]: thisApi.get[key]
102
- },
103
- {}
104
- )
105
- };
106
- }
107
-
108
- // src/lib/createStore.ts
109
- function createStore(initialState, options) {
110
- const { name = "zustand-lite", plugins = [], middlewares = {} } = options ?? {};
111
- let mergedState = initialState;
112
- plugins.forEach((plugin) => {
113
- if (plugin.creates) {
114
- mergedState = { ...mergedState, ...plugin.creates() };
115
- }
116
- });
117
- let initializer = () => mergedState;
118
- if (middlewares.devtools) {
119
- initializer = devtools(
120
- initializer,
121
- middlewares.devtools === true ? { name } : middlewares.devtools
122
- );
123
- }
124
- if (middlewares.persist) {
125
- initializer = persist(
126
- initializer,
127
- middlewares.persist === true ? { name } : middlewares.persist
128
- );
129
- }
130
- const storeApi = createVanillaStore(initializer);
131
- let store = {
132
- api: storeApi,
133
- get: generateStateGet(storeApi),
134
- set: generateStateSet(storeApi, !!middlewares.devtools, name),
135
- use: generateStateUse(storeApi),
136
- extendGetters(builder) {
137
- return extendGetters(builder, this);
138
- },
139
- extendSetters(builder) {
140
- return extendSetters(builder, this);
141
- },
142
- restrictState(publicState = []) {
143
- return restrictState(
144
- publicState,
145
- mergedState,
146
- this
147
- );
148
- }
149
- };
150
- plugins.forEach((plugin) => {
151
- if (plugin.extends) {
152
- store = plugin.extends(store);
153
- }
154
- });
155
- return store;
156
- }
157
-
158
- // src/plugins/reset.ts
159
- var reset = {
160
- extends: (store) => {
161
- return store.extendSetters(({ api }) => ({
162
- reset: () => {
163
- const initialState = api.getInitialState?.() ?? {};
164
- api.setState(() => initialState, true);
165
- }
166
- }));
167
- }
168
- };
169
- export {
170
- createStore,
171
- reset
172
- };
1
+ import{devtools as R,persist as B}from"zustand/middleware";import{createStore as P}from"zustand/vanilla";function T(){return new Error()?.stack?.split(`
2
+ `)[3].trim().split(" ")[1].split(".")[1]??"setState"}function d(r,e){return{...r,setState:(o,s,t)=>{let n=r.setState;n(o,s,e?t??{type:T(),payload:o}:void 0)}}}function m(r){let e={},o=r.getState();return Object.keys(o).forEach(s=>{e[s]=()=>r.getState()[s]}),Object.getOwnPropertySymbols(o).forEach(s=>{e[s]=()=>r.getState()[s]}),e}function p(r,e){let o={};return Object.keys(r.getState()).forEach(s=>{o[s]=t=>{if(r.getState()[s]===t)return;let n=r.setState;n(a=>({...a,[s]:t}),!1,e?{type:s,payload:{[s]:t}}:void 0)}}),o}import{shallow as x}from"zustand/shallow";import{useStoreWithEqualityFn as y}from"zustand/traditional";function l(r){let e={};return Object.keys(r.getState()).forEach(o=>{e[o]=(s=x)=>y(r,t=>t[o],s)}),e}import{shallow as G}from"zustand/shallow";import{useStoreWithEqualityFn as A}from"zustand/traditional";function f(r,e){let o={...e.use},s={...e.get};return Object.keys(r(e)).forEach(t=>{o[t]=(...n)=>A(e.api,()=>r(e)[t](...n),G),s[t]=(...n)=>r(e)[t](...n)}),{...e,get:s,use:o}}function c(r,e){return{...e,set:{...e.set,...r(e)}}}function g(r,e,o){return{api:o.api,set:o.set,use:o.use,get:Object.keys(o.get).reduce((s,t)=>e[t]&&r.includes(t)?s:{...s,[t]:o.get[t]},{})}}function E(r,e){let{name:o="zustand-lite",plugins:s=[],middlewares:t={}}=e??{},n=r;s.forEach(i=>{i.creates&&(n={...n,...i.creates()})});let a=()=>n;t.devtools&&(a=R(a,t.devtools===!0?{name:"zustand-lite",store:o}:t.devtools)),t.persist&&(a=B(a,t.persist===!0?{name:o}:t.persist));let S=P(a),u={api:d(S,!!t.devtools),get:m(S),set:p(S,!!t.devtools),use:l(S),extendGetters(i){return f(i,this)},extendSetters(i){return c(i,this)},restrictState(i=[]){return g(i,n,this)}};return s.forEach(i=>{i.extends&&(u=i.extends(u))}),u}var D={extends:r=>r.extendSetters(({api:e})=>({reset:()=>{let o=e.getInitialState?.()??{};e.setState(()=>o,!0)}}))};export{E as createStore,D as reset};
173
3
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/createStore.ts","../src/lib/extendGetters.ts","../src/lib/extendSetters.ts","../src/lib/generateStateGet.ts","../src/lib/generateStateSet.ts","../src/lib/generateStateUse.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 AugmentedApiData,\n AugmentedGetters,\n AugmentedSetters,\n GettersBuilder,\n SettersBuilder,\n State,\n StoreApi,\n StoreApiPluginList,\n} from '../types';\nimport { extendGetters } from './extendGetters';\nimport { extendSetters } from './extendSetters';\nimport { generateStateGet } from './generateStateGet';\nimport { generateStateSet } from './generateStateSet';\nimport { generateStateUse } from './generateStateUse';\nimport { restrictState } from './restrictState';\n\nexport function createStore<T extends State, Plugins extends StoreApiPluginList = []>(\n initialState: T,\n options?: {\n name?: string;\n plugins?: [...Plugins];\n middlewares?: {\n devtools?: true | DevtoolsOptions;\n persist?: true | PersistOptions<any>;\n };\n },\n): StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>> {\n const { name = 'zustand-lite', plugins = [], middlewares = {} } = options ?? {};\n\n // Merge state from plugins to be available for future use.\n let mergedState: any = initialState;\n plugins.forEach(plugin => {\n if (plugin.creates) {\n mergedState = { ...mergedState, ...plugin.creates() };\n }\n });\n\n // Apply supported middlewares.\n let initializer: any = () => mergedState;\n\n if (middlewares.devtools) {\n initializer = devtools(\n initializer,\n middlewares.devtools === true ? { name } : middlewares.devtools,\n );\n }\n\n if (middlewares.persist) {\n initializer = persist(\n initializer,\n middlewares.persist === true ? { name } : middlewares.persist,\n );\n }\n\n // Create a vanilla zustand store to wrap.\n const storeApi: any = createVanillaStore(initializer);\n\n // Create zustand-lite wrapper.\n let store: any = {\n api: storeApi,\n get: generateStateGet(storeApi),\n set: generateStateSet(storeApi, !!middlewares.devtools, name),\n use: generateStateUse(storeApi),\n extendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n return extendGetters(builder, this);\n },\n extendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n return extendSetters(builder, this);\n },\n restrictState<Key extends keyof T>(publicState: Key[] = []) {\n return restrictState(\n publicState,\n mergedState,\n this as StoreApi<\n AugmentedApiData<T, Plugins>,\n AugmentedGetters<Plugins>,\n AugmentedSetters<Plugins>\n >,\n );\n },\n };\n\n // Extend store getters and setters with plugins.\n plugins.forEach(plugin => {\n if (plugin.extends) {\n store = plugin.extends(store);\n }\n });\n\n return store;\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { Default, GettersBuilder, State, StoreApi } from '../types'\n\nexport function extendGetters<\n Builder extends GettersBuilder<T, Getters, Setters>,\n T extends State = Default,\n Getters = Default,\n Setters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n const use = { ...thisApi.use };\n const get = { ...thisApi.get };\n\n Object.keys(builder(thisApi)).forEach(key => {\n // @ts-ignore\n use[key] = (...args: any[]) =>\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useStoreWithEqualityFn(\n thisApi.api,\n () => {\n return builder(thisApi)[key](...args);\n },\n shallow,\n );\n\n // @ts-ignore\n get[key] = (...args: any[]) => {\n return builder(thisApi)[key](...args);\n };\n });\n\n return {\n ...thisApi,\n get,\n use,\n } as StoreApi<T, Getters & ReturnType<Builder>, Setters>;\n}\n","import { Default, SettersBuilder, State, StoreApi } from '../types'\n\nexport function extendSetters<\n Builder extends SettersBuilder<T, Getters, Setters>,\n T extends State = Default,\n Getters = Default,\n Setters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n return {\n ...thisApi,\n set: {\n ...thisApi.set,\n ...builder(thisApi),\n },\n } as StoreApi<T, Getters, Setters & ReturnType<Builder>>\n}\n","import { StoreApi } from 'zustand/vanilla';\n\nimport { GetRecord, State } from '../types';\n\nexport function generateStateGet<T extends State>(api: StoreApi<T>) {\n const getters: GetRecord<T> = {} as GetRecord<T>;\n\n const initialState = api.getState();\n\n Object.keys(initialState).forEach(key => {\n getters[key as keyof T] = () => api.getState()[key as keyof T];\n });\n\n Object.getOwnPropertySymbols(initialState).forEach(symbol => {\n getters[symbol as keyof T] = () => api.getState()[symbol as keyof T];\n });\n\n return getters;\n}\n","import { NamedSet } from 'zustand/middleware/devtools';\nimport { StoreApi } from 'zustand/vanilla';\n\nimport { SetRecord, State } from '../types';\n\nexport function generateStateSet<T extends State>(\n api: StoreApi<T>,\n hasDevtools: boolean,\n storeName: string\n): SetRecord<T> {\n const setters: SetRecord<T> = {} as SetRecord<T>;\n\n Object.keys(api.getState()).forEach(key => {\n setters[key as keyof T] = (value: any) => {\n if (api.getState()[key] === value) {\n return;\n }\n\n const setState = api.setState as NamedSet<T>;\n setState(\n state => ({\n ...state,\n [key]: value,\n }),\n false,\n hasDevtools ? { type: `${storeName}/${key}`, payload: { [key]: value } } : undefined,\n );\n };\n });\n\n return setters;\n}\n","import { shallow } from 'zustand/shallow';\nimport { useStoreWithEqualityFn } from 'zustand/traditional';\n\nimport { StoreApi } from 'zustand';\n\nimport { EqualityChecker, GetRecord, State } from '../types';\n\nexport function generateStateUse<T extends State>(api: StoreApi<T>) {\n const getters: GetRecord<T> = {} as GetRecord<T>;\n\n Object.keys(api.getState()).forEach(key => {\n getters[key as keyof T] = (equalityFn: EqualityChecker<T[keyof T]> = shallow) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useStoreWithEqualityFn(api, (state: T) => state[key as keyof T], equalityFn);\n };\n });\n\n return getters;\n}\n","import { Empty, GetRecord, SetRecord, State, StoreApi, StoreApiEncapsulated } from '../types';\n\nexport function restrictState<\n T extends State,\n Key extends keyof T,\n Getters extends GetRecord<any> = Empty,\n Setters extends SetRecord<any> = Empty,\n>(privateState: Key[], mergedState: T, thisApi: StoreApi<T, Getters, Setters>) {\n return {\n api: thisApi.api,\n set: thisApi.set,\n use: thisApi.use,\n get: Object.keys(thisApi.get).reduce(\n (acc, key) =>\n mergedState[key] && (privateState as string[]).includes(key)\n ? acc\n : {\n ...acc,\n [key]: thisApi.get[key],\n },\n {},\n ) as GetRecord<Omit<T, Key>> & Getters,\n } as StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>;\n}\n","import { StoreApiPlugin } from '../types';\n\ntype PluginResetSetters = {\n reset: () => void;\n};\n\nexport const reset: StoreApiPlugin<{}, {}, PluginResetSetters> = {\n extends: store => {\n return store.extendSetters(({ api }) => ({\n reset: () => {\n const initialState = api.getInitialState?.() ?? {};\n api.setState(() => initialState, true);\n },\n }));\n },\n};\n"],"mappings":"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","names":["shallow","useStoreWithEqualityFn"]}
1
+ {"version":3,"sources":["../src/lib/createStore.ts","../src/lib/generateApi.ts","../src/lib/generateGet.ts","../src/lib/generateSet.ts","../src/lib/generateUse.ts","../src/lib/extendGetters.ts","../src/lib/extendSetters.ts","../src/lib/restrictState.ts","../src/plugins/reset.ts"],"sourcesContent":["/**\n * Entire zustand-lite no-boilerplate functionality is inspired by this recipe:\n * https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party\n * zustand-x repository: https://github.com/udecode/zustand-x.\n **/\nimport { DevtoolsOptions, PersistOptions, devtools, persist } from 'zustand/middleware';\nimport { createStore as createVanillaStore } from 'zustand/vanilla';\n\nimport {\n AugmentedApiData,\n AugmentedGetters,\n AugmentedSetters,\n GettersBuilder,\n SettersBuilder,\n State,\n StoreApi,\n StoreApiPluginList,\n} from '../types';\nimport { generateApi } from \"./generateApi\";\nimport { generateGet } from './generateGet';\nimport { generateSet } from './generateSet';\nimport { generateUse } from './generateUse';\nimport { extendGetters } from './extendGetters';\nimport { extendSetters } from './extendSetters';\nimport { restrictState } from './restrictState';\n\nexport function createStore<T extends State, Plugins extends StoreApiPluginList = []>(\n initialState: T,\n options?: {\n name?: string;\n plugins?: [...Plugins];\n middlewares?: {\n devtools?: true | DevtoolsOptions;\n persist?: true | PersistOptions<any>;\n };\n },\n): StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>> {\n const { name = 'zustand-lite', plugins = [], middlewares = {} } = options ?? {};\n\n // Merge state from plugins to be available for future use.\n let mergedState: any = initialState;\n plugins.forEach(plugin => {\n if (plugin.creates) {\n mergedState = { ...mergedState, ...plugin.creates() };\n }\n });\n\n // Apply supported middlewares.\n let initializer: any = () => mergedState;\n\n if (middlewares.devtools) {\n initializer = devtools(\n initializer,\n middlewares.devtools === true ? { name: 'zustand-lite', store: name } : middlewares.devtools,\n );\n }\n\n if (middlewares.persist) {\n initializer = persist(\n initializer,\n middlewares.persist === true ? { name } : middlewares.persist,\n );\n }\n\n // Create a vanilla zustand store to wrap.\n const storeApi: any = createVanillaStore(initializer);\n\n // Create zustand-lite wrapper.\n let store: any = {\n api: generateApi(storeApi, !!middlewares.devtools),\n get: generateGet(storeApi),\n set: generateSet(storeApi, !!middlewares.devtools),\n use: generateUse(storeApi),\n extendGetters<Builder extends GettersBuilder<typeof mergedState>>(builder: Builder) {\n return extendGetters(builder, this);\n },\n extendSetters<Builder extends SettersBuilder<typeof mergedState>>(builder: Builder) {\n return extendSetters(builder, this);\n },\n restrictState<Key extends keyof T>(publicState: Key[] = []) {\n return restrictState(\n publicState,\n mergedState,\n this as StoreApi<\n AugmentedApiData<T, Plugins>,\n AugmentedGetters<Plugins>,\n AugmentedSetters<Plugins>\n >,\n );\n },\n };\n\n // Extend store getters and setters with plugins.\n plugins.forEach(plugin => {\n if (plugin.extends) {\n store = plugin.extends(store);\n }\n });\n\n return store;\n}\n","import { NamedSet } from 'zustand/middleware/devtools';\nimport { StoreApi } from 'zustand/vanilla';\n\nimport { State } from '../types';\n\nfunction logFunctionName() {\n return new Error()?.stack?.split('\\n')[3].trim().split(' ')[1].split('.')[1] ?? 'setState';\n}\n\nexport function generateApi<T extends State>(\n api: StoreApi<T>,\n hasDevtools: boolean,\n) {\n return {\n ...api,\n setState: (newState: T | ((state: T) => T), replace?: false, name?: string) => {\n const setState = api.setState as NamedSet<T>;\n setState(\n newState,\n replace,\n hasDevtools\n ? (name ?? { type: logFunctionName(), payload: newState })\n : undefined,\n );\n },\n };\n}\n","import { StoreApi } from 'zustand/vanilla';\n\nimport { GetRecord, State } from '../types';\n\nexport function generateGet<T extends State>(api: StoreApi<T>) {\n const getters: GetRecord<T> = {} as GetRecord<T>;\n\n const initialState = api.getState();\n\n Object.keys(initialState).forEach(key => {\n getters[key as keyof T] = () => api.getState()[key as keyof T];\n });\n\n Object.getOwnPropertySymbols(initialState).forEach(symbol => {\n getters[symbol as keyof T] = () => api.getState()[symbol as keyof T];\n });\n\n return getters;\n}\n","import { NamedSet } from 'zustand/middleware/devtools';\nimport { StoreApi } from 'zustand/vanilla';\n\nimport { SetRecord, State } from '../types';\n\nexport function generateSet<T extends State>(\n api: StoreApi<T>,\n hasDevtools: boolean,\n): SetRecord<T> {\n const setters: SetRecord<T> = {} as SetRecord<T>;\n\n Object.keys(api.getState()).forEach(key => {\n setters[key as keyof T] = (value: any) => {\n if (api.getState()[key] === value) {\n return;\n }\n\n const setState = api.setState as NamedSet<T>;\n setState(\n state => ({\n ...state,\n [key]: value,\n }),\n false,\n hasDevtools ? { type: key, payload: { [key]: value } } : undefined,\n );\n };\n });\n\n return setters;\n}\n","import { shallow } from 'zustand/shallow';\nimport { useStoreWithEqualityFn } from 'zustand/traditional';\n\nimport { StoreApi } from 'zustand';\n\nimport { EqualityChecker, GetRecord, State } from '../types';\n\nexport function generateUse<T extends State>(api: StoreApi<T>) {\n const getters: GetRecord<T> = {} as GetRecord<T>;\n\n Object.keys(api.getState()).forEach(key => {\n getters[key as keyof T] = (equalityFn: EqualityChecker<T[keyof T]> = shallow) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useStoreWithEqualityFn(api, (state: T) => state[key as keyof T], equalityFn);\n };\n });\n\n return getters;\n}\n","import { shallow } from 'zustand/shallow'\nimport { useStoreWithEqualityFn } from 'zustand/traditional'\n\nimport { Default, GettersBuilder, State, StoreApi } from '../types'\n\nexport function extendGetters<\n Builder extends GettersBuilder<T, Getters, Setters>,\n T extends State = Default,\n Getters = Default,\n Setters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n const use = { ...thisApi.use };\n const get = { ...thisApi.get };\n\n Object.keys(builder(thisApi)).forEach(key => {\n // @ts-ignore\n use[key] = (...args: any[]) =>\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useStoreWithEqualityFn(\n thisApi.api,\n () => {\n return builder(thisApi)[key](...args);\n },\n shallow,\n );\n\n // @ts-ignore\n get[key] = (...args: any[]) => {\n return builder(thisApi)[key](...args);\n };\n });\n\n return {\n ...thisApi,\n get,\n use,\n } as StoreApi<T, Getters & ReturnType<Builder>, Setters>;\n}\n","import { Default, SettersBuilder, State, StoreApi } from '../types'\n\nexport function extendSetters<\n Builder extends SettersBuilder<T, Getters, Setters>,\n T extends State = Default,\n Getters = Default,\n Setters = Default,\n>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>) {\n return {\n ...thisApi,\n set: {\n ...thisApi.set,\n ...builder(thisApi),\n },\n } as StoreApi<T, Getters, Setters & ReturnType<Builder>>\n}\n","import { Empty, GetRecord, SetRecord, State, StoreApi, StoreApiEncapsulated } from '../types';\n\nexport function restrictState<\n T extends State,\n Key extends keyof T,\n Getters extends GetRecord<any> = Empty,\n Setters extends SetRecord<any> = Empty,\n>(privateState: Key[], mergedState: T, thisApi: StoreApi<T, Getters, Setters>) {\n return {\n api: thisApi.api,\n set: thisApi.set,\n use: thisApi.use,\n get: Object.keys(thisApi.get).reduce(\n (acc, key) =>\n mergedState[key] && (privateState as string[]).includes(key)\n ? acc\n : {\n ...acc,\n [key]: thisApi.get[key],\n },\n {},\n ) as GetRecord<Omit<T, Key>> & Getters,\n } as StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>;\n}\n","import { StoreApiPlugin } from '../types';\n\ntype PluginResetSetters = {\n reset: () => void;\n};\n\nexport const reset: StoreApiPlugin<{}, {}, PluginResetSetters> = {\n extends: store => {\n return store.extendSetters(({ api }) => ({\n reset: () => {\n const initialState = api.getInitialState?.() ?? {};\n api.setState(() => initialState, true);\n },\n }));\n },\n};\n"],"mappings":"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","names":["devtools","persist","createVanillaStore","logFunctionName","generateApi","api","hasDevtools","newState","replace","name","setState","generateGet","api","getters","initialState","key","symbol","generateSet","api","hasDevtools","setters","key","value","setState","state","shallow","useStoreWithEqualityFn","generateUse","api","getters","key","equalityFn","state","shallow","useStoreWithEqualityFn","extendGetters","builder","thisApi","use","get","key","args","extendSetters","builder","thisApi","restrictState","privateState","mergedState","thisApi","acc","key","createStore","initialState","options","name","plugins","middlewares","mergedState","plugin","initializer","devtools","persist","storeApi","createVanillaStore","store","generateApi","generateGet","generateSet","generateUse","builder","extendGetters","extendSetters","publicState","restrictState","reset","store","api","initialState"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zustand-lite",
3
- "version": "0.1.3",
3
+ "version": "0.2.0",
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",
@@ -37,7 +37,7 @@
37
37
  }
38
38
  },
39
39
  "scripts": {
40
- "build": "npx tsup src/index.ts --format cjs,esm --dts --clean --sourcemap"
40
+ "build": "tsup src/index.ts --format cjs,esm --dts --clean --sourcemap --minify"
41
41
  },
42
42
  "dependencies": {
43
43
  "zustand": "5.0.5"