zustand-lite 0.1.2 → 0.1.3
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.d.ts +82 -3
- package/dist/index.js +201 -2
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +173 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +26 -13
- package/dist/lib/createStore.d.ts +0 -15
- package/dist/lib/createStore.js +0 -56
- package/dist/lib/extendGetters.d.ts +0 -2
- package/dist/lib/extendGetters.js +0 -23
- package/dist/lib/extendSetters.d.ts +0 -2
- package/dist/lib/extendSetters.js +0 -9
- package/dist/lib/generateStateGet.d.ts +0 -3
- package/dist/lib/generateStateGet.js +0 -11
- package/dist/lib/generateStateSet.d.ts +0 -3
- package/dist/lib/generateStateSet.js +0 -16
- package/dist/lib/generateStateUse.d.ts +0 -3
- package/dist/lib/generateStateUse.js +0 -12
- package/dist/lib/restrictState.d.ts +0 -2
- package/dist/lib/restrictState.js +0 -13
- package/dist/plugins/reset.d.ts +0 -6
- package/dist/plugins/reset.js +0 -10
- package/dist/types.d.ts +0 -59
- package/dist/types.js +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,82 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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[]) => {} | null>;
|
|
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.js
CHANGED
|
@@ -1,2 +1,201 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
+
});
|
|
201
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
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
|
+
};
|
|
173
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +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":";AAKA,SAA0C,UAAU,eAAe;AACnE,SAAS,eAAe,0BAA0B;;;ACNlD,SAAS,eAAe;AACxB,SAAS,8BAA8B;AAIhC,SAAS,cAKd,SAAkB,SAAwC;AAC1D,QAAM,MAAM,EAAE,GAAG,QAAQ,IAAI;AAC7B,QAAM,MAAM,EAAE,GAAG,QAAQ,IAAI;AAE7B,SAAO,KAAK,QAAQ,OAAO,CAAC,EAAE,QAAQ,SAAO;AAE3C,QAAI,GAAG,IAAI,IAAI;AAAA;AAAA,MAEb;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AACJ,iBAAO,QAAQ,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI;AAAA,QACtC;AAAA,QACA;AAAA,MACF;AAAA;AAGF,QAAI,GAAG,IAAI,IAAI,SAAgB;AAC7B,aAAO,QAAQ,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI;AAAA,IACtC;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EACF;AACF;;;ACnCO,SAAS,cAKd,SAAkB,SAAwC;AAC1D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,KAAK;AAAA,MACH,GAAG,QAAQ;AAAA,MACX,GAAG,QAAQ,OAAO;AAAA,IACpB;AAAA,EACF;AACF;;;ACXO,SAAS,iBAAkC,KAAkB;AAClE,QAAM,UAAwB,CAAC;AAE/B,QAAM,eAAe,IAAI,SAAS;AAElC,SAAO,KAAK,YAAY,EAAE,QAAQ,SAAO;AACvC,YAAQ,GAAc,IAAI,MAAM,IAAI,SAAS,EAAE,GAAc;AAAA,EAC/D,CAAC;AAED,SAAO,sBAAsB,YAAY,EAAE,QAAQ,YAAU;AAC3D,YAAQ,MAAiB,IAAI,MAAM,IAAI,SAAS,EAAE,MAAiB;AAAA,EACrE,CAAC;AAED,SAAO;AACT;;;ACbO,SAAS,iBACd,KACA,aACA,WACc;AACd,QAAM,UAAwB,CAAC;AAE/B,SAAO,KAAK,IAAI,SAAS,CAAC,EAAE,QAAQ,SAAO;AACzC,YAAQ,GAAc,IAAI,CAAC,UAAe;AACxC,UAAI,IAAI,SAAS,EAAE,GAAG,MAAM,OAAO;AACjC;AAAA,MACF;AAEA,YAAM,WAAW,IAAI;AACrB;AAAA,QACE,YAAU;AAAA,UACR,GAAG;AAAA,UACH,CAAC,GAAG,GAAG;AAAA,QACT;AAAA,QACA;AAAA,QACA,cAAc,EAAE,MAAM,GAAG,SAAS,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC,GAAG,GAAG,MAAM,EAAE,IAAI;AAAA,MAC7E;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AC/BA,SAAS,WAAAA,gBAAe;AACxB,SAAS,0BAAAC,+BAA8B;AAMhC,SAAS,iBAAkC,KAAkB;AAClE,QAAM,UAAwB,CAAC;AAE/B,SAAO,KAAK,IAAI,SAAS,CAAC,EAAE,QAAQ,SAAO;AACzC,YAAQ,GAAc,IAAI,CAAC,aAA0CD,aAAY;AAE/E,aAAOC,wBAAuB,KAAK,CAAC,UAAa,MAAM,GAAc,GAAG,UAAU;AAAA,IACpF;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AChBO,SAAS,cAKd,cAAqB,aAAgB,SAAwC;AAC7E,SAAO;AAAA,IACL,KAAK,QAAQ;AAAA,IACb,KAAK,QAAQ;AAAA,IACb,KAAK,QAAQ;AAAA,IACb,KAAK,OAAO,KAAK,QAAQ,GAAG,EAAE;AAAA,MAC5B,CAAC,KAAK,QACJ,YAAY,GAAG,KAAM,aAA0B,SAAS,GAAG,IACvD,MACA;AAAA,QACE,GAAG;AAAA,QACH,CAAC,GAAG,GAAG,QAAQ,IAAI,GAAG;AAAA,MACxB;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ANEO,SAAS,YACd,cACA,SAQ8F;AAC9F,QAAM,EAAE,OAAO,gBAAgB,UAAU,CAAC,GAAG,cAAc,CAAC,EAAE,IAAI,WAAW,CAAC;AAG9E,MAAI,cAAmB;AACvB,UAAQ,QAAQ,YAAU;AACxB,QAAI,OAAO,SAAS;AAClB,oBAAc,EAAE,GAAG,aAAa,GAAG,OAAO,QAAQ,EAAE;AAAA,IACtD;AAAA,EACF,CAAC;AAGD,MAAI,cAAmB,MAAM;AAE7B,MAAI,YAAY,UAAU;AACxB,kBAAc;AAAA,MACZ;AAAA,MACA,YAAY,aAAa,OAAO,EAAE,KAAK,IAAI,YAAY;AAAA,IACzD;AAAA,EACF;AAEA,MAAI,YAAY,SAAS;AACvB,kBAAc;AAAA,MACZ;AAAA,MACA,YAAY,YAAY,OAAO,EAAE,KAAK,IAAI,YAAY;AAAA,IACxD;AAAA,EACF;AAGA,QAAM,WAAgB,mBAAmB,WAAW;AAGpD,MAAI,QAAa;AAAA,IACf,KAAK;AAAA,IACL,KAAK,iBAAiB,QAAQ;AAAA,IAC9B,KAAK,iBAAiB,UAAU,CAAC,CAAC,YAAY,UAAU,IAAI;AAAA,IAC5D,KAAK,iBAAiB,QAAQ;AAAA,IAC9B,cAAkE,SAAkB;AAClF,aAAO,cAAc,SAAS,IAAI;AAAA,IACpC;AAAA,IACA,cAAkE,SAAkB;AAClF,aAAO,cAAc,SAAS,IAAI;AAAA,IACpC;AAAA,IACA,cAAmC,cAAqB,CAAC,GAAG;AAC1D,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MAKF;AAAA,IACF;AAAA,EACF;AAGA,UAAQ,QAAQ,YAAU;AACxB,QAAI,OAAO,SAAS;AAClB,cAAQ,OAAO,QAAQ,KAAK;AAAA,IAC9B;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AO7FO,IAAM,QAAoD;AAAA,EAC/D,SAAS,WAAS;AAChB,WAAO,MAAM,cAAc,CAAC,EAAE,IAAI,OAAO;AAAA,MACvC,OAAO,MAAM;AACX,cAAM,eAAe,IAAI,kBAAkB,KAAK,CAAC;AACjD,YAAI,SAAS,MAAM,cAAc,IAAI;AAAA,MACvC;AAAA,IACF,EAAE;AAAA,EACJ;AACF;","names":["shallow","useStoreWithEqualityFn"]}
|
package/package.json
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zustand-lite",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Zustand Lite builds upon zustand, by auto-generating selectors and simplifying API even more.",
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"repository": {
|
|
8
|
-
"type": "git",
|
|
9
|
-
"url": "git://github.com/PiotrSiatkowski/zustand-lite.git",
|
|
10
|
-
"web": "https://github.com/PiotrSiatkowski/zustand-lite"
|
|
11
|
-
},
|
|
12
5
|
"author": "Piotr Siatkowski <p.siatkowski@gmail.com>",
|
|
6
|
+
"license": "MIT",
|
|
13
7
|
"keywords": [
|
|
14
8
|
"zustand",
|
|
15
9
|
"state-management",
|
|
@@ -19,18 +13,37 @@
|
|
|
19
13
|
"typescript",
|
|
20
14
|
"no-boilerplate"
|
|
21
15
|
],
|
|
22
|
-
"
|
|
23
|
-
"
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git://github.com/PiotrSiatkowski/zustand-lite.git",
|
|
19
|
+
"web": "https://github.com/PiotrSiatkowski/zustand-lite"
|
|
20
|
+
},
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/PiotrSiatkowski/zustand-lite/issues"
|
|
24
23
|
},
|
|
24
|
+
"sideEffects": false,
|
|
25
|
+
"main": "dist/index.js",
|
|
26
|
+
"module": "dist/index.mjs",
|
|
25
27
|
"types": "dist/index.d.ts",
|
|
26
28
|
"files": [
|
|
27
|
-
"dist"
|
|
29
|
+
"dist/**/*"
|
|
28
30
|
],
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"import": "./dist/index.mjs",
|
|
35
|
+
"module": "./dist/index.mjs",
|
|
36
|
+
"require": "./dist/index.js"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "npx tsup src/index.ts --format cjs,esm --dts --clean --sourcemap"
|
|
41
|
+
},
|
|
29
42
|
"dependencies": {
|
|
30
|
-
"zustand": "
|
|
43
|
+
"zustand": "5.0.5"
|
|
31
44
|
},
|
|
32
45
|
"devDependencies": {
|
|
33
|
-
"typescript": "
|
|
46
|
+
"typescript": "5.8.3"
|
|
34
47
|
},
|
|
35
48
|
"private": false
|
|
36
49
|
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Entire zustand-lite no-boilerplate functionality is inspired by this recipe:
|
|
3
|
-
* https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party
|
|
4
|
-
* zustand-x repository: https://github.com/udecode/zustand-x.
|
|
5
|
-
**/
|
|
6
|
-
import { DevtoolsOptions, PersistOptions } from 'zustand/middleware';
|
|
7
|
-
import { AugmentedApiData, AugmentedGetters, AugmentedSetters, State, StoreApi, StoreApiPluginList } from '../types';
|
|
8
|
-
export declare function createStore<T extends State, Plugins extends StoreApiPluginList = []>(initialState: T, options?: {
|
|
9
|
-
name?: string;
|
|
10
|
-
plugins?: [...Plugins];
|
|
11
|
-
middlewares?: {
|
|
12
|
-
devtools?: true | DevtoolsOptions;
|
|
13
|
-
persist?: true | PersistOptions<any>;
|
|
14
|
-
};
|
|
15
|
-
}): StoreApi<AugmentedApiData<T, Plugins>, AugmentedGetters<Plugins>, AugmentedSetters<Plugins>>;
|
package/dist/lib/createStore.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Entire zustand-lite no-boilerplate functionality is inspired by this recipe:
|
|
3
|
-
* https://docs.pmnd.rs/zustand/guides/auto-generating-selectors and 3th party
|
|
4
|
-
* zustand-x repository: https://github.com/udecode/zustand-x.
|
|
5
|
-
**/
|
|
6
|
-
import { devtools, persist } from 'zustand/middleware';
|
|
7
|
-
import { createStore as createVanillaStore } from 'zustand/vanilla';
|
|
8
|
-
import { extendGetters } from './extendGetters';
|
|
9
|
-
import { extendSetters } from './extendSetters';
|
|
10
|
-
import { generateStateGet } from './generateStateGet';
|
|
11
|
-
import { generateStateSet } from './generateStateSet';
|
|
12
|
-
import { generateStateUse } from './generateStateUse';
|
|
13
|
-
import { restrictState } from './restrictState';
|
|
14
|
-
export function createStore(initialState, options) {
|
|
15
|
-
const { name = 'zustand-lite', plugins = [], middlewares = {} } = options ?? {};
|
|
16
|
-
// Merge state from plugins to be available for future use.
|
|
17
|
-
let mergedState = initialState;
|
|
18
|
-
plugins.forEach(plugin => {
|
|
19
|
-
if (plugin.creates) {
|
|
20
|
-
mergedState = { ...mergedState, ...plugin.creates() };
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
// Apply supported middlewares.
|
|
24
|
-
let initializer = () => mergedState;
|
|
25
|
-
if (middlewares.devtools) {
|
|
26
|
-
initializer = devtools(initializer, middlewares.devtools === true ? { name } : middlewares.devtools);
|
|
27
|
-
}
|
|
28
|
-
if (middlewares.persist) {
|
|
29
|
-
initializer = persist(initializer, middlewares.persist === true ? { name } : middlewares.persist);
|
|
30
|
-
}
|
|
31
|
-
// Create a vanilla zustand store to wrap.
|
|
32
|
-
const storeApi = createVanillaStore(initializer);
|
|
33
|
-
// Create zustand-lite wrapper.
|
|
34
|
-
let store = {
|
|
35
|
-
api: storeApi,
|
|
36
|
-
get: generateStateGet(storeApi),
|
|
37
|
-
set: generateStateSet(storeApi, !!middlewares.devtools, name),
|
|
38
|
-
use: generateStateUse(storeApi),
|
|
39
|
-
extendGetters(builder) {
|
|
40
|
-
return extendGetters(builder, this);
|
|
41
|
-
},
|
|
42
|
-
extendSetters(builder) {
|
|
43
|
-
return extendSetters(builder, this);
|
|
44
|
-
},
|
|
45
|
-
restrictState(publicState = []) {
|
|
46
|
-
return restrictState(publicState, mergedState, this);
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
// Extend store getters and setters with plugins.
|
|
50
|
-
plugins.forEach(plugin => {
|
|
51
|
-
if (plugin.extends) {
|
|
52
|
-
store = plugin.extends(store);
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
return store;
|
|
56
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { Default, GettersBuilder, State, StoreApi } from '../types';
|
|
2
|
-
export declare function extendGetters<Builder extends GettersBuilder<T, Getters, Setters>, T extends State = Default, Getters = Default, Setters = Default>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>): StoreApi<T, Getters & ReturnType<Builder>, Setters>;
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { shallow } from 'zustand/shallow';
|
|
2
|
-
import { useStoreWithEqualityFn } from 'zustand/traditional';
|
|
3
|
-
export function extendGetters(builder, thisApi) {
|
|
4
|
-
const use = { ...thisApi.use };
|
|
5
|
-
const get = { ...thisApi.get };
|
|
6
|
-
Object.keys(builder(thisApi)).forEach(key => {
|
|
7
|
-
// @ts-ignore
|
|
8
|
-
use[key] = (...args) =>
|
|
9
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
10
|
-
useStoreWithEqualityFn(thisApi.api, () => {
|
|
11
|
-
return builder(thisApi)[key](...args);
|
|
12
|
-
}, shallow);
|
|
13
|
-
// @ts-ignore
|
|
14
|
-
get[key] = (...args) => {
|
|
15
|
-
return builder(thisApi)[key](...args);
|
|
16
|
-
};
|
|
17
|
-
});
|
|
18
|
-
return {
|
|
19
|
-
...thisApi,
|
|
20
|
-
get,
|
|
21
|
-
use,
|
|
22
|
-
};
|
|
23
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { Default, SettersBuilder, State, StoreApi } from '../types';
|
|
2
|
-
export declare function extendSetters<Builder extends SettersBuilder<T, Getters, Setters>, T extends State = Default, Getters = Default, Setters = Default>(builder: Builder, thisApi: StoreApi<T, Getters, Setters>): StoreApi<T, Getters, Setters & ReturnType<Builder>>;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export function generateStateGet(api) {
|
|
2
|
-
const getters = {};
|
|
3
|
-
const initialState = api.getState();
|
|
4
|
-
Object.keys(initialState).forEach(key => {
|
|
5
|
-
getters[key] = () => api.getState()[key];
|
|
6
|
-
});
|
|
7
|
-
Object.getOwnPropertySymbols(initialState).forEach(symbol => {
|
|
8
|
-
getters[symbol] = () => api.getState()[symbol];
|
|
9
|
-
});
|
|
10
|
-
return getters;
|
|
11
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export function generateStateSet(api, hasDevtools, storeName) {
|
|
2
|
-
const setters = {};
|
|
3
|
-
Object.keys(api.getState()).forEach(key => {
|
|
4
|
-
setters[key] = (value) => {
|
|
5
|
-
if (api.getState()[key] === value) {
|
|
6
|
-
return;
|
|
7
|
-
}
|
|
8
|
-
const setState = api.setState;
|
|
9
|
-
setState(state => ({
|
|
10
|
-
...state,
|
|
11
|
-
[key]: value,
|
|
12
|
-
}), false, hasDevtools ? { type: `${storeName}/${key}`, payload: { [key]: value } } : undefined);
|
|
13
|
-
};
|
|
14
|
-
});
|
|
15
|
-
return setters;
|
|
16
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { shallow } from 'zustand/shallow';
|
|
2
|
-
import { useStoreWithEqualityFn } from 'zustand/traditional';
|
|
3
|
-
export function generateStateUse(api) {
|
|
4
|
-
const getters = {};
|
|
5
|
-
Object.keys(api.getState()).forEach(key => {
|
|
6
|
-
getters[key] = (equalityFn = shallow) => {
|
|
7
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
8
|
-
return useStoreWithEqualityFn(api, (state) => state[key], equalityFn);
|
|
9
|
-
};
|
|
10
|
-
});
|
|
11
|
-
return getters;
|
|
12
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { Empty, GetRecord, SetRecord, State, StoreApi, StoreApiEncapsulated } from '../types';
|
|
2
|
-
export declare function restrictState<T extends State, Key extends keyof T, Getters extends GetRecord<any> = Empty, Setters extends SetRecord<any> = Empty>(privateState: Key[], mergedState: T, thisApi: StoreApi<T, Getters, Setters>): StoreApiEncapsulated<Omit<T, Key>, Getters, Setters>;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export function restrictState(privateState, mergedState, thisApi) {
|
|
2
|
-
return {
|
|
3
|
-
api: thisApi.api,
|
|
4
|
-
set: thisApi.set,
|
|
5
|
-
use: thisApi.use,
|
|
6
|
-
get: Object.keys(thisApi.get).reduce((acc, key) => mergedState[key] && privateState.includes(key)
|
|
7
|
-
? acc
|
|
8
|
-
: {
|
|
9
|
-
...acc,
|
|
10
|
-
[key]: thisApi.get[key],
|
|
11
|
-
}, {}),
|
|
12
|
-
};
|
|
13
|
-
}
|
package/dist/plugins/reset.d.ts
DELETED
package/dist/plugins/reset.js
DELETED
package/dist/types.d.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { StoreApi as StoreApiLib } from 'zustand';
|
|
2
|
-
export type State = Record<string | symbol, unknown>;
|
|
3
|
-
export type Empty = Record<string, never>;
|
|
4
|
-
export type Default = Record<string | symbol, any>;
|
|
5
|
-
export type EqualityChecker<T> = (state: T, newState: T) => boolean;
|
|
6
|
-
export type StoreApiGet<T extends State, Getters> = Required<GetRecord<T>> & Getters;
|
|
7
|
-
export type StoreApiUse<T extends State, Getters> = Required<UseRecord<T>> & Getters;
|
|
8
|
-
export type StoreApiSet<T extends State, Setters> = Required<SetRecord<T>> & Setters;
|
|
9
|
-
export type StoreApiEncapsulated<T extends State = Empty, Getters = Default, Setters = Default> = {
|
|
10
|
-
api: StoreApiLib<T>;
|
|
11
|
-
get: StoreApiGet<T, Getters>;
|
|
12
|
-
set: StoreApiSet<T, Setters>;
|
|
13
|
-
use: StoreApiUse<T, Getters>;
|
|
14
|
-
};
|
|
15
|
-
export type StoreApi<T extends State = Empty, Getters = Default, Setters = Default> = {
|
|
16
|
-
api: StoreApiLib<T>;
|
|
17
|
-
get: StoreApiGet<T, Getters>;
|
|
18
|
-
set: StoreApiSet<T, Setters>;
|
|
19
|
-
use: StoreApiUse<T, Getters>;
|
|
20
|
-
extendGetters<Builder extends GettersBuilder<T, Getters, Setters>>(builder: Builder): StoreApi<T, Getters & ReturnType<Builder>, Setters>;
|
|
21
|
-
extendSetters<Builder extends SettersBuilder<T, Getters, Setters>>(builder: Builder): StoreApi<T, Getters, Setters & ReturnType<Builder>>;
|
|
22
|
-
restrictState(): StoreApiEncapsulated<T, Getters, Setters>;
|
|
23
|
-
restrictState<Key extends keyof T>(publicState: Key[]): StoreApiEncapsulated<Pick<T, Key>, Getters, Setters>;
|
|
24
|
-
};
|
|
25
|
-
export type GettersBuilder<T extends State, Getters = Default, Setters = Default> = (args: {
|
|
26
|
-
api: StoreApiLib<T>;
|
|
27
|
-
get: StoreApiGet<T, Getters>;
|
|
28
|
-
set: StoreApiSet<T, Setters>;
|
|
29
|
-
}) => Record<string, (...args: any[]) => {} | null>;
|
|
30
|
-
export type SettersBuilder<T extends State, Getters = Default, Setters = Default> = (args: {
|
|
31
|
-
api: StoreApiLib<T>;
|
|
32
|
-
get: StoreApiGet<T, Getters>;
|
|
33
|
-
set: StoreApiSet<T, Setters>;
|
|
34
|
-
}) => Record<string, (...args: any[]) => void>;
|
|
35
|
-
export type GetRecord<O extends Record<string, any>> = {
|
|
36
|
-
[K in keyof O]: () => O[K];
|
|
37
|
-
};
|
|
38
|
-
export type UseRecord<O extends Record<string, any>> = {
|
|
39
|
-
[K in keyof O]: (equalityFn?: EqualityChecker<O[K]>) => O[K];
|
|
40
|
-
};
|
|
41
|
-
export type SetRecord<O extends Record<string, any>> = {
|
|
42
|
-
[K in keyof O]: (value: O[K]) => void;
|
|
43
|
-
};
|
|
44
|
-
export type StoreApiPlugin<NewApiData extends State, NewGetters, NewSetters> = {
|
|
45
|
-
creates?: () => NewApiData;
|
|
46
|
-
extends?: (store: StoreApi<NewApiData, NewGetters, NewSetters>) => StoreApi<NewApiData, NewGetters, NewSetters>;
|
|
47
|
-
};
|
|
48
|
-
export type StoreApiPluginList = StoreApiPlugin<any, any, any>[];
|
|
49
|
-
export type AugmentedApiData<T, Plugins extends StoreApiPluginList> = T & UnionToIntersection<ExtractPluginTypes<Plugins, 'create'>[number]>;
|
|
50
|
-
export type AugmentedGetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['getters']>;
|
|
51
|
-
export type AugmentedSetters<Plugins extends StoreApiPluginList> = UnionToIntersection<ExtractPluginTypes<Plugins, 'extend'>[number]['setters']>;
|
|
52
|
-
type ExtractPluginTypes<Plugins extends StoreApiPluginList, Key extends 'create' | 'extend'> = {
|
|
53
|
-
[K in keyof Plugins]: Plugins[K] extends StoreApiPlugin<infer S, infer G, infer A> ? Key extends 'create' ? S : Key extends 'extend' ? {
|
|
54
|
-
getters: G;
|
|
55
|
-
setters: A;
|
|
56
|
-
} : never : never;
|
|
57
|
-
};
|
|
58
|
-
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
59
|
-
export {};
|
package/dist/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|