zustand-lite 0.1.2 → 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
@@ -1,3 +1,82 @@
1
- export type { StoreApiPlugin } from './types';
2
- export { createStore } from './lib/createStore';
3
- export { reset } from './plugins/reset';
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.js CHANGED
@@ -1,2 +1,3 @@
1
- export { createStore } from './lib/createStore';
2
- export { reset } from './plugins/reset';
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});
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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 ADDED
@@ -0,0 +1,3 @@
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};
3
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
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,15 +1,9 @@
1
1
  {
2
2
  "name": "zustand-lite",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
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
- "scripts": {
23
- "build": "tsc"
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": "tsup src/index.ts --format cjs,esm --dts --clean --sourcemap --minify"
41
+ },
29
42
  "dependencies": {
30
- "zustand": "^5.0.5"
43
+ "zustand": "5.0.5"
31
44
  },
32
45
  "devDependencies": {
33
- "typescript": "^5.5.3"
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>>;
@@ -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,9 +0,0 @@
1
- export function extendSetters(builder, thisApi) {
2
- return {
3
- ...thisApi,
4
- set: {
5
- ...thisApi.set,
6
- ...builder(thisApi),
7
- },
8
- };
9
- }
@@ -1,3 +0,0 @@
1
- import { StoreApi } from 'zustand/vanilla';
2
- import { GetRecord, State } from '../types';
3
- export declare function generateStateGet<T extends State>(api: StoreApi<T>): GetRecord<T>;
@@ -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,3 +0,0 @@
1
- import { StoreApi } from 'zustand/vanilla';
2
- import { SetRecord, State } from '../types';
3
- export declare function generateStateSet<T extends State>(api: StoreApi<T>, hasDevtools: boolean, storeName: string): SetRecord<T>;
@@ -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,3 +0,0 @@
1
- import { StoreApi } from 'zustand';
2
- import { GetRecord, State } from '../types';
3
- export declare function generateStateUse<T extends State>(api: StoreApi<T>): GetRecord<T>;
@@ -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
- }
@@ -1,6 +0,0 @@
1
- import { StoreApiPlugin } from '../types';
2
- type PluginResetSetters = {
3
- reset: () => void;
4
- };
5
- export declare const reset: StoreApiPlugin<{}, {}, PluginResetSetters>;
6
- export {};
@@ -1,10 +0,0 @@
1
- export const reset = {
2
- extends: store => {
3
- return store.extendSetters(({ api }) => ({
4
- reset: () => {
5
- const initialState = api.getInitialState?.() ?? {};
6
- api.setState(() => initialState, true);
7
- },
8
- }));
9
- },
10
- };
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 {};